Files
KefinTweaks/scripts/cardBuilder.css
T

4272 lines
122 KiB
CSS

/* Spotlight Section Styles */
@import url("https://fonts.googleapis.com/css2?family=Alfa+Slab+One&family=Anton&family=Changa+One:ital@0;1&family=Exo:ital,wght@0,100..900;1,100..900&family=Orbitron:[email protected]&family=Oswald:[email protected]&family=Prata&family=Roboto:ital,wght@0,100..900;1,100..900&family=Unbounded:[email protected]&family=VT323&display=swap");
.spotlight-section {
position: relative;
width: calc(100% - (2 * max(env(safe-area-inset-left), 3.3%)));
margin: 2em 0;
}
.spotlight-banner-container {
position: relative;
border-radius: 8px;
}
.layout-mobile .spotlight-banner-container {
display: flex;
justify-items: center;
align-items: center;
justify-content: center;
}
.spotlight-section[data-layout="Border"][data-size="normal"] .spotlight-banner-container {
height: 40vh;
}
/* Size variants */
/* .spotlight-section[data-layout="Borderless"][data-size="full"][data-order="1"] .spotlight-banner-container {
height: 94vh !important;
} */
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-banner-container {
height: 50vh;
}
.spotlight-section[data-size="full"] .spotlight-banner-container {
height: 94vh !important;
}
.layout-mobile .spotlight-section[data-size="full"] .spotlight-banner-container {
height: 85vh !important;
}
.spotlight-items-container {
position: relative;
width: 100%;
height: 100%;
}
.spotlight-item {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
transition: opacity 0.8s ease-in-out;
isolation: isolate;
}
.spotlight-item:not([data-active]):not([data-fade-out]) {
display: none;
}
/* Crossfade: outgoing slide fades to 0 */
.spotlight-item[data-fade-out] {
opacity: 0;
pointer-events: none;
}
/* Crossfade: incoming slide starts at 0, then transitions to 1 when data-entering is removed */
.spotlight-item[data-active][data-entering] {
opacity: 0;
}
.spotlight-item[data-active]:not([data-entering]) {
opacity: 1;
}
/* Skeleton spotlight: single full-container placeholder; fill area and match layout/size */
.skeleton-spotlight-item {
right: 0;
bottom: 0;
width: 100%;
height: 100%;
}
.spotlight-section[data-layout="Border"] .skeleton-spotlight-item {
border-radius: 8px;
}
.spotlight-section[data-layout="Border"] .spotlight-background-dual {
border-radius: 8px;
}
.spotlight-background-layer {
position: absolute;
top: 0;
bottom: 0;
overflow: hidden;
}
.spotlight-background-layer img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
pointer-events: none;
}
.spotlight-background-layer img.animate,
.spotlight-background-single img.animate {
filter: blur(0);
transition: filter 0.3s ease-in-out;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
transform-origin: center center;
animation: var(--spotlight-slide-animation, kenBurnsZoomIn) 15s linear both;
}
/* Single backdrop (when tileCount is 1 or only one image) */
.spotlight-background-single,
.spotlight-background-dual {
position: absolute;
z-index: 1;
overflow: hidden;
width: 100%;
height: 160%;
transform: translateY(-15%);
-webkit-mask-image: linear-gradient( to bottom, transparent 0%, black calc(var(--spotlight-fullscreen-vertical) * 2), black calc(100% - calc(var(--spotlight-fullscreen-vertical) * 2)), transparent 100% );
mask-image: linear-gradient( to bottom, transparent 0%, black calc(var(--spotlight-fullscreen-vertical) * 2), black calc(100% - calc(var(--spotlight-fullscreen-vertical) * 2)), transparent 100% );
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
-webkit-mask-position: 0 0;
mask-position: 0 0;
}
.spotlight-section[data-size="large"] .spotlight-background-single,
.spotlight-section[data-size="large"] .spotlight-background-dual {
height: 140%;
transform: translateY(-10%);
-webkit-mask-image: linear-gradient( to bottom, transparent 0%, black calc(var(--spotlight-fullscreen-vertical) * 4), black calc(100% - calc(var(--spotlight-fullscreen-vertical) * 4)), transparent 100% );
mask-image: linear-gradient( to bottom, transparent 0%, black calc(var(--spotlight-fullscreen-vertical) * 4), black calc(100% - calc(var(--spotlight-fullscreen-vertical) * 4)), transparent 100% );
}
.spotlight-section[data-size="full"] .spotlight-background-single,
.spotlight-section[data-size="full"] .spotlight-background-dual {
height: 125%;
transform: translateY(-5%);
-webkit-mask-image: linear-gradient( to bottom, transparent 0%, black calc(var(--spotlight-fullscreen-vertical) * 2), black calc(100% - calc(var(--spotlight-fullscreen-vertical) * 4)), transparent 100% );
mask-image: linear-gradient( to bottom, transparent 0%, black calc(var(--spotlight-fullscreen-vertical) * 2), black calc(100% - calc(var(--spotlight-fullscreen-vertical) * 4)), transparent 100% );
}
.spotlight-background-single img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
pointer-events: none;
}
/* Cycle backdrops: two stacked layers for crossfade (same as slide transition) */
.spotlight-background-single.cycle-backdrops img {
position: absolute;
inset: 0;
}
.spotlight-background-single.cycle-backdrops img:first-child {
z-index: 1;
}
.spotlight-background-single.cycle-backdrops img:last-child {
z-index: 2;
}
@keyframes kenBurnsZoomIn {
from {
transform: scale3d(1, 1, 0);
}
to {
transform: scale3d(1.12, 1.12, 1);
}
}
@keyframes kenBurnsZoomOut {
from {
transform: scale3d(1.15, 1.15, 0);
}
to {
transform: scale3d(1.02, 1.02, 1);
}
}
/* Full-screen: start images pre-scaled so they extend past edges from the start (no hard edge before zoom) */
@keyframes kenBurnsZoomInFullscreen {
from {
transform: scale3d(1.08, 1.08, 0);
}
to {
transform: scale3d(1.12, 1.12, 1);
}
}
@keyframes kenBurnsZoomOutFullscreen {
from {
transform: scale3d(1.15, 1.15, 0);
}
to {
transform: scale3d(1.08, 1.08, 1);
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: scale3d(1, 1, 0) translateY(30px);
}
to {
opacity: 1;
transform: scale3d(1, 1, 1) translateY(0);
}
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: scale3d(1, 1, 0) translateY(-30px);
}
to {
opacity: 1;
transform: scale3d(1, 1, 1) translateY(0);
}
}
@keyframes kenBurnsPanRight {
from {
transform: scale3d(1.1, 1.1, 0) translateX(-5%);
}
to {
transform: scale3d(1.1, 1.1, 1) translateX(5%);
}
}
@keyframes kenBurnsPanLeft {
from {
transform: scale3d(1.1, 1.1, 0) translateX(5%);
}
to {
transform: scale3d(1.1, 1.1, 0) translateX(-5%);
}
}
@keyframes kenBurnsPanUp {
from {
transform: scale3d(1.1, 1.1, 0) translateY(5%);
}
to {
transform: scale3d(1.1, 1.1, 0) translateY(-5%);
}
}
@keyframes kenBurnsDiagonal {
from {
transform: scale3d(1.08, 1.08, 0) translate(-5%, 5%);
}
to {
transform: scale3d(1.13, 1.13, 0) translate(5%, -5%);
}
}
@keyframes fadeInScale {
from {
opacity: 0;
transform: scale3d(0.95, 0.95, 0);
}
to {
opacity: 1;
transform: scale3d(1, 1, 0);
}
}
@keyframes parallaxFloat {
0%,
100% {
transform: scale3d(1, 1, 0) translateY(0);
}
50% {
transform: scale3d(1, 1, 1) translateY(-12px);
}
}
@keyframes depthPulse {
0%,
100% {
transform: scale3d(1, 1, 0);
}
50% {
transform: scale3d(1.03, 1.03, 1);
}
}
@keyframes slowRotate {
from {
transform: scale3d(1.15, 1.15, 0) rotate(0deg);
}
to {
transform: scale3d(1.15, 1.15, 1) rotate(3deg);
}
}
@keyframes breathe {
0%,
100% {
transform: scale3d(1, 1, 0);
opacity: 0.9;
}
50% {
transform: scale3d(1.04, 1.04, 1);
opacity: 1;
}
}
@keyframes heatHaze {
0%,
100% {
transform: scale3d(1.05, 1.05, 1) skewX(0deg);
}
25% {
transform: scale3d(1.06, 1.06, 1) skewX(0.3deg);
}
75% {
transform: scale3d(1.05, 1.05, 1) skewX(-0.3deg);
}
}
@keyframes colorWash {
0% {
filter: saturate(1) brightness(1);
}
50% {
filter: saturate(1.5) brightness(1.25);
}
100% {
filter: saturate(1) brightness(1);
}
}
@keyframes vignetteIn {
from {
box-shadow: inset 0 0 0px rgba(0, 0, 0, 0);
}
to {
box-shadow: inset 0 0 120px rgba(0, 0, 0, 0.6);
}
}
/* Layer masks for elegant crossfade - overlap in center (45-55%) */
.spotlight-background-layer-left {
left: 0;
width: 55%;
-webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 1) 75%, rgba(0, 0, 0, 0.5) 90%, rgba(0, 0, 0, 0) 100%);
mask-image: linear-gradient(to right, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 1) 75%, rgba(0, 0, 0, 0.5) 90%, rgba(0, 0, 0, 0) 100%);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
}
.spotlight-background-layer-right {
right: 0;
width: 55%;
-webkit-mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.25) 8%,
rgba(0, 0, 0, 0.5) 18%,
rgba(0, 0, 0, 1) 35%,
rgba(0, 0, 0, 1) 100%
);
mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.25) 8%,
rgba(0, 0, 0, 0.5) 18%,
rgba(0, 0, 0, 1) 35%,
rgba(0, 0, 0, 1) 100%
);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
}
/* Three-tile: center layer – symmetric soft fade on both edges for seamless left/center and center/right blend */
.spotlight-background-layer-center {
left: 31.25%;
width: 33.334%;
-webkit-mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.25) 5%,
rgba(0, 0, 0, 0.5) 10%,
rgba(0, 0, 0, 1) 15%,
rgba(0, 0, 0, 1) 85%,
rgba(0, 0, 0, 0.5) 90%,
rgba(0, 0, 0, 0.25) 95%,
rgba(0, 0, 0, 0) 100%
);
mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.25) 5%,
rgba(0, 0, 0, 0.5) 10%,
rgba(0, 0, 0, 1) 15%,
rgba(0, 0, 0, 1) 85%,
rgba(0, 0, 0, 0.5) 90%,
rgba(0, 0, 0, 0.25) 95%,
rgba(0, 0, 0, 0) 100%
);
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
}
/* Three-tile: give the center more visual weight */
.spotlight-section[data-tile-count="3"] .spotlight-background-layer-left,
.spotlight-section[data-tile-count="3"] .spotlight-background-layer-right {
width: 35%;
}
.spotlight-section[data-tile-count="3"] .spotlight-background-layer-center {
left: 30%;
width: 40%;
}
.spotlight-section .spotlight-item .spotlight-background-dual {
background: black;
}
/* Mobile: show only left backdrop (full width) */
.layout-mobile .spotlight-background-layer-center,
.layout-mobile .spotlight-background-layer-right {
display: none !important;
}
.layout-mobile .spotlight-background-layer-left {
width: 100% !important;
mask-image: none !important;
}
/* Logo section heights per size - fixed to prevent layout shift when sliding between items */
.spotlight-section {
--spotlight-logo-height: 118px;
}
.spotlight-section[data-size="large"] {
--spotlight-logo-height: 180px;
}
.spotlight-section[data-size="full"] {
--spotlight-logo-height: 240px;
}
.spotlight-overlay {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 45%;
padding: 40px;
color: white;
display: grid;
grid-template-rows: var(--spotlight-logo-height) auto 1fr minmax(48px, auto);
grid-template-areas: "logo" "metadata" "overview" "buttons";
align-content: start;
gap: 1em;
z-index: 2;
pointer-events: none;
}
.spotlight-overlay a,
.spotlight-overlay button,
.spotlight-overlay .spotlight-buttons-section,
.spotlight-overlay .spotlight-buttons-container,
.spotlight-overlay .spotlight-info-button,
.spotlight-overlay .emby-button {
pointer-events: auto;
}
.spotlight-overlay .spotlight-logo-section {
grid-area: logo;
height: 100%;
min-height: 0;
display: flex;
align-items: flex-end;
overflow: hidden;
align-content: end;
flex-wrap: wrap;
}
.spotlight-overlay .spotlight-metadata-section {
grid-area: metadata;
}
.spotlight-overlay .spotlight-overview-section {
grid-area: overview;
display: flex;
flex-direction: column;
justify-content: flex-start;
overflow: hidden;
gap: 0;
}
.spotlight-overlay .spotlight-buttons-section {
grid-area: buttons;
display: flex;
align-items: start;
}
.spotlight-overlay.has-title {
padding: 50px 40px 20px 40px;
}
.spotlight-section-title {
font-size: 18px;
font-weight: 600;
z-index: 2;
letter-spacing: 2px;
word-spacing: 2px;
}
.layout-mobile .spotlight-section-title {
letter-spacing: 1px;
}
.spotlight-section-title a {
font-size: 1.1rem;
}
.spotlight-item-title {
margin: 0;
font-size: 3.5em;
font-weight: bold;
min-height: 0;
display: flex;
align-items: flex-end;
overflow: hidden;
max-height: 100%;
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-item-title {
font-size: 3rem;
}
.layout-mobile .spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-item-title {
font-size: 2rem;
}
.spotlight-item-logo {
height: 100%;
width: 100%;
object-fit: contain;
margin: 0;
background-size: contain;
background-repeat: no-repeat;
background-position: left;
max-height: 300px;
}
.layout-mobile .spotlight-item-logo {
background-position: bottom;
}
.spotlight-clearart {
position: absolute;
bottom: 0px;
right: 0px;
max-height: 70%;
object-fit: contain;
z-index: 5;
opacity: 0.9;
pointer-events: none;
}
.spotlight-rating-container {
-webkit-align-items: center;
align-items: center;
display: -webkit-flex;
display: flex;
-webkit-justify-content: center;
justify-content: center;
vertical-align: middle;
}
.spotlight-rating-star {
color: #f2b01e;
font-size: 1.4em;
height: auto !important;
width: auto !important;
margin-left: 0em !important;
margin-right: 0em !important;
}
.spotlight-rating-value {
font-size: 20px;
font-weight: 500;
}
.spotlight-rating-value.na {
opacity: 0.7;
}
.spotlight-metadata-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 12px;
font-size: 14px;
opacity: 0.9;
overflow: visible;
min-width: 0;
}
.spotlight-metadata-row .sectionTabs {
font-size: inherit;
}
.spotlight-metadata-row .itemDetailsGroup,
.spotlight-metadata-row .sectionTabs {
flex-shrink: 0;
}
.spotlight-credits-row .spotlight-truncated-list {
flex-shrink: 1;
min-width: 0;
}
/* Keep each name on one line (no mid-name wrapping) */
.spotlight-credits-row .spotlight-person-link,
.spotlight-credits-row
.spotlight-truncated-list
.detailsGroupItem
> span:not(.spotlight-list-separator):not(.spotlight-truncated-list-label),
.spotlight-credits-row
.spotlight-truncated-list
.emby-tab-button
> span:not(.spotlight-list-separator):not(.spotlight-truncated-list-label) {
white-space: nowrap;
}
/* Metadata row icons (end time, etc.) - same pattern as truncated list icons */
.spotlight-metadata-row .emby-tab-button[data-icon] {
display: inline-flex;
align-items: center;
}
.spotlight-metadata-row .emby-tab-button[data-icon]::before {
content: attr(data-icon);
font-family: "Material Icons";
font-size: 1.1em;
margin-right: 6px;
opacity: 0.9;
text-transform: none;
}
.spotlight-metadata-row .spotlight-studio {
display: inline-flex;
align-items: center;
}
.spotlight-metadata-row .spotlight-studio::before {
content: "\ea40"; /* Material Icons 'apartment' codepoint */
font-family: "Material Icons";
font-weight: normal;
font-style: normal;
font-size: 1.1em;
margin-right: 6px;
opacity: 0.9;
}
.metadata-container {
display: flex;
flex-direction: column;
align-items: start;
gap: 8px;
overflow: visible;
min-width: 0;
width: 100%;
}
.spotlight-truncated-list {
font-size: 14px;
opacity: 0.9;
position: relative;
overflow: hidden;
min-width: 0;
max-width: 100%;
}
/* Tooltip for truncated lists - full list on hover after 1s, no layout shift */
.spotlight-truncated-list-tooltip {
position: absolute;
bottom: 100%;
left: 0;
margin-bottom: 8px;
padding: 12px 16px;
background: rgba(0, 0, 0, 0.95);
color: white;
border-radius: 8px;
font-size: 14px;
line-height: 1.5;
max-width: 400px;
min-width: 200px;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease;
z-index: 1000;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
word-wrap: break-word;
display: flex;
flex-direction: column;
gap: 4px;
}
.spotlight-truncated-list-tooltip-items {
display: flex;
flex-direction: column;
gap: 4px;
}
.spotlight-truncated-list-tooltip-item {
display: block;
}
.spotlight-truncated-list-tooltip.visible {
opacity: 1;
pointer-events: auto; /* Allow hovering tooltip to keep it visible */
}
.spotlight-truncated-list-tooltip .spotlight-person-link,
.spotlight-truncated-list-tooltip .spotlight-genre-link,
.spotlight-truncated-list-tooltip .spotlight-studio-link {
color: inherit;
text-decoration: underline;
cursor: pointer;
}
.spotlight-list-separator {
opacity: 0.75;
margin: 0 0.4em;
user-select: none;
}
/* Overview: shown for all layouts with line clamping to avoid cut-off text */
.spotlight-overview {
display: -webkit-box;
margin: 0;
font-size: 15px;
font-style: normal;
opacity: 0.9;
line-height: 1.45;
max-width: min(700px, 75%);
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.spotlight-section[data-size="large"] .spotlight-overview {
-webkit-line-clamp: 4;
}
.spotlight-section[data-size="full"] .spotlight-overview {
font-size: 1.05em;
-webkit-line-clamp: 4;
}
.spotlight-buttons-container {
display: flex;
gap: 5px;
align-items: center;
margin-top: auto;
position: relative !important;
}
.spotlight-play-button {
width: 48px;
height: 48px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
padding: 0;
transition: background 0.2s;
}
.spotlight-play-button:hover {
background: rgba(255, 255, 255, 1);
}
.spotlight-play-button .material-icons {
font-size: 28px;
}
.spotlight-buttons-container button:not(.btnPlay) {
width: 48px;
height: 48px;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
padding: 0;
transition: all 0.2s;
}
.spotlight-watchlist-button[data-active="true"] .material-icons {
color: #4caf50;
}
.spotlight-watchlist-button .material-icons {
font-size: 28px;
}
.spotlight-info-button {
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
position: relative;
overflow: visible;
}
.spotlight-overview-tooltip {
position: absolute !important;
text-align: left;
bottom: 100%;
left: 50%;
transform: translateX(-50%) !important;
margin-bottom: 12px !important;
padding: 16px;
background: rgba(0, 0, 0, 0.95);
color: white;
border-radius: 8px;
font-size: 14px;
line-height: 1.6;
max-width: 400px;
min-width: 300px;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition: opacity 0.2s ease, visibility 0s linear 0.2s;
transition-delay: 0s;
z-index: 1000 !important;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
word-wrap: break-word;
max-height: unset !important;
}
/* Show only while hovering the info icon glyph — not the button/tooltip footprint */
.spotlight-info-button:is(.emby-button):hover .spotlight-overview-tooltip {
opacity: 1;
visibility: visible;
pointer-events: none;
transition-delay: 0.5s, 0.5s;
display: block;
}
/* Hover overview only on Normal desktop spotlights */
.spotlight-section[data-size="large"] .spotlight-overview-tooltip,
.spotlight-section[data-size="full"] .spotlight-overview-tooltip,
.layout-mobile .spotlight-overview-tooltip {
display: none !important;
}
/* TV: no hover tooltips; keep them out of the focus tree */
.layout-tv .spotlight-truncated-list-tooltip,
.layout-tv .spotlight-overview-tooltip {
display: none !important;
pointer-events: none !important;
visibility: hidden !important;
}
.spotlight-section:not(.hide)[data-section-id] > .spotlight-banner-container > .spotlight-nav-container {
position: absolute !important;
display: flex;
gap: 8px;
z-index: 2;
}
.spotlight-nav-button {
background: transparent;
border: none;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
padding: 0;
margin: 0 !important;
transition: background 0.2s;
}
.spotlight-nav-button:hover {
background: rgba(255, 255, 255, 0.2);
}
.spotlight-dots {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 8px;
z-index: 2;
}
.spotlight-dot {
width: 8px;
height: 8px;
border-radius: 50%;
border: none;
background: rgba(255, 255, 255, 0.5);
cursor: pointer;
padding: 0;
transition: background 0.2s;
}
.spotlight-dot.active {
background: white;
}
/* Numeric slide state: "N / X" via data attributes */
.spotlight-dots.spotlight-dots-numeric {
background: rgb(0 0 0 / 40%);
border-radius: 5px;
padding: 0.25rem 0.5rem;
gap: 0;
}
.spotlight-dots.spotlight-dots-numeric .spotlight-dot {
display: none;
}
.spotlight-dots.spotlight-dots-numeric::after {
content: attr(data-index) " / " attr(data-total-items);
font-size: 14px;
font-weight: 500;
color: rgba(255, 255, 255, 0.9);
letter-spacing: 0.5px;
}
.spotlight-genre-link,
.spotlight-person-link,
.spotlight-studio-link {
color: inherit;
text-decoration: underline;
cursor: pointer;
}
.spotlight-empty-writer-container {
font-size: 14px;
opacity: 0.9;
height: 1em;
}
/* Mobile Styles */
@media (max-width: 768px) {
.metadata-container {
display: none !important;
}
.spotlight-nav-container {
display: none !important;
}
.spotlight-pause-button {
display: none !important;
}
.spotlight-clearart {
display: none !important;
}
.spotlight-overlay {
width: calc(100% - 2rem);
padding: 5rem 1rem 3rem !important;
align-items: center;
}
.spotlight-tagline {
-webkit-line-clamp: 1;
bottom: 60px;
}
}
/* Match .cardText line boxes so skeleton→real swap does not shift section height */
.skeleton-text-line {
display: inline-block;
border-radius: 4px;
background: rgba(255, 255, 255, 0.12);
}
.cardText-first .skeleton-text-line {
padding: 0 22.5% !important;
}
.cardText-secondary .skeleton-text-line {
padding: 0 15% !important;
}
.cardText-secondary:nth-child(3) .skeleton-text-line {
padding: 0 10% !important;
}
.skeleton-card .cardText-secondary {
opacity: 0.8;
}
.skeleton-section-title {
width: 50%;
min-width: 8rem;
}
.skeleton-section-caption {
width: 35%;
min-width: 6rem;
margin-top: 0.15em;
}
/* One shimmer overlay per skeleton section — real sibling node, gated by .skeleton-shimmer-active (IO) */
.itemsContainer,
.emby-scroller,
.custom-scroller,
.spotlight-banner-container {
position: relative;
}
.skeleton-shimmer {
position: absolute;
inset: 0;
pointer-events: none;
z-index: 2;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255, 255, 255, 0.08) 45%,
rgba(255, 255, 255, 0.16) 50%,
rgba(255, 255, 255, 0.08) 55%,
transparent 100%
);
transform: translateX(-100%);
opacity: 0;
}
.skeleton-section.skeleton-shimmer-active .skeleton-shimmer {
opacity: 1;
animation: skeleton-shimmer-sweep 1.4s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
.skeleton-section.skeleton-shimmer-active .skeleton-shimmer {
animation: none !important;
opacity: 0 !important;
}
}
/* Localize style/layout invalidation to section shells during enhance/lazy paint */
.emby-scroller-container.custom-scroller-container,
.spotlight-section {
contain: layout style;
}
/* Tagline always 1 line - Movie-specific override kept for any edge cases */
[data-item-type="Movie"] .spotlight-tagline {
-webkit-line-clamp: 1;
}
// Remove this if we switch back to Jellyfin's default scroll buttons
.emby-scrollbuttons.padded-right {
-webkit-align-items: center;
align-items: center;
color: #fff;
display: -webkit-flex;
display: flex;
-webkit-justify-content: center;
justify-content: center;
min-height: 24px;
min-width: 104px;
padding-top: .85em;
position: absolute;
top: 0;
z-index: 1;
}
/* Blurhash placeholder canvas: fill card image area so it's visible until the real image loads */
/* .cardScalable {
position: relative;
}
.cardScalable .blurhash-canvas {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
pointer-events: none;
}
.cardScalable .blurhash-canvas.lazy-hidden {
display: none !important;
} */
/* Progressive Section Reveal Animation */
.cardbuilder-section-reveal {
opacity: 0;
transform: translateY(20px);
transition:
opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1),
transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
/* When section enters viewport, trigger animation */
.cardbuilder-section-reveal.in-viewport {
opacity: 1;
transform: translateY(0);
}
/* Shared section control buttons (show-all / refresh / configure) */
.show-all-button,
.section-refresh-button,
.section-configure-button {
padding: 4px;
min-width: auto;
width: 32px;
height: 32px;
background: transparent;
border: none;
border-radius: 50%;
cursor: pointer;
display: inline-block;
align-items: center;
justify-content: center;
align-self: center;
color: var(--main-text, rgba(255, 255, 255, 0.87));
font-size: 18px;
line-height: 1;
opacity: 0;
visibility: hidden;
transition:
opacity 0.25s ease,
visibility 0s linear 0.25s,
transform 0.3s ease,
color 0.3s ease,
background 0.2s ease !important;
}
/* Show controls only while the section is hovered */
.custom-scroller-container:hover .show-all-button,
.custom-scroller-container:hover .section-refresh-button,
.custom-scroller-container:hover .section-configure-button,
.emby-scroller-container:hover .show-all-button,
.emby-scroller-container:hover .section-refresh-button,
.emby-scroller-container:hover .section-configure-button,
.spotlight-section:hover .section-refresh-button,
.spotlight-section:hover .section-configure-button {
opacity: 0.65;
visibility: visible;
pointer-events: auto;
transition:
opacity 0.25s ease,
visibility 0s linear 0s,
transform 0.3s ease,
color 0.3s ease,
background 0.2s ease !important;
}
.custom-scroller-container:hover .show-all-button:hover,
.custom-scroller-container:hover .section-refresh-button:hover,
.custom-scroller-container:hover .section-configure-button:hover,
.emby-scroller-container:hover .show-all-button:hover,
.emby-scroller-container:hover .section-refresh-button:hover,
.emby-scroller-container:hover .section-configure-button:hover,
.spotlight-section:hover .section-refresh-button:hover,
.spotlight-section:hover .section-configure-button:hover {
background: rgba(255, 255, 255, 0.1);
opacity: 1;
}
.custom-scroller-container h2.sectionTitle.sectionTitle-cards {
align-items: center;
text-align: left;
}
.custom-scroller-container .sectionTitleContainer {
display: flex;
align-items: center;
gap: 0.35em;
}
.layout-mobile .custom-scroller-container .section-controls {
margin-left: auto !important;
}
.section-controls {
display: flex;
align-items: center;
gap: 0.15em;
flex-shrink: 0;
position: relative;
}
.section-controls-inline {
display: flex;
align-items: center;
gap: 0.15em;
}
.section-controls-more {
padding: 4px;
min-width: auto;
width: 32px;
height: 32px;
background: transparent;
border: none;
border-radius: 50%;
cursor: pointer;
display: none;
align-items: center;
justify-content: center;
align-self: center;
color: var(--main-text, rgba(255, 255, 255, 0.87));
font-size: 18px;
line-height: 1;
opacity: 0;
visibility: hidden;
transition:
opacity 0.25s ease,
visibility 0s linear 0.25s,
transform 0.3s ease,
color 0.3s ease,
background 0.2s ease;
}
.custom-scroller-container:hover .section-controls-more,
.emby-scroller-container:hover .section-controls-more,
.spotlight-section:hover .section-controls-more {
opacity: 0.65;
visibility: visible;
pointer-events: auto;
}
.custom-scroller-container:hover .section-controls-more:hover,
.emby-scroller-container:hover .section-controls-more:hover,
.spotlight-section:hover .section-controls-more:hover {
background: rgba(255, 255, 255, 0.1);
opacity: 1;
}
.section-controls-more-popover {
position: absolute !important;
z-index: 1001;
display: block;
background-color: rgba(0, 0, 0, 0.95);
right: 0;
left: auto;
min-width: 12rem;
}
/* Modal-hosted more menu: normal flow so the dialog body does not collapse */
.section-controls-more-menu {
position: static;
display: block;
min-width: 12rem;
background: transparent;
}
.section-controls-more-popover .section-controls-more-item,
.section-controls-more-menu .section-controls-more-item {
align-items: center;
}
.section-controls-more-item {
display: flex;
align-items: center;
gap: 0.65em;
cursor: pointer;
white-space: nowrap;
}
.section-controls-more-item-icon {
font-size: 1.15em;
opacity: 0.9;
}
.section-controls-more-item-label {
flex: 1;
}
:not(.layout-mobile) .section-controls-more {
display: none !important;
}
@media (max-width: 899px) {
:not(.layout-mobile) .section-controls-more {
display: inline-flex !important;
opacity: 1;
visibility: visible;
pointer-events: auto;
}
:not(.layout-mobile) .section-controls-inline .show-all-button,
:not(.layout-mobile) .section-controls-inline .section-refresh-button,
:not(.layout-mobile) .section-controls-inline .section-configure-button {
display: none !important;
}
.spotlight-section {
position: relative;
}
.spotlight-section .section-controls {
position: absolute;
right: 0.5rem;
bottom: 0.5rem;
z-index: 5;
margin: 0;
}
}
.layout-mobile .spotlight-section {
position: relative;
}
.layout-mobile .spotlight-section .section-controls {
position: absolute;
right: -0.5rem;
bottom: unset;
top: -4px;
z-index: 5;
margin: 0;
}
.layout-mobile .section-controls-inline .show-all-button,
.layout-mobile .section-controls-inline .section-refresh-button,
.layout-mobile .section-controls-inline .section-configure-button {
display: none !important;
}
.layout-mobile .spotlight-section .section-controls-more {
opacity: 0;
}
.layout-mobile .section-controls-more {
display: inline-flex !important;
opacity: 1;
visibility: visible;
pointer-events: auto;
}
.layout-mobile .spotlight-section:hover .section-controls-more {
opacity: 1;
}
.kefinTweaks-popover.section-controls-more-menu > .kefinTweaks-popover-item {
align-items: center;
justify-content: space-between;
margin: 0 !important;
padding: 0.5em 0.9em;
max-width: unset !important;
}
/* Grid (non-scrolling) item layouts */
.itemsContainer[data-layout="grid"] {
display: flex !important;
flex-wrap: wrap !important;
white-space: normal !important;
transform: none !important;
transition: none !important;
}
.itemsContainer[data-layout="grid"] > .card {
flex: auto;
box-sizing: border-box;
min-width: 0;
}
/* Natural widths while counting items-per-row for last-row dummy padding */
.itemsContainer[data-measuring="true"] > .card {
flex: 0 0 auto !important;
}
/* Grid dummies keep aspect via padder but allow .cardBorder to paint */
.itemsContainer[data-layout="grid"] > .card.card-layout-dummy {
visibility: hidden;
position: relative;
pointer-events: none;
}
[data-border-style="wood"] .itemsContainer[data-layout="grid"] > .card.card-layout-dummy,
[data-border="wood"] .itemsContainer[data-layout="grid"] > .card.card-layout-dummy {
visibility: visible;
}
.itemsContainer[data-layout="grid"] > .card.card-layout-dummy .cardPadder {
visibility: hidden;
}
.itemsContainer[data-layout="grid"] > .card.card-layout-dummy .cardBorder {
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
box-sizing: border-box;
--card-border-cream: var(--kefin-card-border-color, #e8dab2);
--card-border-fancy: var(--kefin-card-border-color, rgb(231 255 123 / 35%));
}
.itemsContainer[data-gapless="true"],
[data-border-style="film-reel"] .itemsContainer,
[data-border-style="wood"] .itemsContainer {
gap: 0 !important;
}
.emby-scroller-container:not([data-card-title-visibility="hidden"]) .itemsContainer[data-layout="grid"]:not([data-gapless="true"]) {
gap: 1rem 0 !important;
}
.itemsContainer[data-gapless="true"] .card,
[data-border-style="film-reel"] .itemsContainer .card,
[data-border-style="wood"] .itemsContainer .card {
padding: 0 !important;
}
.itemsContainer[data-gapless="true"] > .card > .cardBox,
[data-border-style="film-reel"] .itemsContainer .card > .cardBox,
[data-border-style="wood"] .itemsContainer .card > .cardBox {
margin-left: 0 !important;
margin-right: 0 !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.itemsContainer[data-gapless="true"] .cardContent,
[data-border-style="film-reel"] .itemsContainer .cardContent,
[data-border-style="wood"] .itemsContainer .cardContent {
border-radius: 0 !important;
}
/* Hide section name text only; keep refresh/configure/show-all controls */
[data-hide-section-name="true"] .sectionTitleContainer > .sectionTitle,
[data-hide-section-name="true"] .sectionTitleContainer > .sectionTitle-link,
[data-hide-section-name="true"] .sectionTitleContainer > .sectionTitle-wrapper,
[data-hide-section-name="true"] .spotlight-section-title-container > .spotlight-section-title,
[data-hide-section-name="true"] .spotlight-section-title,
.spotlight-section[data-hide-section-name="true"] .spotlight-section-title {
display: none !important;
}
.layout-mobile .sectionTitle.sectionCaption {
font-size: 0.9em !important;
}
.sectionTitle.sectionCaption {
font-size: 0.9em !important;
text-align: left;
grid-column: 1 / -1;
grid-row: 2;
white-space: nowrap;
text-overflow: ellipsis;
display: inline-block !important;
overflow: hidden;
max-width: calc(100% - max(env(safe-area-inset-left), 3.3%));
}
.sectionTitle-wrapper {
display: grid;
align-items: center;
/* title | picker (optional; collapses when absent) | controls */
grid-template-columns: auto auto 1fr;
flex: 1;
min-width: 0;
width: 100%;
}
.sectionTitle-wrapper > .sectionTitle-link,
.sectionTitle-wrapper > .sectionTitle.sectionTitle-cards {
grid-column: 1;
grid-row: 1;
min-width: 0;
}
.sectionTitle-wrapper > .multi-query-picker-button {
grid-column: 2;
grid-row: 1;
align-self: center;
}
.sectionTitle-wrapper > .section-controls {
grid-column: 3;
grid-row: 1;
align-self: center;
}
/* Spinning animation when refreshing */
[data-refreshing="true"] .section-refresh-button {
animation: spin 1s linear infinite;
}
/* Checkmark state - green color to indicate success */
.section-refresh-button.check_circle {
animation: none;
}
/* Keep icon-state transitions without overriding the shared hover fade */
.section-refresh-button.refresh,
.section-refresh-button.check_circle {
transition:
opacity 0.25s ease,
visibility 0s linear 0.25s,
transform 0.3s ease,
color 0.3s ease,
background 0.2s ease;
}
.custom-scroller-container:hover .section-refresh-button.refresh,
.custom-scroller-container:hover .section-refresh-button.check_circle,
.emby-scroller-container:hover .section-refresh-button.refresh,
.emby-scroller-container:hover .section-refresh-button.check_circle,
.spotlight-section:hover .section-refresh-button.refresh,
.spotlight-section:hover .section-refresh-button.check_circle {
transition:
opacity 0.25s ease,
visibility 0s linear 0s,
transform 0.3s ease,
color 0.3s ease,
background 0.2s ease;
}
/* Fade in/out transitions for icon changes (glyph lives on child .material-icons) */
.section-refresh-button .material-icons {
transition: opacity 0.2s ease;
}
.section-refresh-button.icon-fade-out .material-icons,
.section-refresh-button .material-icons.icon-fade-out {
opacity: 0;
}
.section-refresh-button.icon-fade-in .material-icons,
.section-refresh-button .material-icons.icon-fade-in {
opacity: 1;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* Borderless layout: full width, no border, negative margins for overlap.
Banner has NO padding so the background image overflows edge-to-edge; only content is inset. */
.spotlight-section[data-layout="Borderless"] {
--spotlight-fullscreen-vertical: 20px;
--spotlight-fullscreen-horizontal: max(env(safe-area-inset-left), env(safe-area-inset-right), 4%);
padding: 0;
width: 100%;
margin-top: calc(-1 * calc(var(--spotlight-fullscreen-vertical) * 1));
margin-bottom: calc(-1 * calc(var(--spotlight-fullscreen-vertical) * 2));
}
.layout-mobile .spotlight-section[data-layout="Borderless"] {
margin-top: -4rem;
margin-bottom: -6rem;
}
.spotlight-section[data-layout="Borderless"] .spotlight-banner-container {
border-radius: 0;
position: relative;
}
.spotlight-section[data-layout="Border"] .spotlight-banner-container {
overflow: hidden;
}
/* Dark gradient overlays at top and bottom (like left-side overlay): graceful fade and better visibility when content overlaps */
.spotlight-section .spotlight-item .spotlight-background-single::before,
.spotlight-section .spotlight-item .spotlight-background-single::after,
.spotlight-section .spotlight-item .spotlight-background-dual::before,
.spotlight-section .spotlight-item .spotlight-background-dual::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 100%;
pointer-events: none;
z-index: 5;
}
.spotlight-background-single::before,
.spotlight-background-dual::before {
width: 55%;
background: radial-gradient(farthest-corner at bottom left, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.8) 50%, rgba(0, 0, 0, 0) 70%);
}
.layout-mobile .spotlight-background-single::before,
.layout-mobile .spotlight-background-dual::before {
width: 100%;
background: linear-gradient(to bottom, transparent 0%, transparent 40%, rgba(0, 0, 0, 0.45) 60%, rgba(0, 0, 0, 0.85) 100%) !important;
}
.spotlight-background-single::after,
.spotlight-background-dual::after {
width: 100%;
background: linear-gradient( 180deg, black 0%, transparent 35%, transparent 65%, black 100% );
}
/* .spotlight-section[data-layout="Borderless"] .spotlight-item .spotlight-background-single:::before {
top: 0;
background: linear-gradient(0deg, transparent, black);
}
.spotlight-section[data-layout="Borderless"] .spotlight-item .spotlight-background-single::after {
bottom: 0;
background: linear-gradient(180deg, transparent, black);
} */
.spotlight-section[data-layout="Borderless"] .spotlight-items-container,
.spotlight-section[data-layout="Borderless"] .spotlight-item {
/* Full bleed: fill banner so background extends to edges (and past negative margin) */
left: 0;
right: 0;
width: 100%;
}
/* Borderless: use pre-scaled animations so image never shows hard edge at top */
/* .spotlight-section[data-layout="Borderless"] .spotlight-background-single img.animate {
animation: kenBurnsZoomInFullscreen 20s ease-out forwards;
}
.spotlight-section[data-layout="Borderless"] .spotlight-background-layer-left img.animate {
animation: kenBurnsZoomOutFullscreen 20s ease-out forwards;
}
.spotlight-section[data-layout="Borderless"] .spotlight-background-layer-right img.animate {
animation: kenBurnsZoomInFullscreen 20s ease-out forwards;
} */
/* Overlay: same ~45% width as smaller spotlights for consistent gradient and content area. */
.spotlight-section[data-layout="Borderless"] .spotlight-overlay {
left: 0;
width: 45%;
z-index: 3;
grid-template-rows: 1fr auto auto auto;
gap: 1.5em;
}
.spotlight-section[data-layout="Borderless"][data-size="large"] .spotlight-overlay {
padding: calc(var(--spotlight-fullscreen-vertical) * 5) var(--spotlight-fullscreen-horizontal)
calc(var(--spotlight-fullscreen-vertical) * 5) var(--spotlight-fullscreen-horizontal);
}
.spotlight-section[data-layout="Borderless"][data-size="full"] .spotlight-overlay {
padding: calc(var(--spotlight-fullscreen-vertical) * 5) var(--spotlight-fullscreen-horizontal)
calc(var(--spotlight-fullscreen-vertical) * 5) var(--spotlight-fullscreen-horizontal);
grid-template-rows: 1fr auto minmax(6rem, auto) minmax(48px, auto);
align-content: center;
gap: 1.5em;
}
.spotlight-section[data-layout="Borderless"][data-size="full"] .spotlight-credits-row {
flex-wrap: nowrap;
flex-direction: row;
}
/* Duplicate removed - already defined above for Borderless */
.spotlight-section[data-size="full"] .spotlight-item-title {
width: auto;
max-width: none;
font-size: 4rem;
}
/* Duplicate removed - clearart display:none already set for Borderless above */
.spotlight-section[data-layout="Borderless"] .spotlight-section-title-container {
left: var(--spotlight-fullscreen-horizontal);
top: calc(var(--spotlight-fullscreen-vertical) * 2.5);
}
.spotlight-section[data-layout="Borderless"] .spotlight-nav-container {
right: var(--spotlight-fullscreen-horizontal);
top: calc(var(--spotlight-fullscreen-vertical) * 2.5);
}
.spotlight-section[data-layout="Borderless"] .spotlight-dots {
bottom: calc(var(--spotlight-fullscreen-vertical) * 4.5);
}
.spotlight-section .spotlight-background-layer img,
.spotlight-section .spotlight-background-single img {
object-position: center 0%;
}
.spotlight-section[data-layout="Borderless"] .spotlight-clearart {
display: none;
}
/* Tagline at bottom center above navigation dots (all spotlights) - always 1 line max */
.spotlight-section:not(.hide) > .spotlight-banner-container .spotlight-tagline {
position: absolute !important;
left: 50% !important;
transform: translateX(-50%) !important;
width: fit-content !important;
max-width: min(85%, 700px);
text-align: left !important;
font-style: italic;
font-size: 1.05em;
margin: 0 !important;
padding: 0 !important;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
border-radius: 6px;
z-index: 4;
pointer-events: none;
height: unset !important;
}
.spotlight-section:not(.hide) .spotlight-tagline p {
font-weight: initial !important;
transform: initial !important;
width: 100%;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
cursor: default;
height: unset;
line-height: 1.5;
}
/* Normal and large: tagline above dots (dots at bottom: 20px) */
.spotlight-section[data-layout="Border"] .spotlight-tagline {
bottom: 40px;
}
.spotlight-section[data-layout="Borderless"] .spotlight-tagline {
bottom: calc(var(--spotlight-fullscreen-vertical) * 4.5 + 40px);
}
/* Size full: modern stream-site metadata styles */
.spotlight-section[data-size="full"] .metadata-container {
gap: 10px;
}
.spotlight-section[data-size="full"] .spotlight-metadata-row {
font-size: 15px;
gap: 10px;
}
/* Full-screen: uniform padding for all metadata pills (year, duration, genres, director, writer, series) */
/* .spotlight-section[data-size="full"] .spotlight-metadata-row .detailsGroupItem,
.spotlight-section[data-size="full"] .metadata-container .detailsGroupItem {
border-radius: 6px;
background: rgba(255, 255, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.2);
} */
.spotlight-section[data-size="full"] .spotlight-genre-link {
display: inline-block;
transition:
background 0.2s,
border-color 0.2s;
}
/* Full-screen: director/writer use material icon instead of label text */
/* Director/writer: always use icon, never show "Directed by"/"Written by" text */
.spotlight-truncated-list[data-icon] .spotlight-truncated-list-label {
display: none;
}
.spotlight-truncated-list .detailsGroupItem[data-icon],
.spotlight-truncated-list .emby-tab-button[data-icon] {
display: inline-flex;
align-items: center;
}
.spotlight-truncated-list .detailsGroupItem[data-icon]::before,
.spotlight-truncated-list .emby-tab-button[data-icon]::before {
content: attr(data-icon);
font-family: "Material Icons";
font-size: 1.1em;
margin-right: 6px;
opacity: 0.9;
text-transform: none; /* Prevent parent text-transform: capitalize (e.g. .spotlight-series-info) from breaking icon */
}
.spotlight-truncated-list[data-icon] .detailsGroupItem[data-icon]::before,
.spotlight-truncated-list[data-icon] .emby-tab-button[data-icon]::before {
content: attr(data-icon);
}
.spotlight-section a:not(:hover) {
text-decoration: none !important;
}
.spotlight-section[data-size="full"] .spotlight-buttons-container {
margin-top: 0px !important;
margin-bottom: 0px !important;
display: flex;
flex-direction: row;
justify-content: start;
}
.spotlight-section[data-size="full"] .spotlight-item-logo {
width: 95%;
}
/* Mobile spotlight: uniform layout TITLE -> gap -> LOGO -> METADATA -> OVERVIEW -> BUTTONS -> DOTS */
.layout-mobile .spotlight-tagline {
display: none !important;
}
.layout-mobile .spotlight-overlay {
width: calc(100% - 2rem) !important;
padding: 4rem 1rem 1rem 1rem !important;
align-items: start;
align-content: start;
grid-template-rows: auto auto 1fr minmax(48px, auto);
grid-template-areas:
"logo"
"metadata"
"overview"
"buttons";
gap: 0.75rem;
}
.layout-mobile .spotlight-section[data-layout="Borderless"] .spotlight-overlay {
padding: 9rem 1rem 6rem 1rem !important;
}
.layout-mobile .spotlight-section[data-layout="Borderless"] .spotlight-section-title-container {
top: 5rem;
}
.layout-mobile .spotlight-section .spotlight-section-title-container {
top: 15px;
max-width: calc(100% - 2rem);
left: unset !important;
justify-content: center;
margin: 0 auto !important;
display: grid;
}
.layout-mobile .metadata-container {
display: flex !important;
}
.layout-mobile .spotlight-logo-section {
height: 100% !important;
min-height: 0 !important;
align-content: end;
}
.layout-mobile .spotlight-overview {
max-width: 100%;
}
.spotlight-series-info {
text-transform: capitalize;
}
.spotlight-section[data-size="full"] .metadata-container * {
font-size: 1.1rem;
}
.spotlight-section .itemDetailsGroup:not(.hide) .detailsGroupItem,
.spotlight-section .itemDetailsGroup:not(.hide) .emby-tab-button {
margin: 0px !important;
gap: 0px !important;
}
.layout-mobile .spotlight-buttons-container .starRatingContainer {
display: none !important;
}
.spotlight-section .spotlight-buttons-container.mainDetailButtons > button {
right: 0px !important;
margin-top: 0 !important;
margin-left: 0 !important;
margin-bottom: 0 !important;
margin-right: 0 !important;
min-width: unset;
flex: unset !important;
}
.spotlight-buttons-container > * {
margin: 0 !important;
}
.spotlight-section .spotlight-buttons-container.mainDetailButtons {
margin: 0px !important;
padding: 0px !important;
background: transparent !important;
backdrop-filter: none !important;
}
.spotlight-section .mainDetailButtons > :is(button.emby-button) {
padding: 0em !important;
}
.spotlight-section .mainDetailButtons > .btnPlay:is(.emby-button) {
padding: 0.25em 1em !important;
display: flex;
flex-direction: row;
}
.spotlight-section .mainDetailButtons > .btnPlay:is(.emby-button)::after {
content: attr(title);
padding-right: 0.5em;
}
.spotlight-section .spotlight-buttons-container.mainDetailButtons {
gap: 2em;
}
.spotlight-section .spotlight-buttons-container.mainDetailButtons > * {
padding: 0 !important;
}
.spotlight-section .spotlight-buttons-container.mainDetailButtons > * span {
font-size: 2em;
}
.spotlight-section:not(.hide) .headerTabs,
.spotlight-section:not(.hide) .sectionTabs {
display: flex !important;
height: initial !important;
padding: 0px !important;
margin-top: 0px !important;
margin-bottom: 0px !important;
margin-left: 0px !important;
margin-right: 0px !important;
width: auto !important;
position: relative !important;
transform: unset !important;
}
.spotlight-section:not(.hide) .emby-tab-button {
padding: 0.5em 1em !important;
margin: 0px !important;
top: initial !important;
transform: initial !important;
align-items: center;
height: auto !important;
}
.spotlight-section-title.headerTabs.sectionTabs,
.spotlight-nav-container.headerTabs.sectionTabs {
display: flex !important;
flex-direction: row !important;
align-self: start;
align-items: start;
justify-content: start;
width: auto;
font-size: revert !important;
align-items: center;
}
.spotlight-metadata-row .emby-tab-button {
color: #c0c0c0;
}
:where(.spotlight-section-title.headerTabs.sectionTabs),
:where(.spotlight-section .headerTabs.sectionTabs),
:where(.spotlight-nav-container.headerTabs.sectionTabs) {
background-color: rgba(20, 20, 20, 0.85);
border-radius: 0.2em;
}
.spotlight-section[data-hide-section-name="true"] .spotlight-section-title,
.spotlight-section[data-hide-section-name="true"] .spotlight-section-title.headerTabs.sectionTabs,
.layout-mobile .spotlight-section[data-hide-section-name="true"] .spotlight-section-title.sectionTabs {
display: none !important;
}
.spotlight-section[data-layout="Border"] .spotlight-section-title-container {
top: 0;
}
.spotlight-section:not(.hide) .spotlight-nav-buttons-container {
display: flex !important;
padding: 0 0 !important;
height: auto !important;
}
.spotlight-section:not(.hide) .spotlight-nav-buttons-container button {
padding: 0.5em;
}
.spotlight-nav-button span.material-icons {
display: inline-block !important;
top: initial !important;
}
.spotlight-section-title > * {
font-size: 1em !important;
}
.spotlight-metadata-row *:not(a) {
cursor: default;
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-banner-container {
height: 55vh;
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-overview-section {
display: none !important;
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-buttons-section {
margin-top: -1.5em;
}
.spotlight-section[data-layout="Borderless"][data-size="large"] .spotlight-banner-container {
height: 72vh;
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-overlay.has-title {
padding: calc(var(--spotlight-fullscreen-vertical) * 5) var(--spotlight-fullscreen-horizontal)
calc(var(--spotlight-fullscreen-vertical) * 5) var(--spotlight-fullscreen-horizontal);
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] {
--spotlight-fullscreen-horizontal: max(env(safe-area-inset-left), env(safe-area-inset-right), 4%);
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-tagline {
bottom: calc(var(--spotlight-fullscreen-vertical) * 1.5 + 40px);
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-dots {
bottom: calc(var(--spotlight-fullscreen-vertical) * 1.5);
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-nav-container {
right: var(--spotlight-fullscreen-horizontal);
top: calc(var(--spotlight-fullscreen-vertical) * 2.5);
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-overlay {
grid-template-rows: 1fr auto auto auto;
}
.spotlight-section[data-size="normal"] .spotlight-overlay {
grid-template-rows: var(--spotlight-logo-height) auto 1fr auto;
}
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-overlay {
grid-template-rows: 3fr auto minmax(6rem, auto) auto;
}
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-logo-section {
align-self: end;
}
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-buttons-section {
align-self: start;
}
.spotlight-section[data-layout="Border"][data-size="normal"] .spotlight-overlay {
display: flex;
flex-direction: column;
padding: 100px 40px 25px 40px;
}
.spotlight-section[data-layout="Border"][data-size="normal"] .spotlight-overlay .spotlight-overview-section {
display: none;
}
.layout-mobile .spotlight-section[data-size="normal"] .spotlight-overlay .spotlight-overview-section,
.layout-mobile .spotlight-section[data-size="normal"] .spotlight-overlay .spotlight-metadata-section {
display: none;
}
.spotlight-section[data-layout="Border"][data-size="normal"] .spotlight-dots {
display: none;
}
.spotlight-section[data-size="large"] .spotlight-overlay {
grid-template-rows: 2fr auto minmax(auto, 6rem) auto;
}
.spotlight-section[data-size="large"] .spotlight-overlay .spotlight-item-logo {
background-position: left bottom;
}
.spotlight-section[data-size="large"] .spotlight-overlay .spotlight-buttons-section {
align-items: start;
}
.spotlight-section[data-layout="Border"] .spotlight-overlay {
padding: 85px 40px 45px 40px;
}
.spotlight-section[data-layout="Borderless"][data-size="normal"] .spotlight-overlay {
padding: 85px 40px 45px 40px;
}
.spotlight-section[data-layout="Border"][data-size="large"] .spotlight-overlay {
padding: 100px 40px 45px 40px;
}
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-overlay {
padding: 110px 40px 85px 40px;
}
.spotlight-section[data-layout="Border"] .spotlight-section-title-container {
top: 15px;
left: 40px;
}
.spotlight-section[data-layout="Border"][data-size="large"] .spotlight-section-title-container,
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-section-title-container {
top: 2rem;
left: 2rem;
}
.spotlight-section[data-layout="Border"] .spotlight-nav-container {
top: 15px;
right: 40px;
}
.spotlight-section[data-layout="Border"][data-size="large"] .spotlight-nav-container,
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-nav-container {
top: 2rem !important;
right: 2rem !important;
}
.spotlight-section[data-layout="Border"] .spotlight-banner-container {
border: 1px solid rgb(255 255 255 / 10%);
}
.spotlight-section[data-layout="Border"][data-size="large"] .spotlight-banner-container {
height: 60vh;
}
.spotlight-section[data-layout="Border"][data-size="full"] .spotlight-banner-container {
height: 80vh !important;
}
.spotlight-section[data-layout="Border"][data-size="normal"] .spotlight-overview {
-webkit-line-clamp: 2;
}
.layout-mobile .sectionTitleContainer-cards .sectionTitle-link > * {
padding-top: 0 !important;
}
.layout-mobile .emby-scroller-container .sectionTitleContainer .section-controls {
order: 1;
}
.layout-mobile .section-controls-inline .show-all-button,
.layout-mobile .section-controls-inline .section-refresh-button {
opacity: 1;
visibility: visible;
}
.layout-mobile .spotlight-section .spotlight-nav-container {
display: none !important;
}
.layout-mobile .spotlight-section .spotlight-overlay {
display: flex;
flex-direction: column;
justify-content: end;
align-items: center;
grid-gap: 3em;
}
.layout-mobile .spotlight-overview-section,
.layout-mobile .spotlight-credits-row,
.layout-mobile .spotlight-series-info {
display: none;
}
.layout-mobile .spotlight-logo-section {
width: 100%;
justify-content: center;
}
.layout-mobile .spotlight-dots {
bottom: 1rem !important;
display: none;
}
.layout-mobile .spotlight-section[data-layout="Borderless"] .spotlight-dots {
bottom: 5rem !important;
}
.layout-mobile .spotlight-section .spotlight-buttons-container {
align-content: center;
align-items: center;
justify-content: center;
justify-items: center;
}
.layout-mobile .spotlight-section .spotlight-section-title > * {
max-width: 100%;
min-width: 0;
text-align: center;
}
.layout-mobile .spotlight-section .emby-tab-button,
.layout-mobile .spotlight-metadata-section span a,
.layout-mobile .spotlight-metadata-section span {
font-size: 1em !important;
}
.layout-mobile .spotlight-section .spotlight-item-title {
font-size: 2em !important;
text-align: center;
}
.layout-mobile .spotlight-section:not(.hide) .spotlight-tagline {
display: none !important;
}
.layout-mobile .spotlight-section .spotlight-metadata-row {
justify-content: center;
align-self: center;
}
.layout-mobile .spotlight-buttons-section {
justify-self: center;
}
.emby-scroller-container[data-card-format="Button"] .cardScalable {
display: none;
}
.emby-scroller-container[data-card-format="Button"] .cardText {
display: flex !important;
padding: 0 !important;
}
.emby-scroller-container[data-card-format="Button"] .card > .cardBox {
width: 100%;
justify-content: center;
flex-direction: column;
display: flex;
padding: 1rem !important;
margin-right: 0 !important;
margin-left: 0 !important;
}
.emby-scroller-container[data-card-format="Button"] .card {
width: auto !important;
}
.emby-scroller-container[data-card-format="Button"] .itemsContainer {
gap: 0.5rem;
margin-top: 0.5rem;
}
.emby-scroller-container[data-card-format="Button"] {
margin-bottom: 1rem;
}
.emby-scroller-container[data-card-format="Logo"]:not(.visualCardBox) .cardScalable,
.emby-scroller-container[data-card-format="Logo"]:not(.visualCardBox) .cardPadder,
.emby-scroller-container[data-card-format="Logo"]:not(.visualCardBox) .cardBox,
.emby-scroller-container[data-card-format="Clear Art"]:not(.visualCardBox) .cardScalable,
.emby-scroller-container[data-card-format="Clear Art"]:not(.visualCardBox) .cardPadder,
.emby-scroller-container[data-card-format="Clear Art"]:not(.visualCardBox) .cardBox,
.emby-scroller-container[data-card-format="Disc"]:not(.visualCardBox) .cardScalable,
.emby-scroller-container[data-card-format="Disc"]:not(.visualCardBox) .cardPadder,
.emby-scroller-container[data-card-format="Disc"]:not(.visualCardBox) .cardBox,
.emby-scroller-container[data-section-id="liveTv-channels"]:not(.visualCardBox) .cardScalable,
.emby-scroller-container[data-section-id="liveTv-channels"]:not(.visualCardBox) .cardPadder,
.emby-scroller-container[data-section-id="liveTv-channels"]:not(.visualCardBox) .cardBox,
html.sleekfin-main-ui .emby-scroller-container[data-card-format="Logo"]:not(.visualCardBox) .cardPadder,
html.sleekfin-main-ui .emby-scroller-container[data-card-format="Clear Art"]:not(.visualCardBox) .cardPadder,
html.sleekfin-main-ui .emby-scroller-container[data-card-format="Disc"]:not(.visualCardBox) .cardPadder,
html.sleekfin-main-ui .emby-scroller-container[data-section-id="liveTv-channels"]:not(.visualCardBox) .cardPadder,
html.sleekfin-main-ui .emby-scroller-container[data-card-format="Logo"]:not(.visualCardBox) .cardBox,
html.sleekfin-main-ui .emby-scroller-container[data-card-format="Clear Art"]:not(.visualCardBox) .cardBox,
html.sleekfin-main-ui .emby-scroller-container[data-card-format="Disc"]:not(.visualCardBox) .cardBox,
html.sleekfin-main-ui .emby-scroller-container[data-section-id="liveTv-channels"]:not(.visualCardBox) .cardBox {
background: transparent !important;
box-shadow: none !important;
border: none !important;
background-color: transparent !important;
}
/* Skeletons need a visible padder even when Logo/Clear Art/Disc force transparent cards */
.emby-scroller-container[data-card-format="Logo"] .skeleton-card .cardPadder,
.emby-scroller-container[data-card-format="Logo"] .skeleton-card .cardScalable,
.emby-scroller-container[data-card-format="Clear Art"] .skeleton-card .cardPadder,
.emby-scroller-container[data-card-format="Clear Art"] .skeleton-card .cardScalable,
.emby-scroller-container[data-card-format="Disc"] .skeleton-card .cardPadder,
.emby-scroller-container[data-card-format="Disc"] .skeleton-card .cardScalable,
.emby-scroller-container[data-section-id="liveTv-channels"] .skeleton-card .cardPadder,
.emby-scroller-container[data-section-id="liveTv-channels"] .skeleton-card .cardScalable {
background: rgba(255, 255, 255, 0.12) !important;
}
.emby-scroller-container[data-card-format="Logo"] .cardImageContainer,
.emby-scroller-container[data-card-format="Clear Art"] .cardImageContainer,
.emby-scroller-container[data-section-id="liveTv-channels"] .cardImageContainer {
background-size: contain !important;
box-shadow: none !important;
}
.emby-scroller-container[data-card-format="Banner"] .card {
width: 33vw !important;
}
.layout-mobile .emby-scroller-container[data-card-format="Banner"] .card {
width: 95vw !important;
}
/* .emby-scroller-container[data-card-format="Logo"] .cardImageContainer,
.emby-scroller-container[data-card-format="Clear Art"] .cardImageContainer,
.emby-scroller-container[data-card-format="Disc"] .cardImageContainer {
transition: opacity 0.15s ease-in-out;
}
.emby-scroller-container[data-card-format="Logo"] .cardImageContainer.lazy-hidden,
.emby-scroller-container[data-card-format="Clear Art"] .cardImageContainer.lazy-hidden,
.emby-scroller-container[data-card-format="Disc"] .cardImageContainer.lazy-hidden {
opacity: 0;
}
.emby-scroller-container[data-card-format="Logo"] .cardImageContainer.lazy-loaded,
.emby-scroller-container[data-card-format="Clear Art"] .cardImageContainer.lazy-loaded,
.emby-scroller-container[data-card-format="Disc"] .cardImageContainer.lazy-loaded {
opacity: 1;
} */
:not(.layout-mobile) .emby-scroller-container[data-card-format="Logo"]:not([data-border-style]) .itemsContainer,
:not(.layout-mobile) .emby-scroller-container[data-card-format="Clear Art"]:not([data-border-style]) .itemsContainer,
:not(.layout-mobile) .emby-scroller-container[data-card-format="Disc"]:not([data-border-style]) .itemsContainer {
gap: 4rem !important;
}
.layout-mobile .emby-scroller-container[data-card-format="Logo"]:not([data-border-style]) .itemsContainer,
.layout-mobile .emby-scroller-container[data-card-format="Clear Art"]:not([data-border-style]) .itemsContainer,
.layout-mobile .emby-scroller-container[data-card-format="Disc"]:not([data-border-style]) .itemsContainer {
gap: 2rem !important;
}
.emby-scroller-container[data-hide-card-footer] .card .cardText {
display: none;
}
.spotlight-section-title-container {
position: absolute;
width: 100%;
display: flex;
align-items: center;
gap: 0.35em;
}
.layout-mobile .spotlight-section-title-container .section-controls {
margin-left: auto;
flex-shrink: 0;
}
.spotlight-rating-container:hover {
background-color: transparent !important;
cursor: auto;
}
.spotlight-section .emby-tab-button {
text-shadow: none !important;
}
.custom-scroller-container {
position: relative;
z-index: 1;
}
[dir="ltr"] .emby-scrollbuttons {
right: 0;
}
.emby-scrollbuttons {
-webkit-align-items: center;
align-items: center;
color: #fff;
display: -webkit-flex;
display: flex;
-webkit-justify-content: center;
justify-content: center;
min-height: 24px;
min-width: 104px;
padding-top: 0.85em;
position: absolute;
top: 0;
z-index: 1;
}
/* Section-level card title presentation */
.verticalSection .cardText,
.emby-scroller-container .cardText {
color: var(--kefin-card-title-color, inherit) !important;
}
.verticalSection[data-card-title-visibility="hidden"] .cardText,
.verticalSection[data-card-title-visibility="hidden"] .cardFooter,
.verticalSection[data-card-title-visibility="hidden"] .cardTextStack,
.emby-scroller-container[data-card-title-visibility="hidden"] .cardText,
.emby-scroller-container[data-card-title-visibility="hidden"] .cardFooter,
.emby-scroller-container[data-card-title-visibility="hidden"] .cardTextStack {
display: none !important;
}
.verticalSection[data-card-title-capitalization="uppercase"] .cardText,
.emby-scroller-container[data-card-title-capitalization="uppercase"] .cardText {
text-transform: uppercase;
}
.verticalSection[data-card-title-capitalization="lowercase"] .cardText,
.emby-scroller-container[data-card-title-capitalization="lowercase"] .cardText {
text-transform: lowercase;
}
.verticalSection[data-card-title-capitalization="capitalize"] .cardText,
.emby-scroller-container[data-card-title-capitalization="capitalize"] .cardText {
text-transform: capitalize;
}
.verticalSection[data-font-family="alfa-slab-one"] .cardText,
.emby-scroller-container[data-font-family="alfa-slab-one"] .cardText {
font-family: "Alfa Slab One", serif;
}
.verticalSection[data-font-family="anton"] .cardText,
.emby-scroller-container[data-font-family="anton"] .cardText {
font-family: Anton, sans-serif;
}
.verticalSection[data-font-family="changa-one"] .cardText,
.emby-scroller-container[data-font-family="changa-one"] .cardText {
font-family: "Changa One", cursive;
}
.verticalSection[data-font-family="exo"] .cardText,
.emby-scroller-container[data-font-family="exo"] .cardText {
font-family: Exo, sans-serif;
}
.verticalSection[data-font-family="orbitron"] .cardText,
.emby-scroller-container[data-font-family="orbitron"] .cardText {
font-family: Orbitron, sans-serif;
}
.verticalSection[data-font-family="oswald"] .cardText,
.emby-scroller-container[data-font-family="oswald"] .cardText {
font-family: Oswald, sans-serif;
}
.verticalSection[data-font-family="prata"] .cardText,
.emby-scroller-container[data-font-family="prata"] .cardText {
font-family: Prata, serif;
}
.verticalSection[data-font-family="roboto"] .cardText,
.emby-scroller-container[data-font-family="roboto"] .cardText {
font-family: Roboto, sans-serif;
}
.verticalSection[data-font-family="unbounded"] .cardText,
.emby-scroller-container[data-font-family="unbounded"] .cardText {
font-family: Unbounded, sans-serif;
}
.verticalSection[data-font-family="vt323"] .cardText,
.emby-scroller-container[data-font-family="vt323"] .cardText {
font-family: VT323, monospace;
}
.verticalSection[data-font-family="verdana"] .cardText,
.emby-scroller-container[data-font-family="verdana"] .cardText {
font-family: Verdana, Geneva, sans-serif;
}
.verticalSection[data-font-family="courier-new"] .cardText,
.emby-scroller-container[data-font-family="courier-new"] .cardText {
font-family: "Courier New", Courier, monospace;
}
.verticalSection[data-font-size="small"] .cardText,
.emby-scroller-container[data-font-size="small"] .cardText {
font-size: 0.8em;
}
.verticalSection[data-font-size="large"] .cardText,
.emby-scroller-container[data-font-size="large"] .cardText {
font-size: 1.25em;
}
.verticalSection[data-card-title-position="left"] .cardText,
.verticalSection[data-card-title-position$="-left"] .cardText,
.emby-scroller-container[data-card-title-position="left"] .cardText,
.emby-scroller-container[data-card-title-position$="-left"] .cardText {
text-align: left !important;
}
.verticalSection[data-card-title-position="center"] .cardText,
.verticalSection[data-card-title-position="overlay-center"] .cardText,
.verticalSection[data-card-title-position$="-center"] .cardText,
.emby-scroller-container[data-card-title-position="center"] .cardText,
.emby-scroller-container[data-card-title-position="overlay-center"] .cardText,
.emby-scroller-container[data-card-title-position$="-center"] .cardText {
text-align: center !important;
}
.verticalSection[data-card-title-position="right"] .cardText,
.verticalSection[data-card-title-position$="-right"] .cardText,
.emby-scroller-container[data-card-title-position="right"] .cardText,
.emby-scroller-container[data-card-title-position$="-right"] .cardText {
text-align: right !important;
}
/* Overlay titles: real .cardTextStack over the image (title + footers) */
.verticalSection[data-card-title-position^="overlay-"] .card > .cardBox,
.emby-scroller-container[data-card-title-position^="overlay-"] .card > .cardBox {
position: relative;
}
.verticalSection[data-card-title-position^="overlay-"] .cardBox.cardBox-bottompadded,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardBox.cardBox-bottompadded {
padding-bottom: 0 !important;
}
/* Keep cardScalable without a z-index so overlay chrome (z-index 3) can sit above the text stack (z-index 2). */
.verticalSection[data-card-title-position^="overlay-"] .cardScalable,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardScalable {
position: relative;
}
.verticalSection[data-card-title-position^="overlay-"] .cardScalable > .cardOverlayContainer,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardScalable > .cardOverlayContainer {
z-index: 3;
}
.verticalSection[data-card-title-position^="overlay-"] .cardScalable > .cardBorder,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardScalable > .cardBorder {
z-index: 1;
}
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack {
position: absolute;
z-index: 2;
left: 0;
right: 0;
width: 100%;
max-width: none;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.25em;
margin: 0;
padding: 1.35em 0.85em;
box-sizing: border-box;
pointer-events: none;
color: var(--kefin-card-title-color, #fff);
}
.verticalSection[data-card-title-position^="overlay-"] .cardScalable::after,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardScalable::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0) 75%);
}
.verticalSection[data-card-title-position^="overlay-top"] .cardScalable::after,
.emby-scroller-container[data-card-title-position^="overlay-top"] .cardScalable::after {
background: linear-gradient(to bottom, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 50%);
}
.verticalSection[data-card-title-position^="overlay-bottom"] .cardScalable::after,
.emby-scroller-container[data-card-title-position^="overlay-bottom"] .cardScalable::after {
background: linear-gradient(to top, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 50%);
}
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack .cardText,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack .cardText {
position: static;
margin: 0;
padding: 0;
max-width: 100%;
box-sizing: border-box;
color: inherit;
overflow: visible;
text-overflow: ellipsis;
white-space: nowrap;
background: none;
text-shadow:
0 1px 2px rgba(0, 0, 0, 0.75),
0 0 10px rgba(0, 0, 0, 0.45);
}
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack > .cardFooter,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack > .cardFooter {
display: flex;
flex-direction: column;
align-items: inherit;
gap: 0.1em;
width: 100%;
margin: 0;
padding: 0;
background: none;
}
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack .cardText-first,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack .cardText-first {
font-size: 1.5rem;
line-height: 1.5rem;
white-space: pre-line;
border-radius: 0 !important;
}
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack .cardText-secondary,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack .cardText-secondary {
font-size: 0.95rem;
opacity: 0.92;
border-radius: 0 !important;
}
.verticalSection[data-card-title-position^="overlay-"][data-font-size="small"] .cardTextStack .cardText-first,
.emby-scroller-container[data-card-title-position^="overlay-"][data-font-size="small"] .cardTextStack .cardText-first {
font-size: 1.2rem;
}
.verticalSection[data-card-title-position^="overlay-"][data-font-size="large"] .cardTextStack .cardText-first,
.emby-scroller-container[data-card-title-position^="overlay-"][data-font-size="large"] .cardTextStack .cardText-first {
font-size: 1.875rem;
}
.verticalSection[data-card-title-position="overlay-top-left"] .cardTextStack,
.verticalSection[data-card-title-position="overlay-top-center"] .cardTextStack,
.verticalSection[data-card-title-position="overlay-top-right"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-top-left"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-top-center"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-top-right"] .cardTextStack {
/* Solid at top → fade out toward bottom */
padding: 0.9em 1.1em;
border-top-left-radius: var(--kefin-card-radius, 0);
border-top-right-radius: var(--kefin-card-radius, 0);
overflow: hidden;
}
.verticalSection[data-card-title-position="overlay-bottom-left"] .cardTextStack,
.verticalSection[data-card-title-position="overlay-bottom-center"] .cardTextStack,
.verticalSection[data-card-title-position="overlay-bottom-right"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-bottom-left"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-bottom-center"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-bottom-right"] .cardTextStack {
/* Solid at bottom → fade out toward top */
padding: 0.9em 1.1em;
border-bottom-left-radius: var(--kefin-card-radius, 0);
border-bottom-right-radius: var(--kefin-card-radius, 0);
overflow: hidden;
}
.verticalSection[data-card-title-position="overlay-center-left"] .cardTextStack,
.verticalSection[data-card-title-position="overlay-center-center"] .cardTextStack,
.verticalSection[data-card-title-position="overlay-center-right"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-center-left"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-center-center"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-center-right"] .cardTextStack {
/* Solid at bottom → fade out toward top */
padding: 0 1.1em;
overflow: hidden;
}
.verticalSection[data-card-title-position="overlay-top-left"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-top-left"] .cardTextStack {
top: 0;
}
.verticalSection[data-card-title-position="overlay-top-center"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-top-center"] .cardTextStack {
top: 0;
align-items: center;
text-align: center;
}
.verticalSection[data-card-title-position="overlay-top-right"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-top-right"] .cardTextStack {
top: 0;
align-items: flex-end;
text-align: right;
}
.verticalSection[data-card-title-position="overlay-center-left"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-center-left"] .cardTextStack {
top: 50%;
transform: translateY(-50%);
}
.verticalSection[data-card-title-position="overlay-center"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-center"] .cardTextStack {
top: 50%;
transform: translateY(-50%);
align-items: center;
text-align: center;
}
.verticalSection[data-card-title-position="overlay-center-right"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-center-right"] .cardTextStack {
top: 50%;
transform: translateY(-50%);
align-items: flex-end;
text-align: right;
}
.verticalSection[data-card-title-position="overlay-bottom-left"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-bottom-left"] .cardTextStack {
bottom: 0;
}
.verticalSection[data-card-title-position="overlay-bottom-center"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-bottom-center"] .cardTextStack {
bottom: 0;
align-items: center;
text-align: center;
}
.verticalSection[data-card-title-position="overlay-bottom-right"] .cardTextStack,
.emby-scroller-container[data-card-title-position="overlay-bottom-right"] .cardTextStack {
bottom: 0;
align-items: flex-end;
text-align: right;
}
/* ========== Card border overlay host (.cardBorder) ========== */
.card .cardScalable > .cardBorder {
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
box-sizing: border-box;
/* Section may override via --kefin-card-border-color */
--card-border-cream: var(--kefin-card-border-color, #e8dab2);
--card-border-fancy: var(--kefin-card-border-color, rgb(231 255 123 / 35%));
}
.card .cardScalable > .cardBorder > * {
box-sizing: border-box;
pointer-events: none;
}
[data-border="double"] .card .cardBorder[data-style="double"],
[data-border-style="double"] .card .cardBorder[data-style="double"],
.card .cardBorder[data-style="double"],
[data-border="slim-fancy"] .card .cardBorder[data-style="slim-fancy"],
[data-border-style="slim-fancy"] .card .cardBorder[data-style="slim-fancy"],
.card .cardBorder[data-style="slim-fancy"] {
border: 10px solid transparent;
outline: 1px solid var(--card-border-cream) !important;
outline-offset: -5px;
background: conic-gradient(from 90deg at 1px 1px, #0000 25%, var(--card-border-cream) 0) 0 0 / calc(100% - 2px) calc(100% - 2px)
padding-box border-box !important;
}
/*
* Decorative borders that are always square — override skin radius on the card
* hosts and --kefin-card-radius so overlay text stacks stay square too.
*/
[data-border="retro-poster"],
[data-border-style="retro-poster"],
[data-border="modern-poster"],
[data-border-style="modern-poster"],
[data-border="picture-frame"],
[data-border-style="picture-frame"],
[data-border="art-gallery"],
[data-border-style="art-gallery"],
[data-border="wood"],
[data-border-style="wood"],
[data-border="profile"],
[data-border-style="profile"],
[data-border="film-reel"],
[data-border-style="film-reel"] {
--kefin-card-radius: 0px;
}
[data-border="retro-poster"] .card .cardBox,
[data-border="retro-poster"] .card .cardScalable,
[data-border-style="retro-poster"] .card .cardBox,
[data-border-style="retro-poster"] .card .cardScalable,
[data-border="modern-poster"] .card .cardBox,
[data-border="modern-poster"] .card .cardScalable,
[data-border-style="modern-poster"] .card .cardBox,
[data-border-style="modern-poster"] .card .cardScalable,
[data-border="picture-frame"] .card .cardBox,
[data-border="picture-frame"] .card .cardScalable,
[data-border-style="picture-frame"] .card .cardBox,
[data-border-style="picture-frame"] .card .cardScalable,
[data-border="art-gallery"] .card .cardBox,
[data-border="art-gallery"] .card .cardScalable,
[data-border-style="art-gallery"] .card .cardBox,
[data-border-style="art-gallery"] .card .cardScalable,
[data-border="wood"] .card .cardBox,
[data-border="wood"] .card .cardScalable,
[data-border-style="wood"] .card .cardBox,
[data-border-style="wood"] .card .cardScalable,
[data-border="profile"] .card .cardBox,
[data-border="profile"] .card .cardScalable,
[data-border-style="profile"] .card .cardBox,
[data-border-style="profile"] .card .cardScalable,
[data-border="film-reel"] .card .cardBox,
[data-border="film-reel"] .card .cardScalable,
[data-border-style="film-reel"] .card .cardBox,
[data-border-style="film-reel"] .card .cardScalable {
border-radius: 0 !important;
}
/*
* Retro Poster — bulb frame around marquee strip + poster.
* Solid red mid-band; top/bottom bulbs own corners; theater-track title above image.
*/
[data-border="retro-poster"],
[data-border-style="retro-poster"] {
--rp-thin: 2px;
--rp-band: 16px;
--rp-inset: calc(var(--rp-thin) + var(--rp-band) + var(--rp-thin));
--rp-marquee-h: 2.15em;
/* Gold frames stay fixed; only the inner band follows border color */
--rp-gold-hi: #ffe9a0;
--rp-gold-lo: #c9a227;
--rp-red: var(--kefin-card-border-color, #c41e26);
}
/* Poster clears the placard + bulb frame; padder padding-top restores full poster height */
[data-border="retro-poster"] .card .cardScalable > .cardImageContainer,
[data-border-style="retro-poster"] .card .cardScalable > .cardImageContainer,
[data-border="retro-poster"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="retro-poster"] .card .cardScalable > .cardOverlayContainer,
[data-border="retro-poster"] .card .cardScalable > .blurhash-canvas,
[data-border-style="retro-poster"] .card .cardScalable > .blurhash-canvas {
top: calc(var(--rp-inset) + var(--rp-marquee-h)) !important;
right: var(--rp-inset) !important;
bottom: var(--rp-inset) !important;
left: var(--rp-inset) !important;
width: calc(100% - var(--rp-inset) * 2) !important;
height: calc(100% - var(--rp-inset) * 2 - var(--rp-marquee-h)) !important;
border-radius: 0 !important;
}
[data-border="retro-poster"] .card,
[data-border-style="retro-poster"] .card,
[data-border="retro-poster"] .card .cardScalable,
[data-border-style="retro-poster"] .card .cardScalable,
[data-border="retro-poster"] .card .cardPadder,
[data-border-style="retro-poster"] .card .cardPadder {
border-radius: 0 !important;
}
/* Grow the aspect box so the placard sits above the poster instead of shrinking it */
[data-border="retro-poster"] .card .cardPadder,
[data-border-style="retro-poster"] .card .cardPadder {
padding-top: var(--rp-marquee-h);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, rgba(0, 0, 0, 0.4) 100%), linear-gradient(135deg, #1e2029 0%, #0f1015 100%) !important;
backdrop-filter: blur(12px);
}
[data-card-format="Thumb"][data-border="retro-poster"] .card .cardPadder,
[data-card-format="Thumb"][data-border-style="retro-poster"] .card .cardPadder,
[data-card-format="Backdrop"][data-border="retro-poster"] .card .cardPadder,
[data-card-format="Backdrop"][data-border-style="retro-poster"] .card .cardPadder,
[data-card-format="Logo"][data-border="retro-poster"] .card .cardPadder,
[data-card-format="Logo"][data-border-style="retro-poster"] .card .cardPadder,
[data-card-format="Clear Art"][data-border="retro-poster"] .card .cardPadder,
[data-card-format="Clear Art"][data-border-style="retro-poster"] .card .cardPadder {
padding-top: calc(var(--rp-marquee-h) + var(--rp-inset));
}
[data-card-format="Poster"][data-border="retro-poster"] .card .cardPadder,
[data-card-format="Poster"][data-border-style="retro-poster"] .card .cardPadder {
padding-top: initial;
}
[data-card-format="Banner"][data-border="retro-poster"] .card .cardPadder,
[data-card-format="Banner"][data-border-style="retro-poster"] .card .cardPadder {
padding-top: calc(var(--rp-marquee-h) + calc(var(--rp-inset) * 2));
}
/* Theater letter-board strip above the poster, inside the frame */
[data-border="retro-poster"] .card .cardScalable > .retroPosterMarquee,
[data-border-style="retro-poster"] .card .cardScalable > .retroPosterMarquee {
position: absolute;
top: var(--rp-inset);
left: var(--rp-inset);
right: var(--rp-inset);
height: var(--rp-marquee-h);
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
box-sizing: border-box;
padding: 0 0.35em;
container-type: inline-size;
container-name: retro-marquee;
/* Off-white board + vertical posts + horizontal letter tracks */
background-color: #e6e2d8;
background-image:
repeating-linear-gradient(90deg, transparent 0, transparent 22px, rgba(60, 45, 20, 0.12) 22px, rgba(60, 45, 20, 0.12) 24px),
repeating-linear-gradient(180deg, transparent 0, transparent 3px, #1c1c1c78 3px, #1c1c1c17 4px);
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
}
[data-border="retro-poster"] .card .retroPosterMarquee-label,
[data-border-style="retro-poster"] .card .retroPosterMarquee-label {
position: relative;
z-index: 1;
margin: 0;
font-family: Oswald, "Arial Narrow", sans-serif;
font-weight: 700;
font-size: 16px;
letter-spacing: 0.12em;
line-height: 1;
text-transform: uppercase;
color: #1e3a8a;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.35);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
.card .cardBorder[data-style="retro-poster"] {
box-shadow:
inset 0 0 0 1px var(--rp-gold-hi),
inset 0 0 0 var(--rp-thin) var(--rp-gold-lo);
}
.card .cardBorder[data-style="retro-poster"]::before {
content: "";
position: absolute;
inset: var(--rp-thin);
padding: var(--rp-band);
box-sizing: border-box;
pointer-events: none;
background: var(--rp-red);
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
mask-composite: exclude;
}
.card .cardBorder[data-style="retro-poster"]::after {
content: "";
position: absolute;
inset: calc(var(--rp-thin) + var(--rp-band));
pointer-events: none;
box-shadow:
inset 0 0 0 1px var(--rp-gold-hi),
inset 0 0 0 var(--rp-thin) var(--rp-gold-lo);
}
/* Corner + edge circles: bulb on each corner, even spacing between on each side */
.card .cardBorder[data-style="retro-poster"] .cardBorder-rp-bulbs {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
overflow: visible;
pointer-events: none;
z-index: 1;
}
.card .cardBorder[data-style="retro-poster"] .cardBorder-rp-bulb-glow {
fill: rgba(255, 120, 20, 0.45);
}
.card .cardBorder[data-style="retro-poster"] .cardBorder-rp-bulb-mid {
fill: rgba(255, 236, 160, 0.95);
}
.card .cardBorder[data-style="retro-poster"] .cardBorder-rp-bulb-core {
fill: #ffffff;
}
/* Stairstep — triple-layer stepped corners (CodePen stairstep geometry) */
.card .cardBorder[data-style="stairstep"] {
display: grid;
grid-template-columns:
[outer-start] 5px
[mid-start] 5px
[inner-start] 1fr
[inner-end] 5px
[mid-end] 5px
[outer-end];
grid-template-rows:
[inner-start] 5px
[mid-start] 5px
[outer-start] 1fr
[outer-end] 5px
[mid-end] 5px
[inner-end];
}
.card .cardBorder[data-style="stairstep"] .cardBorder-outer-left {
grid-column: outer-start / mid-start;
grid-row: outer-start / outer-end;
border-left: 1px solid var(--card-border-cream);
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-outer-right {
grid-column: mid-end / outer-end;
grid-row: outer-start / outer-end;
border-right: 1px solid var(--card-border-cream);
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-mid-left {
grid-column: mid-start / inner-start;
grid-row: mid-start / mid-end;
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-mid-right {
grid-column: inner-end / mid-end;
grid-row: mid-start / mid-end;
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-mid-top {
grid-column: mid-start / mid-end;
grid-row: outer-start / mid-start;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-mid-bottom {
grid-column: mid-start / mid-end;
grid-row: mid-end / outer-end;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-inner-top {
grid-column: inner-start / inner-end;
grid-row: inner-start / mid-start;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
border-top: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="stairstep"] .cardBorder-inner-bottom {
grid-column: inner-start / inner-end;
grid-row: mid-end / inner-end;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
/* Square — dual rails + nested corner squares (CodePen square geometry) */
.card .cardBorder[data-style="square"] {
display: grid;
grid-template-columns:
[outer-start] 5px
[mid-start] 5px
[inner-start] 2px
[gap-start] 1fr
[gap-end] 2px
[inner-end] 5px
[mid-end] 5px
[outer-end];
grid-template-rows:
[outer-start] 5px
[mid-start] 5px
[inner-start] 2px
[gap-start] 1fr
[gap-end] 2px
[inner-end] 5px
[mid-end] 5px
[outer-end];
}
.card .cardBorder[data-style="square"] .cardBorder-inner {
grid-area: mid;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="square"] .cardBorder-square-left-top {
grid-column: outer-start / inner-start;
grid-row: outer-start / inner-start;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="square"] .cardBorder-square-left-bottom {
grid-column: outer-start / inner-start;
grid-row: inner-end / outer-end;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="square"] .cardBorder-square-right-top {
grid-column: inner-end / outer-end;
grid-row: outer-start / inner-start;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="square"] .cardBorder-square-right-bottom {
grid-column: inner-end / outer-end;
grid-row: inner-end / outer-end;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="square"] .cardBorder-tall {
grid-column: gap-start / gap-end;
grid-row: outer-start / outer-end;
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="square"] .cardBorder-wide {
grid-column: outer-start / outer-end;
grid-row: gap-start / gap-end;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
}
/* Triple — concentric tall/mid/wide frames */
.card .cardBorder[data-style="triple"] {
display: grid;
grid-template-columns:
[wide-start] 5px
[mid-start] 5px
[tall-start] 1fr
[tall-end] 5px
[mid-end] 5px
[wide-end];
grid-template-rows:
[tall-start] 5px
[mid-start] 5px
[wide-start] 1fr
[wide-end] 5px
[mid-end] 5px
[tall-end];
}
.card .cardBorder[data-style="triple"] .cardBorder-tall {
grid-area: tall;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="triple"] .cardBorder-mid {
grid-area: mid;
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="triple"] .cardBorder-wide {
grid-area: wide;
border: 1px solid var(--card-border-cream);
}
/* Diamond — corner diamonds + dual tall/wide rails */
.card .cardBorder[data-style="diamond"] {
display: grid;
grid-template-columns:
[outer-start] 5px
[mid-start] 5px
[inner-start] 3px
[gap-start] 1fr
[gap-end] 3px
[inner-end] 5px
[mid-end] 5px
[outer-end];
grid-template-rows:
[outer-start] 5px
[mid-start] 5px
[inner-start] 3px
[gap-start] 1fr
[gap-end] 3px
[inner-end] 5px
[mid-end] 5px
[outer-end];
}
.card .cardBorder[data-style="diamond"] .cardBorder-square-left-top {
grid-column: outer-start / inner-start;
grid-row: outer-start / inner-start;
transform: rotate(45deg);
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-square-left-bottom {
grid-column: outer-start / inner-start;
grid-row: inner-end / outer-end;
transform: rotate(45deg);
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-square-right-top {
grid-column: inner-end / outer-end;
grid-row: outer-start / inner-start;
transform: rotate(45deg);
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-square-right-bottom {
grid-column: inner-end / outer-end;
grid-row: inner-end / outer-end;
transform: rotate(45deg);
border: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-tall-outer {
grid-column: gap-start / gap-end;
grid-row: outer-start / outer-end;
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-tall-inner {
grid-column: gap-start / gap-end;
grid-row: inner-start / inner-end;
border-top: 1px solid var(--card-border-cream);
border-bottom: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-wide-outer {
grid-column: outer-start / outer-end;
grid-row: gap-start / gap-end;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
}
.card .cardBorder[data-style="diamond"] .cardBorder-wide-inner {
grid-column: inner-start / inner-end;
grid-row: gap-start / gap-end;
border-left: 1px solid var(--card-border-cream);
border-right: 1px solid var(--card-border-cream);
}
/* ========== Corner ==========
Inset overlay frame + mirrored corner flourishes (stays inside the card). */
.card .cardBorder[data-style="corner"] {
--corner-inset: 0.5rem;
--corner-sq: 0.4rem;
--corner-arm: 1.25rem;
--corner-gap: 0.7rem;
--corner-line: var(--card-border-cream);
/* Shrink host so the frame sits inside the poster as an overlay */
inset: var(--corner-inset);
border: 1px solid var(--corner-line);
overflow: visible;
background: transparent;
}
.card .cardBorder[data-style="corner"] .cardBorder-corner {
position: absolute;
width: var(--corner-sq);
height: var(--corner-sq);
/* content-box keeps abspos math identical on left vs right */
box-sizing: content-box;
border: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner::after,
.card .cardBorder[data-style="corner"] .cardBorder-corner::before {
content: "";
position: absolute;
box-sizing: border-box;
}
.card .cardBorder[data-style="corner"] .cardBorder-corner::after {
width: var(--corner-arm);
height: var(--corner-gap);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner::before {
width: var(--corner-gap);
height: var(--corner-arm);
}
/* Center each square on the inset frame corner (symmetric L/R + T/B) */
.card .cardBorder[data-style="corner"] .cardBorder-corner-tl {
top: calc(var(--corner-sq) / -2 - 1px);
left: calc(var(--corner-sq) / -2 - 1px);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tr {
top: calc(var(--corner-sq) / -2 - 1px);
right: calc(var(--corner-sq) / -2 - 1px);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-bl {
bottom: calc(var(--corner-sq) / -2 - 1px);
left: calc(var(--corner-sq) / -2 - 1px);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-br {
bottom: calc(var(--corner-sq) / -2 - 1px);
right: calc(var(--corner-sq) / -2 - 1px);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tl::after,
.card .cardBorder[data-style="corner"] .cardBorder-corner-bl::after {
left: calc(var(--corner-gap) - 1px);
border-left: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tl::before,
.card .cardBorder[data-style="corner"] .cardBorder-corner-bl::before {
left: -1px;
border-left: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tr::after,
.card .cardBorder[data-style="corner"] .cardBorder-corner-br::after {
right: calc(var(--corner-gap) - 1px);
border-right: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tr::before,
.card .cardBorder[data-style="corner"] .cardBorder-corner-br::before {
right: -1px;
border-right: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tl::after,
.card .cardBorder[data-style="corner"] .cardBorder-corner-tr::after {
top: -1px;
border-top: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-tl::before,
.card .cardBorder[data-style="corner"] .cardBorder-corner-tr::before {
top: calc(var(--corner-gap) - 1px);
border-top: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-bl::after,
.card .cardBorder[data-style="corner"] .cardBorder-corner-br::after {
bottom: -1px;
border-bottom: 1px solid var(--corner-line);
}
.card .cardBorder[data-style="corner"] .cardBorder-corner-bl::before,
.card .cardBorder[data-style="corner"] .cardBorder-corner-br::before {
bottom: calc(var(--corner-gap) - 1px);
border-bottom: 1px solid var(--corner-line);
}
/* ========== Picture Frame ==========
Frame stays inside the card; poster shrinks into the mat opening. */
[data-border="picture-frame"],
[data-border-style="picture-frame"] {
--pf-frame: 0.85rem;
--pf-mat: 0.55rem;
--pf-lip: 0.35rem;
/* Extra gap so the poster sits deeper in the mat opening */
--pf-gap: 0.45rem;
--pf-inset: calc(var(--pf-lip) + var(--pf-frame) + var(--pf-mat) + var(--pf-gap));
/* Raised lip/mat use border color; recessed rings use a slightly darker mix */
--pf-raised: var(--kefin-card-border-color, #f8f8f8);
--pf-recessed: color-mix(in srgb, var(--pf-raised) 78%, #000);
}
[data-border="picture-frame"] .card .cardScalable > .cardImageContainer,
[data-border-style="picture-frame"] .card .cardScalable > .cardImageContainer,
[data-border="picture-frame"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="picture-frame"] .card .cardScalable > .cardOverlayContainer,
[data-border="picture-frame"] .card .cardScalable > .blurhash-canvas,
[data-border-style="picture-frame"] .card .cardScalable > .blurhash-canvas {
top: calc(var(--pf-inset) + 0.25rem) !important;
right: calc(var(--pf-inset) + 0.25rem) !important;
bottom: calc(var(--pf-inset) + 0.25rem) !important;
left: calc(var(--pf-inset) + 0.25rem) !important;
width: calc(100% - calc(calc(var(--pf-inset) + 0.25rem) * 2)) !important;
height: calc(100% - calc(calc(var(--pf-inset) + 0.25rem) * 2)) !important;
border-radius: 0 !important;
z-index: 3 !important;
background-size: cover;
}
[data-border="picture-frame"] .card,
[data-border-style="picture-frame"] .card,
[data-border="picture-frame"] .card .cardScalable,
[data-border-style="picture-frame"] .card .cardScalable,
[data-border="picture-frame"] .card .cardPadder,
[data-border-style="picture-frame"] .card .cardPadder {
border-radius: 0 !important;
}
[data-border="picture-frame"] .card .cardScalable {
padding: var(--pf-inset) !important;
}
.card .cardBorder[data-style="picture-frame"] {
--pf-frame: 1.25rem;
--pf-mat: 0.55rem;
--pf-lip: 0.5rem;
--pf-raised: var(--kefin-card-border-color, #f8f8f8);
--pf-recessed: color-mix(in srgb, var(--pf-raised) 95%, #000);
overflow: hidden;
/* Above padder so the frame is visible in the inset margins */
z-index: 2;
}
/* Mid frame / mat bed (1st inner) — recessed, slightly darker than border color */
.card .cardBorder[data-style="picture-frame"]::before {
content: "";
position: absolute;
inset: var(--pf-lip);
z-index: 0;
background-color: var(--pf-recessed);
background-image: radial-gradient(
circle farthest-corner at 50% 50%,
color-mix(in srgb, var(--pf-recessed) 88%, #fff),
var(--pf-recessed) 100%
);
box-shadow:
inset 0 10px 0.5em rgba(0, 0, 0, 0.25),
inset 0.1em 0 0.1em rgba(0, 0, 0, 0.1),
inset -0.1em 0 0.1em rgba(0, 0, 0, 0.05),
0 0.3em 0.2em color-mix(in srgb, var(--pf-raised) 55%, transparent);
}
/* Outer lip — fills the cardBorder host (no outside overflow).
Border color tints this raised outer band. */
.card .cardBorder[data-style="picture-frame"]::after {
content: "";
position: absolute;
inset: 0;
z-index: -1;
background: var(--pf-raised);
box-shadow:
0 1em 2em -1em rgba(0, 0, 0, 0.4),
0 2em 2em -1em rgba(0, 0, 0, 0.3),
0 3em 2em -1em rgba(0, 0, 0, 0.2),
0 4em 1.5em -1em rgba(0, 0, 0, 0.15),
0 2em 4em 0.5em rgba(0, 0, 0, 0.1),
inset 0 0.2em 0.1em color-mix(in srgb, var(--pf-raised) 70%, #fff);
}
/* Inner mat (2nd inner raised) + opening bed (3rd inner recessed) */
.card .cardBorder[data-style="picture-frame"] .cardBorder-pf-inner {
position: absolute;
inset: calc(var(--pf-lip) + var(--pf-frame));
box-shadow: inset 0 0.3em 0.1em rgba(0, 0, 0, 0.2);
background: var(--pf-recessed);
box-sizing: border-box;
}
/* ========== Art Gallery ==========
Demo .Frame look: dark beveled rail, light mat, diagonal gloss, thin photo lip. */
[data-border="art-gallery"],
[data-border-style="art-gallery"] {
--ag-rail: 1.1rem;
--ag-mat: 0.5rem;
--ag-inset: calc(var(--ag-rail) + var(--ag-mat));
--ag-base: var(--kefin-card-border-color, #434040);
--ag-rail-top: color-mix(in srgb, var(--ag-base) 72%, #000);
--ag-rail-side: var(--ag-base);
--ag-rail-bottom: color-mix(in srgb, var(--ag-base) 88%, #fff);
}
[data-border="art-gallery"] .card .cardScalable > .cardImageContainer,
[data-border-style="art-gallery"] .card .cardScalable > .cardImageContainer,
[data-border="art-gallery"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="art-gallery"] .card .cardScalable > .cardOverlayContainer,
[data-border="art-gallery"] .card .cardScalable > .blurhash-canvas,
[data-border-style="art-gallery"] .card .cardScalable > .blurhash-canvas {
top: var(--ag-inset) !important;
right: var(--ag-inset) !important;
bottom: var(--ag-inset) !important;
left: var(--ag-inset) !important;
width: calc(100% - var(--ag-inset) * 2) !important;
height: calc(100% - var(--ag-inset) * 2) !important;
border-radius: 0 !important;
z-index: 3 !important;
background-size: cover;
}
[data-border="art-gallery"] .card .cardScalable > .cardImageContainer,
[data-border-style="art-gallery"] .card .cardScalable > .cardImageContainer {
border-width: 2px !important;
border-style: solid !important;
border-color: #bbbab4 #c7c7bf #e5e4df #c7c7bf !important;
box-shadow:
0 -1px 1px rgba(0, 0, 0, 0.1),
0 1px 1px 1px rgba(255, 255, 255, 0.7) !important;
box-sizing: border-box !important;
}
[data-border="art-gallery"] .card,
[data-border-style="art-gallery"] .card,
[data-border="art-gallery"] .card .cardScalable,
[data-border-style="art-gallery"] .card .cardScalable,
[data-border="art-gallery"] .card .cardPadder,
[data-border-style="art-gallery"] .card .cardPadder {
border-radius: 0 !important;
}
[data-border="art-gallery"] .card .cardScalable {
padding: calc(var(--ag-inset) * 2) !important;
}
.emby-scroller-container[data-border-style="art-gallery"] .card .cardBorder {
--ag-rail: 0.5rem;
--ag-base: var(--kefin-card-border-color, #434040);
--ag-rail-top: color-mix(in srgb, var(--ag-base) 72%, #000);
--ag-rail-side: var(--ag-base);
--ag-rail-bottom: color-mix(in srgb, var(--ag-base) 88%, #fff);
z-index: 2;
overflow: hidden;
box-sizing: border-box;
border-width: var(--ag-rail);
border-style: solid;
border-color: var(--ag-rail-top) var(--ag-rail-side) var(--ag-rail-bottom) var(--ag-rail-side);
background: #f5f5f5;
background-image: linear-gradient(#e5e4df, #cdcdc6);
box-shadow:
inset 0 2px 5px rgba(0, 0, 0, 0.45),
0 3px 2px rgba(0, 0, 0, 0.08),
0 8px 16px rgba(0, 0, 0, 0.45);
}
/* Diagonal gloss highlight over the mat */
.emby-scroller-container[data-border-style="art-gallery"] .card .cardImageContainer::before,
.emby-scroller-container[data-border-style="art-gallery"] .card .cardBorder::before {
content: "";
position: absolute;
top: -175px;
right: -20%;
height: 400px;
z-index: 27;
pointer-events: none;
transform: rotate(-40deg);
background-image: linear-gradient(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0));
}
.emby-scroller-container[data-border-style="art-gallery"] .card .cardBorder::before {
left: calc(50% - 14px);
}
.emby-scroller-container[data-border-style="art-gallery"] .cardImageContainer::before {
left: 50%;
}
/* ========== Modern Poster ==========
Bevel colors match demo: lighten(#000, 20%) / #000 */
[data-border="modern-poster"],
[data-border-style="modern-poster"] {
--mp-inset: 10px;
}
/* Shrink poster so the 10px bevel does not clip the image */
[data-border="modern-poster"] .card .cardScalable > .cardImageContainer,
[data-border-style="modern-poster"] .card .cardScalable > .cardImageContainer,
[data-border="modern-poster"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="modern-poster"] .card .cardScalable > .cardOverlayContainer,
[data-border="modern-poster"] .card .cardScalable > .blurhash-canvas,
[data-border-style="modern-poster"] .card .cardScalable > .blurhash-canvas {
width: calc(100% - var(--mp-inset) * 4) !important;
height: calc(100% - var(--mp-inset) * 4) !important;
top: calc(var(--mp-inset) * 2) !important;
left: calc(var(--mp-inset) * 2) !important;
border-radius: 0 !important;
background-size: cover;
}
[data-border="modern-poster"] .cardPadder {
background: white !important;
}
/* Square corners so the poster meets the bevel flush */
[data-border="modern-poster"] .card,
[data-border-style="modern-poster"] .card,
[data-border="modern-poster"] .card .cardScalable,
[data-border-style="modern-poster"] .card .cardScalable,
[data-border="modern-poster"] .card .cardPadder,
[data-border-style="modern-poster"] .card .cardPadder {
border-radius: 0 !important;
}
[data-border="modern-poster"] .card .cardScalable {
padding: calc(var(--mp-inset) * 2) !important;
background: white !important;
}
.card .cardBorder[data-style="modern-poster"] {
border-style: solid;
border-width: var(--mp-inset, 15px);
border-top-color: #333;
border-right-color: #000;
border-bottom-color: #333;
border-left-color: #000;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.6);
background: transparent;
}
/* ========== Vintage ========== */
.card .cardBorder[data-style="vintage"] {
overflow: visible;
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-outer {
position: absolute;
inset: 0;
border: 2px solid var(--card-border-cream);
padding: 4px;
box-sizing: border-box;
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-mid {
position: relative;
width: 100%;
height: 100%;
border: 4px solid var(--card-border-cream);
padding: 4px;
box-sizing: border-box;
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-inner {
position: relative;
width: 100%;
height: 100%;
border: 2px solid var(--card-border-cream);
box-sizing: border-box;
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-corner {
position: absolute;
width: 3em;
height: 3em;
margin: -3px;
background-color: var(--card-border-cream);
background-image: none;
-webkit-mask-image: var(--v-corner-deco);
mask-image: var(--v-corner-deco);
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-corner-tl {
left: 0;
top: 0;
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-corner-tr {
top: 0;
right: 0;
transform: scaleX(-1);
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-corner-br {
right: 0;
bottom: 0;
transform: scale(-1);
}
.card .cardBorder[data-style="vintage"] .cardBorder-v-corner-bl {
left: 0;
bottom: 0;
transform: scaleY(-1);
}
/* ========== Film Reel ==========
Black film frame by default; poster inset into the center “hole”
so top/bottom sprocket bands stay fully visible. */
[data-border="film-reel"],
[data-border-style="film-reel"] {
--fr-film: var(--kefin-card-border-color, #000000);
--fr-band: 22px;
--fr-side: 10px;
/* Sprocket perforations: taller than wide; spaced + inset so none clip */
--fr-hole-w: 8px;
--fr-hole-h: 12px;
--fr-hole-gap: 18px;
--fr-edge-inset: -8px;
--fr-hole-fill: color-mix(in srgb, var(--fr-film) 12%, #f2ead8);
}
/* Shrink poster into the center frame hole */
[data-border="film-reel"] .card .cardScalable > .cardImageContainer,
[data-border-style="film-reel"] .card .cardScalable > .cardImageContainer,
[data-border="film-reel"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="film-reel"] .card .cardScalable > .cardOverlayContainer {
top: var(--fr-band) !important;
right: var(--fr-side) !important;
bottom: var(--fr-band) !important;
left: var(--fr-side) !important;
width: auto !important;
height: auto !important;
border-radius: 0 !important;
}
[data-border="film-reel"] .card,
[data-border-style="film-reel"] .card,
[data-border="film-reel"] .card .cardScalable,
[data-border-style="film-reel"] .card .cardScalable,
[data-border="film-reel"] .card .cardPadder,
[data-border-style="film-reel"] .card .cardPadder {
border-radius: 0 !important;
border: none !important;
}
.card .cardBorder[data-style="film-reel"] {
/* Transparent center so the inset poster shows through; sides are solid rails */
background: transparent;
border-top: none;
border-bottom: none;
border-left: var(--fr-side) solid var(--fr-film);
border-right: var(--fr-side) solid var(--fr-film);
overflow: hidden;
box-sizing: border-box;
}
/* Top / bottom sprocket bands — corner holes inset, evenly spaced, never clipped */
.card .cardBorder[data-style="film-reel"]::before,
.card .cardBorder[data-style="film-reel"]::after {
content: "";
position: absolute;
left: 0;
right: 0;
height: var(--fr-band);
box-sizing: border-box;
pointer-events: none;
z-index: 3;
margin: 0 var(--fr-edge-inset);
/* Hole centered in each tile so first/last stay inset; `space` evens the rest */
background-image:
linear-gradient(
90deg,
transparent 0,
transparent calc(var(--fr-hole-gap) / 2),
var(--fr-hole-fill) calc(var(--fr-hole-gap) / 2) calc(var(--fr-hole-gap) / 2 + var(--fr-hole-w)),
transparent calc(var(--fr-hole-gap) / 2 + var(--fr-hole-w))
),
linear-gradient(var(--fr-film), var(--fr-film));
background-size:
calc(var(--fr-hole-w) + var(--fr-hole-gap)) var(--fr-hole-h),
auto;
background-repeat:
space no-repeat,
no-repeat;
background-position:
left center,
center;
background-origin: content-box, border-box;
background-clip: content-box, border-box;
}
.card .cardBorder[data-style="film-reel"]::before {
top: 0;
}
.card .cardBorder[data-style="film-reel"]::after {
bottom: 0;
}
/* ========== Wood (bookshelf) ==========
wood.png under the poster; top/bottom shelf bars only (no side rails).
Tiles: half shelf height + container half padding so outer edges sum to full. */
[data-border="wood"],
[data-border-style="wood"] {
--wood-shelf-h-full: 14px;
--wood-shelf-h: var(--wood-shelf-h-full);
--wood-vert-img: url("../pages/images/wood.png");
--wood-shelf: color-mix(in srgb, var(--kefin-card-border-color, #6b492b) 40%, #6b492b);
/* Top-of-top and bottom-of-bottom share --wood-shelf-edge for seamless tiling */
--wood-shelf-edge: color-mix(in srgb, var(--wood-shelf) 82%, #8a6340);
--wood-shelf-mid: color-mix(in srgb, var(--wood-shelf) 70%, #3d2818);
--wood-shelf-top: linear-gradient(to bottom, var(--wood-shelf-edge), var(--wood-shelf-mid));
--wood-shelf-bottom: linear-gradient(to bottom, var(--wood-shelf-mid), var(--wood-shelf-edge));
--wood-bevel-hi: color-mix(in srgb, var(--wood-shelf) 40%, #e8d4b0);
--wood-bevel-lo: color-mix(in srgb, var(--wood-shelf) 40%, #1a0f08);
}
[data-border="wood"] .emby-scroller,
[data-border-style="wood"] .emby-scroller {
margin-top: 0.5rem;
}
/* Row/grid: grain on each card. Tiles: container owns continuous grain (below). */
[data-border="wood"] .card .cardScalable,
[data-border-style="wood"] .card .cardScalable {
background-image: var(--wood-vert-img);
background-size: cover;
background-repeat: repeat;
background-position: center top;
border-radius: 0 !important;
}
[data-border="wood"] .card,
[data-border-style="wood"] .card {
padding: 0;
}
[data-border="wood"] .itemsContainer[data-gapless="true"] .card .cardScalable,
[data-border-style="wood"] .itemsContainer[data-gapless="true"] .card .cardScalable {
background-image: none;
background-color: transparent;
}
/* Gapless: half shelves + outer half-height shelf ring on the container */
[data-border="wood"] .itemsContainer[data-gapless="true"],
[data-border-style="wood"] .itemsContainer[data-gapless="true"] {
box-sizing: border-box;
background-color: transparent;
background-image: var(--wood-shelf-bottom), var(--wood-shelf-top), transparent;
background-size:
100% var(--wood-shelf-h),
100% var(--wood-shelf-h),
cover;
background-position:
top,
bottom,
center top;
background-repeat: no-repeat, no-repeat, repeat;
}
[data-card-title-visibility="hidden"][data-border-style="wood"] .itemsContainer[data-gapless="true"],
[data-card-title-visibility="hidden"][data-border-style="wood"] .itemsContainer[data-layout="grid"] {
--wood-shelf-h: calc(var(--wood-shelf-h-full) / 2);
padding: var(--wood-shelf-h) 0;
background: var(--wood-shelf-edge);
}
/* Poster inset — top/bottom shelves only */
[data-border="wood"] .card .cardScalable > .cardImageContainer,
[data-border-style="wood"] .card .cardScalable > .cardImageContainer,
[data-border="wood"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="wood"] .card .cardScalable > .cardOverlayContainer,
[data-border="wood"] .card .cardScalable > .blurhash-canvas,
[data-border-style="wood"] .card .cardScalable > .blurhash-canvas {
top: calc(var(--wood-shelf-h-full) * 2) !important;
right: var(--wood-shelf-h-full) !important;
bottom: var(--wood-shelf-h) !important;
left: var(--wood-shelf-h-full) !important;
width: calc(100% - var(--wood-shelf-h-full) * 2) !important;
height: calc(100% - calc(calc(var(--wood-shelf-h-full) * 2) + var(--wood-shelf-h))) !important;
border-radius: 0 !important;
z-index: 1 !important;
box-shadow: 0px -4px 10px 0px #000c;
}
[data-border-style="wood"] .card .cardScalable {
border: none !important;
box-shadow: none !important;
}
[data-border-style="wood"][data-card-format="Disc"] .card .cardScalable > .cardImageContainer,
[data-border-style="wood"][data-card-format="Clear Art"] .card .cardScalable > .cardImageContainer,
[data-border-style="wood"][data-card-format="Logo"] .card .cardScalable > .cardImageContainer {
box-shadow: none !important;
background-size: contain;
background-position: bottom center;
}
[data-border="wood"] .card,
[data-border-style="wood"] .card,
[data-border="wood"] .card .cardPadder,
[data-border-style="wood"] .card .cardPadder {
border-radius: 0 !important;
}
/* Shelves only — full width, no side rails */
.card .cardBorder[data-style="wood"] {
overflow: hidden;
z-index: 0;
box-sizing: border-box;
border: none;
background-image: var(--wood-vert-img);
background-size: cover;
}
.card .cardBorder[data-style="wood"]::before,
.card .cardBorder[data-style="wood"]::after {
content: "";
position: absolute;
left: 0;
right: 0;
width: auto;
height: var(--wood-shelf-h);
z-index: 3;
pointer-events: none;
box-sizing: border-box;
}
.card .cardBorder[data-style="wood"]::before {
top: 0;
background: var(--wood-shelf-top);
/* Bevel shadow along the inner (bottom) edge */
box-shadow: inset 0 -2px 0 var(--wood-bevel-lo);
}
.card .cardBorder[data-style="wood"]::after {
bottom: 0;
background: var(--wood-shelf-bottom);
/* Bevel highlight along the inner (top) edge */
box-shadow: inset 0 1px 0 var(--wood-bevel-hi);
}
/* ========== Profile ==========
Broken outer frame around the whole card; poster inset with its own thin
border; title sits in the side gaps; secondary sits in the bottom gap.
Card chrome is transparent (no white/cream fill). */
[data-border="profile"],
[data-border-style="profile"] {
--pr-c: var(--kefin-card-border-color, #c45c4a);
--pr-w: 2px;
--pr-pad: 1.85rem;
/* Vertical gap in the side rails where the primary title sits */
--pr-side-gap: 2.35em;
/* Height of the short side stubs that meet the bottom corners */
--pr-side-stub: 1.55em;
/* Half-width gap in the bottom rail for secondary text */
--pr-bottom-gap: 3.25em;
}
[data-border="profile"] .itemsContainer,
[data-border-style="profile"] .itemsContainer,
[data-border-style="profile"] .itemsContainer {
gap: 1.5rem;
}
[data-border="profile"] .card,
[data-border-style="profile"] .card {
box-shadow: none;
background: transparent !important;
contain: none;
overflow: hidden;
}
[data-border="profile"] .card .cardBox,
[data-border-style="profile"] .card .cardBox {
position: relative;
background-color: transparent !important;
/* Broken rectangle: top + upper sides, bottom stubs + bottom rail with center gap */
background-image:
linear-gradient(var(--pr-c), var(--pr-c)), linear-gradient(var(--pr-c), var(--pr-c)), linear-gradient(var(--pr-c), var(--pr-c)),
linear-gradient(var(--pr-c), var(--pr-c)), linear-gradient(var(--pr-c), var(--pr-c)), linear-gradient(var(--pr-c), var(--pr-c)),
linear-gradient(var(--pr-c), var(--pr-c));
background-size:
100% var(--pr-w),
var(--pr-w) calc(100% - var(--pr-side-stub) - var(--pr-side-gap)),
var(--pr-w) calc(100% - var(--pr-side-stub) - var(--pr-side-gap)),
var(--pr-w) var(--pr-side-stub),
var(--pr-w) var(--pr-side-stub),
calc(50% - var(--pr-bottom-gap)) var(--pr-w),
calc(50% - var(--pr-bottom-gap)) var(--pr-w);
background-position:
top left,
top left,
top right,
bottom left,
bottom right,
bottom left,
bottom right;
background-repeat: no-repeat;
padding: var(--pr-pad) var(--pr-pad) 0;
box-sizing: border-box;
display: grid;
grid-template-rows: auto 1fr;
}
[data-border="profile"] .card .cardScalable,
[data-border-style="profile"] .card .cardScalable {
padding: var(--pr-pad) !important;
background: transparent !important;
border-radius: 0 !important;
box-shadow: none !important;
border: none !important;
}
[data-border="profile"] .card .cardPadder,
[data-border-style="profile"] .card .cardPadder {
background: transparent;
}
[data-border="profile"] .card .cardBox,
[data-border-style="profile"] .cardBox {
height: calc(100% - var(--pr-pad));
}
[data-border="profile"] .card .cardPadder,
[data-border-style="profile"] .card .cardPadder,
[data-border="profile"] .card .cardScalable > .cardImageContainer,
[data-border-style="profile"] .card .cardScalable > .cardImageContainer,
[data-border="profile"] .card .cardScalable > .cardOverlayContainer,
[data-border-style="profile"] .card .cardScalable > .cardOverlayContainer,
[data-border="profile"] .card .cardScalable > .blurhash-canvas,
[data-border-style="profile"] .card .cardScalable > .blurhash-canvas {
border-radius: 0 !important;
}
[data-border="profile"] .card .cardScalable > .blurhash-canvas,
[data-border-style="profile"] .card .cardScalable > .blurhash-canvas {
top: 1rem;
left: 1rem;
width: calc(100% - 2rem);
height: calc(100% - 2rem);
}
[data-border="profile"] .card .cardScalable > .cardImageContainer,
[data-border-style="profile"] .card .cardScalable > .cardImageContainer {
box-sizing: border-box !important;
clip-path: none !important;
box-shadow: none !important;
width: calc(100% - 2rem);
height: calc(100% - 2rem);
background-size: cover;
top: 1rem;
left: 1rem;
}
/* Frame is painted on .cardBox; hide the scalable overlay host */
[data-border="profile"] .card .cardBorder,
[data-border-style="profile"] .card .cardBorder {
display: none;
}
[data-border="profile"] .card .cardTextStack,
[data-border-style="profile"] .card .cardTextStack {
display: grid;
}
[data-border="profile"] .card .cardText-first,
[data-border-style="profile"] .card .cardText-first {
position: relative;
order: 2;
z-index: 1;
background: transparent !important;
color: var(--pr-c);
font-size: 1.05em;
width: calc(100% - 2 * var(--pr-pad));
margin: -0.55em auto 0;
padding: 0.35em 0;
text-align: center;
text-transform: uppercase;
font-weight: 700;
letter-spacing: 0.02em;
box-sizing: border-box;
/* Sit in the side-rail gap */
line-height: 1.2;
text-align: center !important;
white-space: normal;
}
[data-border="profile"] .card .cardText-first a,
[data-border-style="profile"] .card .cardText-first a {
color: inherit !important;
font-weight: inherit;
}
[data-border="profile"] .card .cardText-secondary,
[data-border-style="profile"] .card .cardText-secondary {
position: relative;
z-index: 1;
margin: 0.35em calc(-1 * var(--pr-pad)) 0;
width: calc(100% + 2 * var(--pr-pad));
padding: 0.15em var(--pr-pad) 0.65em;
text-align: center;
text-transform: uppercase;
letter-spacing: 0.12em;
font-size: 0.78em;
font-weight: 500;
color: var(--pr-c);
opacity: 0.72;
background: transparent !important;
box-sizing: border-box;
/* Centered in the bottom-rail gap */
line-height: 1;
text-align: center !important;
}
[data-border="profile"] .card .cardText-secondary a,
[data-border-style="profile"] .card .cardText-secondary a {
color: inherit !important;
}
[data-border-style="profile"] .cardTextStack .cardText-secondary:nth-child(2) {
order: 3;
margin-top: auto;
}
[data-border-style="profile"] .cardTextStack {
display: flex;
flex-direction: column;
}
[data-border="profile"] .card .cardFooter,
[data-border-style="profile"] .card .cardFooter {
visibility: visible !important;
background: transparent !important;
}
.cardbuilder-items-fade {
transition: opacity 0.28s ease;
}
.cardbuilder-items-fade.is-hidden {
opacity: 0;
}
.cardbuilder-empty-message {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 4.5em;
padding: 1em 1.25em;
box-sizing: border-box;
opacity: 0.55;
font-size: 1.05em;
text-align: center;
}
.cardbuilder-card-collapse,
.cardbuilder-card-insert {
overflow: hidden !important;
pointer-events: none;
}
.itemsContainer.cardbuilder-row-animating .cardbuilder-card-collapse,
.itemsContainer.cardbuilder-row-animating .cardbuilder-card-insert {
transition:
opacity 0.32s ease,
width 0.32s ease,
min-width 0.32s ease,
max-width 0.32s ease,
margin 0.32s ease;
}
.itemProgressBarForeground {
height: 100%;
}
.custom-scroller-container .sectionTitleContainer h2,
.sectionTitleContainer span {
margin: 0 !important;
}
.custom-scroller .homeLibraryButton {
min-width: unset;
}
.missingIndicator,
.unairedIndicator {
background: #c33;
border-radius: 100em;
color: #fff;
font-size: 84%;
font-weight: 500;
margin: 0 0.25em;
padding: 0.25em 0.5em;
}
.custom-scroller-container .sectionCaption.sectionTitleTextButton:not(.padded-left) {
padding-top: 0 !important;
padding-bottom: 0 !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.emby-scroller-container[data-layout="grid"] .emby-scrollbuttons {
display: none !important;
}
.spotlight-section[data-tile-count="3"] .spotlight-background-layer {
width: 37.5%;
}
.emby-scroller-container[data-no-scroll="true"] .emby-scrollbuttons {
display: none;
}
.emby-scroller-container[data-layout="grid"] .emby-scrollbuttons {
display: none !important;
}
/*
.spotlight-truncated-list:has(.spotlight-truncated-list-tooltip) {
overflow: visible;
}
.spotlight-section[data-size="full"] .spotlight-truncated-list.itemDetailsGroup:has(> .detailsGroupItem),
.spotlight-section[data-size="full"] .spotlight-truncated-list.sectionTabs:has(> .emby-tab-button) {
font-size: large;
display: flex;
align-items: center;
align-self: start;
}
.spotlight-section .itemDetailsGroup:has(.detailsGroupItem:not(.hide)),
.spotlight-section .sectionTabs:not(.spotlight-section-title):has(.emby-tab-button:not(.hide)) {
margin: 0px !important;
padding: 0px !important;
width: initial !important;
min-width: initial !important;
}
.spotlight-section:not(.hide) span.emby-tab-button.emby-tab-button-active:not(:has(a)) {
cursor: default;
}
.layout-mobile .spotlight-section .spotlight-section-title.sectionTabs:has(.emby-tab-button:not(.hide)) {
justify-self: center;
display: flex !important;
justify-content: center;
}
.layout-mobile .spotlight-section .spotlight-section-title.sectionTabs:has(.emby-tab-button:not(.hide)) > * {
display: block !important;
padding: 0.25em 0.5em !important;
}
.emby-scroller-container[data-border-style="profile"] .card .cardTextStack:has(.cardText:nth-child(2):last-child) .cardText-first {
margin-top: auto;
} */
.layout-mobile .spotlight-section[data-hide-section-name="true"] .spotlight-section-title,
.layout-mobile .spotlight-section[data-hide-section-name="true"] .spotlight-section-title.sectionTabs,
.spotlight-section[data-hide-section-name="true"] .spotlight-section-title.sectionTabs {
display: none !important;
}
.spotlight-section .spotlight-section-title-container > *,
.spotlight-section .spotlight-section-title-container .section-controls,
.spotlight-section .spotlight-section-title-container a,
.spotlight-section .spotlight-section-title-container button,
.spotlight-section .spotlight-nav-container {
pointer-events: auto;
}
.sectionTitleContainer {
display: flex !important;
}
.cardOverlayContainer > .button-link {
width: 100%;
height: 100%;
}
.card[data-type="Program"] .cardTextStack .cardText-secondary:nth-child(3) {
display: none;
}
[data-section-id="liveTv-on-now"] .card[data-type="Program"] .cardTextStack .cardText-secondary:nth-child(2) {
display: none;
}
[data-section-id="liveTv-on-now"] .card[data-type="Program"] .cardTextStack .cardText-secondary:nth-child(3) {
display: block;
}
/* TV layout: native emby-scroller + button cards (match Jellyfin layout-tv rows) */
.layout-tv .emby-scroller-container > .emby-scroller.no-padding {
overflow: hidden;
}
.layout-tv .itemsContainer-tv > button.card {
-webkit-appearance: none;
appearance: none;
display: inline-block;
border: 0;
background: transparent;
padding: 0;
margin: 0;
font: inherit;
color: inherit;
text-align: inherit;
vertical-align: top;
cursor: pointer;
}
/* Section controls are hover-only on desktop; TV has no hover */
.layout-tv .emby-scroller-container .section-refresh-button,
.layout-tv .emby-scroller-container .section-configure-button,
.layout-tv .emby-scroller-container .section-controls-more,
.layout-tv .spotlight-section .section-refresh-button,
.layout-tv .spotlight-section .section-configure-button {
opacity: 0.65;
visibility: visible;
pointer-events: auto;
}
.verticalSection[data-card-title-position^="overlay-"] .cardScalable::after,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardScalable::after {
pointer-events: none !important;
}
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack a,
.verticalSection[data-card-title-position^="overlay-"] .cardTextStack button,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack a,
.emby-scroller-container[data-card-title-position^="overlay-"] .cardTextStack button {
pointer-events: auto !important;
position: relative;
z-index: 1;
}
.spotlight-section-title-container {
position: absolute;
z-index: 2;
isolation: isolate;
transform: translateZ(0);
}
.emby-scroller-container[data-section-id] {
z-index: 1;
}
.section-controls span.material-icons {
font-size: 18px !important;
}