ccca1a7959
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.
293 lines
8.0 KiB
CSS
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;
|
|
}
|
|
}
|