Wave 5a building blocks under the Seerr-inspired Plex enrichment (E5).
Carousel (frontend/src/components/Carousel.tsx): the one horizontal-rail
component, replacing the hand-rolled `flex overflow-x-auto` strips and the
home of the future Plex-Discover rows. Edge-fade mask, hover/focus scroll
buttons that appear only on the clipped side (useHScroll — the X-axis twin
of useScrollFade, same watch-the-children discipline), native scrollbar
hidden behind .no-scrollbar, reduced-motion-aware paging. First consumers:
CastStrip + RelatedStrip now scroll inside it (dedup + free affordances).
New i18n: common.seeAll / scrollLeft / scrollRight (en+hu).
Card-art serializer (backend/app/plex/cards.py): movie_card + show_card now
emit `art` (the wide backdrop, /api/plex/image/{rk}?variant=art) so rails and
the crossfading hero get a landscape image with no per-item fetch — gated on
art_key so an art-less item stays null and falls back to the poster. FE type
PlexCard.art?.
Tests: Carousel.dom.test (children/header/see-all, clipped-edge buttons +
paging), test_plex_cards (art present/absent by art_key). Added a
ResizeObserver stub to PlexPersonView.dom.test (it renders CastStrip, now a
Carousel consumer).
Gate: tsc x3 / eslint / prettier / knip / vitest 324 green; ruff green;
backend test lane (docker-compose.test.yml) green on the plex card tests.
27 lines
971 B
JSON
27 lines
971 B
JSON
{
|
|
"privacyPolicy": "Privacy Policy",
|
|
"termsOfService": "Terms of Service",
|
|
"sourceCode": "Source code",
|
|
"close": "Close",
|
|
"cancel": "Cancel",
|
|
"confirm": "Confirm",
|
|
"confirmTitle": "Are you sure?",
|
|
"save": "Save",
|
|
"undo": "Undo",
|
|
"redo": "Redo",
|
|
"loading": "Loading…",
|
|
"language": "Language",
|
|
"somethingWrong": "Something went wrong.",
|
|
"accessRequestsTitle": "Access requests",
|
|
"accessRequestsMessage": "{{count}} pending — review them on the Users page.",
|
|
"accessRequestsReview": "Review",
|
|
"demoTitle": "Demo account",
|
|
"demoSharedNotice": "You're in the shared demo account. Everything you do here — playlists, hidden videos, settings — is communal and may be changed by other demo visitors at the same time.",
|
|
"backToTop": "Back to top",
|
|
"retry": "Retry",
|
|
"loadError": "Couldn't load this — check your connection and try again.",
|
|
"seeAll": "See all",
|
|
"scrollLeft": "Scroll left",
|
|
"scrollRight": "Scroll right"
|
|
}
|