Files
Netflin/Theme/Netflin.css
T
2026-10-14 14:04:31 +02:00

6284 lines
198 KiB
CSS

/*! Netflin: a Netflix-style theme for Jellyfin (Modern layout) */
@import url("https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@400;500;600;700;800&display=swap");
/* ═══════════════════════════════════════════════════════════════════════
* 1. Tokens
* ═══════════════════════════════════════════════════════════════════════ */
:root {
--nf-red: #e50914;
--nf-red-hover: #c11119;
--nf-bg: #101010;
--nf-bg-rgb: 16 16 16;
--nf-surface: #181818;
--nf-surface-2: #232323;
--nf-surface-3: #2f2f2f;
--nf-surface-4: #404040;
--nf-line: rgb(255 255 255 / 0.1);
--nf-outline: rgb(255 255 255 / 0.5);
--nf-text: #fff;
--nf-text-2: #e5e5e5;
--nf-text-dim: #b3b3b3;
--nf-text-mute: #8c8c8c;
--nf-fill-btn: rgb(109 109 110 / 0.7);
--nf-fill-btn-hover: rgb(109 109 110 / 0.4);
--nf-fill-disc: rgb(42 42 42 / 0.6);
--nf-fill-disc-hover: rgb(42 42 42 / 0.85);
--nf-fill-hover: rgb(255 255 255 / 0.08);
--nf-fill-panel: rgb(255 255 255 / 0.04);
--nf-fill-tag: rgb(255 255 255 / 0.12);
--nf-fill-white-hover: rgb(255 255 255 / 0.75);
--nf-fill-menu: rgb(24 24 24 / 0.96);
--nf-track: rgb(128 128 128 / 0.55);
--nf-scrim: rgb(0 0 0 / 0.7);
--nf-scrim-card: linear-gradient(0deg, rgb(0 0 0 / 0.75), rgb(0 0 0 / 0) 60%);
--nf-field-bg: rgb(22 22 22 / 0.7);
--nf-field-line: rgb(128 128 128 / 0.7);
--nf-field-line-hover: rgb(255 255 255 / 0.7);
--nf-success: #46d369;
--nf-warning: #e87c03;
--nf-error: #eb3942;
--nf-star: #f5c518;
--nf-font: "Inter", "Helvetica Neue", Helvetica, Arial, sans-serif;
--nf-font-brand: "Bebas Neue", var(--nf-font);
--nf-fs-h1: clamp(1.5rem, 1.1rem + 1.2vw, 2.25rem);
--nf-fs-h2: clamp(1.05rem, 0.7rem + 0.75vw, 1.5rem);
--nf-gutter: 3.3%;
--nf-radius-xs: 2px;
--nf-radius: 4px;
--nf-radius-lg: 6px;
--nf-shadow-1: 0 0.5em 1em -0.6em rgb(0 0 0 / 0.9);
--nf-shadow-2: 0 3px 10px rgb(0 0 0 / 0.75);
--nf-shadow-3: 0 1.5rem 3rem rgb(0 0 0 / 0.7);
--nf-shadow-disc: 0 1px 2px rgb(0 0 0 / 0.3), 0 6px 18px -4px rgb(0 0 0 / 0.55);
--nf-shadow-disc-hover: 0 1px 2px rgb(0 0 0 / 0.3), 0 10px 24px -6px rgb(0 0 0 / 0.65);
--nf-ease: cubic-bezier(0.5, 0, 0.1, 1);
--nf-ease-out: cubic-bezier(0.2, 0, 0, 1);
--nf-dur-1: 150ms;
--nf-dur-2: 250ms;
--nf-dur-3: 400ms;
--nf-focus: 2px solid #fff;
--nf-focus-offset: 2px;
--nf-icon-play: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.67 4.5 20.67 12 7.67 19.5Z' fill='%23000' stroke='%23000' stroke-width='2.2' stroke-linejoin='round'/%3E%3C/svg%3E");
}
/* ── Jellyfin palette ────────────────────────────────────────────────────── */
:root,
:root[data-theme] {
--jf-palette-background-default: var(--nf-bg);
--jf-palette-background-defaultChannel: var(--nf-bg-rgb);
--jf-palette-background-paper: var(--nf-surface);
--jf-palette-background-paperChannel: 24 24 24;
--jf-palette-AppBar-defaultBg: var(--nf-bg);
--jf-palette-AppBar-transparentBg: transparent;
--jf-palette-text-primary: var(--nf-text);
--jf-palette-text-primaryChannel: 255 255 255;
--jf-palette-text-secondary: var(--nf-text-dim);
--jf-palette-text-secondaryChannel: 179 179 179;
--jf-palette-primary-main: var(--nf-red);
--jf-palette-primary-mainChannel: 229 9 20;
--jf-palette-primary-light: var(--nf-red-hover);
--jf-palette-primary-dark: var(--nf-red-hover);
--jf-palette-primary-contrastText: #fff;
--jf-palette-secondary-main: var(--nf-red);
--jf-palette-secondary-mainChannel: 229 9 20;
--jf-palette-secondary-contrastText: #fff;
--jf-palette-error-light: var(--nf-red);
--jf-palette-error-main: var(--nf-error);
--jf-palette-error-mainChannel: 235 57 66;
--jf-palette-warning-main: var(--nf-warning);
--jf-palette-warning-mainChannel: 232 124 3;
--jf-palette-success-main: var(--nf-success);
--jf-palette-success-mainChannel: 70 211 105;
--jf-palette-info-main: #6d6d6e;
--jf-palette-info-mainChannel: 109 109 110;
--jf-palette-TableCell-border: var(--nf-line);
--jf-palette-Avatar-defaultBg: var(--nf-surface-3);
--jf-palette-LinearProgress-primaryBg: var(--nf-track);
--jf-palette-LinearProgress-secondaryBg: var(--nf-track);
--jf-palette-LinearProgress-errorBg: var(--nf-track);
--jf-palette-LinearProgress-infoBg: var(--nf-track);
--jf-palette-LinearProgress-successBg: var(--nf-track);
--jf-palette-LinearProgress-warningBg: var(--nf-track);
--jf-palette-divider: var(--nf-line);
--jf-palette-action-hover: var(--nf-fill-hover);
--jf-palette-action-focus: rgb(255 255 255 / 0.12);
--jf-palette-FilledInput-bg: var(--nf-field-bg);
--jf-palette-FilledInput-hoverBg: var(--nf-field-bg);
--jf-palette-FilledInput-borderColor: var(--nf-field-line);
--jf-palette-Button-inheritContainedBg: var(--nf-fill-btn);
--jf-palette-Button-inheritContainedHoverBg: var(--nf-fill-btn-hover);
--jf-palette-SnackbarContent-bg: var(--nf-surface-2);
--jf-palette-SnackbarContent-color: var(--nf-text-2);
--jf-card-borderRadius: var(--nf-radius);
}
/* ═══════════════════════════════════════════════════════════════════════
* 2. Base
* ═══════════════════════════════════════════════════════════════════════ */
html,
body,
.backgroundContainer,
.mainDrawer,
.dialog {
background-color: var(--nf-bg);
}
html {
font-family: var(--nf-font);
color: var(--nf-text-2);
}
body,
h1, h2, h3, h4, h5, h6,
button, input, select, textarea,
.emby-button,
[class*="Mui"]:not(.MuiIcon-root, .material-icons) {
font-family: var(--nf-font);
}
* {
scrollbar-width: none;
}
::-webkit-scrollbar {
display: none;
}
::selection {
background: var(--nf-red);
color: #fff;
}
body {
position: relative;
}
body::before {
content: "";
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: calc(env(safe-area-inset-bottom) + 5em);
background: linear-gradient(to top, var(--nf-bg) 0%, transparent 100%);
z-index: 100;
pointer-events: none;
}
/* ═══════════════════════════════════════════════════════════════════════
* 3. App bar
* ═══════════════════════════════════════════════════════════════════════ */
.MuiAppBar-root.MuiAppBar-colorTransparent,
.MuiAppBar-root.MuiAppBar-colorDefault {
background: transparent;
box-shadow: none;
border: 0;
color: var(--nf-text-2);
transition: background-color var(--nf-dur-3) var(--nf-ease-out);
}
.MuiAppBar-root.MuiAppBar-colorTransparent {
background-image: linear-gradient(180deg, rgb(0 0 0 / 0.7) 10%, transparent);
}
.MuiAppBar-root.MuiAppBar-colorDefault {
background-color: rgb(var(--nf-bg-rgb) / 0.72);
-webkit-backdrop-filter: blur(18px) saturate(1.4);
backdrop-filter: blur(18px) saturate(1.4);
}
/* ── Nav links ───────────────────────────────────────────────────────────── */
.MuiAppBar-root .MuiStack-root > .MuiButton-root {
background: none !important;
color: var(--nf-text-2);
font-size: 0.875rem;
font-weight: 400;
letter-spacing: normal;
text-transform: none;
min-width: 0;
padding: 0.25rem 0;
flex: none;
margin-inline: 0 1.25rem;
white-space: nowrap;
transition: color var(--nf-dur-3) var(--nf-ease-out);
}
@media (max-width: 60em) {
.MuiAppBar-root .MuiToolbar-root:has(> .MuiStack-root > .MuiButton-root) {
flex-wrap: nowrap;
}
.MuiAppBar-root .MuiToolbar-root > .MuiStack-root:has(> .MuiButton-root) {
flex: 1 1 auto;
min-width: 0;
overflow-x: auto;
scrollbar-width: none;
}
}
@media (max-width: 36em) {
.MuiAppBar-root .MuiToolbar-root:has(> .MuiStack-root > .MuiButton-root) {
flex-wrap: wrap;
}
.MuiAppBar-root .MuiToolbar-root > .MuiStack-root:has(> .MuiButton-root) {
order: 1;
flex-basis: 100%;
padding-bottom: 0.25rem;
}
.MuiAppBar-root .MuiToolbar-root > .MuiStack-root > .MuiButton-root:has(.MuiButton-startIcon > img) {
position: absolute; /* out of the scrolling links, onto the icons' row */
top: 0;
height: var(--nf-appbar);
}
.MuiAppBar-root .MuiToolbar-root > .MuiStack-root:has(> .MuiButton-root) + .MuiBox-root {
margin-left: auto;
}
}
.MuiAppBar-root .MuiStack-root > .MuiButton-root:hover {
color: var(--nf-text-dim);
}
.MuiAppBar-root .MuiStack-root > .MuiButton-root .MuiButton-startIcon {
display: none;
}
.MuiAppBar-root .MuiStack-root > .MuiButton-textPrimary {
color: var(--nf-text) !important;
font-weight: 700;
}
.MuiAppBar-root .MuiStack-root > .MuiButton-root .MuiTouchRipple-root {
display: none;
}
/* ── Brand ───────────────────────────────────────────────────────────────── */
.MuiAppBar-root .MuiStack-root > .MuiButton-root:has(.MuiButton-startIcon > img) {
font-size: 0 !important;
margin-right: 2.5rem;
}
.MuiAppBar-root .MuiStack-root > .MuiButton-root:has(.MuiButton-startIcon > img)::before,
.MuiDrawer-paper > .MuiBox-root > .MuiList-root:first-child > li:first-child > a::before {
content: "JELLYFIN";
color: var(--nf-red);
font: 400 2.25rem/1 var(--nf-font-brand);
letter-spacing: 0.02em;
filter: drop-shadow(0 1px 6px rgb(0 0 0 / 0.35));
}
/* ── Icons and avatar ────────────────────────────────────────────────────── */
.MuiAppBar-root .MuiIconButton-root {
color: var(--nf-text);
}
.MuiAppBar-root .MuiIconButton-root:hover {
background: var(--nf-fill-hover);
}
.MuiAppBar-root .MuiAvatar-root,
.MuiAppBar-root .MuiToolbar-root > .MuiBox-root:last-child img {
border-radius: var(--nf-radius);
}
.MuiAppBar-root .MuiAvatar-root {
width: 1.75rem;
height: 1.75rem;
}
.MuiAppBar-root .MuiIconButton-root:has(> .MuiAvatar-root) {
padding: 0.4rem;
}
/* ── User menu ───────────────────────────────────────────────────────────── */
:is(#app-user-menu, #library-view-menu) .MuiMenu-paper {
min-width: 13.5rem;
margin-top: 0.4rem;
}
/* ── Library toolbar ─────────────────────────────────────────────────────── */
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) {
padding-bottom: 1rem;
}
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) > .MuiStack-root > .MuiButtonGroup-text ~ .MuiButtonGroup-text {
align-items: center;
gap: 0.5rem;
margin-left: 0.75rem;
}
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) > .MuiStack-root > .MuiButtonGroup-text ~ .MuiButtonGroup-text > .MuiButton-root {
box-sizing: border-box;
width: 2rem;
min-width: 0;
height: 2rem;
padding: 0;
border-radius: 50%;
}
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) > .MuiStack-root > .MuiButtonGroup-text ~ .MuiButtonGroup-text > .MuiButton-root:disabled {
opacity: 0.35;
}
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) > .MuiButton-root {
color: var(--nf-text);
font-size: 2.1rem;
font-weight: 700;
letter-spacing: -0.01em;
text-transform: none;
padding-left: 0;
background: none;
}
/* ═══════════════════════════════════════════════════════════════════════
* 4. Buttons, fields, menus, dialogs
* ═══════════════════════════════════════════════════════════════════════ */
/* ── Focus ───────────────────────────────────────────────────────────────── */
:is(a, button, [tabindex], .card, .listItem, .emby-tab-button):focus-visible {
outline: var(--nf-focus);
outline-offset: var(--nf-focus-offset);
}
/* ── Buttons ─────────────────────────────────────────────────────────────── */
.MuiButton-root {
text-transform: none;
border-radius: var(--nf-radius);
}
.MuiButton-containedPrimary,
.button-submit {
font-weight: 700;
box-shadow: none;
}
.button-submit:focus {
background: var(--nf-red-hover);
}
.raised,
.fab,
.button-submit,
.button-delete,
.emby-button.raised {
border-radius: var(--nf-radius);
}
.raised:not(.button-submit, .button-delete),
.raised:not(.button-submit, .button-delete):focus,
.dashboardDocument .mainAnimatedPage .MuiButton-containedError {
background: var(--nf-fill-btn);
color: var(--nf-text);
}
.raised:not(.button-submit, .button-delete):hover,
.dashboardDocument .mainAnimatedPage .MuiButton-containedError:hover {
background: var(--nf-fill-btn-hover);
}
.button-flat.button-flat:hover,
.button-link.button-link {
color: inherit;
}
.button-flat:not(.detailButton, .cardOverlayButton):hover {
color: var(--nf-text);
}
.raised:is(.button-cancel, .btnCancel),
.raised:is(.button-cancel, .btnCancel):focus,
.upNextDialog .upNextDialog-button.btnHide,
body .sections.watchlist :is(.sort-button, .show-all-btn) {
background: transparent;
box-shadow: inset 0 0 0 1px var(--nf-outline);
color: var(--nf-text);
}
.raised:is(.button-cancel, .btnCancel):hover,
.upNextDialog .upNextDialog-button.btnHide:hover,
body .sections.watchlist :is(.sort-button, .show-all-btn):hover {
background: var(--nf-fill-hover);
box-shadow: inset 0 0 0 1px #fff;
}
:is(.formDialogContent, .dashboardDocument .mainAnimatedPage) .fab,
.mainDetailButtons .detailButton,
body #slides-container :is(.detail-button, .favorite-button, .watchlist-button, .arrow),
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) > .MuiStack-root > .MuiButtonGroup-text ~ .MuiButtonGroup-text > .MuiButton-root,
.skip-button {
border: 2px solid var(--nf-outline);
background: var(--nf-fill-disc);
color: var(--nf-text);
}
:is(.formDialogContent, .dashboardDocument .mainAnimatedPage) .fab:hover,
.mainDetailButtons .detailButton:hover,
body #slides-container :is(.detail-button, .favorite-button, .watchlist-button, .arrow):hover,
.MuiAppBar-root > .MuiToolbar-root:nth-child(2) > .MuiStack-root > .MuiButtonGroup-text ~ .MuiButtonGroup-text > .MuiButton-root:not(:disabled):hover,
.skip-button:hover {
border-color: #fff;
background: var(--nf-fill-disc-hover);
color: var(--nf-text);
}
.MuiAppBar-root .MuiButtonGroup-contained {
gap: 0.5rem;
box-shadow: none;
}
.MuiAppBar-root .MuiButtonGroup-contained > .MuiButton-containedPrimary {
border: 0 !important;
border-radius: var(--nf-radius) !important;
background: var(--nf-fill-btn);
color: #fff;
transition: background-color var(--nf-dur-1) var(--nf-ease-out);
}
.MuiAppBar-root .MuiButtonGroup-contained > .MuiButton-containedPrimary:hover {
background: var(--nf-fill-btn-hover);
}
.MuiAppBar-root .MuiButtonGroup-contained > .MuiButton-containedPrimary:first-child,
.upNextDialog .upNextDialog-button.btnStartNow {
background: #fff;
color: #000;
}
.MuiAppBar-root .MuiButtonGroup-contained > .MuiButton-containedPrimary:first-child:hover,
.upNextDialog .upNextDialog-button.btnStartNow:hover {
background: var(--nf-fill-white-hover);
}
.paper-icon-button-light:hover:not(:disabled),
.paper-icon-button-light:active:not(:disabled) {
background-color: var(--nf-fill-hover);
color: var(--nf-text);
}
/* ── Chips ───────────────────────────────────────────────────────────────── */
.MuiChip-root.MuiChip-filledDefault {
height: 1.6rem;
border-radius: var(--nf-radius-xs);
background: var(--nf-fill-tag);
color: var(--nf-text-2);
font-size: 0.75rem;
font-weight: 600;
}
.MuiChip-root.MuiChip-filledDefault .MuiChip-label {
padding: 0 0.55em;
}
/* ── Filter chips ────────────────────────────────────────────────────────── */
.dashboardDocument .MuiToggleButtonGroup-root .MuiToggleButton-root.MuiToggleButton-root,
.dashboardDocument .MuiChip-root.MuiChip-clickable.MuiChip-clickable,
#searchPage .smart-search-btn,
body .sections.watchlist .stats-range-chip,
.verticalSection .scrollSlider > a.emby-button.raised {
height: 2rem;
border: 1px solid var(--nf-line);
border-radius: var(--nf-radius);
background: var(--nf-surface-2);
color: var(--nf-text-2);
font-size: 0.875rem;
font-weight: 500;
}
.dashboardDocument .MuiToggleButtonGroup-root .MuiToggleButton-root.MuiToggleButton-root:hover,
.dashboardDocument .MuiChip-root.MuiChip-clickable.MuiChip-clickable:hover,
#searchPage .smart-search-btn:hover,
body .sections.watchlist .stats-range-chip:hover,
.verticalSection .scrollSlider > a.emby-button.raised:hover {
background: var(--nf-surface-3);
color: var(--nf-text);
}
.dashboardDocument .MuiToggleButtonGroup-root .MuiToggleButton-root.MuiToggleButton-root.Mui-selected,
.dashboardDocument .MuiChip-root.MuiChip-clickable.MuiChip-colorPrimary,
#searchPage .smart-search-btn.active,
body .sections.watchlist .stats-range-chip.is-active {
border-color: #fff;
background: #fff;
color: #000;
}
.dashboardDocument .MuiToggleButtonGroup-root .MuiToggleButton-root.MuiToggleButton-root,
#searchPage .smart-search-btn {
margin: 0;
padding: 0 0.875rem;
text-transform: none;
}
/* ── Panels ──────────────────────────────────────────────────────────────── */
.formDialogContent .paperList,
.formDialog .mediaInfoStream,
.trackSelections,
#itemDetailPage .programGuide .vertical-list,
.dashboardDocument .mainAnimatedPage :is(.MuiPaper-root, .MuiCard-root):not(.MuiAlert-root, .MuiAppBar-root),
.dashboardDocument .mainAnimatedPage .MuiList-root:not(.MuiPaper-root *),
.MuiAlert-root.MuiAlert-standard,
.dashboardDocument .mainAnimatedPage .checkboxList.paperList,
body .sections.watchlist .progress-card,
body .sections.watchlist .progress-card-completed,
body .sections.watchlist :is(.stat-card, .top-shows-container, .stats-chart-card, .stats-list-card) {
border: 1px solid var(--nf-line);
border-radius: var(--nf-radius-lg);
background: var(--nf-fill-panel);
box-shadow: none;
}
/* ── Fields ──────────────────────────────────────────────────────────────── */
.emby-input.emby-input, /* doubled: core's lazy chunks can load after */
.emby-textarea.emby-textarea,
.emby-select-withcolor.emby-select-withcolor,
.MuiInputBase-root.MuiFilledInput-root,
.dashboardDocument .mainAnimatedPage div:has(> .MuiInputBase-root:not(.MuiFilledInput-root, .MuiOutlinedInput-root, .MuiInput-root)) {
border: 1px solid var(--nf-field-line);
border-radius: var(--nf-radius);
background: var(--nf-field-bg);
color: var(--nf-text);
transition: border-color var(--nf-dur-1) var(--nf-ease-out), box-shadow var(--nf-dur-1) var(--nf-ease-out);
}
.emby-select-withcolor > option {
background: var(--nf-surface-2);
color: var(--nf-text);
}
:is(.emby-input, .emby-textarea, .emby-select-withcolor):not(:disabled, .detailTrackSelect):hover,
.MuiInputBase-root.MuiFilledInput-root:hover:not(.Mui-disabled),
.dashboardDocument .mainAnimatedPage div:has(> .MuiInputBase-root:not(.MuiFilledInput-root, .MuiOutlinedInput-root, .MuiInput-root)):hover {
border-color: var(--nf-field-line-hover);
}
:is(.emby-input, .emby-textarea, .emby-select-withcolor):not(.detailTrackSelect):focus,
.MuiInputBase-root.MuiFilledInput-root.Mui-focused,
.dashboardDocument .mainAnimatedPage div:has(> .MuiInputBase-root.Mui-focused:not(.MuiFilledInput-root, .MuiOutlinedInput-root, .MuiInput-root)) {
border-color: #fff !important;
box-shadow: 0 0 0 1px #fff;
outline: none;
}
.inputLabel.inputLabel,
.selectLabel.selectLabel,
.textareaLabel.textareaLabel,
.checkboxListLabel.checkboxListLabel,
.paperListLabel.paperListLabel {
color: var(--nf-text-2);
font-weight: 500;
}
.inputLabelFocused,
.selectLabelFocused,
.textareaLabelFocused {
color: var(--nf-text);
}
.fieldDescription {
color: var(--nf-text-mute);
margin-top: .75em;
}
/* ── Checkboxes ──────────────────────────────────────────────────────────── */
.checkboxOutline.checkboxOutline {
top: 50%;
translate: 0 -50%;
width: 1.25em;
height: 1.25em;
border: 1px solid var(--nf-field-line-hover);
border-radius: var(--nf-radius-xs);
background: transparent;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), border-color var(--nf-dur-1) var(--nf-ease-out);
}
.checkboxOutline > .checkboxIcon {
font-size: 1.05em;
}
.emby-checkbox-label:hover .checkboxOutline,
.emby-checkbox:focus:not(:checked) + span + .checkboxOutline {
border-color: #fff;
}
.emby-checkbox.emby-checkbox:checked + span + .checkboxOutline {
background-color: #fff;
border-color: #fff;
}
.emby-checkbox.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon {
color: #000;
}
.emby-checkbox:focus-visible + span + .checkboxOutline {
outline: var(--nf-focus);
outline-offset: var(--nf-focus-offset);
}
/* ── Menus ───────────────────────────────────────────────────────────────── */
.MuiPaper-root.MuiMenu-paper,
.MuiPaper-root.MuiPopover-paper,
.actionSheet,
.kefinTweaks-popover,
.playerStats,
.iconOsd,
.upNextContainer {
border: 1px solid var(--nf-line);
border-radius: var(--nf-radius-lg) !important;
background: var(--nf-fill-menu) !important;
-webkit-backdrop-filter: blur(20px) saturate(1.4) !important;
backdrop-filter: blur(20px) saturate(1.4) !important;
box-shadow: var(--nf-shadow-2) !important;
}
.MuiMenu-list,
.actionSheetContent {
padding: 0.375rem 0;
}
.actionSheetContent {
border: 0;
border-radius: 0;
background: none !important;
}
.MuiMenuItem-root,
.actionSheet .actionSheetMenuItem {
gap: 0;
min-height: 0;
margin: 0;
padding: 0.55rem 1rem;
color: var(--nf-text-2);
font-size: 0.875rem;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
.MuiMenuItem-root:hover,
.actionSheetMenuItem:hover {
background: var(--nf-fill-hover);
color: var(--nf-text);
}
.MuiMenuItem-root.Mui-selected,
.MuiMenuItem-root.Mui-selected:hover {
background: var(--nf-fill-hover);
color: var(--nf-text);
font-weight: 600;
}
:is(.MuiMenuItem-root, .actionSheetMenuItem) :is(.MuiListItemIcon-root, .actionsheetMenuItemIcon) {
min-width: 2rem;
margin: 0;
color: var(--nf-text-mute);
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
:is(.MuiMenuItem-root, .actionSheetMenuItem):hover :is(.MuiListItemIcon-root, .actionsheetMenuItemIcon) {
color: var(--nf-text);
}
.MuiMenu-list > .MuiDivider-root,
.actionSheet .actionsheetDivider {
margin: 0.375rem 0;
}
.MuiMenuItem-root .MuiTypography-root {
font-size: inherit;
font-weight: inherit;
}
:is(.MuiMenuItem-root, .actionSheetMenuItem) :is(.MuiListItemIcon-root > *, .actionsheetMenuItemIcon) {
font-size: 1.25rem;
}
.actionSheet .actionsheetMenuItemIcon {
margin: 0 !important;
}
.actionSheet .actionsheetListItemBody,
.actionSheet .actionSheetItemText {
padding: 0 !important;
font-size: inherit;
line-height: 1.3;
}
.actionSheet .actionSheetTitle {
margin: 0;
padding: 0.6rem 1rem 0.35rem;
}
.actionSheetMenuItem:has(.actionsheetMenuItemIcon.delete),
.actionSheetMenuItem:has(.actionsheetMenuItemIcon.delete) .actionsheetMenuItemIcon {
color: var(--nf-error);
}
.dialogBackdrop:has(+ .dialogContainer > .actionsheet-not-fullscreen) {
opacity: 0;
}
/* ── Dialogs ─────────────────────────────────────────────────────────────── */
.dialog:not(.actionSheet),
.formDialogHeader:not(.formDialogHeader-clear),
.formDialogFooter:not(.formDialogFooter-clear) {
background-color: var(--nf-surface);
}
.dialog:not(.actionSheet) {
box-shadow: var(--nf-shadow-3);
}
.dialog:not(.actionSheet, [class*="fullscreen"]) {
border-radius: var(--nf-radius-lg);
}
.dialogBackdropOpened {
opacity: 0.7;
}
/* ── Form dialogs ────────────────────────────────────────────────────────── */
.formDialogHeader:not(.formDialogHeader-clear) {
gap: 0.25rem;
padding: 1rem 1rem 1rem 1.5rem;
border-bottom: 1px solid var(--nf-line);
}
.formDialogHeader:not(.formDialogHeader-clear):has(> .btnCancel:first-child:not(.hide)) {
padding-left: 0.75rem;
}
.formDialogHeaderTitle {
margin: 0;
line-height: 1.3;
}
.formDialogHeader .paper-icon-button-light {
color: var(--nf-text-dim);
}
.formDialogHeader .paper-icon-button-light:hover {
color: var(--nf-text);
}
.formDialog .dialogContentInner {
padding-top: 1.5rem;
padding-left: 1.5rem;
padding-right: 1.5rem;
}
.formDialog .dialog-content-centered {
max-width: 42rem;
margin: 0;
}
@media (min-width: 80em) and (min-height: 45em) {
.dialog-small:has(.dialog-content-centered) {
width: min(47rem, 60%);
height: auto;
max-height: 80%;
}
.dialog-small:has(.dialog-content-centered) .dialog-content-centered {
padding-bottom: 1.5rem;
}
}
.formDialogFooter:not(.formDialogFooter-clear) {
justify-content: flex-end;
gap: 0.5rem;
padding: 1rem 1.5rem;
border-top: 1px solid var(--nf-line);
}
.formDialogFooter:not(.formDialogFooter-clear) > .formDialogFooterItem,
.formDialogFooter:not(.formDialogFooter-clear) > .raised {
flex: 0 0 auto;
width: auto; /* .emby-button.block is 100% */
min-width: 7rem;
margin: 0 !important; /* core: margin !important */
}
.formDialogContent h2 {
color: var(--nf-text);
font-size: 1.125rem;
font-weight: 700;
}
:is(.formDialogContent, .dashboardDocument .mainAnimatedPage) .fab {
width: 2rem;
height: 2rem;
margin: 0 0 0 0.5rem;
padding: 0;
border-radius: 50%;
transition: border-color var(--nf-dur-1) var(--nf-ease-out), background-color var(--nf-dur-1) var(--nf-ease-out);
}
:is(.formDialogContent, .dashboardDocument .mainAnimatedPage) .fab .material-icons {
font-size: 1.1rem;
}
.formDialogContent :is(.editableListviewContainer, .imageEditor-buttons) {
display: flex;
flex-wrap: wrap;
align-items: center;
}
.formDialogContent :is(.editableListviewContainer, .imageEditor-buttons) > h2 {
margin: 0;
}
.formDialogContent .editableListviewContainer > .paperList {
flex-basis: 100%;
}
.formDialogContent .paperList {
margin: 0.75rem 0 0;
padding: 0;
overflow: hidden;
}
.formDialogContent .paperList > .listItem + .listItem,
#itemDetailPage .programGuide .listItem + .listItem {
border-top: 1px solid var(--nf-line);
}
.formDialogContent .paperList .listItemBodyText:not(.secondary) {
color: var(--nf-text-2);
}
.formDialogContent .paperList .secondary {
color: var(--nf-text-mute);
}
.formDialogContent .paperList .listItem .paper-icon-button-light {
color: var(--nf-text-mute);
}
.formDialogContent .paperList .listItem .paper-icon-button-light:hover {
color: var(--nf-error);
}
.imageEditorCard .visualCardBox {
background: none;
box-shadow: none;
}
.imageEditorCard .cardFooter {
padding: 0.4rem 0 0;
background: none;
}
.imageEditorCard .cardFooter .paper-icon-button-light {
color: var(--nf-text-mute);
}
.imageEditorCard .cardFooter .paper-icon-button-light:hover {
color: var(--nf-text);
}
.formDialog .mediaInfoContent {
width: auto;
margin: 0;
}
.formDialog .mediaInfoStream {
width: min(100%, 22rem);
margin: 1rem 1rem 0 0;
padding: 0.25rem 1.25rem 1rem;
line-height: 1.6;
}
.formDialog .mediaInfoLabel {
color: var(--nf-text-mute);
font-weight: 500;
}
.formDialog .mediaInfoAttribute {
color: var(--nf-text-2);
}
.formDialog .mediaInfoContent .btnCopy {
color: var(--nf-text-mute);
}
.formDialog .mediaInfoContent .btnCopy:hover {
color: var(--nf-text);
}
/* ── Type ────────────────────────────────────────────────────────────────── */
#myPreferencesMenuPage .verticalSection:first-child > .headerUsername,
.dashboardDocument .mainAnimatedPage .MuiTypography-h1,
.dashboardDocument .content-primary > .verticalSection:first-child > .sectionTitleContainer > .sectionTitle,
body .sections.watchlist .tab-header h2 {
color: var(--nf-text);
font-size: var(--nf-fs-h1);
font-weight: 700;
letter-spacing: -0.02em;
}
.MuiDialog-paper .MuiDialogTitle-root,
.dashboardDocument .mainAnimatedPage .MuiTypography-h2,
.dashboardDocument .mainAnimatedPage h2.paperListLabel,
.userPreferencesPage form :is(.verticalSection > .sectionTitle, .MuiStack-root > h2.MuiTypography-h2),
.formDialogHeaderTitle {
color: var(--nf-text);
font-size: 1.25rem;
font-weight: 700;
}
.actionSheet .actionSheetTitle,
#myPreferencesMenuPage .verticalSection:not(:first-child) > .sectionTitle,
.MuiDrawer-paper .MuiListSubheader-root,
.playerStats .playerStats-stat-header > .playerStats-stat-label,
.upNextDialog .upNextDialog-nextVideoText,
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) .formDialogHeader + div > h2 {
color: var(--nf-text-mute);
font-size: 0.6875rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
}
/* ── Tooltips and notices ────────────────────────────────────────────────── */
.MuiTooltip-tooltip {
padding: 0.45rem 0.75rem;
border-radius: var(--nf-radius);
background: #fff;
color: #141414;
font: 700 0.8125rem/1.2 var(--nf-font);
box-shadow: var(--nf-shadow-2);
}
.MuiTooltip-arrow {
color: #fff;
}
.toast,
.MuiSnackbarContent-root {
border: 1px solid var(--nf-line);
border-radius: var(--nf-radius-lg);
box-shadow: var(--nf-shadow-2);
}
/* ═══════════════════════════════════════════════════════════════════════
* 5. Rows and cards
* ═══════════════════════════════════════════════════════════════════════ */
.sectionTitle,
.sectionTitle-cards {
color: var(--nf-text-2);
font-size: var(--nf-fs-h2);
font-weight: 700;
letter-spacing: -0.005em;
margin-bottom: 0.15em;
}
.sectionTitleTextButton,
a.more,
.sectionTitle a {
color: inherit;
}
/* ── Row titles ──────────────────────────────────────────────────────────── */
.sectionTitle.sectionTitle {
line-height: 1.35;
}
:is(.sectionTitleTextButton, a.more) > .material-icons,
a.clearLink > .sectionTitle + svg,
.sectionTitle .material-icons {
flex: none;
width: 1em;
height: 1em;
align-self: flex-start;
translate: 0 0.25em;
color: var(--nf-text-mute);
font-size: var(--nf-fs-h2);
transition: transform var(--nf-dur-2) var(--nf-ease), color var(--nf-dur-2) var(--nf-ease-out);
}
a.clearLink > .sectionTitle + svg {
padding: 0;
}
:is(.sectionTitleTextButton, a.more, a.clearLink) > .sectionTitle {
transition: color var(--nf-dur-2) var(--nf-ease-out);
}
:is(.sectionTitleTextButton, a.more, a.clearLink):is(:hover, :focus-visible) > .sectionTitle {
color: var(--nf-text);
}
:is(.sectionTitleTextButton, a.more):is(:hover, :focus-visible) > .material-icons,
a.clearLink:is(:hover, :focus-visible) > .sectionTitle + svg,
.sectionTitle a:is(:hover, :focus-visible) .material-icons,
#myPreferencesMenuPage a.listItem-border:hover .listItem::after,
.dashboardDocument a.MuiButton-root:has(> .MuiTypography-h3):is(:hover, :focus-visible) .MuiButton-endIcon {
color: var(--nf-text);
transform: translateX(0.2em);
}
.sectionTitleContainer > a.clearLink:has(> button.more) {
align-self: center;
margin: 0 0 0.15em 1em;
padding: 0;
}
.sectionTitleContainer > a.clearLink > button.more.raised {
display: flex;
align-items: center;
margin: 0;
padding: 0;
border: 0;
background: none;
box-shadow: none;
color: var(--nf-text-mute);
font-size: 0.875rem;
font-weight: 600;
transition: color var(--nf-dur-2) var(--nf-ease-out);
}
.sectionTitleContainer > a.clearLink > button.more.raised::after {
content: "\e5cc"; /* chevron_right */
font-family: "Material Icons";
font-size: 1.35em;
font-weight: 400;
line-height: 1;
transition: transform var(--nf-dur-2) var(--nf-ease);
}
.sectionTitleContainer > a.clearLink:is(:hover, :focus-visible) > button.more.raised {
color: var(--nf-text);
}
.sectionTitleContainer > a.clearLink:is(:hover, :focus-visible) > button.more.raised::after {
transform: translateX(0.2em);
}
/* ── Cards ───────────────────────────────────────────────────────────────── */
.cardScalable,
.cardImageContainer,
.cardPadder,
.cardContent,
.cardOverlayContainer,
.blurhash-canvas {
border-radius: var(--nf-radius);
}
.cardBox:not(.visualCardBox) .cardPadder {
background-color: var(--nf-surface-2);
}
.cardPadder .cardImageIcon {
color: #3a3a3a;
}
/* ── Loading skeleton ────────────────────────────────────────────────────── */
.card :is(.blurhash-canvas, .cardImageContainer > div:not([class]) > canvas) {
display: none;
}
.card:has(> .cardBox > .cardScalable .cardImageContainer > div:not([class]) > span) {
--nf-skeleton-clock: paused;
}
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)),
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)) * {
animation: nf-skeleton-inert 10s;
animation-play-state: var(--nf-skeleton-clock, running);
}
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)) .cardText {
width: fit-content;
max-width: 100%;
animation: nf-skeleton-text 10s;
animation-play-state: var(--nf-skeleton-clock, running);
}
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)) :is(.cardPadder > .cardImageIcon, .cardImageContainer > .indicators, .cardImageContainer > .MuiLinearProgress-root),
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)) .cardText::before {
animation: nf-skeleton-hide 10s;
animation-play-state: var(--nf-skeleton-clock, running);
}
@keyframes nf-skeleton-inert {
from, to { pointer-events: none; }
}
@keyframes nf-skeleton-hide {
from, to { opacity: 0; pointer-events: none; }
}
@keyframes nf-skeleton-text {
from, to {
pointer-events: none;
--kefin-card-title-color: transparent;
color: transparent;
background: linear-gradient(var(--nf-surface-2), var(--nf-surface-2)) 0 50% / 100% 0.85em no-repeat content-box;
}
}
@keyframes nf-skeleton {
50% { opacity: 0.45; }
}
@media (prefers-reduced-motion: no-preference) {
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)) .cardPadder {
animation: nf-skeleton 1.6s ease-in-out 6;
animation-play-state: var(--nf-skeleton-clock, running);
}
.card:has(> .cardBox > .cardScalable :is(.cardImageContainer > div:not([class]) > :is(span, img[style*="opacity: 0"]), .cardImageContainer.lazy-hidden)) .cardText {
animation: nf-skeleton-text 10s, nf-skeleton 1.6s ease-in-out 6;
animation-play-state: var(--nf-skeleton-clock, running);
}
}
.defaultCardBackground,
[class*="defaultCardBackground"] {
background-color: var(--nf-surface-2) !important;
}
.card.card:not(.show-animation) { /* core's paint containment clips the zoom */
contain: layout style;
}
/* ── Card hover ──────────────────────────────────────────────────────────── */
@media (hover: hover) and (pointer: fine) {
:is(.card-hoverable, .chapterCard) .cardBox {
transition: transform var(--nf-dur-3) var(--nf-ease);
}
:is(.card-hoverable, .chapterCard):hover {
z-index: 2;
position: relative;
}
:is(.card-hoverable, .chapterCard):hover .cardBox {
transform: scale(1.06);
}
:is(.card-hoverable, .chapterCard):hover .cardScalable {
box-shadow: 0 0 0 1px var(--nf-line), var(--nf-shadow-1);
}
}
.emby-scroller {
overflow-y: visible;
}
/* ── Card overlay ────────────────────────────────────────────────────────── */
.cardOverlayContainer {
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: flex-end;
justify-content: center;
gap: 0.25rem;
padding: 0.6rem;
background: var(--nf-scrim-card);
}
.cardOverlayContainer > .cardOverlayButton-br {
position: relative;
padding: 0;
}
.cardOverlayContainer > .cardImageContainer {
position: absolute;
inset: 0;
width: auto;
height: auto;
}
:is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) .cardOverlayContainer {
justify-content: space-between;
}
:is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) .cardOverlayContainer > .cardOverlayButton-br {
margin: 0 -0.35rem 0 auto;
}
.cardOverlayButton,
.cardOverlayButton-br,
.cardOverlayButton-br .cardOverlayButton {
color: var(--nf-text);
}
.cardOverlayButton:hover {
background: rgb(255 255 255 / 0.15);
}
/* ── Play disc ───────────────────────────────────────────────────────────── */
.cardOverlayContainer > .cardOverlayFab-primary,
.listItemImageButton,
.chapterCard .cardScalable > [class*="cardPadder"],
.layout-mobile :is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) :is(.cardScalable > button.cardOverlayButton-br[data-action="play"], .cardScalable > a > .cardOverlayButton-br > .cardOverlayButton) {
--nf-rise: 0.35rem;
--nf-grow: 1;
width: 2.75rem;
height: 2.75rem;
min-width: 0;
padding: 0;
border: 0;
border-radius: 50%;
background: var(--nf-icon-play) center / 50% no-repeat, #fff !important;
color: transparent !important;
box-shadow: var(--nf-shadow-disc);
transform: translateY(var(--nf-rise)) scale(var(--nf-grow));
transition: opacity var(--nf-dur-2) var(--nf-ease-out), transform var(--nf-dur-3) var(--nf-ease), box-shadow var(--nf-dur-2) var(--nf-ease-out);
}
:is(.cardOverlayFab-primary, .listItemImageButton) > :is(.material-icons, svg),
.layout-mobile :is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) :is(.cardScalable > button.cardOverlayButton-br[data-action="play"], .cardScalable > a > .cardOverlayButton-br > .cardOverlayButton) > :is(.material-icons, svg) {
display: none;
}
.cardOverlayContainer > .cardOverlayFab-primary:hover,
.listItemImageButton:hover,
.chapterCard .cardScalable > [class*="cardPadder"]:hover {
--nf-grow: 1.08;
box-shadow: var(--nf-shadow-disc-hover);
transform: translateY(var(--nf-rise)) scale(var(--nf-grow));
transition: opacity var(--nf-dur-2) var(--nf-ease-out), transform var(--nf-dur-3) var(--nf-ease), box-shadow var(--nf-dur-2) var(--nf-ease-out);
}
.cardOverlayContainer > .cardOverlayFab-primary:active,
.listItemImageButton:active,
.chapterCard .cardScalable > [class*="cardPadder"]:active {
--nf-grow: 0.96;
transition-duration: var(--nf-dur-1);
}
.card:is(:hover, :focus-within) .cardOverlayFab-primary,
.listItem:is(:hover, :focus-within) .listItemImageButton {
--nf-rise: 0rem;
}
.cardOverlayContainer > .cardOverlayFab-primary,
.listItemImage .listItemImageButton {
position: absolute;
inset: 0;
margin: auto;
}
:is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) .cardOverlayContainer > .cardOverlayFab-primary {
position: static;
margin: 0;
}
:is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) .cardOverlayContainer > .cardOverlayFab-primary,
.layout-mobile :is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) :is(.cardScalable > button.cardOverlayButton-br[data-action="play"], .cardScalable > a > .cardOverlayButton-br > .cardOverlayButton),
.layout-desktop #itemDetailPage .listItem-largeImage .listItemImageButton,
.chapterCard .cardScalable > [class*="cardPadder"],
#liveTvPage .vertical-wrap > .squareCard .cardOverlayContainer > .cardOverlayFab-primary {
width: 2.5rem;
height: 2.5rem;
}
:is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) .cardOverlayContainer > .cardOverlayFab-primary:hover:not(:active),
.layout-desktop #itemDetailPage .listItem-largeImage .listItemImageButton:hover:not(:active),
.chapterCard .cardScalable > [class*="cardPadder"]:hover:not(:active),
#liveTvPage .vertical-wrap > .squareCard .cardOverlayContainer > .cardOverlayFab-primary:hover:not(:active) {
--nf-grow: 1.04;
}
.listItemImage {
position: relative;
}
.listItemImage:not(.listItemImage-large) .listItemImageButton {
width: 2rem;
height: 2rem;
}
@media (hover: hover) {
.listItemImageButton {
opacity: 0;
}
.listItem:is(:hover, :focus-within) .listItemImageButton {
opacity: 1;
}
}
/* ── Card text ───────────────────────────────────────────────────────────── */
.cardFooter {
padding-top: 0;
text-align: left;
}
.cardText,
.cardTextCentered,
.cardTextCentered > .textActionButton {
text-align: left !important; /* core sets center with !important */
}
.cardText {
--kefin-card-title-color: var(--nf-text-mute);
padding: 0.1rem 0.1em 0;
color: var(--nf-text-mute);
font-size: 0.8125rem;
font-weight: 400;
line-height: 1.35;
}
.cardText-first {
--kefin-card-title-color: var(--nf-text-2);
padding-top: 0.5rem;
color: var(--nf-text-2);
font-size: 0.875rem;
font-weight: 500;
}
.cardText > :is(a, button, .textActionButton) {
color: inherit;
font: inherit;
}
/* ── Progress ────────────────────────────────────────────────────────────── */
.itemProgressBar {
background: var(--nf-track);
height: 3px;
border-radius: 0;
}
.MuiLinearProgress-root .MuiLinearProgress-bar:not([class*="barColorSuccess"], [class*="barColorWarning"], [class*="barColorError"], .MuiLinearProgress-bar2, [class*="bar2Buffer"]) {
background-color: var(--nf-red) !important;
border-radius: 0;
}
.MuiLinearProgress-root.itemLinearProgress {
height: 3px;
border-radius: 0;
background-color: var(--nf-track) !important;
}
.starIcon {
color: var(--nf-star);
}
.innerCardFooter.fullInnerCardFooter {
background: none;
}
/* ── Watched badge ───────────────────────────────────────────────────────── */
.cardIndicators:has(> .playedIndicator) {
top: 0;
right: 0;
}
.cardIndicators > .playedIndicator,
body .sections.watchlist .movie-watched-badge {
align-items: flex-start;
justify-content: flex-end;
width: 2.1rem;
height: 2.1rem;
padding: 0.2rem;
border-radius: 0 var(--nf-radius) 0 0;
clip-path: polygon(0 0, 100% 0, 100% 100%);
}
.cardIndicators > .playedIndicator > :is(svg, .indicatorIcon),
body .sections.watchlist .movie-watched-badge > .material-icons {
width: 0.95rem;
height: 0.95rem;
font-size: 0.95rem;
}
.emby-scrollbuttons-button {
color: var(--nf-text);
}
/* ── Programme lists ─────────────────────────────────────────────────────── */
.libraryPage:has(.itemsContainer .card[data-type="Program"]) .itemsViewSettingsContainer .btnFilter {
display: none;
}
/* ── Buttons in rows ─────────────────────────────────────────────────────── */
.verticalSection .emby-button.raised,
.verticalSection .emby-button.button-flat {
font-weight: 600;
}
.verticalSection .scrollSlider > a.emby-button.raised {
margin: 0 0.5rem 0 0;
padding: 0 0.875rem;
}
.verticalSection > h2.sectionTitle-cards.padded-left {
padding-top: 1em; /* as a .sectionTitleContainer, so the scroll arrows line up */
}
/* ═══════════════════════════════════════════════════════════════════════
* 6. Library pages
* ═══════════════════════════════════════════════════════════════════════ */
.alphaPickerButton {
color: var(--nf-text-mute);
font-weight: 600;
}
.alphaPickerButton:hover,
.alphaPickerButton-selected {
color: var(--nf-text);
background: none;
}
.emby-tab-button {
color: var(--nf-text-dim);
}
.emby-tab-button-active {
color: var(--nf-text);
font-weight: 700;
box-shadow: inset 0 -2px 0 #fff;
}
.MuiTabs-indicator.MuiTabs-indicator {
background-color: #fff;
}
.emby-tab-button:hover,
.emby-tab-button.show-focus:focus {
color: var(--nf-text);
}
/* ── List view ───────────────────────────────────────────────────────────── */
.itemsContainer.vertical-list:has(> .MuiBox-root > .listItem) {
padding-top: 1rem;
}
.vertical-list > .MuiBox-root > .listItem {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
grid-template-areas:
"image title buttons"
"image meta buttons";
align-items: center;
column-gap: 1rem;
padding: 0.5rem;
border: 0;
border-radius: var(--nf-radius-lg);
transition: background-color var(--nf-dur-2) var(--nf-ease-out);
}
.vertical-list > .MuiBox-root > .listItem:is(:hover, :focus-within) {
background: var(--nf-fill-hover);
}
.vertical-list > .MuiBox-root > .listItem > .listItemImage {
display: block; /* core hides it under 40em */
grid-area: image;
width: 3rem;
height: auto;
aspect-ratio: 2 / 3;
margin: 0;
overflow: hidden;
border-radius: var(--nf-radius);
background: var(--nf-surface-2);
}
.vertical-list > .MuiBox-root > .listItem > .listItemBody {
grid-area: title;
align-self: end;
min-width: 0;
padding: 0;
}
.vertical-list > .MuiBox-root > .listItem .listItemBodyText {
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--nf-text);
font-size: 1rem;
font-weight: 600;
line-height: 1.3;
}
.vertical-list > .MuiBox-root > .listItem > .listItemMediaInfo {
display: flex; /* core hides it under 50em */
grid-area: meta;
align-self: start;
flex-wrap: wrap;
align-items: center;
gap: 0.25em 0.75em;
margin: 0.3rem 0 0;
color: var(--nf-text-dim);
font-size: 0.85rem;
font-variant-numeric: tabular-nums;
}
.vertical-list > .MuiBox-root > .listItem > .listItemMediaInfo > .mediaInfoItem {
margin: 0;
}
.vertical-list > .MuiBox-root > .listItem > .listItemMediaInfo > .mediaInfoText:not(.mediaInfoOfficialRating) {
padding: 0;
border: 0;
background: none;
}
.vertical-list > .MuiBox-root > .listItem > .listItemMediaInfo svg {
font-size: 1.15rem;
}
.vertical-list > .MuiBox-root > .listItem > .listViewUserDataButtons {
grid-area: buttons;
}
.vertical-list > .MuiBox-root > .listItem > .listViewUserDataButtons > :is(.listItemButton, .paper-icon-button-light) {
color: var(--nf-text-mute);
}
.vertical-list > .MuiBox-root > .listItem > .listViewUserDataButtons > :is(.listItemButton, .paper-icon-button-light):hover {
color: var(--nf-text);
}
/* ═══════════════════════════════════════════════════════════════════════
* 7. Detail page
* ═══════════════════════════════════════════════════════════════════════ */
:root {
--nf-hero-height: 100vh;
--nf-hero-logo: 24vh;
--nf-hero-logo-width: 36%;
--nf-hero-pad: 3.3vw;
--nf-hero-fs: clamp(15px, 8px + 0.55vw, 22px);
--nf-hero-veil: 0.98;
--nf-hero-blur: 22px;
--nf-appbar: 48px; /* MUI dense toolbar */
}
#itemDetailPage {
--nf-hero-band: calc(var(--nf-hero-fs) * (6.9 + var(--nf-band-subtitle, 0) + var(--nf-band-original, 0)) + var(--nf-hero-pad));
}
.layout-desktop #itemDetailPage:has(.nameContainer .subtitle) {
--nf-band-subtitle: 2.3;
--nf-hero-height: 65vh;
--nf-hero-logo: 19vh;
}
.layout-desktop #itemDetailPage:has(.nameContainer .originalTitle:not(.hide)) {
--nf-band-original: 1.8;
}
.itemName,
.parentName {
color: var(--nf-text);
font-weight: 700;
}
.mediaInfoOfficialRating,
.mediaInfoText {
border-color: var(--nf-outline);
border-radius: var(--nf-radius-xs);
}
.detailRibbon {
background: transparent;
}
/* ── Hero: backdrop ──────────────────────────────────────────────────────── */
.layout-desktop body:has(#itemDetailPage:not(.hide) .detailImageContainer :is(.portraitCard, .backdropCard)):not(:has(#itemDetailPage:not(.hide) .detailImageContainer .cardImageIcon.person, #itemDetailPage:not(.hide) .programGuideSection:not(.hide))) .backgroundContainer.withBackdrop {
background-color: transparent;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemBackdrop {
height: var(--nf-hero-height);
margin-top: calc(-1 * var(--nf-appbar));
background-attachment: scroll;
background-position: center 20%;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemBackdrop::after,
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .cardScalable::after {
content: "";
position: absolute;
inset: 0;
background:
linear-gradient(180deg, rgb(0 0 0 / 0.6) 0%, transparent 20%),
linear-gradient(77deg, rgb(0 0 0 / 0.8) 0%, rgb(0 0 0 / 0.35) 40%, transparent 70%);
pointer-events: none;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailImageContainer {
display: none;
}
/* ── Hero: episode still ─────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage:has(.detailImageContainer .backdropCard):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer {
--nf-still-w: min(32vw, 44rem);
display: block;
position: absolute;
right: var(--nf-gutter);
top: calc(var(--nf-hero-band) - var(--nf-hero-pad) - var(--nf-still-w) * 9 / 16);
width: var(--nf-still-w);
z-index: 3;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .backdropCard):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .card {
position: relative !important;
float: none;
left: 0 !important;
top: 0;
width: 100% !important;
max-width: none;
margin: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .backdropCard):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .cardScalable {
border-radius: var(--nf-radius-lg);
box-shadow:
0 0 0 1px rgb(255 255 255 / 0.14),
0 1.2em 2.5em rgb(0 0 0 / 0.6);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailLogo {
display: block;
left: var(--nf-gutter);
right: calc(100% - var(--nf-gutter) - var(--nf-hero-logo-width));
width: auto;
height: var(--nf-hero-logo);
top: calc(var(--nf-hero-height) - var(--nf-appbar) - var(--nf-hero-band) - var(--nf-hero-logo));
background-position: left bottom;
background-size: contain;
filter: drop-shadow(0 2px 12px rgb(0 0 0 / 0.5));
z-index: 3;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailLogo:not(.hide) ~ .detailPageWrapperContainer .nameContainer > .itemName.parentNameLast {
display: none;
}
/* ── Hero: info block ────────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPageWrapperContainer {
margin-top: calc(-1 * var(--nf-hero-band));
min-height: 0;
position: relative;
z-index: 2;
background: none; /* core: noBackdropTransparency */
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPageWrapperContainer::before {
--nf-veil-rise: calc(var(--nf-hero-logo));
--nf-veil-ramp: calc(var(--nf-veil-rise) + var(--nf-hero-band) - var(--nf-hero-pad) + 0.5em);
content: "";
position: absolute;
top: calc(-1 * var(--nf-veil-rise));
left: 0;
right: 0;
bottom: 0;
z-index: -1;
background: rgb(var(--nf-bg-rgb) / var(--nf-hero-veil));
-webkit-backdrop-filter: blur(var(--nf-hero-blur)) saturate(1.15);
backdrop-filter: blur(var(--nf-hero-blur)) saturate(1.15);
--nf-veil-mask: linear-gradient(180deg,
transparent 0,
rgb(0 0 0 / 0.3) calc(var(--nf-veil-ramp) * 0.15),
rgb(0 0 0 / 0.52) calc(var(--nf-veil-ramp) * 0.3),
rgb(0 0 0 / 0.68) calc(var(--nf-veil-ramp) * 0.45),
rgb(0 0 0 / 0.8) calc(var(--nf-veil-ramp) * 0.6),
rgb(0 0 0 / 0.89) calc(var(--nf-veil-ramp) * 0.75),
rgb(0 0 0 / 0.96) calc(var(--nf-veil-ramp) * 0.88),
#000 var(--nf-veil-ramp));
-webkit-mask-image: var(--nf-veil-mask);
mask-image: var(--nf-veil-mask);
pointer-events: none;
}
/* ── Hero: collections ───────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage:has(.collectionItems:not(.hide)) {
--nf-hero-height: calc(var(--nf-hero-band) + 16vh);
--nf-hero-logo: calc(16vh - var(--nf-appbar) - 1.5rem);
--nf-content-top: 0.75em;
--nf-children-gap: 0;
}
.layout-desktop #itemDetailPage:has(.collectionItems:not(.hide)):has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPageWrapperContainer::before {
-webkit-mask-image: var(--nf-veil-mask), linear-gradient(to top right, #000 50%, transparent);
mask-image: var(--nf-veil-mask), linear-gradient(to top right, #000 50%, transparent);
-webkit-mask-composite: source-in;
mask-composite: intersect;
}
#itemDetailPage .collectionItems :is(.sectionTitleContainer, .itemsContainer) {
padding-inline: 0; /* the section is already on the gutter */
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailRibbon {
text-shadow: 0 1px 10px rgb(0 0 0 / 0.65);
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: stretch;
box-sizing: border-box;
height: auto;
min-height: var(--nf-hero-band);
margin-top: 0;
padding: 0 var(--nf-gutter) var(--nf-hero-pad);
font-size: var(--nf-hero-fs);
text-align: left;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) :is(.itemMiscInfo-primary, .mainDetailButtons) {
justify-content: flex-start;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailRibbon > .infoWrapper {
flex: none;
max-width: 60%;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .nameContainer {
display: block;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemName {
font-size: 2.8em;
letter-spacing: -0.02em;
line-height: 1.1;
white-space: normal;
text-shadow: 0 2px 16px rgb(0 0 0 / 0.5);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .nameContainer > .itemName:not(.parentNameLast),
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .nameContainer > .parentName ~ .itemName {
font-size: 1.6em;
font-weight: 700;
letter-spacing: -0.01em;
line-height: 1.15;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .nameContainer > .itemName.originalTitle {
font-size: 1em;
font-weight: 500;
letter-spacing: 0;
line-height: 1.3;
color: var(--nf-text-dim);
margin: 0.3em 0 0;
text-shadow: none;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-primary {
color: var(--nf-text-2);
font-size: 1.05em;
font-weight: 500;
gap: 0.25em 0.75em;
margin: 0.6em 0 0 !important; /* core sets margin-bottom inline */
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-primary > .mediaInfoItem {
margin-right: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-primary > .mediaInfoOfficialRating {
padding: 0.05em 0.45em;
font-size: 0.85em;
line-height: 1.5;
}
:root .anime-tag-badge.anime-tag-badge.colored {
height: 1.6em;
padding: 0 0.55em !important;
border: 0;
border-radius: var(--nf-radius-xs);
color: var(--nf-text-2);
font-weight: 600;
line-height: 1.6em;
text-shadow: none;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo .endsAt {
display: block;
color: var(--nf-text-dim);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .mainDetailButtons {
gap: 0.65em;
margin: 1.3em 0 0;
font-size: 1em;
}
/* ── Hero: body ──────────────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContent {
padding: var(--nf-content-top, 3.5em) var(--nf-gutter) 0 !important;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection {
display: grid;
grid-template-columns: minmax(0, 1.7fr) minmax(20em, 1fr);
column-gap: 4vw;
row-gap: 1.75em;
align-items: start;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > * {
grid-column: 1 / -1;
margin-top: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .detailSectionContent {
grid-column: 1;
grid-row: 1;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .itemDetailsGroup {
grid-column: 1;
grid-row: 2;
margin-top: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .trackSelections {
grid-column: 2;
grid-row: 1 / span 2;
margin: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection:has(> .trackSelections.hide) {
grid-template-columns: minmax(0, 1fr);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > :is(.nextUpSection, #listChildrenCollapsible, .programGuideSection, .collectionItems) {
margin-top: var(--nf-children-gap, 1.5em);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPageSecondaryContainer {
padding-top: 1.5em;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer :is(.portraitCard, .backdropCard), .recordingFields .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailLogo:not(.hide) ~ .detailPageWrapperContainer .nameContainer > .parentName {
display: none;
}
/* ── Episodes ────────────────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage .vertical-list:has(> .listItem-largeImage) {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(24em, 100%), 1fr));
gap: 2.2em 1.4vw;
padding-right: 0;
}
.layout-desktop #itemDetailPage .listItem-largeImage {
display: block;
padding: 0.6em 0.6em 0.9em;
margin: -0.6em -0.6em -0.9em;
border-radius: var(--nf-radius-lg);
background: transparent;
transition: background-color var(--nf-dur-2) var(--nf-ease-out);
}
.layout-desktop #itemDetailPage .listItem-largeImage:hover,
.layout-desktop #itemDetailPage .listItem-largeImage:focus-within {
background: var(--nf-fill-hover);
}
.layout-desktop #itemDetailPage .listItem-largeImage > .listItem-content {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
grid-template-areas:
"image image"
"title buttons"
"meta meta"
"overview overview";
align-items: center;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemImage-large {
grid-area: image;
position: relative;
isolation: isolate;
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
margin: 0;
border-radius: var(--nf-radius);
background-size: cover;
overflow: hidden;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemImage-large::before {
content: "";
position: absolute;
inset: 0;
z-index: -1;
background: inherit;
background-size: cover;
background-position: center;
transition: transform 0.6s var(--nf-ease);
}
.layout-desktop #itemDetailPage .listItem-largeImage:hover .listItemImage-large::before {
transform: scale(1.04);
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemBody {
display: contents;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemBodyText:first-child {
grid-area: title;
min-width: 0;
padding-top: 0.7em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--nf-text);
font-size: 1.02em;
font-weight: 700;
margin-bottom: 0.2em;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemMediaInfo {
grid-area: meta;
flex-wrap: wrap;
align-items: center;
gap: 0.25em 0.75em;
white-space: nowrap;
color: var(--nf-text-dim);
font-size: 0.85rem;
font-variant-numeric: tabular-nums;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemMediaInfo > .mediaInfoItem {
margin: 0;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemMediaInfo .starIcon {
margin-right: 0.15em;
font-size: 1.25em;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemMediaInfo > .anime-tag-badge {
font-size: 0.6875rem;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItem-overview {
grid-area: overview;
color: var(--nf-text-mute);
font-size: 0.88em;
line-height: 1.45;
margin-top: 0.5em;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
white-space: normal;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listViewUserDataButtons {
grid-area: buttons;
padding: 0.7em 0 0 0.5em;
gap: 0;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemButton {
color: var(--nf-text-mute);
font-size: 0.85em;
padding: 0.35em;
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItemButton:hover {
color: var(--nf-text);
}
.layout-desktop #itemDetailPage .listItem-largeImage .listItem-bottomoverview {
display: none;
}
/* ── KefinTweaks breadcrumbs ─────────────────────────────────────────────── */
.MuiAppBar-root .MuiToolbar-root:has(.kefinTweaks-breadcrumbs-wrapper) {
display: flex; /* KefinTweaks makes it a 3-column grid */
}
.kefinTweaks-breadcrumbs-wrapper--modern {
position: absolute;
top: 100%;
left: var(--nf-gutter);
margin: 0;
transition: opacity var(--nf-dur-2) var(--nf-ease-out);
}
.kefinTweaks-breadcrumbs-wrapper--modern .kefinTweaks-breadcrumbs {
padding-left: 0;
}
.MuiAppBar-colorDefault .kefinTweaks-breadcrumbs-wrapper--modern {
opacity: 0;
pointer-events: none;
}
.kefinTweaks-breadcrumbs {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.15rem 0.5rem;
font-size: 0.85rem;
text-shadow: 0 1px 6px rgb(0 0 0 / 0.7);
}
.kefinTweaks-breadcrumb-element {
color: var(--nf-text-dim);
font-weight: 500;
cursor: pointer;
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
.kefinTweaks-breadcrumb-element:hover {
color: var(--nf-text);
}
.kefinTweaks-breadcrumb-element:last-child {
color: var(--nf-text);
font-weight: 600;
cursor: default;
}
.kefinTweaks-breadcrumb-separator {
color: var(--nf-text-dim);
font-size: 0;
}
.kefinTweaks-breadcrumb-separator::before {
content: "chevron_right";
font-family: "Material Icons";
font-size: 1rem;
vertical-align: middle;
}
/* ── Buttons ─────────────────────────────────────────────────────────────── */
.mainDetailButtons .detailButton {
border-radius: 50%;
width: 2.6em;
height: 2.6em;
margin: 0;
padding: 0 !important;
transition: border-color var(--nf-dur-1) var(--nf-ease-out), background-color var(--nf-dur-1) var(--nf-ease-out);
}
.mainDetailButtons .detailButton-icon {
font-size: 1.35em !important;
}
.mainDetailButtons .detailButton.btnPlay {
flex-direction: row;
width: auto;
min-width: 7.5em;
margin-right: 0.25em;
padding: 0 1.7em 0 1.15em !important;
border: 0;
border-radius: var(--nf-radius);
background: #fff;
color: #000;
font-weight: 700;
text-shadow: none;
}
.mainDetailButtons .detailButton.btnPlay:hover {
background: var(--nf-fill-white-hover);
color: #000;
}
.mainDetailButtons .detailButton.btnPlay .detailButton-content {
flex-direction: row;
gap: 0.3em;
}
.mainDetailButtons .detailButton.btnPlay .detailButton-icon {
font-size: 1.7em !important;
}
.mainDetailButtons .detailButton.btnPlay::after {
content: attr(title);
font-size: 1.1em;
letter-spacing: 0.01em;
}
/* ── Technical panel ─────────────────────────────────────────────────────── */
.trackSelections {
display: flex;
flex-direction: column;
max-width: none;
padding: 0.35em 1.1em;
}
.layout-mobile .trackSelections {
margin-bottom: 2em;
}
.trackSelections .selectContainer {
position: relative;
display: grid;
grid-template-columns: 7.5rem minmax(0, 1fr);
align-items: center;
max-width: none;
margin: 0 !important;
padding: 0.6em 0;
border-bottom: 1px solid rgb(255 255 255 / 0.06);
}
.trackSelections .selectContainer:last-child {
border-bottom: 0;
}
.trackSelections .selectContainer .selectLabel {
display: flex;
align-items: center;
gap: 0.45rem;
margin: 0;
color: var(--nf-text-mute);
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.08em;
line-height: 1;
text-transform: uppercase;
}
.trackSelections .selectContainer .selectLabel::before {
font-family: "Material Icons";
font-size: 1.1rem;
font-weight: 400;
letter-spacing: 0;
text-transform: none;
}
.trackSelections .selectVideoContainer .selectLabel::before { content: "movie"; }
.trackSelections .selectAudioContainer .selectLabel::before { content: "volume_up"; }
.trackSelections .selectSubtitlesContainer .selectLabel::before { content: "subtitles"; }
.trackSelections .selectSourceContainer .selectLabel::before { content: "video_file"; }
.trackSelections .detailTrackSelect,
.trackSelections .detailTrackSelect.emby-select-withcolor {
width: 100%;
max-width: none;
padding: 0.35em 2em 0.35em 0.55em !important;
border: 0;
border-radius: var(--nf-radius);
background: transparent;
color: var(--nf-text-2);
font-size: 0.9em;
font-weight: 500;
text-overflow: ellipsis;
cursor: pointer;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
.trackSelections .detailTrackSelect:not(:disabled):hover,
.trackSelections .detailTrackSelect:focus-visible {
background: var(--nf-fill-hover);
color: var(--nf-text);
}
.trackSelections .detailTrackSelect:disabled {
padding-right: 0.55em !important;
color: var(--nf-text-dim);
cursor: default;
opacity: 1;
}
.trackSelections .detailTrackSelect > option {
background: var(--nf-surface-2);
color: var(--nf-text);
}
.trackSelections .selectArrowContainer {
position: absolute;
right: 0.4em;
top: 50%;
transform: translateY(-50%);
color: var(--nf-text-mute);
pointer-events: none;
}
.trackSelections .selectContainer:has(.detailTrackSelect:disabled) .selectArrowContainer {
display: none;
}
/* ── Synopsis, links and credits ─────────────────────────────────────────── */
#itemDetailPage .detailSectionContent {
display: flex;
flex-direction: column;
max-width: 60rem;
}
#itemDetailPage .detailSectionContent > .itemExternalLinks {
order: -2;
margin: 0 0 1.5rem !important; /* core sets margin inline */
}
#itemDetailPage .detailSectionContent > .itemExternalLinks:not(:has(> a)) {
display: none;
}
#itemDetailPage .detailSectionContent > .tagline:not(.hide, :empty) {
display: block;
order: -1;
margin: 0 0 0.8rem;
color: var(--nf-text);
font: italic 500 1.25rem/1.5 var(--nf-font);
letter-spacing: -0.005em;
}
#itemDetailPage .detailSectionContent > .tagline:not(.hide, :empty)::before {
content: "\201C";
margin-right: 0.15em;
}
#itemDetailPage .detailSectionContent > .tagline:not(.hide, :empty)::after {
content: "\201D";
margin-left: 0.05em;
}
#itemDetailPage .overview-controls {
justify-content: flex-start;
}
#itemDetailPage .overview-controls .overview-expand {
margin: 0.5rem 0 0;
padding: 0;
background: none;
color: var(--nf-text-dim);
font-size: 0.875rem;
font-weight: 600;
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
#itemDetailPage .overview-controls .overview-expand:hover {
color: var(--nf-text);
}
.detailSectionContent .overview {
max-width: none; /* core: 90% */
margin: 0;
color: var(--nf-text-2);
font-size: 1.1rem;
line-height: 1.6;
}
.detailSectionContent .overview > bdi > p { margin: 0; }
.detailSectionContent .itemGenres {
display: none;
}
#itemDetailPage .detailSectionContent .itemTags {
display: none;
}
/* ── External links ──────────────────────────────────────────────────────── */
.itemExternalLinks {
display: flex;
flex-wrap: wrap;
row-gap: 0.5rem;
margin-top: 1.4em;
color: transparent;
font-size: 0 !important; /* core sets font-size inline */
}
.itemExternalLinks > a.button-link + a.button-link {
margin-left: 0.5rem;
}
.itemExternalLinks > a.button-link {
--nf-brand: var(--nf-text);
--nf-brand-ink: #000;
display: inline-flex;
align-items: center;
margin: 0;
padding: .2em .75em;
border: 1px solid var(--nf-outline);
border-radius: var(--nf-radius);
background: transparent;
color: var(--nf-text);
font-size: 0.875rem;
font-weight: 600;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out), border-color var(--nf-dur-1) var(--nf-ease-out);
}
.itemExternalLinks > a.button-link:hover,
.itemExternalLinks > a.button-link:focus-visible {
background: var(--nf-brand);
border-color: var(--nf-brand);
color: var(--nf-brand-ink) !important;
text-decoration: none;
}
.itemExternalLinks > a[href*="imdb.com"] { --nf-brand: #f5c518; }
.itemExternalLinks > a[href*="themoviedb.org"] { --nf-brand: #01b4e4; }
.itemExternalLinks > a[href*="thetvdb.com"] { --nf-brand: #6cd591; }
.itemExternalLinks > a[href*="anidb.net"] { --nf-brand: #2a5fa8; --nf-brand-ink: #fff; }
.itemExternalLinks > a[href*="myanimelist.net"] { --nf-brand: #2e51a2; --nf-brand-ink: #fff; }
.itemExternalLinks > a[href*="anilist.co"] { --nf-brand: #02a9ff; }
.itemExternalLinks > a[href*="trakt.tv"] { --nf-brand: #ed1c24; --nf-brand-ink: #fff; }
.itemExternalLinks > a[href*="letterboxd.com"] { --nf-brand: #00e054; }
.itemExternalLinks > a[href*="musicbrainz.org"] { --nf-brand: #ba478f; --nf-brand-ink: #fff; }
.itemExternalLinks > a[href*="theaudiodb.com"] { --nf-brand: #6399cc; }
.itemExternalLinks > a[href*="tvmaze.com"] { --nf-brand: #3c948b; --nf-brand-ink: #fff; }
.itemExternalLinks > a[href*="wikidata.org"] { --nf-brand: #990000; --nf-brand-ink: #fff; }
.itemExternalLinks > a[title*="Radarr"] { --nf-brand: #ffc230; }
.itemExternalLinks > a[title*="Sonarr"] { --nf-brand: #35c5f4; }
.itemDetailsGroup {
max-width: 60rem;
display: flex;
flex-direction: column;
}
.itemDetailsGroup > div:not(:empty) {
margin-bottom: .75em;
}
.itemDetailsGroup .detailsGroupItem {
display: block;
max-width: none; /* core: 44em */
margin: 0 !important;
font-size: 0.92em;
}
.itemDetailsGroup div:last-child:not(:empty) {
order: -1;
}
.layout-desktop .itemDetailsGroup > div:last-child:not(:empty) {
margin-bottom: 2em;
}
.itemDetailsGroup .detailsGroupItem .label {
display: inline;
color: var(--nf-text-mute);
margin: 0;
}
.itemDetailsGroup .detailsGroupItem .label::after {
content: ": ";
}
.itemDetailsGroup .detailsGroupItem > :not(.label) {
display: inline;
color: var(--nf-text-2);
}
.itemDetailsGroup .detailsGroupItem a {
display: inline;
color: var(--nf-text-2);
font-weight: 400;
}
.itemDetailsGroup .detailsGroupItem a:hover,
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSectionContent > p:not(.overview) a:hover {
color: var(--nf-text);
text-decoration: underline;
}
/* ── Genres ──────────────────────────────────────────────────────────────── */
.itemDetailsGroup > :last-child .detailsGroupItem > .label {
display: none;
}
.itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) {
display: flex;
flex-wrap: wrap;
align-items: center;
margin-top: 0.35em;
}
.itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) > span {
font-size: 0;
}
.itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) > span > a {
font-size: 0.875rem;
}
.itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) > span + span::before {
content: "•";
margin: 0 0.5em;
color: var(--nf-surface-4);
font-size: 0.875rem;
}
/* ── Scenes ──────────────────────────────────────────────────────────────── */
.chapterCard .chapterCardImageContainer {
transition: filter var(--nf-dur-3) var(--nf-ease-out);
}
.chapterCard .innerCardFooter {
left: 0;
right: 0;
bottom: 0;
width: auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.6em;
padding: 2.4em 0.75em 0.65em;
background: linear-gradient(0deg, rgb(0 0 0 / 0.85), rgb(0 0 0 / 0.45) 55%, transparent);
border-radius: 0 0 var(--nf-radius) var(--nf-radius);
}
.chapterCard .innerCardFooter .cardText {
min-width: 0;
padding: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--nf-text);
font-size: 0.85em;
font-weight: 600;
}
.chapterCard .innerCardFooter .cardText + .cardText {
flex: 0 0 auto;
padding: 0.15em 0.45em;
border-radius: var(--nf-radius-xs);
background: rgb(255 255 255 / 0.16);
color: var(--nf-text-2);
font-size: 0.75em;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
.chapterCard .cardScalable {
aspect-ratio: 16 / 9;
overflow: hidden;
}
.chapterCard .cardScalable > [class*="cardPadder"] {
position: absolute;
inset: 0;
z-index: 2;
margin: auto;
padding: 0 !important;
opacity: 0;
}
@media (hover: hover) and (pointer: fine) {
.chapterCard:hover .chapterCardImageContainer {
filter: brightness(1.15);
}
.chapterCard:hover .cardScalable > [class*="cardPadder"] {
--nf-rise: 0rem;
opacity: 1;
}
}
/* ── Cast and crew ───────────────────────────────────────────────────────── */
:is(#castCollapsible, #guestCastCollapsible) .cardScalable {
margin-bottom: 1rem;
aspect-ratio: 1 / 1;
border-radius: 50%;
overflow: hidden;
box-shadow: 0 0 0 0 transparent;
transition: box-shadow var(--nf-dur-3) var(--nf-ease);
}
:is(#castCollapsible, #guestCastCollapsible) :is(.cardPadder, .cardImageContainer, .blurhash-canvas, .cardContent) {
border-radius: 50%;
}
:is(#castCollapsible, #guestCastCollapsible) .cardImageContainer {
background-position: center 22%;
filter: grayscale(0.35) brightness(0.9);
transition: transform 0.5s var(--nf-ease), filter var(--nf-dur-3) var(--nf-ease-out);
}
:is(#castCollapsible, #guestCastCollapsible) .cardOverlayContainer {
display: none;
}
:is(#castCollapsible, #guestCastCollapsible) .card-hoverable:hover .cardBox {
transform: none;
}
:is(#castCollapsible, #guestCastCollapsible) .card:hover .cardScalable {
box-shadow:
0 0 0 3px var(--nf-bg),
0 0 0 5px #fff;
}
:is(#castCollapsible, #guestCastCollapsible) .card:hover .cardImageContainer {
transform: scale(1.12);
filter: none;
}
:is(#castCollapsible, #guestCastCollapsible) .cardText {
text-align: center !important;
padding-top: 0.25em;
}
:is(#castCollapsible, #guestCastCollapsible) .cardText-first {
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
:is(#castCollapsible, #guestCastCollapsible) .card:hover .cardText-first,
:is(#castCollapsible, #guestCastCollapsible) .card:hover .cardText-first a {
color: var(--nf-text);
}
/* ═══════════════════════════════════════════════════════════════════════
* 7b. Person pages
* ═══════════════════════════════════════════════════════════════════════ */
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) {
--nf-person-photo: clamp(12rem, 18vw, 22rem);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .itemBackdrop {
height: 2.5rem;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailPagePrimaryContainer {
display: grid;
grid-template-columns: var(--nf-person-photo) minmax(0, 1fr);
column-gap: 4vw;
align-items: start;
padding: 0 var(--nf-gutter);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) :is(.detailRibbon, .infoWrapper, .detailPagePrimaryContent, .detailSection, .detailSectionContent) {
display: contents;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailPagePrimaryContainer :is(.nameContainer, .mainDetailButtons, .detailSectionContent > *, .detailSection > *) {
grid-column: 2;
min-width: 0;
margin-left: 0;
margin-right: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailImageContainer {
display: block;
position: sticky;
top: calc(var(--nf-appbar) + 1.5rem);
grid-column: 1;
grid-row: 1 / span 30;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailImageContainer .card {
position: relative !important;
top: 0 !important;
left: 0 !important;
width: 100% !important;
margin: 0 !important;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailImageContainer .cardScalable {
isolation: isolate;
border-radius: var(--nf-radius-lg);
box-shadow: 0 0 0 1px var(--nf-line), var(--nf-shadow-3);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailImageContainer :is(.cardImageContainer, .cardPadder, [class*="cardPadder"]) {
border-radius: var(--nf-radius-lg);
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailImageContainer .cardImageContainer {
overflow: visible;
contain: none; /* core's contain: strict draws the glow on top */
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailImageContainer .cardImageContainer::before {
content: "";
position: absolute;
inset: 4% -6% -6%;
z-index: -1;
border-radius: inherit;
background: inherit;
background-size: cover;
filter: blur(48px) saturate(1.3);
opacity: 0.45;
pointer-events: none;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .nameContainer {
order: -6;
display: block;
margin: 0;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .nameContainer .itemName {
margin: 0;
color: var(--nf-text);
font: 800 clamp(2.25rem, 1.4rem + 2.4vw, 3.75rem)/1.05 var(--nf-font);
letter-spacing: -0.03em;
white-space: normal;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSectionContent > p:not(.overview) {
order: -5;
margin: 0.35rem 0 0;
color: var(--nf-text-dim);
font-size: 0.95rem;
font-variant-numeric: tabular-nums;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSectionContent > p:not(.overview) a {
color: var(--nf-text-2);
font-weight: 500;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .mainDetailButtons {
order: -4;
justify-content: flex-start;
gap: 0.65em;
margin: 1.5rem 0 0;
font-size: 1rem;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .mainDetailButtons .detailButton {
width: 2.6em;
height: 2.6em;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSectionContent > .itemExternalLinks {
order: -3;
margin: 1.5rem 0 0 !important; /* core sets margin inline */
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSectionContent > .overview {
order: -2;
max-width: 75ch;
margin: 1.5rem 0 0;
color: var(--nf-text-2);
font-size: 1rem;
line-height: 1.65;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSectionContent > .overview-controls {
order: -2;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSection > .detailVerticalSection {
margin-top: 2.5rem;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSection > .detailVerticalSection + .detailVerticalSection {
margin-top: 1rem;
}
.layout-desktop #itemDetailPage:has(.detailImageContainer .cardImageIcon.person) .detailSection > .detailVerticalSection .itemsContainer {
padding-right: 0;
}
/* ═══════════════════════════════════════════════════════════════════════
* 7c. Live TV
* ═══════════════════════════════════════════════════════════════════════ */
/* ── Guide: day picker ───────────────────────────────────────────────────── */
.tvguide .guideHeaderDateSelection {
padding: 0.5rem var(--nf-gutter) 0.75rem;
}
.tvguide .guideDateTabsSlider {
display: flex;
gap: 0.375rem;
text-align: left;
}
#liveTvPage .guide-date-tab-button {
min-width: 3.25rem;
margin: 0;
padding: 0.4rem 0.6rem;
border-radius: var(--nf-radius-lg);
background: none;
color: var(--nf-text-dim);
font-size: 1rem;
font-weight: 700;
line-height: 1.2;
font-variant-numeric: tabular-nums;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
#liveTvPage .guide-date-tab-button .emby-button-foreground::first-line {
font-size: 0.6875rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
}
#liveTvPage .guide-date-tab-button:is(:hover, :focus-visible) {
background: var(--nf-fill-hover);
color: var(--nf-text);
}
#liveTvPage .guide-date-tab-button.emby-tab-button-active {
background: #fff;
box-shadow: none;
color: #000;
}
/* ── Guide: time ruler ───────────────────────────────────────────────────── */
.tvguide .guide-headerTimeslots {
padding: 0 var(--nf-gutter);
}
.tvguide .timeslotHeader {
padding-left: 0.6rem;
border-left: 1px solid var(--nf-line);
color: var(--nf-text-dim);
font-size: 0.8125rem;
font-weight: 600;
text-indent: 0;
font-variant-numeric: tabular-nums;
}
/* ── Guide: channel column ───────────────────────────────────────────────── */
.tvguide :is(.channelsContainer, .guide-channelTimeslotHeader) {
width: 11rem;
}
.tvguide .guide-channelTimeslotHeader {
justify-content: flex-start;
}
.tvguide .guide-channelHeaderCell {
border: 0;
border-radius: var(--nf-radius);
background: none;
transition: background-color var(--nf-dur-1) var(--nf-ease-out);
}
.tvguide .guide-channelHeaderCell:hover {
background: var(--nf-fill-hover);
}
.tvguide .guideChannelImage {
box-sizing: border-box;
top: 0;
bottom: 0;
left: auto;
right: 0.75rem;
width: 5.5rem;
height: 2.75rem;
margin: auto 0;
padding: 0.35rem 0.6rem;
border-radius: var(--nf-radius);
background-color: #3a3a3a;
background-origin: content-box;
background-position: center;
box-shadow: inset 0 0 0 1px var(--nf-line);
}
.tvguide .guideChannelNumber {
max-width: none;
padding-left: 0.5rem;
color: var(--nf-text-mute);
font-size: 0.875rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
/* ── Guide: programmes ───────────────────────────────────────────────────── */
.tvguide .channelPrograms {
border: 0;
}
.tvguide .programCell {
border: 2px solid var(--nf-bg);
border-radius: calc(var(--nf-radius) + 2px);
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
.tvguide .programCell:not(.programCell-active),
.tvguide .programCell:not(.programCell-active):is(:focus, .programCell-sports, .programCell-movie, .programCell-kids, .programCell-news) {
background: var(--nf-surface) !important;
color: var(--nf-text-dim) !important;
}
.tvguide .programCell:not(.programCell-active):hover {
background: var(--nf-surface-3) !important;
color: var(--nf-text) !important;
}
.tvguide .programCell.programCell-active,
.tvguide .programCell.programCell-active:focus {
background: linear-gradient(90deg, rgb(229 9 20 / 0.18), rgb(229 9 20 / 0) 18rem), #333 !important;
color: var(--nf-text) !important;
}
.tvguide .programCell.programCell-active:hover {
background: linear-gradient(90deg, rgb(229 9 20 / 0.22), rgb(229 9 20 / 0) 18rem), #3d3d3d !important;
}
.tvguide .programCell-active .guideProgramNameText::before,
#itemDetailPage .programGuide > .verticalDetailSection:first-child .listItem:first-child .listItemBodyText:first-child::before, /* ponytail: assumes no gaps in the schedule */
#liveTvPage .vertical-wrap > .squareCard .cardText-secondary:last-child:not(:empty)::before {
content: "";
display: inline-block;
flex: none;
width: 0.4rem;
height: 0.4rem;
margin-right: 0.4em;
border-radius: 50%;
background: var(--nf-red);
vertical-align: 0.12em;
}
.tvguide .guide-channelHeaderCell:focus {
background-color: var(--nf-fill-hover) !important;
color: inherit !important;
}
.tvguide .guideProgramName {
padding: 0 0.75rem;
}
.tvguide .guideProgramNameText {
font-size: 0.875rem;
font-weight: 500;
}
.tvguide .programCell-active .guideProgramNameText {
color: var(--nf-text);
font-weight: 600;
}
.tvguide .guideProgramSecondaryInfo {
margin-top: 0.15rem;
color: var(--nf-text-mute);
font-size: 0.8rem;
}
.tvguide .programCell-active .guideProgramSecondaryInfo {
color: var(--nf-text-2);
}
.tvguide .guideProgramIndicator {
margin: 0 0.5em 0 0;
padding: 0.2em 0.45em;
border-radius: var(--nf-radius-xs);
font-size: 0.6875rem;
font-weight: 700;
letter-spacing: 0.03em;
line-height: 1.2;
text-transform: uppercase;
}
.tvguide .guideProgramIndicator:is(.liveTvProgram, .newTvProgram) {
background: var(--nf-red);
color: #fff;
}
.tvguide .guideProgramIndicator:is(.premiereTvProgram, .repeatTvProgram) {
background: var(--nf-fill-tag);
color: var(--nf-text-2);
}
/* ── Channels ────────────────────────────────────────────────────────────── */
#liveTvPage .vertical-wrap > .squareCard .cardPadder,
#itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer .cardScalable {
background: radial-gradient(90% 110% at 50% 45%, #4a4a4a 0%, #333 55%, #262626 100%);
box-shadow: inset 0 0 0 1px var(--nf-line);
}
#liveTvPage .vertical-wrap > .squareCard .cardImageContainer img {
position: absolute;
inset: 0;
width: 62% !important;
height: 62% !important;
margin: auto;
object-fit: contain;
filter: drop-shadow(0 2px 8px rgb(0 0 0 / 0.35));
}
#liveTvPage .vertical-wrap > .squareCard .cardBox {
display: flex;
flex-direction: column;
}
#liveTvPage .vertical-wrap > .squareCard .cardText-first {
--kefin-card-title-color: var(--nf-text);
order: 1;
padding-top: 0.6rem;
color: var(--nf-text);
font-size: 1rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
#liveTvPage .vertical-wrap > .squareCard .cardText-secondary:empty {
display: none;
}
#liveTvPage .vertical-wrap > .squareCard .cardText-secondary:not(:last-child) {
--kefin-card-title-color: var(--nf-text-dim);
order: 2;
padding-top: 0.2rem;
color: var(--nf-text-dim);
font-size: 0.8125rem;
}
#liveTvPage .vertical-wrap > .squareCard .cardText-secondary:last-child:not(:empty) {
order: 3;
padding-top: 0.15rem;
color: var(--nf-text-mute);
font-size: 0.75rem;
font-variant-numeric: tabular-nums;
}
/* ── Channel page ────────────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) {
--nf-ch-top: 3.5rem;
--nf-ch-logo: 10rem;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .itemBackdrop {
display: none;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailPageWrapperContainer {
overflow-x: clip;
background: none;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailPagePrimaryContainer {
box-sizing: border-box;
display: grid;
grid-template-columns: var(--nf-ch-logo) minmax(0, 1fr);
grid-template-rows: auto minmax(0, 1fr);
height: calc(100dvh - var(--nf-appbar));
min-height: 36rem;
column-gap: 2.5rem;
align-items: center;
padding: var(--nf-ch-top) var(--nf-gutter) 1.5rem;
isolation: isolate;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer {
grid-area: 1 / 1;
height: auto;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer .card {
position: relative !important;
left: 0 !important;
top: 0;
float: none;
width: 100% !important;
max-width: none;
margin: 0;
z-index: auto; /* core's z-index: 3 covers the name */
}
#itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer .cardPadder {
padding-bottom: 100%;
}
#itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer .cardScalable {
border-radius: var(--nf-radius-lg);
box-shadow: inset 0 0 0 1px var(--nf-line), var(--nf-shadow-3);
}
#itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer .cardContent {
box-sizing: border-box;
padding: 16% !important; /* core zeroes .cardContent padding with !important */
overflow: visible;
contain: none;
background-color: transparent;
background-origin: content-box;
background-size: contain;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailImageContainer .cardContent::before {
content: "";
position: absolute;
top: calc(-1 * (var(--nf-appbar) + var(--nf-ch-top) + 6rem));
left: calc(-1 * var(--nf-hero-pad) - 6rem);
width: calc(100vw + 12rem);
height: calc(var(--nf-appbar) + var(--nf-ch-top) + var(--nf-ch-logo) + 14rem);
z-index: -1;
background: inherit;
background-origin: border-box;
background-size: 5rem 5rem;
background-repeat: repeat;
filter: blur(40px) saturate(2) brightness(1.15);
-webkit-mask-image: linear-gradient(to top, transparent 0, #000 70%);
mask-image: linear-gradient(to top, transparent 0, #000 70%);
pointer-events: none;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailRibbon {
grid-area: 1 / 2;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 1.25rem;
height: auto;
margin: 0;
padding: 0;
background: none;
text-shadow: 0 1px 10px rgb(0 0 0 / 0.45);
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailRibbon > .infoWrapper {
flex: none;
padding: 0;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .itemName {
font-size: var(--nf-fs-h1);
letter-spacing: -0.02em;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .mainDetailButtons {
justify-content: flex-start;
gap: 0.65em;
margin: 0;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailPagePrimaryContent {
grid-area: 2 / 1 / 3 / -1;
align-self: stretch;
padding: 2.5rem 0 0 !important;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) :is(.detailPagePrimaryContent, .detailSection, .programGuideSection) {
display: flex;
flex-direction: column;
min-height: 0;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) :is(.detailSection, .programGuideSection) {
flex: 1;
margin: 0;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .programGuide {
flex: 1;
height: auto;
min-height: 0;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .detailPageSecondaryContainer:not(:has(> :not(.hide))) {
display: none;
}
#itemDetailPage .programGuide {
--nf-days-inset: 0px;
anchor-name: --nf-days;
display: grid;
grid-auto-flow: column;
grid-auto-columns: min(46rem, 100% - 2.5rem);
grid-template-rows: minmax(0, 1fr);
gap: 1.5rem;
height: calc(100dvh - var(--nf-appbar) - 5.5rem);
overflow-x: auto;
overscroll-behavior-x: contain;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
scroll-marker-group: before;
}
.layout-desktop #itemDetailPage:has(.programGuideSection:not(.hide)) .programGuide {
--nf-days-inset: var(--nf-hero-pad);
--nf-days-fade: linear-gradient(to right, transparent, #000 var(--nf-hero-pad), #000 calc(100% - var(--nf-hero-pad)), transparent);
margin: 0 calc(-1 * var(--nf-hero-pad));
padding: 0 var(--nf-hero-pad);
scroll-padding: 0 var(--nf-hero-pad);
-webkit-mask-image: var(--nf-days-fade);
mask-image: var(--nf-days-fade);
}
#itemDetailPage .programGuide .verticalDetailSection {
display: flex;
flex-direction: column;
min-height: 0;
margin: 0;
scroll-snap-align: start;
}
#itemDetailPage .programGuide :is(.sectionTitle, .vertical-list) {
padding-left: 0;
padding-right: 0;
}
#itemDetailPage .programGuide .sectionTitle {
flex: none;
margin: 0 0 0.85rem;
}
#itemDetailPage .programGuide .vertical-list {
display: block;
flex: 0 1 auto;
min-height: 0;
margin: 0; /* core centres it, which shrinks it */
overflow-y: auto;
scroll-snap-type: y mandatory;
scroll-padding: 0.5rem 0;
}
#itemDetailPage .programGuide .listItem {
scroll-snap-align: start;
padding: 0.2rem 0.5rem 0.2rem 1rem;
border-bottom: 0;
transition: background-color var(--nf-dur-1) var(--nf-ease-out);
}
#itemDetailPage .programGuide .listItem:hover {
background: var(--nf-fill-hover);
}
#itemDetailPage .programGuide .listItemBody {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: baseline;
gap: 1rem;
padding: 0;
}
#itemDetailPage .programGuide .listItemBodyText {
margin: 0;
}
#itemDetailPage .programGuide .listItemBodyText:first-child {
flex: none;
width: 3.75rem;
color: var(--nf-text-dim);
text-align: right;
font-size: 0.875rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
#itemDetailPage .programGuide .listItemBodyText.secondary {
min-width: 0;
overflow: hidden;
color: var(--nf-text);
font-size: 0.95rem;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ── Channel page: day pager ─────────────────────────────────────────────── */
#itemDetailPage .programGuide::scroll-marker-group { /* own rules: unsupported browsers drop a whole list */
display: flex;
justify-content: flex-end;
align-items: center;
gap: 0.4rem;
height: 2.25rem;
margin-bottom: 0.75rem;
padding-right: 5.75rem;
}
#itemDetailPage .programGuide .verticalDetailSection::scroll-marker {
content: "";
display: block;
flex: none;
width: 0.45rem;
height: 0.45rem;
border-radius: 999px;
background: rgb(255 255 255 / 0.28);
cursor: pointer;
transition: width var(--nf-dur-2) var(--nf-ease-out), background-color var(--nf-dur-1) var(--nf-ease-out);
}
#itemDetailPage .programGuide .verticalDetailSection::scroll-marker:hover {
background: rgb(255 255 255 / 0.6);
}
#itemDetailPage .programGuide .verticalDetailSection::scroll-marker:target-current {
width: 1.35rem;
background: #fff;
}
#itemDetailPage .programGuide::scroll-button(*) {
position: absolute;
position-anchor: --nf-days;
bottom: calc(anchor(top) + 0.75rem);
box-sizing: border-box;
width: 2.25rem;
height: 2.25rem;
border: 1px solid var(--nf-line);
background: rgb(24 24 24 / 0.6);
-webkit-backdrop-filter: blur(14px) saturate(1.3);
backdrop-filter: blur(14px) saturate(1.3);
box-shadow: 0 0.5rem 1.5rem rgb(0 0 0 / 0.3);
color: var(--nf-text);
font: 1.35rem/1 "Material Icons";
cursor: pointer;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
#itemDetailPage .programGuide::scroll-button(*):hover:not(:disabled) {
background: rgb(70 70 70 / 0.75);
}
#itemDetailPage .programGuide::scroll-button(*):active:not(:disabled) {
background: rgb(90 90 90 / 0.8);
}
#itemDetailPage .programGuide::scroll-button(*):focus-visible {
outline: 2px solid #fff;
outline-offset: -2px;
}
#itemDetailPage .programGuide::scroll-button(*):disabled {
color: rgb(255 255 255 / 0.25);
cursor: default;
}
#itemDetailPage .programGuide::scroll-button(left) {
content: "chevron_left" / "Previous day";
right: calc(anchor(right) + var(--nf-days-inset) + 2.25rem);
border-right: 0;
border-radius: 999px 0 0 999px;
padding-left: 0.15rem;
}
#itemDetailPage .programGuide::scroll-button(right) {
content: "chevron_right" / "Next day";
right: calc(anchor(right) + var(--nf-days-inset));
border-radius: 0 999px 999px 0;
padding-right: 0.15rem;
}
#itemDetailPage .programGuide .listItemButton {
color: var(--nf-text-mute);
}
#itemDetailPage .programGuide .listItemButton:hover {
color: var(--nf-text);
}
#itemDetailPage .programGuide > .verticalDetailSection:first-child .listItem:first-child .listItemBodyText:first-child {
color: var(--nf-text);
}
/* ── Programme page ──────────────────────────────────────────────────────── */
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) {
--nf-prog-hero: 66vh;
--nf-prog-poster: 100%;
--nf-prog-poster-y: 15%;
--nf-hero-height: var(--nf-prog-hero);
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer {
display: block;
position: absolute;
top: calc(var(--nf-hero-band) - var(--nf-hero-height));
left: 0;
right: 0;
width: auto;
height: var(--nf-hero-height);
overflow: hidden;
z-index: -2;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .card {
position: relative !important;
left: 0 !important;
top: 0;
float: none;
width: 100% !important;
max-width: none;
margin: 0;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer :is(.card, .cardBox, .cardScalable) {
height: 100%;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .cardScalable {
border-radius: 0;
background: none;
box-shadow: none;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .cardPadder {
display: none;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer .cardContent {
border-radius: 0;
background-color: transparent;
background-position: center 20%;
contain: none;
}
@supports (anchor-name: --a) {
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailRibbon {
anchor-name: --nf-hero-ribbon;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContainer > .detailImageContainer {
position-anchor: --nf-hero-ribbon;
bottom: anchor(bottom);
height: auto;
}
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))):has(.detailImageContainer .portraitCard) .detailPagePrimaryContainer > .detailImageContainer .cardContent {
background-size: 0 0;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))):has(.detailImageContainer .portraitCard) .detailPagePrimaryContainer > .detailImageContainer .cardContent::before {
content: "";
position: absolute;
inset: -10%;
background: inherit;
background-size: cover;
background-position: center;
filter: blur(60px) saturate(1.3) brightness(0.7);
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))):has(.detailImageContainer .portraitCard) .detailPagePrimaryContainer > .detailImageContainer .cardContent::after {
--nf-poster-fade: linear-gradient(to right, transparent, rgb(0 0 0 / 0.6) 15%, #000 35%), linear-gradient(to bottom, transparent, #000 22%);
content: "";
position: absolute;
top: 0;
bottom: 0;
right: 0;
width: max(var(--nf-prog-poster), var(--nf-prog-hero) * 2 / 3);
background: inherit;
background-size: cover;
background-position: center var(--nf-prog-poster-y);
-webkit-mask-image: var(--nf-poster-fade);
mask-image: var(--nf-poster-fade);
-webkit-mask-composite: source-in;
mask-composite: intersect;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))):has(.detailImageContainer .squareCard) .detailPagePrimaryContainer > .detailImageContainer .cardScalable {
background: radial-gradient(70% 90% at 72% 30%, #2a2a2a 0%, #1a1a1a 45%, var(--nf-bg) 80%);
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))):has(.detailImageContainer .squareCard) .detailPagePrimaryContainer > .detailImageContainer .cardContent::after {
content: "live_tv";
position: absolute;
top: 42%;
right: calc(var(--nf-hero-pad) + 6vw);
translate: 0 -50%;
color: rgb(255 255 255 / 0.06);
font: min(34vh, 24vw)/1 "Material Icons";
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailPagePrimaryContent {
padding-top: 0 !important;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .nameContainer > .itemName {
overflow: visible;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .nameContainer > .itemName.subtitle {
margin-top: 0.25em;
color: var(--nf-text-2);
font-size: 1.2em;
font-weight: 600;
letter-spacing: 0;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailRibbon > .infoWrapper {
display: flex;
flex-wrap: wrap;
align-items: center;
column-gap: 0.6em;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .infoWrapper > .nameContainer {
flex-basis: 100%;
margin-top: 0.35em;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .infoWrapper > .itemMiscInfo-secondary {
display: contents;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-secondary > .mediaInfoItem {
order: 1;
margin: 0.45em 0.9em 0 0;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-secondary > .mediaInfoItem:has(+ a.mediaInfoItem) {
order: -2;
margin: 0;
padding: 0.2em 0.5em;
border-radius: var(--nf-radius-xs);
background: var(--nf-red);
color: #fff;
font-size: 0.8em;
font-weight: 700;
letter-spacing: 0.04em;
line-height: 1.2;
text-shadow: none;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-secondary > a.mediaInfoItem {
order: -1;
margin: 0;
padding: 0;
color: var(--nf-text);
font-size: 0.95em;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemMiscInfo-secondary > a.mediaInfoItem:hover {
text-decoration: underline;
text-underline-offset: 0.2em;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) {
gap: 0.4rem;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) > span + span::before {
content: none;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) > span > a {
display: inline-flex;
align-items: center;
height: 1.6rem;
padding: 0 0.6em;
border-radius: var(--nf-radius-xs);
background: var(--nf-fill-tag);
color: var(--nf-text-2);
font-size: 0.75rem;
font-weight: 600;
text-decoration: none;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .itemDetailsGroup > :last-child .detailsGroupItem > :not(.label) > span > a:hover {
background: rgb(255 255 255 / 0.2);
color: var(--nf-text);
text-decoration: none;
}
/* ── Programme page: record buttons ──────────────────────────────────────── */
@supports (anchor-name: --a) {
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .mainDetailButtons {
anchor-name: --nf-hero-buttons;
align-self: flex-start;
min-height: 2.6em;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .mainDetailButtons:has(> .detailButton:not(.hide)) {
padding-right: 0.65em;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .mainDetailButtons.hide {
display: flex !important;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) :is(.detailPagePrimaryContent, .detailSection) {
position: static;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .recordingFields {
position: absolute;
position-anchor: --nf-hero-buttons;
top: anchor(top);
left: anchor(right);
height: 2.6em;
margin: 0 !important; /* core sets a margin inline */
font-size: var(--nf-hero-fs);
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .recordingFields > .recordingFields {
height: 100%;
gap: 0.65em;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .recordingFields :is(.recordingFields-buttons, .recordingFields-buttons > div) {
height: 100%;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .recordingFields .recordingButton {
gap: 0.4em;
height: 100%;
min-width: 0;
padding: 0 1.4em 0 1.1em;
font-size: 1.1em;
font-weight: 700;
text-shadow: none;
}
.layout-desktop #itemDetailPage:has(.recordingFields:not(.hide) .recordingButton):not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .detailSection > .recordingFields .recordingIcon {
font-size: 1.15em;
font-weight: 400; /* the icon font has no bold */
}
}
#itemDetailPage .recordingFields > .recordingFields {
display: flex;
flex-wrap: wrap;
gap: 0.65rem;
}
#itemDetailPage .recordingFields-buttons {
margin: 0;
}
#itemDetailPage .recordingFields-buttons:has(.singleRecordingButton) {
order: -1;
}
#itemDetailPage .recordingButton {
margin: 0;
}
#itemDetailPage .recordingButton .recordingIcon {
color: var(--nf-red);
}
.layout-mobile #itemDetailPage .recordingFields-buttons:not(.hide) {
flex: 1 1 0;
}
.layout-mobile #itemDetailPage .recordingFields-buttons > div,
.layout-mobile #itemDetailPage .recordingButton {
width: 100%;
}
.layout-mobile #itemDetailPage .recordingButton {
justify-content: center;
}
.material-icons.play_arrow::before { /* restated: the glyph chunk can be mis-decoded */
content: "\e037";
}
.material-icons.fiber_manual_record::before {
content: "\e061";
}
.material-icons.fiber_smart_record::before {
content: "\e062";
}
/* ═══════════════════════════════════════════════════════════════════════
* 7d. Search
* ═══════════════════════════════════════════════════════════════════════ */
#searchPage .searchFields {
align-items: flex-start;
padding-top: 1.5rem;
}
#searchPage .searchFieldsInner {
position: relative;
width: 100%;
max-width: 36rem;
margin: 0;
}
#searchPage .searchfields-icon {
position: absolute;
left: 0.8rem;
top: 50%;
z-index: 1;
margin: 0;
transform: translateY(-50%);
color: var(--nf-text);
font-size: 1.5rem;
pointer-events: none;
}
#searchPage .searchFields .inputContainer {
margin: 0;
}
#searchPage .searchFields .inputLabel {
display: none;
}
#searchPage .searchfields-txtSearch {
height: 3rem;
padding: 0 1rem 0 3rem;
border-color: #fff;
background: rgb(0 0 0 / 0.75);
font-size: 1rem;
}
#searchPage .searchfields-txtSearch::placeholder {
color: var(--nf-text-mute);
}
#searchPage .searchSuggestions:not([style*="none"]) {
display: flex !important;
}
#searchPage .searchSuggestions {
flex-wrap: wrap;
align-items: baseline;
gap: 0.4rem 0.6em;
margin: 1.25rem 0 0;
padding: 0 var(--nf-gutter);
font-size: clamp(0.95rem, 0.8rem + 0.35vw, 1.2rem);
}
#searchPage .searchSuggestionsList {
display: contents;
}
#searchPage .searchSuggestions .sectionTitle {
margin: 0;
padding: 0;
color: var(--nf-text-mute);
font-size: 1em;
font-weight: 400;
}
#searchPage .searchSuggestions .sectionTitle::after {
content: ":";
}
#searchPage .searchSuggestionsList > div + div::before {
content: "|";
margin-right: 0.6em;
color: var(--nf-text-mute);
}
#searchPage .searchSuggestionsList a {
margin: 0;
padding: 0 !important;
color: var(--nf-text);
font-size: 1em;
font-weight: 400;
}
#searchPage .searchSuggestionsList a:hover {
text-decoration: underline;
}
#searchPage .searchResults {
padding-top: 1.75rem;
}
#searchPage .noItemsMessage {
margin: 0;
padding: 2rem var(--nf-gutter);
color: var(--nf-text-dim);
font-size: clamp(0.95rem, 0.8rem + 0.35vw, 1.2rem);
text-align: left;
}
/* ═══════════════════════════════════════════════════════════════════════
* 7e. Settings
* ═══════════════════════════════════════════════════════════════════════ */
.userPreferencesPage > :first-child {
margin-top: 2.5rem;
}
#myPreferencesMenuPage .verticalSection:first-child > .headerUsername {
margin: 0 0 1.25rem;
padding: 0;
}
#myPreferencesMenuPage .verticalSection:not(:first-child) > .sectionTitle {
margin: 0 0 0.75rem;
padding: 0;
}
#myPreferencesMenuPage a.listItem-border {
display: block;
margin: 0;
border: 1px solid var(--nf-line);
border-top: 0;
background: var(--nf-fill-panel);
transition: background-color var(--nf-dur-1) var(--nf-ease-out);
}
#myPreferencesMenuPage a.listItem-border:nth-child(1 of a.listItem-border:not(.hide)) {
border-top: 1px solid var(--nf-line);
border-radius: var(--nf-radius-lg) var(--nf-radius-lg) 0 0;
}
#myPreferencesMenuPage a.listItem-border:nth-last-child(1 of a.listItem-border:not(.hide)) {
border-radius: 0 0 var(--nf-radius-lg) var(--nf-radius-lg);
}
#myPreferencesMenuPage a.listItem-border:nth-child(1 of a.listItem-border:not(.hide)):nth-last-child(1 of a.listItem-border:not(.hide)) {
border-radius: var(--nf-radius-lg);
}
#myPreferencesMenuPage a.listItem-border:hover {
background: var(--nf-fill-hover);
}
#myPreferencesMenuPage a.listItem-border .listItem {
gap: 1rem;
padding: 0.9rem 1rem 0.9rem 1.25rem;
}
#myPreferencesMenuPage a.listItem-border .listItemIcon {
margin: 0;
color: var(--nf-text-mute);
font-size: 1.375rem;
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
#myPreferencesMenuPage a.listItem-border .listItemBody {
padding: 0;
}
#myPreferencesMenuPage a.listItem-border .listItemBodyText {
color: var(--nf-text-2);
font-size: 1rem;
font-weight: 500;
}
#myPreferencesMenuPage a.listItem-border .listItem::after {
content: "chevron_right";
margin-left: auto;
color: var(--nf-text-mute);
font: 400 1.5rem/1 "Material Icons";
transition: color var(--nf-dur-1) var(--nf-ease-out), transform var(--nf-dur-2) var(--nf-ease);
}
#myPreferencesMenuPage a.listItem-border:hover :is(.listItemIcon, .listItemBodyText) {
color: var(--nf-text);
}
.userPreferencesPage form :is(.verticalSection > .sectionTitle, .MuiStack-root > h2.MuiTypography-h2) {
margin: 0 0 1.25rem;
letter-spacing: -0.01em;
}
.userPreferencesPage form .MuiStack-root > h2.MuiTypography-h2 {
margin-bottom: 0;
}
.userPreferencesPage form > .verticalSection ~ .verticalSection,
.userPreferencesPage form > .MuiStack-root > .MuiStack-root ~ .MuiStack-root,
.dashboardDocument .mainAnimatedPage .MuiStack-root > .MuiTypography-h2:not(:first-child, h1 + *),
.dashboardDocument .mainAnimatedPage .MuiStack-root > .MuiStack-root:not(:first-child, h1 + *):has(> .MuiTypography-h2:first-child) {
margin-top: 2rem;
padding-top: 2rem;
border-top: 1px solid var(--nf-line);
}
.subtitleappearance-preview {
border-radius: var(--nf-radius-lg);
background: radial-gradient(120% 140% at 30% 20%, #4a4a4a, #1c1c1c 60%, #0a0a0a) !important;
}
#userProfilePage .imagePlaceHolder #image {
border-radius: var(--nf-radius-lg) !important; /* core sets 100% inline */
}
#userProfilePage .username {
margin: 0;
color: var(--nf-text);
font-weight: 700;
}
/* ── Settings: layout ────────────────────────────────────────────────────── */
.userPreferencesPage :is(.readOnlyContent, form) {
margin-left: 0 !important;
margin-right: 0 !important;
}
@media (min-width: 50em) {
.userPreferencesPage :is(.readOnlyContent, form) {
max-width: 42rem;
}
}
#myPreferencesMenuPage a.listItem-border:focus-visible {
position: relative;
z-index: 1;
outline: var(--nf-focus);
outline-offset: -2px;
background: var(--nf-fill-hover);
}
:is(.formDialogContent, .userPreferencesPage, .dashboardDocument .mainAnimatedPage) :is(.emby-select-withcolor, .emby-input) {
height: 3rem;
padding-top: 0;
padding-bottom: 0;
}
:is(.formDialogContent, .userPreferencesPage, .dashboardDocument .mainAnimatedPage) .checkboxFieldDescription {
margin-top: 0.15rem;
padding-left: 2.4rem;
}
@media (min-width: 50em) {
.userPreferencesPage form > .verticalSection:has(> .selectContainer #selectHomeSection1) {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: 1.5rem;
}
.userPreferencesPage form > .verticalSection:has(> .selectContainer #selectHomeSection1) > :not(.selectContainer) {
grid-column: 1 / -1;
}
}
/* ── Sticky Save ─────────────────────────────────────────────────────────── */
:is(.userPreferencesPage form, .dashboardDocument .mainAnimatedPage form:last-child) > .btnSave,
:is(.userPreferencesPage form, .dashboardDocument .mainAnimatedPage form:last-child) .MuiButton-root[type="submit"] {
position: sticky;
bottom: 1.25rem;
z-index: 2;
margin-top: 2rem;
box-shadow:
0 1.25rem 0 1.25rem var(--nf-bg),
0 -1rem 1.5rem 1rem color-mix(in srgb, var(--nf-bg) 85%, transparent);
}
/* ── MUI fields ──────────────────────────────────────────────────────────── */
.MuiFormControl-root > .MuiInputLabel-root.MuiInputLabel-root:has(+ .MuiFilledInput-root) {
position: static;
max-width: none;
margin-bottom: 0.45rem;
transform: none;
color: var(--nf-text-2);
font-size: 0.875rem;
font-weight: 500;
line-height: 1.3;
}
.MuiFilledInput-root::before,
.MuiFilledInput-root::after {
display: none;
}
.MuiFilledInput-root.MuiInputBase-multiline {
padding: 0;
}
.MuiFilledInput-root .MuiFilledInput-input {
padding: 0.7rem 0.9rem;
color: var(--nf-text);
}
.MuiFilledInput-root .MuiSelect-select.MuiSelect-select {
padding-right: 2.5rem;
}
.MuiFilledInput-root .MuiSelect-icon {
right: 0.6rem;
color: var(--nf-text-dim);
}
.MuiFormControl-root .MuiFormHelperText-root {
margin: 0.45rem 0 0;
color: var(--nf-text-mute);
font-size: 0.8125rem;
line-height: 1.4;
}
.MuiFormHelperText-root .MuiLink-root {
color: var(--nf-text-2);
text-decoration-color: rgb(255 255 255 / 0.4);
}
.MuiFormHelperText-root .MuiLink-root:hover {
color: var(--nf-text);
text-decoration-color: currentColor;
}
.MuiCheckbox-root.MuiCheckbox-root,
.MuiRadio-root.MuiRadio-root {
color: var(--nf-field-line-hover);
}
.MuiCheckbox-root.MuiCheckbox-root.Mui-checked,
.MuiRadio-root.MuiRadio-root.Mui-checked {
color: #fff;
}
.MuiCheckbox-root.MuiCheckbox-root:hover {
background-color: var(--nf-fill-hover);
}
.MuiFormControlLabel-root .MuiFormControlLabel-label {
color: var(--nf-text-2);
font-size: 0.875rem;
}
.MuiSwitch-root .MuiSwitch-switchBase {
color: var(--nf-text-dim);
}
.MuiSwitch-root .MuiSwitch-track {
background-color: var(--nf-surface-4);
opacity: 1;
}
.MuiSwitch-root .MuiSwitch-switchBase.Mui-checked {
color: var(--nf-bg);
}
.MuiSwitch-root .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track {
background-color: #fff;
opacity: 1;
}
.MuiTab-root.MuiTab-root {
color: var(--nf-text-dim);
text-transform: none;
}
.MuiTab-root.MuiTab-root:hover,
.MuiTab-root.MuiTab-root.Mui-selected {
color: var(--nf-text);
}
/* ═══════════════════════════════════════════════════════════════════════
* 7f. Dashboard
* ═══════════════════════════════════════════════════════════════════════ */
/* ── Drawer ──────────────────────────────────────────────────────────────── */
.MuiDrawer-paper {
border-right: 1px solid var(--nf-line);
background: var(--nf-bg);
}
.MuiDrawer-paper .MuiListSubheader-root {
position: static;
padding: 1.5rem 1.25rem 0.5rem;
background: none;
line-height: 1;
}
.MuiDrawer-paper .MuiListItemButton-root {
min-height: 0;
margin: 0.0625rem 0.5rem;
padding: 0.5rem 0.75rem;
border-radius: var(--nf-radius);
color: var(--nf-text-dim);
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
.MuiDrawer-paper .MuiListItemButton-root:hover {
background: var(--nf-fill-hover);
color: var(--nf-text);
}
.MuiDrawer-paper .MuiListItemButton-root.Mui-selected {
background: var(--nf-surface-2);
color: var(--nf-text);
}
.MuiDrawer-paper .MuiListItemButton-root.Mui-selected .MuiListItemText-primary {
font-weight: 600;
}
.MuiDrawer-paper .MuiListItemIcon-root {
min-width: 2rem;
color: var(--nf-text-mute);
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
.MuiDrawer-paper :is(.MuiListItemIcon-root > svg, .MuiListItemButton-root > svg) {
font-size: 1.25rem;
}
.MuiDrawer-paper .MuiListItemButton-root > svg {
color: var(--nf-text-mute);
}
.MuiDrawer-paper .MuiListItemButton-root:is(:hover, .Mui-selected) .MuiListItemIcon-root {
color: var(--nf-text);
}
.MuiDrawer-paper .MuiListItemText-root {
margin: 0;
}
.MuiDrawer-paper .MuiListItemText-primary {
font-size: 0.875rem;
line-height: 1.3;
}
.MuiDrawer-paper > .MuiList-root:first-child {
padding-top: 0.75rem;
}
.MuiDrawer-paper > .MuiList-root:first-child .MuiListItemIcon-root {
min-width: 0;
margin-right: 0.75rem;
}
.MuiDrawer-paper > .MuiList-root:first-child .MuiListItemText-primary {
color: var(--nf-text);
font-size: 1rem;
font-weight: 700;
}
.MuiDrawer-paper > .MuiList-root:first-child .MuiListItemText-secondary {
color: var(--nf-text-mute);
font-size: 0.75rem;
}
/* ── Page ────────────────────────────────────────────────────────────────── */
.dashboardDocument .mainAnimatedPage > .content-primary {
padding: 1rem clamp(1rem, 2.5vw, 3rem) 4rem;
}
.dashboardDocument a.MuiButton-root:has(> .MuiTypography-h3) {
min-width: 0;
margin: 0 0 0.75rem;
padding: 0;
background: none;
color: var(--nf-text-2);
}
.dashboardDocument a.MuiButton-root:has(> .MuiTypography-h3) .MuiTouchRipple-root {
display: none;
}
.dashboardDocument a.MuiButton-root > .MuiTypography-h3 {
font-size: 1.25rem;
font-weight: 700;
letter-spacing: -0.005em;
line-height: 1.35;
transition: color var(--nf-dur-2) var(--nf-ease-out);
}
.dashboardDocument a.MuiButton-root:has(> .MuiTypography-h3) .MuiButton-endIcon {
margin-left: 0.2rem;
color: var(--nf-text-mute);
transition: transform var(--nf-dur-2) var(--nf-ease), color var(--nf-dur-2) var(--nf-ease-out);
}
.dashboardDocument a.MuiButton-root:has(> .MuiTypography-h3) .MuiButton-endIcon > svg {
font-size: 1.5rem;
}
.dashboardDocument a.MuiButton-root:has(> .MuiTypography-h3):is(:hover, :focus-visible) {
background: none;
color: var(--nf-text);
}
/* ── Panels ──────────────────────────────────────────────────────────────── */
.dashboardDocument .mainAnimatedPage .MuiCard-root {
overflow: hidden;
}
.dashboardDocument .mainAnimatedPage .MuiList-root:not(.MuiPaper-root *) {
padding: 0;
overflow: hidden;
}
.dashboardDocument .mainAnimatedPage .MuiList-root:not(.MuiPaper-root *) > li + li {
border-top: 1px solid var(--nf-line);
}
.dashboardDocument .mainAnimatedPage .MuiListItemButton-root:hover {
background: var(--nf-fill-hover);
}
.dashboardDocument .mainAnimatedPage .MuiListItemIcon-root {
color: var(--nf-text-mute);
}
.dashboardDocument .mainAnimatedPage .MuiListItemAvatar-root {
min-width: 3rem;
}
.dashboardDocument .mainAnimatedPage .MuiListItemAvatar-root > .MuiAvatar-root {
width: 2.25rem;
height: 2.25rem;
}
.dashboardDocument .mainAnimatedPage .MuiListItemAvatar-root > .MuiAvatar-root > svg {
font-size: 1.15rem;
}
.dashboardDocument .mainAnimatedPage:not(#dashboardPage) .MuiListItemAvatar-root > .MuiAvatar-root {
background: var(--nf-surface-3);
color: var(--nf-text-dim);
}
.dashboardDocument .mainAnimatedPage:not(#dashboardPage) .MuiListItemAvatar-root > .MuiAvatar-root > svg {
color: inherit !important; /* sx sets #fff */
}
#scheduledTasksPage .MuiListItemText-root > :not(h3) {
margin-top: 0.15rem;
color: var(--nf-text-mute);
font-size: 0.8125rem;
}
.dashboardDocument .mainAnimatedPage .MuiListItemText-root > h3.MuiTypography-h3 {
color: var(--nf-text-2);
font-size: 0.9375rem;
font-weight: 600;
}
.dashboardDocument .mainAnimatedPage .MuiListItemSecondaryAction-root .MuiIconButton-root {
color: var(--nf-text-dim);
}
.dashboardDocument .mainAnimatedPage .MuiListItemSecondaryAction-root .MuiIconButton-root:hover {
background: var(--nf-fill-hover);
color: var(--nf-text);
}
.dashboardDocument .mainAnimatedPage h3.MuiTypography-h3:not(.MuiListItemText-root > *) {
color: var(--nf-text);
font-size: 1.0625rem;
font-weight: 700;
}
.dashboardDocument #dashboardPage .MuiListItemText-root {
margin: 0;
}
.dashboardDocument #dashboardPage .MuiListItemText-root > .MuiTypography-body1 {
color: var(--nf-text-2);
font-size: 0.9375rem;
font-weight: 500;
line-height: 1.35;
}
.dashboardDocument #dashboardPage .MuiListItemText-root > .MuiStack-root > .MuiTypography-root {
color: var(--nf-text-mute);
font-size: 0.8125rem;
line-height: 1.45;
}
.dashboardDocument #dashboardPage .MuiListItemText-primary {
color: var(--nf-text-mute);
font-size: 0.75rem;
}
.dashboardDocument #dashboardPage .MuiListItemText-secondary > .MuiTypography-root:first-child {
color: var(--nf-text-2);
font-size: 0.9375rem;
padding-bottom: 0.4rem;
}
.dashboardDocument #dashboardPage .MuiListItemText-secondary .MuiTypography-body2 {
margin-top: 0.35rem;
color: var(--nf-text-mute);
font-size: 0.75rem;
font-variant-numeric: tabular-nums;
}
.MuiLinearProgress-root:has(> [class*="barColorSuccess"], > [class*="barColorWarning"], > [class*="barColorError"]) {
height: 3px;
border-radius: 0;
}
.MuiLinearProgress-bar[class*="barColorSuccess"] {
background-color: var(--nf-text-dim);
}
.dashboardDocument #dashboardPage .MuiPaper-root > .MuiStack-root > .MuiStack-root:first-child > .MuiTypography-root {
color: var(--nf-text-mute);
font-weight: 500;
}
.dashboardDocument #dashboardPage .MuiPaper-root > .MuiStack-root > .MuiStack-root + .MuiStack-root > .MuiTypography-root {
color: var(--nf-text);
}
.dashboardDocument #dashboardPage .MuiCard-root .MuiTypography-h5 {
color: var(--nf-text);
font-size: 1.75rem;
font-weight: 700;
line-height: 1.2;
font-variant-numeric: tabular-nums;
}
.dashboardDocument #dashboardPage .MuiCard-root .MuiTypography-body2 {
color: var(--nf-text-mute);
font-size: 0.8125rem;
}
.dashboardDocument #dashboardPage .MuiCard-root > .MuiStack-root > svg {
color: var(--nf-text-mute);
}
.dashboardDocument .mainAnimatedPage .MuiCard-root .MuiIconButton-root {
color: var(--nf-text-dim);
}
.dashboardDocument .mainAnimatedPage .MuiCard-root .MuiIconButton-root:hover {
background: var(--nf-fill-hover);
color: var(--nf-text);
}
/* ── Buttons ─────────────────────────────────────────────────────────────── */
:is(.dashboardDocument .mainAnimatedPage, .MuiDialog-root) .MuiButton-root:not(.MuiButton-text, .MuiButton-sizeSmall) {
min-height: 2.5rem;
padding-inline: 1.25rem;
font-weight: 700;
box-shadow: none;
}
.MuiButton-root.MuiButton-outlined:not(.MuiButton-outlinedError) {
border-color: var(--nf-outline);
color: var(--nf-text);
}
.MuiButton-root.MuiButton-outlined:not(.MuiButton-outlinedError):hover {
border-color: #fff;
background: var(--nf-fill-hover);
}
.MuiButton-root.MuiButton-textPrimary:not(.MuiAppBar-root *) {
color: var(--nf-text);
}
.MuiButton-root.MuiButton-textPrimary:not(.MuiAppBar-root *):hover {
background: var(--nf-fill-hover);
}
/* ── Alerts ──────────────────────────────────────────────────────────────── */
.MuiAlert-root.MuiAlert-standard {
color: var(--nf-text-2);
}
.MuiAlert-standardSuccess .MuiAlert-icon { color: var(--nf-success); }
.MuiAlert-standardWarning .MuiAlert-icon { color: var(--nf-warning); }
.MuiAlert-standardError .MuiAlert-icon { color: var(--nf-error); }
.MuiAlert-standardInfo .MuiAlert-icon { color: var(--nf-text-dim); }
/* ── MUI dialogs ─────────────────────────────────────────────────────────── */
.MuiDialog-paper.MuiPaper-root {
border: 1px solid var(--nf-line);
border-radius: var(--nf-radius-lg);
background: var(--nf-surface);
box-shadow: var(--nf-shadow-3);
}
.MuiDialog-paper .MuiDialogContentText-root {
color: var(--nf-text-dim);
}
.MuiDialog-paper .MuiDialogActions-root {
gap: 0.5rem;
padding: 0 1.5rem 1.5rem;
}
/* ── Tables ──────────────────────────────────────────────────────────────── */
.dashboardDocument .MuiPaper-root:has(> .MuiTableContainer-root) :is(.MuiTableRow-root, .MuiTableCell-root),
.dashboardDocument .MuiPaper-root:has(> .MuiTableContainer-root) > .MuiBox-root {
background-color: transparent !important; /* MRT's rows are !important */
}
.dashboardDocument .MuiPaper-root:has(> .MuiTableContainer-root) .MuiTableCell-head {
background-color: color-mix(in srgb, #fff 4%, var(--nf-bg)) !important;
color: var(--nf-text-mute);
font-weight: 600;
}
.dashboardDocument .MuiPaper-root:has(> .MuiTableContainer-root) .MuiTableCell-head :is(.MuiTableSortLabel-icon, .MuiIconButton-root) {
color: var(--nf-text-mute);
}
.dashboardDocument .MuiPaper-root:has(> .MuiTableContainer-root) .MuiTableCell-body {
color: var(--nf-text-2);
}
.dashboardDocument .MuiTableBody-root > .MuiTableRow-root:hover > .MuiTableCell-root {
background-color: var(--nf-fill-hover) !important;
}
.dashboardDocument .MuiPaper-root:has(> .MuiTableContainer-root) :is(.MuiTablePagination-root, .MuiTablePagination-root .MuiIconButton-root, .MuiToolbar-root .MuiIconButton-root) {
color: var(--nf-text-dim);
}
.dashboardDocument .MuiToggleButtonGroup-root.MuiToggleButtonGroup-root {
gap: 0.5rem;
}
.dashboardDocument .MuiChip-root.MuiChip-clickable .MuiChip-label {
padding: 0 0.875rem;
}
/* ── Legacy pages ────────────────────────────────────────────────────────── */
.dashboardDocument .content-primary > .verticalSection:first-child > .sectionTitleContainer > .sectionTitle {
margin: 0;
}
.dashboardDocument .sectionTitleContainer > div > .sectionTitleButton.fab {
margin-left: 0.75rem;
}
.dashboardDocument input:is([type="checkbox"], [type="radio"]) {
accent-color: #fff;
}
.dashboardDocument .mainAnimatedPage .checkboxList.paperList {
padding: 0.5rem 1rem;
}
/* ── Users ───────────────────────────────────────────────────────────────── */
#userProfilesPage .visualCardBox {
background: none;
box-shadow: none;
}
#userProfilesPage .cardScalable {
border-radius: var(--nf-radius-lg);
overflow: hidden;
}
#userProfilesPage .cardFooter {
padding: 0.55rem 0 0;
background: none;
}
#userProfilesPage .cardText {
padding: 0;
color: var(--nf-text-2);
font-size: 0.9375rem;
font-weight: 600;
}
#userProfilesPage .cardText-secondary {
margin-top: 0.15rem;
color: var(--nf-text-mute);
font-size: 0.8125rem;
font-weight: 400;
}
#userProfilesPage .btnUserMenu {
color: var(--nf-text-dim);
}
/* ═══════════════════════════════════════════════════════════════════════
* 7g. Mobile layout
* ═══════════════════════════════════════════════════════════════════════ */
.layout-mobile {
--nf-m-top: calc(var(--nf-appbar) + env(safe-area-inset-top));
--nf-m-hero: 50vh;
--nf-m-logo: 20vh;
--nf-fs-h2: clamp(1.25rem, 1rem + 0.75vw, 1.6rem);
}
.layout-mobile .MuiAppBar-root.MuiAppBar-positionFixed {
padding-top: env(safe-area-inset-top);
}
.layout-mobile .MuiAppBar-root.MuiAppBar-positionFixed + div[aria-hidden="true"] {
min-height: var(--nf-m-top);
}
/* ── Detail pages: hero ──────────────────────────────────────────────────── */
.layout-mobile #itemDetailPage .itemBackdrop {
height: var(--nf-m-hero);
margin-top: calc(-1 * var(--nf-m-top)) !important; /* core: -48px !important */
background-position: center 20%;
}
.layout-mobile #itemDetailPage .itemBackdrop:not([style*="url("], [data-src], .lazy, .lazy-hidden) {
height: var(--nf-m-top);
}
.layout-mobile #itemDetailPage:has(.programGuideSection:not(.hide)) .itemBackdrop[style*="url("] {
height: calc(var(--nf-m-top) + 12rem);
overflow: hidden;
isolation: isolate;
background-size: 0 0;
}
.layout-mobile #itemDetailPage:has(.programGuideSection:not(.hide)) .itemBackdrop::before {
background: linear-gradient(0deg, var(--nf-bg) 0, rgb(var(--nf-bg-rgb) / 0.5) 15%, transparent 40%);
}
.layout-mobile #itemDetailPage:has(.programGuideSection:not(.hide)):has(.itemBackdrop[style*="url("]) .detailPageWrapperContainer {
position: relative;
margin-top: -10rem;
background: none;
}
.layout-mobile #itemDetailPage:has(.programGuideSection:not(.hide)) .itemBackdrop::after {
content: "";
position: absolute;
inset: -3rem;
z-index: -1;
background: inherit;
background-size: 5rem 5rem;
background-repeat: repeat;
filter: blur(40px) saturate(2) brightness(1.15);
}
.layout-mobile #itemDetailPage .itemBackdrop::before {
background:
linear-gradient(180deg, rgb(0 0 0 / 0.55), transparent 25%),
linear-gradient(0deg,
var(--nf-bg) 0,
var(--nf-bg) 4%,
rgb(var(--nf-bg-rgb) / 0.88) 22%,
rgb(var(--nf-bg-rgb) / 0.66) 34%,
rgb(var(--nf-bg-rgb) / 0.38) 48%,
rgb(var(--nf-bg-rgb) / 0.14) 70%,
transparent 90%);
}
.layout-mobile #itemDetailPage .detailLogo:not(.hide) {
display: block;
left: 0;
right: 0;
top: calc(var(--nf-m-hero) - var(--nf-m-top) - var(--nf-m-logo) - 0.5rem);
width: min(80%, 28rem);
height: var(--nf-m-logo);
margin: 0 auto;
background-position: center bottom;
background-size: contain;
filter: drop-shadow(0 2px 12px rgb(0 0 0 / 0.5));
z-index: 2;
}
.layout-mobile #itemDetailPage .detailLogo:not(.hide) ~ .detailPageWrapperContainer .nameContainer > :is(.parentName, .itemName.parentNameLast) {
display: none;
}
.layout-mobile #itemDetailPage:not(:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide))) .infoWrapper > .detailImageContainer {
display: none;
}
.layout-mobile #itemDetailPage:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide)) .infoWrapper > .detailImageContainer {
display: flex;
justify-content: center;
margin: 1.5rem 0 1.25rem;
}
.layout-mobile #itemDetailPage:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide)) .infoWrapper > .detailImageContainer .card,
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .infoWrapper > .detailImageContainer .card {
position: relative;
top: auto;
bottom: auto;
left: auto;
width: min(45%, 13rem);
max-width: none;
margin: 0;
filter: none;
}
.layout-mobile #itemDetailPage:has(.detailImageContainer .cardImageIcon.person, .programGuideSection:not(.hide)) .infoWrapper > .detailImageContainer .cardScalable,
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .infoWrapper > .detailImageContainer .cardScalable {
overflow: hidden;
border-radius: var(--nf-radius-lg);
box-shadow: 0 0 0 1px var(--nf-line), var(--nf-shadow-3);
}
.layout-mobile #itemDetailPage .detailRibbon {
padding: 0 var(--nf-gutter);
text-align: center;
}
.layout-mobile #itemDetailPage .infoWrapper {
padding-left: 0;
}
.layout-mobile #itemDetailPage :is(.nameContainer, .itemMiscInfo, .mainDetailButtons) {
justify-content: center;
text-align: center;
}
.layout-mobile #itemDetailPage .itemName {
font-size: 1.75rem;
letter-spacing: -0.01em;
line-height: 1.15;
}
.layout-mobile #itemDetailPage .nameContainer > .itemName.originalTitle {
margin: 0.3em 0 0;
color: var(--nf-text-dim);
font-size: 0.9rem;
font-weight: 500;
}
.layout-mobile #itemDetailPage .itemMiscInfo-primary {
flex-wrap: wrap;
gap: 0.25em 0.75em;
margin: 0.6rem 0 0 !important; /* core sets margin-bottom inline */
color: var(--nf-text-2);
}
.layout-mobile #itemDetailPage .itemMiscInfo-primary > .mediaInfoItem {
margin: 0;
}
.layout-mobile #itemDetailPage .mainDetailButtons {
flex-wrap: wrap;
gap: 0.65em;
margin: 1.25rem 0 0;
padding: 0;
}
@media (orientation: portrait) and (max-width: 40em) {
.layout-mobile #itemDetailPage .mainDetailButtons .detailButton.btnPlay {
flex: 1 0 100%;
justify-content: center;
margin: 0 0 0.35em;
}
}
/* ── Detail pages: episodes ──────────────────────────────────────────────── */
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) {
--nf-m-still: min(78vw, 26rem);
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .detailLogo {
display: none;
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .itemBackdrop {
height: calc(var(--nf-m-top) + 2rem + var(--nf-m-still) * 9 / 16);
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .itemBackdrop::before {
background:
linear-gradient(180deg, rgb(0 0 0 / 0.6), transparent 25%),
linear-gradient(0deg,
var(--nf-bg) 0,
var(--nf-bg) 4%,
rgb(var(--nf-bg-rgb) / 0.92) 22%,
rgb(var(--nf-bg-rgb) / 0.83) 45%,
rgb(var(--nf-bg-rgb) / 0.69) 75%,
rgb(var(--nf-bg-rgb) / 0.62) 100%);
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .infoWrapper > .detailImageContainer {
display: flex;
position: relative;
justify-content: center;
margin: calc(-0.5rem - var(--nf-m-still) * 9 / 16) 0 1.25rem;
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .infoWrapper > .detailImageContainer .card {
z-index: auto; /* core's 3 puts the still's shadow over the title */
width: var(--nf-m-still);
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .nameContainer {
position: relative; /* above the still's shadow */
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .nameContainer > .parentName {
display: block;
margin: 0;
font-size: 1.75rem;
letter-spacing: -0.01em;
line-height: 1.15;
}
.layout-mobile #itemDetailPage:has(.infoWrapper > .detailImageContainer .backdropCard):has(.nameContainer > .parentName):not(:has(.recordingFields:not(.hide) .recordingButton)) .nameContainer > .parentName ~ .itemName:not(.originalTitle) {
margin: 0.35em 0 0;
color: var(--nf-text-2);
font-size: 1.05rem;
font-weight: 600;
letter-spacing: 0;
line-height: 1.3;
}
/* ── Detail pages: below the hero ────────────────────────────────────────── */
.layout-mobile #itemDetailPage .detailPagePrimaryContent {
padding: 1.75rem var(--nf-gutter) 0 !important; /* core: 5% !important */
}
.layout-mobile #itemDetailPage :is(.detailSectionContent > .tagline, .detailSectionContent .overview, .itemDetailsGroup) {
max-width: none;
}
/* ── Detail pages: episode list ──────────────────────────────────────────── */
.layout-mobile #itemDetailPage .listItem-largeImage {
display: block;
margin: 0 0 1.5rem;
padding: 0;
background: none;
}
.layout-mobile #itemDetailPage .listItem-largeImage > .listItem-content {
align-items: center;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemImage-large {
flex: none;
width: min(40%, 11rem);
height: auto;
aspect-ratio: 16 / 9;
margin: 0;
border-radius: var(--nf-radius);
background-size: cover;
overflow: hidden;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemImageButton {
width: 2rem;
height: 2rem;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemBody {
min-width: 0;
padding: 0 0.25rem 0 0.85rem;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemBodyText:first-child {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
margin: 0;
padding: 0;
color: var(--nf-text);
font-size: 0.95rem;
font-weight: 600;
line-height: 1.3;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemMediaInfo {
display: flex;
flex-wrap: wrap;
gap: 0.25em 0.75em;
margin-top: 0.3em;
color: var(--nf-text-dim);
font-size: 0.8rem;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemMediaInfo > .mediaInfoItem {
margin: 0;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemMediaInfo > :is(.starRatingContainer, .endsAt) {
display: none;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listViewUserDataButtons {
gap: 0;
}
.layout-mobile #itemDetailPage .listItem-largeImage .listItemButton {
padding: 0.35em;
color: var(--nf-text-mute);
font-size: 0.85em;
}
.layout-mobile #itemDetailPage .listItem-largeImage :is(.listItem-bottomoverview, .listItem-overview) {
margin: 0.5rem 0 0;
padding: 0;
color: var(--nf-text-mute);
font-size: 0.85rem;
line-height: 1.45;
}
/* ── Cards ───────────────────────────────────────────────────────────────── */
.layout-mobile .card:is(.portraitCard, .overflowPortraitCard, .squareCard, .overflowSquareCard) :is(.cardScalable > button.cardOverlayButton-br[data-action="play"], .cardScalable > a > .cardOverlayButton-br) {
display: none;
}
.layout-mobile :is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) :is(.cardScalable > button.cardOverlayButton-br[data-action="play"], .cardScalable > a > .cardOverlayButton-br > .cardOverlayButton) {
--nf-rise: 0rem;
}
.layout-mobile :is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) :is(.cardScalable > button.cardOverlayButton-br[data-action="play"], .cardScalable > a > .cardOverlayButton-br) {
top: auto;
right: auto;
bottom: 0.6rem;
left: 0.6rem;
margin: 0;
}
.layout-mobile :is(.backdropCard, .overflowBackdropCard, .smallBackdropCard) .cardScalable > a > .cardOverlayButton-br {
padding: 0;
}
/* ── Navigation drawer ───────────────────────────────────────────────────── */
.MuiDrawer-modal > .MuiBackdrop-root {
background: rgb(0 0 0 / 0.7);
}
.MuiDrawer-paper:has(> .MuiBox-root) {
width: min(80vw, 18rem);
padding-top: env(safe-area-inset-top);
border-right: 0;
outline: 0; /* MUI focuses the sheet on open */
box-shadow: var(--nf-shadow-3);
}
.MuiDrawer-paper > .MuiBox-root > .MuiList-root:first-child > li:first-child > a {
min-height: var(--nf-appbar);
margin-bottom: 0.5rem;
background: none;
}
.MuiDrawer-paper > .MuiBox-root > .MuiList-root:first-child > li:first-child > a > * {
display: none;
}
.MuiDrawer-paper > .MuiBox-root .MuiListItemButton-root {
margin: 0;
padding: 0.8rem 1.25rem;
border-radius: 0;
}
.MuiDrawer-paper > .MuiBox-root .MuiListItemButton-root.Mui-selected {
background: none;
box-shadow: inset 3px 0 0 var(--nf-text);
}
.MuiDrawer-paper > .MuiBox-root .MuiListItemIcon-root {
min-width: 2.5rem;
}
.MuiDrawer-paper > .MuiBox-root .MuiListItemText-primary {
font-size: 1rem;
}
.MuiDrawer-paper > .MuiBox-root > .MuiDivider-root {
margin: 0.5rem 1.25rem;
border-color: var(--nf-line);
}
/* ── Rows, guide ─────────────────────────────────────────────────────────── */
.layout-mobile a.clearLink > .sectionTitle + svg {
padding-top: 0.5em;
}
.layout-mobile .tvguide :is(.channelsContainer, .guide-channelTimeslotHeader) {
width: 6.5rem;
}
.layout-mobile .tvguide .guideChannelImage {
right: 0.5rem;
}
/* ═══════════════════════════════════════════════════════════════════════
* 7h. Sign-in
* ═══════════════════════════════════════════════════════════════════════ */
#loginPage {
display: flex;
background: radial-gradient(70rem 40rem at 50% -10%, rgb(229 9 20 / 0.16), transparent 70%), #000;
}
#loginPage > div {
box-sizing: border-box;
width: min(100% - 2rem, 28.125rem);
margin: auto;
padding: 3rem 4.25rem 2.5rem !important; /* core: .padded-bottom-page */
border-radius: var(--nf-radius);
background: rgb(var(--nf-bg-rgb) / 0.75);
box-shadow: var(--nf-shadow-3);
}
#loginPage :is(.manualLoginForm, .readOnlyContent) {
max-width: none;
margin: 0 !important; /* core sets the bottom margin inline */
}
#loginPage .manualLoginForm > div:first-child {
justify-content: flex-start;
padding: 0;
}
#loginPage .manualLoginForm h1 {
margin: 0 0 1.75rem;
color: var(--nf-text);
font-size: 2rem;
font-weight: 700;
}
#loginPage .inputContainer {
margin-bottom: 1rem;
}
#loginPage .emby-input {
height: 3.25rem;
padding: 0 1rem;
font-size: 1rem;
}
#loginPage .checkboxContainer {
margin: 0.25rem 0 1.5rem;
}
#loginPage .emby-button.block {
height: 2.75rem;
margin: 0 0 0.75rem;
font-size: 1rem;
font-weight: 600;
}
#loginPage .readOnlyContent > :is(.btnForgotPassword, .btnSelectServer) {
height: auto;
margin: 1rem auto 0;
padding: 0;
background: none;
color: var(--nf-text);
font-weight: 500;
}
#loginPage .readOnlyContent > :is(.btnForgotPassword, .btnSelectServer):hover {
text-decoration: underline;
}
#loginPage .loginDisclaimerContainer {
margin-top: 1.5rem;
color: var(--nf-text-mute);
font-size: 0.85rem;
}
#loginPage .loginDisclaimerContainer:has(.loginDisclaimer:empty) {
display: none;
}
@media (max-width: 40em) {
#loginPage {
background: #000;
}
#loginPage > div {
width: 100%;
padding: calc(var(--nf-appbar) + 1rem) 1.5rem 2rem !important;
background: none;
box-shadow: none;
}
}
/* ═══════════════════════════════════════════════════════════════════════
* 8. Media Bar
* ═══════════════════════════════════════════════════════════════════════ */
:root {
--slideshow-font: var(--nf-font);
--slideshow-bottom-fade: linear-gradient(to top, #fff0 5%, rgb(0 0 0 / 0.1) 35%, #000000 80%);
--slideshow-gutter: 3.3%;
}
body #slides-container .gradient-overlay {
background:
linear-gradient(77deg, rgb(0 0 0 / 0.65) 0%, rgb(0 0 0 / 0.25) 45%, transparent 75%),
linear-gradient(0deg, var(--nf-bg) 0%, transparent 35%);
}
body #slides-container .spec-line {
font-family: var(--nf-font);
letter-spacing: 0.02em;
text-transform: none;
font-weight: 500;
color: var(--nf-text-2);
}
body #slides-container .spec-rail {
background: rgb(255 255 255 / 0.18);
}
body #slides-container .spec-progress {
background: var(--nf-red);
}
body #slides-container .slide-content {
text-shadow: 0 1px 10px rgb(0 0 0 / 0.65);
}
body #slides-container .misc-info {
gap: 0.25em 0.75em;
color: var(--nf-text-2);
font-size: 1.05rem;
font-weight: 500;
font-variant-numeric: tabular-nums;
}
body #slides-container .misc-info > .separator-icon {
display: none;
}
body #slides-container .misc-info > .age-rating {
padding: 0.05em 0.45em;
border: 1px solid var(--nf-outline);
border-radius: var(--nf-radius-xs);
background: none;
color: var(--nf-text-2);
font-size: 0.85em;
font-weight: 600;
line-height: 1.5;
text-shadow: none;
}
body #slides-container .genre {
gap: 0.5em;
color: var(--nf-text-dim);
font-size: 0.95rem;
}
body #slides-container .genre > .separator-icon {
font-size: 4px;
color: var(--nf-text-mute);
}
body #slides-container .plot {
max-width: 38em;
color: var(--nf-text-2);
font-size: 1.1rem; /* as .detailSectionContent .overview */
line-height: 1.6;
}
body #slides-container .button-container {
gap: 0.65rem;
}
body #slides-container :is(.detail-button, .favorite-button, .watchlist-button) {
text-shadow: none;
}
body #slides-container button {
background: var(--nf-text-2);
border: 1px solid var(--nf-text-2);
color: var(--nf-bg);
font-family: var(--nf-font);
font-weight: 700;
}
body #slides-container .play-button {
order: -1;
border-color: #fff;
border-radius: var(--nf-radius);
background: #fff;
color: #000;
text-shadow: none;
padding-inline: 1em 1.35em !important;
}
body #slides-container button:hover {
background: var(--nf-fill-white-hover);
}
body #slides-container .favorite-button.favorited {
color: var(--nf-red) !important;
border-color: var(--nf-red) !important;
}
body #slides-container .watchlist-button[data-active="true"] {
color: var(--nf-success) !important;
border-color: var(--nf-success) !important;
}
body #slides-container .dots-container {
display: none !important;
}
body #slides-container :is(.arrow, .ss-chrome) {
display: grid;
place-items: center;
width: 2.25rem;
height: 2.25rem;
border-radius: 50%;
text-shadow: none;
}
body #slides-container .arrow {
box-sizing: border-box;
width: 2rem;
height: 2rem;
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
transition: opacity var(--nf-dur-2) var(--nf-ease-out), visibility var(--nf-dur-2) var(--nf-ease-out), background-color var(--nf-dur-1) var(--nf-ease-out), border-color var(--nf-dur-1) var(--nf-ease-out);
}
body #slides-container :is(.arrow, .ss-chrome) i {
font-size: 1.2rem;
}
body #slides-container .ss-chrome {
color: var(--nf-text);
filter: drop-shadow(0 1px 3px rgb(0 0 0 / 0.6));
transition: opacity var(--nf-dur-2) var(--nf-ease-out), visibility var(--nf-dur-2) var(--nf-ease-out);
}
body #slides-container:is(:hover, :focus-within, .is-paused, .settings-open) .ss-chrome {
opacity: 0.55;
}
body #slides-container .ss-chrome:is(:hover, :focus-visible) {
opacity: 1;
}
@media (min-width: 768px) {
body #slides-container:not([class*="layout-"]) :is(.arrow, .ss-chrome) {
top: auto;
left: auto;
bottom: calc(var(--slideshow-height) - var(--slideshow-content-top) + var(--slideshow-dots-reserve) + 25px - 1.125rem); /* centred on the 50px button row */
transform: none;
}
body #slides-container:not([class*="layout-"]) .arrow {
bottom: calc(var(--slideshow-height) - var(--slideshow-content-top) + var(--slideshow-dots-reserve) + 25px - 1rem);
}
body #slides-container:not([class*="layout-"]) .right-arrow {
right: var(--slideshow-gutter);
}
body #slides-container:not([class*="layout-"]) .left-arrow {
right: calc(var(--slideshow-gutter) + 3rem);
}
body #slides-container:not([class*="layout-"]) .pause-button {
right: calc(var(--slideshow-gutter) + 6.25rem);
}
body #slides-container:not([class*="layout-"]) .volume-toggle {
right: calc(var(--slideshow-gutter) + 8.75rem);
}
body #slides-container:not([class*="layout-"]) .ss-settings-toggle {
right: calc(var(--slideshow-gutter) + 11.25rem);
}
}
@media (max-width: 767px) and (orientation: portrait) {
body #slides-container:not([class*="layout-"]) .ss-chrome {
right: var(--slideshow-gutter);
height: 1.75rem;
}
body #slides-container:not([class*="layout-"]) .ss-settings-toggle {
top: calc(var(--nf-m-top, var(--nf-appbar)) + 0.5rem);
}
body #slides-container:not([class*="layout-"]) .pause-button {
top: calc(var(--nf-m-top, var(--nf-appbar)) + 2.25rem);
}
}
/* ═══════════════════════════════════════════════════════════════════════
* 9. KefinTweaks
* ═══════════════════════════════════════════════════════════════════════ */
.progress-bar-fill,
.progress-chunk.watched,
.pagination-btn.active,
.mdl-radio__focus-circle {
background: var(--nf-red);
border-color: var(--nf-red);
}
.view-episode-btn:hover {
color: var(--nf-red);
}
.import-export-tab.active {
border-bottom-color: var(--nf-red);
}
.watchlist-button[data-active="true"],
.watchlist-icon[data-active="true"] {
color: var(--nf-success) !important;
}
header .kefin-custom-menu-top-divider {
display: none;
}
/* ── Watchlist page ──────────────────────────────────────────────────────── */
body .sections.watchlist .watchlist-tabs {
justify-content: flex-start;
gap: 1.75rem;
padding: 0 var(--nf-gutter);
border-bottom: 1px solid var(--nf-line);
}
body .sections.watchlist .watchlist-tabs button {
padding: 0.75rem 0;
border: 0;
border-radius: 0;
background: none;
color: var(--nf-text-dim);
font: 500 1rem/1.2 var(--nf-font);
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .watchlist-tabs button:hover {
background: none;
color: var(--nf-text);
}
body .sections.watchlist .watchlist-tabs button.active {
background: none;
box-shadow: inset 0 -2px 0 #fff;
color: var(--nf-text);
font-weight: 700;
}
body .sections.watchlist .tab-header h2 {
line-height: 1.15;
}
body .sections.watchlist .tab-header {
max-width: none;
margin: 0;
padding: 1.75rem var(--nf-gutter) 1.25rem;
border-bottom: 0;
flex-direction: row;
align-items: center;
}
body .sections.watchlist :is(.watchlist-header-stats, .progress-header-stats, .movie-history-stats) {
padding: 0.3rem 0.6rem;
border: 0;
border-radius: var(--nf-radius-xs);
background: var(--nf-fill-tag);
color: var(--nf-text-2);
font-size: 0.75rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
body .sections.watchlist :is(.progress-header-stats-container, .movie-history-stats-container) {
align-items: center;
gap: 0.5rem;
}
body .sections.watchlist :is(.progress-header-stats-container, .movie-history-stats-container) > * {
margin: 0;
}
body .sections.watchlist :is(.progress-header-stats, .movie-history-stats) {
display: flex;
align-items: center;
box-sizing: border-box;
height: 2rem;
}
body .sections.watchlist .sort-button,
body .sections.watchlist .show-all-btn {
height: 2rem;
padding: 0 0.85rem;
border: 0;
border-radius: var(--nf-radius);
font-size: 0.875rem;
font-weight: 600;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), box-shadow var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .search-container {
margin: 0 var(--nf-gutter) 1.5rem !important;
padding: 0;
justify-self: start;
}
body .sections.watchlist .search-input-wrapper {
max-width: 21rem;
margin: 0;
}
body .sections.watchlist .search-input-wrapper .search-icon {
left: 0.6rem;
transform: translateY(-50%);
color: var(--nf-text-dim);
}
body .sections.watchlist .search-input {
box-sizing: border-box;
width: 100%;
height: 2.25rem;
padding: 0 2.25rem;
border: 1px solid rgb(255 255 255 / 0.5);
border-radius: var(--nf-radius);
background: rgb(0 0 0 / 0.6);
color: var(--nf-text);
font-size: 0.875rem;
transition: border-color var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .search-input:focus {
border-color: #fff;
background: rgb(0 0 0 / 0.75);
box-shadow: none;
}
body .sections.watchlist .paginated-container {
max-width: none;
margin: 0;
padding: 0 var(--nf-gutter);
}
/* ── Watchlist: Series Progress ──────────────────────────────────────────── */
body .sections.watchlist .progress-series {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(36rem, 100%), 1fr));
gap: 1rem;
padding: 0;
}
body .sections.watchlist .progress-card {
margin: 0;
transition: background-color var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .progress-card:hover,
body .sections.watchlist .progress-card-completed:hover {
background: var(--nf-fill-hover);
}
body .sections.watchlist .progress-card-content {
gap: 1.25rem;
padding: 1rem;
}
body .sections.watchlist .progress-poster {
width: 7.5rem;
height: 11.25rem;
border-radius: var(--nf-radius);
}
body .sections.watchlist .progress-title {
font: 700 1.25rem/1.25 var(--nf-font);
letter-spacing: -0.01em;
}
body .sections.watchlist .progress-title .title-link:hover {
color: var(--nf-text);
}
body .sections.watchlist .completion-badge {
padding: 0.3em 0.55em;
border-radius: var(--nf-radius-xs);
background: var(--nf-fill-tag);
color: var(--nf-text-2);
font-size: 0.6875rem;
font-weight: 700;
letter-spacing: 0.04em;
}
body .sections.watchlist .progress-percentage {
color: var(--nf-text);
font: 700 1.25rem/1 var(--nf-font);
font-variant-numeric: tabular-nums;
}
body .sections.watchlist .progress-series .progress-bar {
height: 6px;
padding: 0;
border-radius: 3px;
background: rgb(128 128 128 / 0.35);
}
body .sections.watchlist .progress-bar-completed .progress-chunk.watched,
body .sections.watchlist .progress-bar-completed .progress-bar-fill {
background: var(--nf-red);
}
body .sections.watchlist .progress-stats {
color: var(--nf-text-dim);
font-size: 0.875rem;
}
body .sections.watchlist .progress-stats strong {
color: var(--nf-text);
}
body .sections.watchlist .progress-last-watched {
color: var(--nf-text-mute);
font-size: 0.8125rem;
}
body .sections.watchlist .progress-last-watched strong {
color: var(--nf-text-2);
}
body .sections.watchlist .action-link {
color: var(--nf-text-dim);
font-size: 0.875rem;
font-weight: 600;
transition: color var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .action-link:hover {
color: var(--nf-text);
}
/* ── Watchlist: Movie History ────────────────────────────────────────────── */
body .sections.watchlist .movie-history-grid {
grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
gap: 1.75rem 0.75rem;
}
body .sections.watchlist .movie-card {
overflow: visible;
border: 0;
border-radius: 0;
background: none;
-webkit-backdrop-filter: none;
backdrop-filter: none;
transition: transform var(--nf-dur-3) var(--nf-ease);
}
body .sections.watchlist .movie-card:hover {
z-index: 2;
border: 0;
background: none;
box-shadow: none;
transform: scale(1.04);
}
body .sections.watchlist .movie-poster {
border-radius: var(--nf-radius);
transition: box-shadow var(--nf-dur-3) var(--nf-ease);
}
body .sections.watchlist .movie-card:hover .movie-poster {
box-shadow: 0 0 0 1px var(--nf-line), var(--nf-shadow-1);
transform: none;
}
body .sections.watchlist .movie-poster-overlay {
justify-content: flex-end;
padding: 0.6rem 0.3rem;
background: transparent;
}
body .sections.watchlist .movie-card:is(:hover, :focus-within) .movie-poster-overlay {
background: var(--nf-scrim-card);
}
body .sections.watchlist .movie-watched-badge {
position: absolute;
top: 0;
right: 0;
gap: 0;
background: var(--nf-red);
color: #fff;
font-size: 0;
}
body .sections.watchlist .movie-watched-badge > .material-icons::before {
content: "\e5ca"; /* check, not check_circle */
}
body .sections.watchlist .movie-poster-overlay .cardOverlayButton {
position: static;
width: 2rem;
height: 2rem;
border: 0;
background: transparent;
-webkit-backdrop-filter: none;
backdrop-filter: none;
color: var(--nf-text);
transition: opacity var(--nf-dur-2) var(--nf-ease-out), background-color var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .movie-poster-overlay .cardOverlayButton:hover {
border: 0;
background: var(--nf-fill-hover);
color: var(--nf-text);
transform: none;
}
body .sections.watchlist .movie-poster-overlay .cardOverlayButton.favorited {
border: 0;
background: transparent;
color: var(--nf-red);
filter: drop-shadow(0 1px 3px rgb(0 0 0 / 0.6));
}
.layout-desktop body .sections.watchlist .movie-card:not(:hover, :focus-within) .cardOverlayButton:not(.favorited) {
opacity: 0;
}
body .sections.watchlist .movie-poster-overlay .cardOverlayButton .material-icons {
font-size: 1.1rem;
}
body .sections.watchlist .movie-details {
padding: 0.5rem 0.1em 0;
}
body .sections.watchlist .movie-title {
margin: 0;
color: var(--nf-text-2);
font: 500 0.875rem/1.35 var(--nf-font);
-webkit-line-clamp: 1;
}
body .sections.watchlist .movie-meta {
gap: 0.6em;
margin: 0.1rem 0 0;
color: var(--nf-text-mute);
font-size: 0.8125rem;
}
body .sections.watchlist .movie-meta .material-icons {
display: none;
}
body .sections.watchlist .movie-meta > * {
color: inherit;
font-size: inherit;
font-weight: 400;
}
body .sections.watchlist .movie-watched-date {
margin-top: 0.1rem;
color: var(--nf-text-mute);
font-size: 0.75rem;
font-style: normal;
}
/* ── Watchlist: Statistics ───────────────────────────────────────────────── */
body .sections.watchlist .progress-stats-container {
max-width: none;
margin: 1.5rem 0 !important;
padding: 0 var(--nf-gutter);
}
body .sections.watchlist .progress-stats-grid {
gap: 0.75rem;
}
body .sections.watchlist :is(.stat-card, .top-shows-container, .stats-chart-card, .stats-list-card) {
-webkit-backdrop-filter: none;
backdrop-filter: none;
}
body .sections.watchlist .stat-card {
gap: 1rem;
padding: 1.25rem;
transition: background-color var(--nf-dur-1) var(--nf-ease-out);
}
body .sections.watchlist .stat-card:hover {
border-color: var(--nf-line);
background: var(--nf-fill-hover);
transform: none;
}
body .sections.watchlist .stat-icon {
width: 2.75rem;
height: 2.75rem;
background: var(--nf-fill-tag);
}
body .sections.watchlist .stat-icon .material-icons {
color: var(--nf-text-2);
font-size: 1.35rem;
}
body .sections.watchlist .stat-value {
margin-bottom: 0.3rem;
font: 800 2rem/1 var(--nf-font);
letter-spacing: -0.02em;
font-variant-numeric: tabular-nums;
}
body .sections.watchlist .stat-label {
color: var(--nf-text-mute);
font-size: 0.6875rem;
font-weight: 600;
letter-spacing: 0.08em;
}
body .sections.watchlist .top-shows-container {
padding: 1.25rem 1.5rem;
}
body .sections.watchlist :is(.top-shows-header, .stats-list-header) {
color: var(--nf-text);
font-size: 1.125rem;
font-weight: 700;
}
body .sections.watchlist :is(.top-shows-header, .stats-list-header) .material-icons {
color: var(--nf-text-dim);
}
body .sections.watchlist .top-shows-list {
gap: 0;
}
body .sections.watchlist .top-show-item,
body .sections.watchlist .top-show-item:is(.rank-1, .rank-2, .rank-3) {
padding: 0.75rem 0.5rem;
border: 0;
border-bottom: 1px solid var(--nf-line);
border-radius: 0;
background: none;
}
body .sections.watchlist .top-show-item:last-child {
border-bottom: 0;
}
body .sections.watchlist .top-show-item:hover {
border-color: var(--nf-line);
background: var(--nf-fill-hover);
}
body .sections.watchlist .show-rank,
body .sections.watchlist .top-show-item:is(.rank-1, .rank-2, .rank-3) .show-rank {
min-width: 2.75rem;
margin-right: 0.75rem;
color: var(--nf-text-mute);
font: 800 1.75rem/1 var(--nf-font);
letter-spacing: -0.04em;
text-align: left;
font-variant-numeric: tabular-nums;
}
body .sections.watchlist .top-show-item:is(.rank-1, .rank-2, .rank-3) .show-rank {
color: var(--nf-text);
}
body .sections.watchlist .top-show-name {
color: var(--nf-text);
font-size: 1rem;
font-weight: 600;
}
body .sections.watchlist .top-show-episodes {
padding: 0;
background: none;
color: var(--nf-text-mute);
font-size: 0.8125rem;
}
body .sections.watchlist .stats-chart-title {
color: var(--nf-text);
font-size: 1rem;
font-weight: 700;
}
body .sections.watchlist .stats-chart-subtitle {
color: var(--nf-text-mute);
font-size: 0.8125rem;
}
body .sections.watchlist .stats-range-chip {
height: auto;
padding: 0.3rem 0.7rem;
font-size: 0.75rem;
}
body .sections.watchlist .stats-chart-canvas-wrap canvas {
filter: hue-rotate(148deg) saturate(2.6) brightness(0.88);
}
body .sections.watchlist .stats-list-item {
border-color: var(--nf-line);
}
body .sections.watchlist .stats-list-item-title {
color: var(--nf-text);
font-size: 0.875rem;
}
body .sections.watchlist .stats-list-item-meta {
color: var(--nf-text-mute);
font-size: 0.75rem;
}
body .sections.watchlist .stats-media-icon {
color: var(--nf-text-dim);
}
/* ── Watchlist: narrow screens ───────────────────────────────────────────── */
body .sections.watchlist .watchlist-tabs {
overflow-x: auto;
scrollbar-width: none;
}
body .sections.watchlist .watchlist-tabs button {
flex: none;
white-space: nowrap;
}
@media (max-width: 48em) {
body .sections.watchlist .watchlist-tabs {
gap: 1.25rem;
}
body .sections.watchlist .tab-header {
flex-wrap: wrap;
justify-content: flex-start;
gap: 1rem 0.5rem;
padding-top: 1.25rem;
}
body .sections.watchlist .tab-header > :not(h2) {
display: contents;
}
body .sections.watchlist .tab-header > h2 {
flex: 1 0 calc(100% - 3.5rem); /* leaves the refresh button beside it */
order: -2;
margin: 0;
}
body .sections.watchlist .tab-header > :not(h2) > :last-child {
order: -1;
margin: 0;
}
body .sections.watchlist :is(.watchlist-header-stats, .progress-header-stats, .movie-history-stats) {
white-space: nowrap;
}
body .sections.watchlist .progress-poster {
width: 100%;
max-width: none;
height: auto;
aspect-ratio: 300 / 55; /* the plugin switches to banners */
overflow: hidden;
}
body .sections.watchlist .progress-poster img {
width: 100%;
height: 100%;
object-fit: cover;
}
body .sections.watchlist .progress-stats-grid {
grid-template-columns: 1fr 1fr;
}
body .sections.watchlist .stat-card {
flex-direction: column;
align-items: flex-start;
gap: 0.75rem;
padding: 1rem;
}
body .sections.watchlist .stat-card:last-child:nth-child(odd) {
grid-column: 1 / -1;
}
body .sections.watchlist .stats-list-card {
min-height: 0;
}
body .sections.watchlist .top-show-item {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
}
body .sections.watchlist .top-show-item > .show-rank {
grid-row: span 2;
}
body .sections.watchlist .top-show-item > :is(.top-show-name, .top-show-episodes) {
justify-self: start;
max-width: 100%;
margin: 0;
}
}
/* ── Menus ───────────────────────────────────────────────────────────────── */
.kefinTweaks-popover {
min-width: 12rem;
max-width: none;
font-size: 0.875rem;
}
html body .kefinTweaks-popover.kefinTweaks-popover.kefinTweaks-popover.kefinTweaks-popover { /* beats KefinTweaks' 4-class !important */
padding: 0.375rem 0 !important;
}
html body .kefinTweaks-breadcrumbs-wrapper--modern .kefinTweaks-popover.kefinTweaks-popover:not(.kefinTweaks-popover--above) {
margin-top: 1.25rem !important;
}
.kefinTweaks-popover .kefinTweaks-popover-item {
display: flex;
align-items: center;
gap: 0.75rem;
width: auto !important;
margin: 0 !important;
padding: 0.55rem 1rem !important;
border: 0;
border-radius: 0 !important;
background: none !important;
color: var(--nf-text-2);
font-size: inherit;
font-weight: 400;
line-height: 1.3;
transition: background-color var(--nf-dur-1) var(--nf-ease-out), color var(--nf-dur-1) var(--nf-ease-out);
}
.kefinTweaks-popover .kefinTweaks-popover-item:hover {
background: var(--nf-fill-hover) !important;
color: var(--nf-text);
}
.kefinTweaks-popover .section-controls-more-item-icon {
color: var(--nf-text-mute);
font-size: 1.25rem;
opacity: 1;
}
.kefinTweaks-popover .kefinTweaks-popover-item.selected {
color: var(--nf-text);
font-weight: 600;
}
.kefinTweaks-popover .kefinTweaks-popover-item.selected::before {
content: none;
}
.kefinTweaks-popover .kefinTweaks-popover-item.selected::after {
content: "check";
margin-left: auto;
font: 400 1.25rem/1 "Material Icons";
}
/* ── Collection sort ─────────────────────────────────────────────────────── */
#itemDetailPage .collectionItems .sectionTitle:has(> .kt-collections-sort-btn) {
display: inline-flex;
align-items: center;
gap: 0.35rem;
}
#itemDetailPage .collectionItems .kt-collections-sort-btn {
width: 2rem;
height: 2rem;
margin: 0;
padding: 0;
color: var(--nf-text-dim);
}
#itemDetailPage .collectionItems .kt-collections-sort-btn .material-icons {
font-size: 1.25rem;
}
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) {
min-width: 17rem;
}
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) .formDialogHeader {
position: absolute;
top: 0.6rem;
right: 0.6rem;
z-index: 1;
padding: 0 !important; /* KefinTweaks sets padding and border inline */
border: 0 !important;
background: none;
}
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) .formDialogHeader + div {
padding: 1.4rem 1.5rem 1.25rem;
}
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) .formDialogHeader + div > h2 {
margin: 1.25rem 0 0.5rem;
}
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) .formDialogHeader + div > h2:first-child {
margin-top: 0;
}
.formDialog:has(.menuSortBy):not(:has(.formDialogHeaderTitle)) .radio-label-block {
margin: 0;
padding: 0.3rem 0;
color: var(--nf-text-2);
}
/* ── Enhanced search ─────────────────────────────────────────────────────── */
body.smart-search-mode #searchPage .searchFields {
padding-top: 0;
}
#searchPage .input-wrapper .searchfields-icon {
right: auto;
}
#searchPage .smart-search-buttons {
justify-content: flex-start;
gap: 0.5rem;
margin-top: 0.75rem;
}
#searchPage #smart-search-results {
margin-top: 0;
padding-left: 0;
padding-top: 1.75rem;
}
/* ═══════════════════════════════════════════════════════════════════════
* 10. Leftover Jellyfin blue, player
* ═══════════════════════════════════════════════════════════════════════ */
.listItemIcon:not(.listItemIcon-transparent) {
background-color: var(--nf-surface-3);
color: var(--nf-text);
}
.mdl-spinner__layer-1,
.mdl-spinner__layer-2,
.mdl-spinner__layer-3,
.mdl-spinner__layer-4 {
border-color: var(--nf-red);
}
.playbackProgress > div,
.sliderMarker.watched,
.mdl-slider-background-lower {
background-color: var(--nf-red);
}
progress::-webkit-progress-value {
background-color: var(--nf-red);
}
progress::-moz-progress-bar {
background-color: var(--nf-red);
}
progress[aria-valuenow]::before {
background-color: var(--nf-red);
}
.button-accent-flat {
color: var(--nf-red) !important;
}
/* ── Player ──────────────────────────────────────────────────────────────── */
.mdl-slider {
color: var(--nf-red);
}
.mdl-slider::-webkit-slider-thumb {
background: var(--nf-red);
}
.mdl-slider::-moz-range-thumb {
background: var(--nf-red);
}
body:has(#videoOsdPage:not(.hide), .videoPlayerContainer-onTop)::before {
display: none;
}
.skinHeader-withBackground.osdHeader {
background: linear-gradient(180deg, rgb(0 0 0 / 0.7), transparent);
}
.layout-mobile body:has(#videoOsdPage:not(.hide)) .MuiAppBar-root.MuiAppBar-positionFixed + div[aria-hidden="true"] {
min-height: 0;
}
.osdHeader .videoOsd-appBar {
flex-wrap: nowrap;
padding: calc(0.75rem + env(safe-area-inset-top)) 1.25rem 0;
}
.osdHeader .videoOsd-appBar > .MuiBox-root {
flex: none;
}
.osdHeader .videoOsd-appBar .MuiIconButton-root:first-child .MuiSvgIcon-root {
font-size: 2.25rem;
}
.osdHeader .videoOsd-appBar > .MuiTypography-root {
flex: 1 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-left: 0.5rem;
color: var(--nf-text-2);
font: 500 1.125rem/1.3 var(--nf-font);
}
.videoOsdBottom {
padding-top: 10rem;
padding-bottom: max(env(safe-area-inset-bottom), 1.25rem);
background: linear-gradient(0deg, rgb(0 0 0 / 0.85), rgb(0 0 0 / 0.45) 45%, transparent);
}
.videoOsdBottom .osdControls {
padding: 0 2rem;
}
.videoOsdBottom .osdTextContainer {
color: var(--nf-text-2);
font-size: 0.875rem;
font-variant-numeric: tabular-nums;
}
.videoOsdBottom :is(.osdPositionText, .osdDurationText) {
min-width: 8ch; /* fixed, so the bar doesn't move as they tick */
color: var(--nf-text);
font-weight: 700;
}
.videoOsdBottom .osdPositionText, .videoOsdBottom .osdDurationText {
justify-content: center;
padding: 0;
}
.videoOsdBottom .osdTitle {
color: var(--nf-text);
font: 700 1.25rem/1.3 var(--nf-font);
}
.videoOsdBottom .mdl-slider-background-flex {
height: 4px;
margin-top: -2px;
border-radius: 2px;
background: rgb(255 255 255 / 0.25);
transition: height var(--nf-dur-1) var(--nf-ease-out), margin var(--nf-dur-1) var(--nf-ease-out);
}
.videoOsdBottom .mdl-slider-background-upper {
background: rgb(255 255 255 / 0.3);
}
.videoOsdBottom .sliderContainer:hover .mdl-slider-background-flex {
height: 6px;
margin-top: -3px;
}
.videoOsdBottom .sliderMarker,
.videoOsdBottom .sliderMarker.watched {
z-index: 1;
height: 4px;
background: rgb(0 0 0 / 0.6);
pointer-events: none;
transform: translateY(calc(0.625em - 2px)); /* centred on the track */
transition: height var(--nf-dur-1) var(--nf-ease-out), transform var(--nf-dur-1) var(--nf-ease-out);
}
.videoOsdBottom .sliderContainer:hover .sliderMarker {
height: 6px;
transform: translateY(calc(0.625em - 3px));
}
.videoOsdBottom .sliderBubble {
overflow: hidden;
border-radius: var(--nf-radius);
background: var(--nf-surface-2);
box-shadow: var(--nf-shadow-1);
font-variant-numeric: tabular-nums;
}
.videoOsdBottom .sliderBubble:has(.chapterThumbContainer) {
overflow: visible;
border-radius: 0;
background: none;
box-shadow: none;
transform: translate3d(-50%, calc(-100% - 0.25rem), 0);
transition: left 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.videoOsdBottom .chapterThumbContainer {
overflow: visible !important; /* core sets hidden inline, which clips the frame's shadow */
background: none;
box-shadow: none;
}
.videoOsdBottom .chapterThumbWrapper {
border-radius: var(--nf-radius);
box-shadow: 0 0.5rem 1.5rem rgb(0 0 0 / 0.6);
}
.videoOsdBottom .chapterThumbTextContainer {
position: static;
padding: 0.5rem 0 0;
text-align: center;
}
.videoOsdBottom .chapterThumbText {
margin: 0;
padding: 0;
color: var(--nf-text);
text-shadow: 0 1px 4px rgb(0 0 0 / 0.9);
}
.videoOsdBottom .chapterThumbText:empty {
display: none;
}
.videoOsdBottom .chapterThumbText-dim {
color: var(--nf-text-2);
font: 500 0.8125rem/1.3 var(--nf-font);
opacity: 1;
}
.videoOsdBottom h2.chapterThumbText {
font: 700 1rem/1.3 var(--nf-font);
font-variant-numeric: tabular-nums;
}
.videoOsdBottom .buttons {
padding-top: 0.5rem;
}
.videoOsdBottom .buttons .paper-icon-button-light {
margin: 0 0.15rem;
padding: 0.4rem;
color: var(--nf-text);
transition: transform var(--nf-dur-1) var(--nf-ease-out);
}
.videoOsdBottom .buttons .paper-icon-button-light:is(:hover, :active):not(:disabled) {
background: none;
color: var(--nf-text);
transform: scale(1.2);
}
.videoOsdBottom .buttons .paper-icon-button-light > .material-icons {
font-size: 1.875rem;
}
.videoOsdBottom .osdTimeText {
margin-left: 1.25rem;
color: var(--nf-text-dim);
font-size: 0.875rem;
font-variant-numeric: tabular-nums;
}
.videoOsdBottom .osdVolumeSliderContainer {
flex-grow: 0;
width: 7rem;
}
@media (max-width: 40em) {
.osdHeader .videoOsd-appBar {
padding-inline: 0.5rem;
}
.videoOsdBottom .osdControls {
padding: 0 1rem;
}
.videoOsdBottom .osdPositionText {
padding-right: 0.5rem;
}
.videoOsdBottom .osdDurationText {
padding-left: 0.5rem;
}
.videoOsdBottom .sliderBubble:has(.chapterThumbContainer) {
left: 50% !important; /* centred over the bar, so it never leaves the screen */
transition: none;
}
.videoOsdBottom .chapterThumbWrapper {
zoom: 0.75;
}
.videoOsdBottom .buttons {
flex-wrap: nowrap;
}
.videoOsdBottom .buttons .paper-icon-button-light {
margin: 0;
padding: 0.3rem;
}
.videoOsdBottom .buttons .paper-icon-button-light > .material-icons {
font-size: 1.6rem;
}
}
.videoOsdBottom .osdVolumeSliderContainer .sliderBubbleText {
padding: 0.2rem 0.45rem;
font-size: 0.75rem;
font-weight: 700;
}
body:has(#videoOsdPage:not(.hide)) .actionSheet.actionsheet-not-fullscreen {
top: auto !important; /* core centres it on the button, inline */
bottom: calc(max(env(safe-area-inset-bottom), 1.25rem) + 3.25rem) !important;
max-height: calc(100dvh - 10rem);
}
.iconOsd {
top: 4.5rem;
right: 2rem;
width: 5.5rem;
padding: 1rem;
}
.iconOsd .iconOsdIcon {
margin: 0 auto;
font-size: 2rem;
text-align: center;
}
.iconOsd .iconOsdProgressOuter {
height: 4px;
margin: 0.85rem 0 0;
border-radius: 2px;
background: rgb(255 255 255 / 0.25);
}
.iconOsd .iconOsdProgressInner {
border-radius: 2px;
background: var(--nf-red);
}
.upNextContainer.upNextDialog {
z-index: 2; /* over the controls' gradient */
width: auto;
max-width: min(26rem, calc(100vw - 4rem));
margin: 0 2rem calc(max(env(safe-area-inset-bottom), 1.25rem) + 6.5rem) 0; /* clear of the controls */
padding: 1.1rem 1.25rem 1.25rem;
}
@keyframes nf-upnext-in {
from { transform: translateX(calc(100% + 2rem)); }
}
@media (prefers-reduced-motion: no-preference) {
.upNextContainer.upNextDialog {
transition: opacity 0.3s ease-out, transform var(--nf-dur-3) var(--nf-ease);
animation: nf-upnext-in var(--nf-dur-3) var(--nf-ease-out);
}
.upNextContainer.upNextDialog-hidden {
transform: translateX(calc(100% + 2rem));
}
}
.upNextDialog .upNextDialog-nextVideoText {
margin: 0 0 0.5rem;
}
.upNextDialog .upNextDialog-countdownText {
color: var(--nf-text);
}
.upNextDialog .upNextDialog-title {
width: auto;
margin: 0;
color: var(--nf-text);
font: 700 1.125rem/1.3 var(--nf-font);
}
.upNextDialog .upNextDialog-mediainfo {
margin: 0.35rem 0 0;
color: var(--nf-text-dim);
font-size: 0.8125rem;
font-variant-numeric: tabular-nums;
}
.upNextDialog .upNextDialog-buttons {
gap: 0.5rem;
width: auto;
margin-top: 1rem;
justify-content: flex-start;
}
.upNextDialog .upNextDialog-button {
margin: 0;
padding: 0.55rem 1.1rem;
font-size: 0.875rem;
font-weight: 700;
}
.playerStats {
z-index: 10; /* the OSD header covers its close button */
top: 4.5rem;
left: 2rem;
}
.playerStats .playerStats-content {
font-size: 0.8125rem;
}
.playerStats .playerStats-closeButton {
top: 0.5rem;
right: 0.5rem;
color: var(--nf-text-mute);
}
.playerStats .playerStats-stats {
padding: 1rem 3.25rem 1.1rem 1.25rem;
}
.playerStats .playerStats-stat {
display: grid;
grid-template-columns: 12rem minmax(0, 1fr);
column-gap: 1rem;
margin: 0;
padding: 0.2rem 0;
}
.playerStats .playerStats-stat-header {
margin: 1rem 0 0.2rem;
}
.playerStats .playerStats-stat-header:first-child {
margin-top: 0;
}
.playerStats .playerStats-stat-header > .playerStats-stat-label {
grid-column: 1 / -1;
}
.playerStats .playerStats-stat-header > .playerStats-stat-value {
display: none;
}
.playerStats .playerStats-stat-label {
margin: 0;
color: var(--nf-text-dim);
font-weight: 400;
}
.playerStats .playerStats-stat-value {
color: var(--nf-text);
font-variant-numeric: tabular-nums;
}
.skip-button {
gap: 0.4rem;
margin-right: 2rem;
padding: 0.7rem 1.4rem;
border-radius: var(--nf-radius);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
font: 600 1rem/1.2 var(--nf-font);
transition: border-color var(--nf-dur-1) var(--nf-ease-out), background-color var(--nf-dur-1) var(--nf-ease-out), opacity 0.2s ease-out;
}