Files
homepage/static/other/jellyfin.css
T
Alexander ccca1a7959 fix(jellyfin): scope logo bocken.org link to home header only
The previous wrap-in-anchor approach leaked the bocken.org link onto
unrelated page titles because Jellyfin reuses the same <h3> across
navigations and only swaps its class between .pageTitleWithDefaultLogo
and .pageTitle. Switch to click delegation so the redirect fires only
when the clicked element currently carries the logo class. Also unwrap
any legacy anchor wrappers on first mutation, and bump cursor/filter
hover styles to !important so they survive Jellyfin's own h3 rules.
2026-05-02 13:10:24 +02:00

293 lines
8.0 KiB
CSS

/*
This file styles jellyfin and can be imported by adding:
@import url("https://bocken.org/other/jellyfin.css");
under Server -> General -> Custom CSS Code
Also requires jellyfin.js loaded via the Custom CSS/JS Injector plugin:
https://bocken.org/other/jellyfin.js
*/
:root{
--nord0: #2E3440;
--blue: #5E81AC;
--lightblue: #81A1C1;
--swiper-theme-color: var(--blue);
}
.selectionCommandsPanel,
.countIndicator, .fullSyncIndicator, .mediaSourceIndicator, .playedIndicator,
.itemProgressBarForeground,
.mdl-slider-background-lower,
.iconOsdProgressInner{
background-color: var(--blue);
}
.mdl-slider,
.emby-tab-button:hover{
color: var(--blue);
}
@media (hover: hover) and (pointer: fine){
.paper-icon-button-light:hover:not(:disabled) {
color: var(--lightblue);
background-color: rgba(var(--blue), 0.2);
}
}
/* Loading spinner */
.mdl-spinner__layer{
border-color: var(--blue);
}
/* volume and timeline button color */
/* Need to be separate to apply*/
input[type="range"]::-moz-range-thumb{
background-color: var(--blue);
}
input[type="range"]::-webkit-slider-thumb{
background-color: var(--blue);
}
.listItemIcon:not(.listItemIcon-transparent),
.navMenuOption-selected,
.button-submit,
.defaultCardBackground1,
.defaultCardBackground2,
.defaultCardBackground3,
.defaultCardBackground4,
.defaultCardBackground5,
.emby-checkbox:checked + span + .checkboxOutline, .itemProgressBarForeground
{
background-color: var(--blue) !important;
}
.button-link,
.button-flat:hover{
color: var(--blue);
}
.emby-checkbox:checked + span + .checkboxOutline{
border-color: var(--blue);
}
.btnUserRating:hover,
.cardOverlayButton:has(.favorite):hover{
color: #BF616A !important;
}
.emby-input:focus, .emby-textarea:focus{
border-color: var(--blue);
}
.emby-select-withcolor:focus{
border-color: var(--blue) !important;
}
.listItemIcon:not(.listItemIcon-transparent),
.navMenuOption-selected,
.button-submit,
.defaultCardBackground1,
.defaultCardBackground2,
.defaultCardBackground3,
.defaultCardBackground4,
.defaultCardBackground5,
.emby-checkbox:checked + span + .checkboxOutline,
.itemProgressBarForeground,
.taskProgressInner,
.sliderMarker.watched
{
background-color: var(--blue) !important;
}
#divRunningTasks > p > progress + span,
div.taskProgressOuter + span{
color: var(--blue) !important;
}
progress[value] {
background-color: var(--blue);
}
progress[value]::-webkit-progress-value {
background-color: var(--blue);
}
/* For Mozilla-based browsers (Firefox) */
progress[value]::-moz-progress-bar {
background-color: var(--blue);
}
/* ═══════════════════════════════════════════
FLOATING GLASS PILL HEADER
Matches bocken.org homepage header style
═══════════════════════════════════════════ */
/* Base glass effect for all header states */
.skinHeader {
background: rgba(20, 20, 20, 0.78) !important;
backdrop-filter: blur(16px) !important;
-webkit-backdrop-filter: blur(16px) !important;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.25) !important;
}
/* Float as a pill (non-OSD) */
.skinHeader:not(.osdHeader) {
position: fixed !important;
top: 12px !important;
left: 50% !important;
transform: translateX(-50%) !important;
width: fit-content !important;
min-width: min(600px, calc(100% - 1.5rem));
max-width: calc(100% - 1.5rem);
border-radius: 100px !important;
border: 1px solid rgba(255, 255, 255, 0.06) !important;
z-index: 999;
padding: 0 0.4rem !important;
overflow: visible !important;
}
/* Push page content below the floating header */
.skinBody {
padding-top: 5rem !important;
}
/* Compact the top bar row */
.skinHeader:not(.osdHeader) .headerTop {
padding: 0 0.2rem !important;
min-height: 3rem !important;
}
/* ── Header buttons ─────────────────────── */
.skinHeader:not(.osdHeader) .headerButton {
color: #999 !important;
transition: all 150ms;
border-radius: 100px;
}
.skinHeader:not(.osdHeader) .headerButton:hover {
color: white !important;
background: rgba(255, 255, 255, 0.1);
}
/* ── Hide the tab bar — replaced by icon buttons via JS ── */
.skinHeader:not(.osdHeader) .headerTabs {
display: none !important;
}
/* ── Active state for injected nav buttons (home/favorites) ── */
.bocken-nav-active {
color: white !important;
background: rgba(136, 192, 208, 0.25) !important;
}
/* Hide the original home button — replaced by our injected one */
.headerHomeButton {
display: none !important;
}
/* ═══════════════════════════════════════════
SIDEBAR DRAWER
═══════════════════════════════════════════ */
.mainDrawer {
background: rgba(20, 20, 20, 0.95) !important;
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
/* ═══════════════════════════════════════════
CARDS & LIST ITEMS
═══════════════════════════════════════════ */
.card {
transition: 200ms;
}
.card:hover {
scale: 1.05;
}
/* Play overlay on card thumbnails */
.bocken-play-overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.3);
opacity: 0;
transition: opacity 200ms;
pointer-events: none;
border-radius: inherit;
}
.bocken-play-overlay .material-icons {
font-size: 3rem;
color: white;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.5));
}
.cardImageContainer:hover .bocken-play-overlay {
opacity: 1;
}
.listItem {
transition: 200ms;
}
.listItem:hover {
scale: 1.02;
}
@media (max-width: 64em){
.listItemImageButton, .listItemIndicators {
font-size: initial !important;
}
}
.backgroundContainer {
background-color: #000;
}
.pageTitleWithDefaultLogo {
background-image: url(https://bocken.org/static/css/logos/logo_full_light.png);
}
/* Bocken logo (clickable via JS click delegation) */
.skinHeader:not(.osdHeader) .pageTitleWithDefaultLogo {
cursor: pointer !important;
transition: filter 150ms;
}
.skinHeader:not(.osdHeader) .pageTitleWithDefaultLogo:hover {
/* Tint white logo to Nord lightblue (#81A1C1) */
filter: brightness(0) saturate(100%) invert(61%) sepia(52%) saturate(212%) hue-rotate(169deg) brightness(92%) contrast(94%) !important;
}
/* Toast notification */
.bocken-toast {
position: fixed;
bottom: 2rem;
left: 50%;
transform: translateX(-50%);
background: rgba(20, 20, 20, 0.9);
color: white;
padding: 0.6rem 1.2rem;
border-radius: 100px;
font-size: 0.85rem;
z-index: 9999;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
opacity: 1;
transition: opacity 400ms;
}
.bocken-toast-hide {
opacity: 0;
}
/* ═══════════════════════════════════════════
VIDEO DETAIL PAGE
═══════════════════════════════════════════ */
.detailPagePrimaryContainer,
.detailPageSecondaryContainer,
.detailRibbon {
background-color: #000 !important;
}
/* Always show the detail logo, not just on large screens */
.detailLogo {
display: block !important;
}
/* ═══════════════════════════════════════════
MOBILE ADJUSTMENTS
═══════════════════════════════════════════ */
@media (max-width: 800px) {
.skinHeader:not(.osdHeader) {
min-width: unset;
width: calc(100% - 1rem);
top: 8px !important;
border-radius: 20px !important;
padding: 0 0.2rem !important;
}
}