feat(web): add sidebar browse, bottom nav, and now-playing tiles - #835
Open
rahul-singh-solanki wants to merge 5 commits into
Open
rahul-singh-solanki wants to merge 5 commits into
rahul-singh-solanki wants to merge 5 commits into
Conversation
Define shared navigation, card, sidebar, and mobile layout styles. Regenerate the committed Tailwind output from the updated source.
Replace per-channel suppression with one global acknowledgement. Remove redundant suppression controls from channel and player modals.
Move quality, language, and category controls into a reusable sidebar. Persist selections in cookies so server-rendered grids start filtered.
Redesign channel cards around live metadata and lazy EPG hydration. Use the same safe card builder for home and similar-channel grids.
Add Home, Search, and Browse controls across mobile screens. Improve player, catchup, and premium-provider responsive layouts.
rahul-singh-solanki
force-pushed
the
feat/web-tv-ui
branch
from
September 16, 2026 10:46
d8c3aa8 to
232343d
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The web UI put search, quality, categories, and languages in a crowded bar above the grid, and channel cards showed only a logo and a name. This PR reorganises the layout into something closer to a TV app: a persistent sidebar on desktop that becomes a drawer on mobile, a bottom tab bar for small screens, and channel cards that show what is airing right now. The filter selection is also written to a cookie so the first server render is already filtered instead of flashing an unfiltered grid.
Changes
22 files changed
web/views/sidebar.htmlcategory_sidebartemplate: quality/language/category pickers with a single Apply, static column on desktop and off-canvas drawer on mobileweb/views/bottom_nav.htmlbottom_navtemplate: Home / Search / Browse tabs, hidden atmdand aboveweb/static/internal/bottom_nav.jswindow.toggleSidebar; Home tab highlighted only on/web/static/internal/now_tiles.jsIntersectionObserver-driven per-card EPG fetch that fills the "Now:" line; exposeswindow.hydrateNowTiles()for dynamically added cardsweb/static/internal/channels.jsweb/static/internal/epg.jsbuildChannelCard, using DOM APIs for untrusted names, then hydrate favourites, catchup and now-playing stateweb/static/internal/utils.jsisSubscriptionWarningDismissed/dismissSubscriptionWarning) instead of per-channel suppressionweb/static/internal/index.jsdata-channel-nameinstead of scraping the card's bold text, which no longer existsweb/static/internal/input.csshas-bottom-navspacingweb/static/internal/tailwind.cssnpm run buildweb/views/index.htmlnow_tiles.jsandbottom_nav.jsweb/views/channel_list.htmldata-channel-nameweb/views/navbar.htmlweb/views/play.htmlchannels.jsandnow_tiles.jsweb/views/catchup.html,web/views/catchup_player.html,web/views/premium_provider.htmlhas-bottom-navspacing, and theme-aware colours replacing hardcoded greysweb/views/styling.html,web/views/footer.htmlinternal/handlers/handlers.goqualityOptionsso/playcan render the same picker; readlanguage/categoryfrom cookies when no query param is presentweb/test/channels_filter_scope.test.js/vs/play, cookie write/clear, redirect-once behaviour, and drawer togglingweb/test/play.test.jsKey Implementation Details
/playit routes back to/with the filter applied rather than reloading the player.IndexHandlerfalls back to that cookie, so a returning user gets a filtered first paint. When saved state and cookie disagree the page reloads exactly once, guarded inchannels.js.buildChannelCardinepg.jsmirrorschannel_list.htmlso Similar Channels and the home grid stay visually identical; channel names go throughtextContent/attributes, neverinnerHTML.rootMargin: 200px), since there is no bulk now-playing feed; cards without EPG simply keep the line hidden.Screenshots
Test Areas
/and does not restart playbackVerification
go test ./...cd web && npm test -- --watchAll=false --ci(12 suites, 143 tests)npm run buildfor the regeneratedtailwind.cssserverun at 1440×900 and 390×844