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 ce479f6c611c3430d7a7c3f15604931fdecb0893 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 failed — run details

CI log
=== gofmt ===
=== no-rastrillo ===
go test -run '^(TestFiestaNeverImportsRastrillo|TestThePublicPackagesLinkNoBrowser)$' -count=1 .
ok  	amadan.net/rastrillo/fiesta	0.227s
=== 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	3.674s
ok  	amadan.net/rastrillo/fiesta/check	9.399s
ok  	amadan.net/rastrillo/fiesta/example	0.231s
?   	amadan.net/rastrillo/fiesta/hack/seed/english	[no test files]
ok  	amadan.net/rastrillo/fiesta/internal/axe	0.567s
ok  	amadan.net/rastrillo/fiesta/internal/build	2.304s
ok  	amadan.net/rastrillo/fiesta/internal/codeview	0.015s
?   	amadan.net/rastrillo/fiesta/internal/harness	[no test files]
ok  	amadan.net/rastrillo/fiesta/internal/markup	0.010s
ok  	amadan.net/rastrillo/fiesta/internal/nodetest	0.492s
ok  	amadan.net/rastrillo/fiesta/internal/site	4.055s
ok  	amadan.net/rastrillo/fiesta/internal/tokens	0.008s
suite: root took 19s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m11.720000s 0m2.020000s
--- 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	84.672s
suite: test.internal.gallery~1of3 took 90s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m51.280000s 0m1.360000s
--- 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	85.519s
suite: test.internal.gallery~2of3 took 93s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m53.890000s 0m1.360000s
--- 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	80.763s
suite: test.internal.gallery~3of3 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m49.130000s 0m1.430000s
--- 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	70.085s
suite: test.cmd.fiesta~1of2 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m34.050000s 0m2.210000s
--- 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	74.296s
suite: test.cmd.fiesta~2of2 took 78s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.600000s 0m2.440000s
--- 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	80.943s
suite: test.internal.www~1of2 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m48.160000s 0m1.630000s
--- 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	77.074s
suite: test.internal.www~2of2 took 83s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.600000s 0m1.680000s
--- 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 19s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.680000s 0m0.980000s
--- 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 10s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m2.980000s 0m0.350000s
--- 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:07AM INF Unknown SCM platform. Use --platform to include links in findings. host=amadan.net
8:08AM INF 30 commits scanned.
8:08AM INF scanned ~8415193 bytes (8.42 MB) in 9.34s
8:08AM INF no leaks found
suite: gitleaks took 11s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m7.320000s 0m0.230000s
--- 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	5.569s
suite: browser.internal.harness took 13s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m1.950000s 0m1.310000s
--- 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	105.207s
suite: browser.check~1of13 took 119s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m49.520000s 0m14.670000s
--- 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	108.659s
suite: browser.check~2of13 took 122s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m50.940000s 0m13.730000s
--- 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	103.537s
suite: browser.check~3of13 took 118s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m42.380000s 0m11.740000s
--- 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	104.474s
suite: browser.check~4of13 took 117s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m54.180000s 0m16.120000s
--- 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	95.075s
suite: browser.check~5of13 took 108s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m40.990000s 0m14.120000s
--- 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	93.941s
suite: browser.check~6of13 took 108s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m42.960000s 0m14.150000s
--- 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	97.260s
suite: browser.check~7of13 took 112s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m43.510000s 0m13.400000s
--- 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	106.069s
suite: browser.check~8of13 took 119s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.600000s 0m15.940000s
--- 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	87.563s
suite: browser.check~9of13 took 102s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m30.900000s 0m9.780000s
--- 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	94.292s
suite: browser.check~10of13 took 108s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m38.810000s 0m12.450000s
--- 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	96.395s
suite: browser.check~11of13 took 111s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m43.320000s 0m14.610000s
--- 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	98.540s
suite: browser.check~12of13 took 112s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.620000s 0m15.540000s
--- 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	94.775s
suite: browser.check~13of13 took 109s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m38.160000s 0m11.020000s
--- 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	53.698s
suite: browser.internal.gallery~1of18 took 66s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.170000s 0m3.750000s
--- 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	58.099s
suite: browser.internal.gallery~2of18 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.990000s 0m2.620000s
--- 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	70.800s
suite: browser.internal.gallery~3of18 took 83s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.150000s 0m4.110000s
--- 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	63.037s
suite: browser.internal.gallery~4of18 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.550000s 0m2.970000s
--- 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	77.147s
suite: browser.internal.gallery~5of18 took 89s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.350000s 0m5.520000s
--- 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	68.108s
suite: browser.internal.gallery~6of18 took 81s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.420000s 0m3.890000s
--- 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	66.627s
suite: browser.internal.gallery~7of18 took 78s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.310000s 0m2.850000s
--- 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	72.863s
suite: browser.internal.gallery~8of18 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m18.710000s 0m4.690000s
--- 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	86.560s
suite: browser.internal.gallery~9of18 took 99s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m23.420000s 0m7.520000s
--- 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	72.486s
suite: browser.internal.gallery~10of18 took 84s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.700000s 0m2.720000s
--- 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	72.874s
suite: browser.internal.gallery~11of18 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.970000s 0m2.970000s
--- 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	86.589s
suite: browser.internal.gallery~12of18 took 98s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.290000s 0m5.130000s
--- 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	82.277s
suite: browser.internal.gallery~13of18 took 95s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.700000s 0m5.390000s
--- 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	86.744s
suite: browser.internal.gallery~14of18 took 99s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.020000s 0m5.570000s
--- 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	87.901s
suite: browser.internal.gallery~15of18 took 100s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.110000s 0m5.680000s
--- 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
--- FAIL: TestThePhoneIndexAndTheWayBack (3.32s)
    index_browser_test.go:179: day/en at 390px, scripts off: the Tab after Back lands on #nav-form, want the row after Form, nav-choices-and-actions
FAIL
FAIL	amadan.net/rastrillo/fiesta/internal/gallery	78.782s
FAIL
make[1]: *** [Makefile:234: browser.internal.gallery~16of18] Error 1
suite: browser.internal.gallery~16of18 took 91s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m17.350000s 0m4.480000s
make: *** [Makefile:76: suite] Error 2

amadan: step suite shard 40 of 48 failed: exit status 2
--- 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	81.634s
suite: browser.internal.gallery~17of18 took 94s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.850000s 0m5.580000s
--- 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	83.063s
suite: browser.internal.gallery~18of18 took 94s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m21.300000s 0m6.460000s
--- 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	47.180s
suite: browser.internal.gallery.history took 55s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m22.270000s 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-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	81.381s
suite: browser.internal.www~1of4 took 91s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m32.130000s 0m2.120000s
--- 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	86.722s
suite: browser.internal.www~2of4 took 97s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.040000s 0m2.700000s
--- 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	102.650s
suite: browser.internal.www~3of4 took 112s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m53.490000s 0m3.040000s
--- 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	94.168s
suite: browser.internal.www~4of4 took 104s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.090000s 0m3.100000s

amadan: job failed at step suite shard 40 of 48 — its output is above, not at the tail of this log
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": "默认标签",