Tier 3Tier 3 · Roku. Conversion is a dialog panel from the same family as continue watching: DialogStyle.brs scrim, fill and shadow, one secondary action button. The 5s status poll and the progress bar live in VideoConversionStatus.brs.DesignTokens.brs · scrim · surface · primary · border · textMuted
Conversion statusshared/VideoConversionStatuscustom, from tokens
Shown when need_convert is set, before the player. The channel POSTs /files/:id/mp4, then polls every 5 seconds. A spinner holds the middle slot until the API reports percent_done; then the 672x9 progress bar takes over. On completion the converted file is refetched and playback continues.
Preparing video
Seinfeld.S09E23.The.Finale.Part.2.720p.HDTV.x264-FLEET.mkv
Converting your video...
Cancel
Converting · 62%Progress at [66,201]: border track, primary fill at 672 × percent/100. Status recentres per state
panel[558,330] 804x420 on surface, shadow offset 12, no border (the border rectangles ship hidden)
title / filePreparing video h1 45 at [66,54] · raw filename small 33 textMuted, 2-line budget
middle slotspinner 88x88 centred until percent_done exists, then the 672x9 bar. Never both
status linebody 36 textMuted, centred: Starting conversion... · Waiting to convert... · Converting your video... · Conversion complete. · failures as sentences
button324x63 secondary, always focused: Cancel normally, Retry after an error. OK cancels or retries; Back dismisses
poll5s timer on GET /files/:id/mp4; COMPLETED refetches the file and raises completed
tier-4 twintv-p05-conversion: same decision, PreVideoPrompt skeleton, percentage as text, no cancel
Do not repurpose the continue-watching panel metrics here: this panel is 804x420 with 66px insets and one button, that one is 822x504 with 48px insets and two. They are siblings, not the same component.
Contract: platforms/roku/DESIGN.md · source: VideoConversionStatus.xml, VideoConversionStatus.brs, DialogStyle.brs