Give TV cards roomy spacing and edge-straddling focus rings
Some checks failed
review/code-gpt Spacing review: progress-bar inset regression; rail transition focus invalidation

This commit is contained in:
justinzeus 2026-11-06 12:53:51 +01:00
parent 9e15dbee8c
commit c17447c528
18 changed files with 210 additions and 142 deletions

View file

@ -115,5 +115,6 @@ class HomeCaptureTest {
@Test fun st101_unratedEpisode() = capture("st-101", person = "mindel", row = "nu", column = 2)
@Test fun st102_filmTile() = capture("st-102", person = "mindel", row = "new", column = 4)
@Test fun st103_heroRatings() = capture("st-103")
@Test fun spacingNextUpFirstFocused() = capture("spacing-next-up", row = "nu")
@Test fun xHomeDiscoverStart() = capture("x-home-discover-start", row = "pk-m")
}

View file

@ -82,6 +82,14 @@ class LibraryCaptureTest {
@Test fun st112_cachedWhileDown() = capture("st-112", reachable = false, cached = true)
@Test fun st113_uncachedWhileDown() = capture("st-113", reachable = false)
@Test fun unsignedRatingsHidden() = capture("library-unsigned", ratings = false)
@Test fun spacingShowsFirstFocused() = capture("spacing-shows", "mindel", "shows")
@Test fun spacingLetterRailClearsFocusedFifthColumn() = capture("spacing-letter-rail") { grid ->
val original = grid.source
grid.source = List(200) { index ->
original[index % original.size].copy(id = "rail-$index", title = "${('A'.code + index / 10).toChar()} Title $index")
}
grid.index = 4
}
}
fun libraryFixture(): LibraryFixture = LibraryFixture(LibraryCaptureTest::class.java.getResourceAsStream("/wolfskin-library.json")!!.bufferedReader().use { it.readText() }, "/library/")

View file

@ -112,18 +112,25 @@ class LibraryKeysTest {
val titles = (0 until 200).map { index -> LibraryTitle("$index", "${('A'.code + index / 10).toChar()}Title $index", "movie") }
val grid = LibraryGridState("Movies", titles)
assertTrue(grid.railVisible)
grid.index = 5
grid.index = 4
grid.key(ShellKey.Right)
assertTrue(grid.inRail)
grid.key(ShellKey.Down)
assertEquals('B', grid.railLetter)
grid.key(ShellKey.Back)
assertEquals(5, grid.index)
assertEquals(4, grid.index)
assertFalse(grid.inRail)
grid.key(ShellKey.Down)
assertEquals(9, grid.index)
grid.key(ShellKey.Up)
assertEquals(4, grid.index)
grid.key(ShellKey.Right); grid.key(ShellKey.Down); grid.key(ShellKey.Ok)
assertEquals('B', grid.focusedTitle!!.letter)
grid.source = titles.take(199)
assertFalse(grid.railVisible)
grid.index = 4
grid.key(ShellKey.Right)
assertEquals(5, grid.index)
grid.source = titles; grid.sort = 1
assertFalse(grid.railVisible)
}

View file

@ -1,6 +1,6 @@
{
"id": "library",
"title": "Libraries: Movies, Shows, Anime (one continuous 6-column grid)",
"title": "Libraries: Movies, Shows, Anime (continuous grid; five columns with letter rail)",
"specSection": "6.4",
"source": "index.html:1403-1426, 1563-1611",
"layout": [
@ -22,7 +22,7 @@
"token": null,
"title": "",
"yPx": 236,
"heightPx": 104,
"heightPx": 136,
"cards": null,
"focusable": true,
"endsInSeeAll": false,
@ -33,8 +33,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 340,
"heightPx": 488,
"yPx": 372,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -45,8 +45,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 828,
"heightPx": 488,
"yPx": 896,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -57,8 +57,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 1316,
"heightPx": 488,
"yPx": 1420,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -69,8 +69,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 1804,
"heightPx": 488,
"yPx": 1944,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -81,8 +81,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 2292,
"heightPx": 488,
"yPx": 2468,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -93,8 +93,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 2780,
"heightPx": 488,
"yPx": 2992,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -105,8 +105,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 3268,
"heightPx": 488,
"yPx": 3516,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -117,8 +117,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 3756,
"heightPx": 488,
"yPx": 4040,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -129,8 +129,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 4244,
"heightPx": 488,
"yPx": 4564,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -141,8 +141,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 4732,
"heightPx": 488,
"yPx": 5088,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -153,8 +153,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 5220,
"heightPx": 488,
"yPx": 5612,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -165,8 +165,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 5708,
"heightPx": 488,
"yPx": 6136,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -177,8 +177,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 6196,
"heightPx": 488,
"yPx": 6660,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,
@ -189,8 +189,8 @@
"type": "grid",
"token": "poster",
"title": "",
"yPx": 6684,
"heightPx": 488,
"yPx": 7184,
"heightPx": 524,
"cards": 6,
"focusable": true,
"endsInSeeAll": false,