diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index e21c5b61..f794cb9a 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -792,7 +792,10 @@ "logosLabel": "Image logos", "carouselView": "Carousel view", "carouselViewDescription": "Display your currently watching and bookmark sections as carousels instead of a grid. Disabled by default.", - "carouselViewLabel": "Carousel view" + "carouselViewLabel": "Carousel view", + "forceCompactEpisodeView": "Force compact episode view", + "forceCompactEpisodeViewDescription": "Force the episode carousel in the player to use the \"classic\" compact vertical view. Disabled by default.", + "forceCompactEpisodeViewLabel": "Compact episodes" } }, "connections": { diff --git a/src/backend/accounts/settings.ts b/src/backend/accounts/settings.ts index 88f7b747..dc747e62 100644 --- a/src/backend/accounts/settings.ts +++ b/src/backend/accounts/settings.ts @@ -18,6 +18,7 @@ export interface SettingsInput { enableDetailsModal?: boolean; enableImageLogos?: boolean; enableCarouselView?: boolean; + forceCompactEpisodeView?: boolean; sourceOrder?: string[]; enableSourceOrder?: boolean; proxyTmdb?: boolean; diff --git a/src/components/player/atoms/Episodes.tsx b/src/components/player/atoms/Episodes.tsx index ebebe778..945ff354 100644 --- a/src/components/player/atoms/Episodes.tsx +++ b/src/components/player/atoms/Episodes.tsx @@ -17,6 +17,7 @@ import { Menu } from "@/components/player/internals/ContextMenu"; import { useOverlayRouter } from "@/hooks/useOverlayRouter"; import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; +import { usePreferencesStore } from "@/stores/preferences"; import { useProgressStore } from "@/stores/progress"; import { hasAired } from "../utils/aired"; @@ -122,6 +123,9 @@ export function EpisodesView({ const descriptionRefs = useRef<{ [key: string]: HTMLParagraphElement | null; }>({}); + const forceCompactEpisodeView = usePreferencesStore( + (s) => s.forceCompactEpisodeView, + ); const isTextTruncated = (element: HTMLElement | null) => { if (!element) return false; @@ -248,7 +252,12 @@ export function EpisodesView({ content = (
{/* Horizontal scroll buttons */} -
+
diff --git a/src/pages/parts/settings/AppearancePart.tsx b/src/pages/parts/settings/AppearancePart.tsx index 62564d43..78dbf882 100644 --- a/src/pages/parts/settings/AppearancePart.tsx +++ b/src/pages/parts/settings/AppearancePart.tsx @@ -216,6 +216,9 @@ export function AppearancePart(props: { enableCarouselView: boolean; setEnableCarouselView: (v: boolean) => void; + + forceCompactEpisodeView: boolean; + setForceCompactEpisodeView: (v: boolean) => void; }) { const { t } = useTranslation(); @@ -389,6 +392,32 @@ export function AppearancePart(props: {

+ + {/* Force Compact Episode View */} +
+

+ {t("settings.appearance.options.forceCompactEpisodeView")} +

+

+ {t( + "settings.appearance.options.forceCompactEpisodeViewDescription", + )} +

+
+ props.setForceCompactEpisodeView(!props.forceCompactEpisodeView) + } + className={classNames( + "bg-dropdown-background hover:bg-dropdown-hoverBackground select-none my-4 cursor-pointer space-x-3 flex items-center max-w-[25rem] py-3 px-4 rounded-lg", + "cursor-pointer opacity-100 pointer-events-auto", + )} + > + +

+ {t("settings.appearance.options.forceCompactEpisodeViewLabel")} +

+
+
{/* Second Column - Themes */} diff --git a/src/stores/preferences/index.tsx b/src/stores/preferences/index.tsx index bb7859b3..f470b777 100644 --- a/src/stores/preferences/index.tsx +++ b/src/stores/preferences/index.tsx @@ -11,6 +11,7 @@ export interface PreferencesStore { enableDetailsModal: boolean; enableImageLogos: boolean; enableCarouselView: boolean; + forceCompactEpisodeView: boolean; sourceOrder: string[]; enableSourceOrder: boolean; proxyTmdb: boolean; @@ -25,6 +26,7 @@ export interface PreferencesStore { setEnableDetailsModal(v: boolean): void; setEnableImageLogos(v: boolean): void; setEnableCarouselView(v: boolean): void; + setForceCompactEpisodeView(v: boolean): void; setSourceOrder(v: string[]): void; setEnableSourceOrder(v: boolean): void; setProxyTmdb(v: boolean): void; @@ -43,6 +45,7 @@ export const usePreferencesStore = create( enableDetailsModal: false, enableImageLogos: true, enableCarouselView: false, + forceCompactEpisodeView: false, sourceOrder: [], enableSourceOrder: false, proxyTmdb: false, @@ -88,6 +91,11 @@ export const usePreferencesStore = create( s.enableCarouselView = v; }); }, + setForceCompactEpisodeView(v) { + set((s) => { + s.forceCompactEpisodeView = v; + }); + }, setSourceOrder(v) { set((s) => { s.sourceOrder = v;