Tier 3Tier 3 · Roku. A custom HistoryListItem in a stock list. The event map knows ten types with per-type icon tints, but the screen filters to the two a remote can act on.DesignTokens.brs · primary · danger · textMuted · focus
Ten event types in the map, two on the screen
shouldShowHistoryEvent passes only transfer_completed and file_shared: rows a click can open. Errors, RSS notices and vouchers stay web-side. Source: History.brs, HistoryEvents.brs.
Rows stack the raw name over a date - detail caption. Semantic tint rides on the icon only: completed is primary yellow, incidental events are textMuted, errors are the map's only danger red.
put.io
History
9:41
Seinfeld.S09E23.The.Finale.Part.2.720p.HDTV.x264-FLEET.mkv
12 Aug 2026 - 1.20 GB
The.Wire.S03E04.Back.Burners.1080p.BluRay.x264-DEMAND.mkv
12 Aug 2026 - 3.42 GB
document-scan-march-2026.pdf
11 Aug 2026 - shared by another user
podcast_ep127_final_mixdown_v2.mp3
9 Aug 2026 - 72.4 MB
OKOpenBack
History · completed and shared onlySelecting a row fetches the file and navigates; the row shows its blinking spinner Poster while the fetch runs.
listtranslation="[102,189]" · rows [1716,120] · spacing 30 · nine-patch focus blended focus
row anatomyicon Poster 50 · title h2 36 over caption 27, stacked with 10px (vert LayoutGroup, unlike the shared ListItem)
title widthlistItemMainTextWidth(1716) = 1490, set by HistoryListItem.brs. The XML's 1336 is a dead default
icon assetscompleted (primary) · shared, upload, voucher (textMuted) · error, rss (danger). Asset names, not Phosphor names
captiondate - detail: size for transfers, shared by %s for shares
loadingscreen-level LoadingIndicator at 120x120 while /events/list runs
emptyEmptyState at [189,300] w1500: This is your history. It's currently empty. / You will see information here once things start happening.
unsupportedevents whose file cannot play open the file-not-supported AppDialog
Per-control detail, the token map and the full don't list live in platforms/roku/DESIGN.md.
Do not surface the full event stream, and do not tint a whole row for a semantic state. Colour rides on the 50px icon; title and caption stay text / textMuted.