-
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy paththeme.css
More file actions
2378 lines (2083 loc) · 92.1 KB
/
Copy paththeme.css
File metadata and controls
2378 lines (2083 loc) · 92.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
================================================================================
| |
| JELLYFIN CUSTOM THEME |
| Main Stylesheet (theme.css) |
| |
================================================================================
*/
/* ~~~~~~~~~~~~~~~~~~~~ EXTERNAL IMPORTS ~~~~~~~~~~~~~~~~~~~~ */
@import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap'); /* Quicksand Font from Google Fonts */
@import url("https://cdn.jsdelivr.net/gh/Druidblack/jellyfin-icon-metadata/public-icon.css"); /* Metadata icons by Druidblack */
@import url("https://cdn.jsdelivr.net/gh/n00bcodr/Jellyfish/fonts/materialSymbolsRounded.css");
@import url("https://cdn.jsdelivr.net/gh/n00bcodr/Jellyfish/loginpage.css");
@import url("https://cdn.jsdelivr.net/gh/n00bcodr/Jellyfish/colors/jellyblue.css");
/* ~~~~~~~~~~~~~~~~~~~~ GLOBAL CSS VARIABLES ~~~~~~~~~~~~~~~~~~~~ */
/* Defines core variables used throughout the theme for consistency. */
:root {
--theme-updated-on: "02 May 2026 - 09:39 A.M."; /* Date of last theme update */
--theme-name: 'Jellyfish';
--rounded-cards: 15px; /* Standard border-radius */
--blur: 15px; /* Default blur intensity */
}
/* ~~~~~~~~~~~~~~~~~~~~ GLOBAL FONT ~~~~~~~~~~~~~~~~~~~~ */
/* Sets the font for the theme. */
body, h1, h2, h3, h4, h5, h6, p {
font-family: 'Quicksand', sans-serif !important;
}
/* hide scrollbars */
* {
scrollbar-color : transparent transparent !important;
scrollbar-width: none !important;
}
.emby-button.block, .dashboardDocument .material-icons.check:before, .displayPreferencesPage .material-icons.check:before {
color: var(--text-color) !important;
background-color: var(--secondary-accent-color);
}
/* Show theme date in dashboard */
.dashboardActionsContainer::before {
content: "Theme last updated on " var(--theme-updated-on, "..........");
display: block;
background-color: var(--alt-accent-color);
color: #ddd;
border-radius: var(--rounded-cards);
padding: 15px 15px;
font-family: 'Quicksand', sans-serif;
font-weight: bold;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
margin-bottom: 1em;
margin-left: 2px;
}
/* ~~~~~~~~~~~~~~~~~~~~ ACCENT COLOR APPLICATION ~~~~~~~~~~~~~~~~~~~~ */
/* Styles that apply the theme's accent colors to various UI elements. */
/* == Primary Accent Backgrounds == */
/* Applied to main interactive element backgrounds indicating a primary action or state. */
.emby-checkbox:checked+span+.checkboxOutline, /* Checked checkboxes outline */
.selectionCommandsPanel, /* Toolbar for selected items */
.countIndicator, /* Unwatched count on cards */
.MuiButton-root.MuiButton-containedSizeMedium, /* Material UI medium contained buttons */
.MuiChip-root.MuiChip-colorInfo:not(.MuiChip-root.MuiChip-colorError), /* Info Chips (excluding error state) */
progress[aria-valuenow]:before, /* Progress bar fill (pseudo-element for some browsers) */
.button-submit, /* General submit buttons */
.layout-desktop .dashboardDocument div[data-role="controlgroup"] a.ui-btn-active, /* Active tabs in dashboard control groups (Desktop) */
.layout-desktop #editItemMetadataPage .btnHeaderSave, /* Save button in metadata editor header (Desktop) */
.layout-desktop .mainDetailButtons .btnPlay, /* Play button on details page (Desktop) */
.layout-desktop .mainDetailButtons .button-flat.btnPlay, /* Play button on details page (Desktop JMP) */
.layout-mobile .mainDetailButtons .btnPlay, /* Play button on details page (Mobile) */
.layout-tv .mainDetailButtons .btnPlay, /* Play button on details page (TV) */
.playbackProgress>div, /* Inner bar of playback progress sliders */
.iconOsdProgressInner /* Inner part of OSD circular progress indicators */
{
background: var(--primary-accent-color) !important;
}
/* == Secondary Accent Backgrounds == */
/* Applied to elements that need a less prominent accent background. */
.MuiAlert-root.MuiAlert-standardInfo, /* Info type Material UI alerts */
.navMenuOption-selected, /* Selected items in the main navigation menu */
.MuiListItemButton-root.Mui-selected, /* Selected Material UI list item buttons */
.jstree-default .jstree-wholerow-clicked /* Clicked rows in jsTree (e.g., metadata editor folder tree) */ {
background: var(--secondary-accent-color) !important;
}
.MuiMenu-paper {
background: var(--secondary-background-transparent) !important;
backdrop-filter: blur(var(--blur)) !important;
}
.formDialogHeader,
.formDialogFooter {
background: var(--secondary-accent-color) !important;
backdrop-filter: blur(25px) !important;
}
.formDialogHeader h3 {
font-weight: 800;
}
.formDialogContent {
background: var(--secondary-background-transparent) !important;
height: -webkit-fill-available !important;
}
.formDialog:has(.formDialogHeader-clear) .formDialogContent {
background: none !important;
}
.formDialog .formDialogFooter-clear {
margin-top: 1em !important;
margin-bottom: 0px !important;
padding: 1em;
}
.layout-mobile .dialog-fullscreen-lowres .formDialogHeader-clear {
border-radius: var(--rounded-cards) !important;
margin-left: 0em !important;
}
.layout-mobile .dialog-fullscreen-lowres .formDialogFooter-clear {
background: none !important;
}
.formDialogHeader.formDialogHeader-clear.justify-content-center {
width: 100%;
margin-bottom: 1em !important;
}
.formDialogHeader.formDialogHeader-clear .formDialogHeaderTitle {
margin-left: 0em !important;
}
.iconOsdProgressOuter /* Outer ring of OSD circular progress indicators */
{
background: #ffffffc0 !important;
}
.listItemIcon:not(.listItemIcon-transparent, .notification_important) /* Icons in list items (excluding transparent/important notifications) */
{
color: #ffffff !important;
background-color: var(--secondary-accent-color) !important;
}
/* == Accent Color for Progress Bars == */
/* Styles progress bar elements with the primary accent color. */
progress::-webkit-progress-value, /* Progress bar fill for WebKit browsers */
.itemProgressBarForeground, /* Foreground of item progress bars (e.g., watched progress on cards) */
.mdl-slider-background-lower /* Lower part of Material Design Lite sliders (used in player progress) */
{
background: var(--primary-accent-color) !important;
}
/* Background for the track of item progress bars, using primary accent with transparency. */
.itemProgressBar {
background: rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.2) !important;
}
/* == Accent Color for Borders == */
/* Applies primary accent color to borders of interactive or focused elements. */
.emby-checkbox:checked+span+.checkboxOutline, /* Outline of checked checkboxes */
.emby-checkbox:focus:not(:checked)+span+.checkboxOutline, /* Outline of focused (but not checked) checkboxes */
.emby-input:focus, /* Focused text input fields */
.emby-textarea:focus, /* Focused textarea fields */
.emby-select-withcolor:focus, /* Focused select dropdowns with color indication */
.mdl-spinner__layer-1, /* Layers of Material Design Lite spinners */
.mdl-spinner__layer-2,
.mdl-spinner__layer-3,
.mdl-spinner__layer-4,
.progressring-spiner /* Spinner for progress rings */
{
border-color: var(--primary-accent-color) !important;
}
/* == Accent Color for Text & Icons == */
/* Applies primary accent color to text and icons for emphasis or active states. */
.button-link:not(.itemDetailPage .button-link), /* Link-styled buttons (excluding those on item detail pages) */
.selectLabelFocused, /* Labels for focused select dropdowns */
.textareaLabelFocused, /* Labels for focused textareas */
.inputLabelFocused, /* Labels for focused input fields */
.metadataSidebarIcon, /* Icons in the metadata editor sidebar */
.upNextDialog-countdownText, /* Countdown text in the "Up Next" dialog */
.MuiSvgIcon-root.MuiSvgIcon-fontSizeInherit, /* Material UI SVG icons inheriting font size */
.listItemImageButton:hover, /* Hovered image buttons within list items */
.button-flat:hover, /* Hovered flat buttons */
#divRunningTasks span, /* Text within the running tasks indicator */
.username, /* Usernames (e.g., on profile pages) */
.headerUsername, /* Username in the header */
.sectionTitle, /* Titles of sections */
.navMenuOption:hover:not(.navMenuOption-selected) /* Hovered main navigation items (not selected) */
{
color: var(--primary-accent-color) !important;
}
.MuiListItemButton-root.Mui-selected .MuiListItemIcon-root, /* Icons within selected Material UI list items */
.MuiListItemButton-root.Mui-selected /* Selected Material UI list items (text) */
{
color: #ffffff !important;
}
/* == Accent Color for Hover Effects (Fine Pointer Devices) == */
/* Applies accent color on hover for icon buttons, specifically for mouse users. */
@media (hover: hover) and (pointer: fine) {
.paper-icon-button-light:hover:not(:disabled) { /* Exclude disabled buttons */
color: var(--primary-accent-color) !important;
background-color: transparent !important;
}
}
.paper-icon-button-light:active:not(:disabled) { /* Active state for icon buttons */
color: var(--primary-accent-color) !important;
background-color: transparent !important;
}
/* == Accent Color for Dashboard Headings == */
.dashboardSection h3 {
color: var(--primary-accent-color);
font-weight: bold !important;
}
.dashboardSection span.material-icons.chevron_right {
display: none;
}
/* == Hover Color for Movie Card Overlays == */
/* Sets a semi-transparent background on movie card hover. */
.card-hoverable:hover .cardOverlayContainer {
background: var(--secondary-background-transparent);
}
.cardOverlayContainer > .cardOverlayFab-primary {
background-color: transparent !important;
color: var(--primary-accent-color) !important;
}
/* Hide watched and favorite buttons on card hover */
.cardOverlayButtonIcon:is(.playstatebutton-icon-unplayed, .playstatebutton-icon-played, .favorite) {
display: none !important;
}
/* ~~~~~~~~~~~~~~~~~~~~ SPECIFIC ELEMENT BACKGROUNDS (NON-ACCENT) ~~~~~~~~~~~~~~~~~~~~ */
/* Defines specific background colors for particular buttons or elements, not tied to the theme accent. */
/* Red background for delete image button. */
#btnDeleteImage {
background: #942626c2 !important;
}
/* Red background for shutdown server button. */
#btnShutdown {
background: #AE3739 !important;
}
/* Green background for restart server button and Save Metadata button */
#btnRestartServer {
background: forestgreen !important;
}
/* Violet background for refresh button and reset metadata button */
button.raised.btnRefresh.emby-button, .button-reset {
background: blueviolet !important;
}
/* Dark, semi-transparent background for the Intro Skipper button. */
#skipIntro .emby-button {
background: rgba(30, 30, 30, 0.7) !important;
}
/* Red background for cancel and reset password buttons. */
#btnCancel, #btnResetPassword, .button-cancel {
background: rgb(180 96 96) !important;
}
/* ~~~~~~~~~~~~~~~~~~~~ GENERAL BACKGROUND COLORS ~~~~~~~~~~~~~~~~~~~~ */
/* Sets base background colors for main layout areas and components. */
/* Primary background for the entire page and containers without backdrops. */
html
{
background-color: var(--primary-background-color) !important;
}
.backgroundContainer:not(.withBackdrop):not(.backgroundContainer-transparent), /* Main page background, excluding when a backdrop is shown */
.noBackdropTransparency .detailPageSecondaryContainer /* Secondary container on detail pages when backdrop transparency is off */
{
background-color: var(--secondary-background-transparent) !important;
}
.libraryDocument.withSectionTabs .backgroundContainer {
backdrop-filter: blur(var(--blur)) brightness(.3) !important;
background-color: var(--secondary-background-transparent);
}
/* Hide backdrop image on homepage to work well with media bar */
.libraryDocument.withSectionTabs .backdropImage {
display: block !important;
}
/* Secondary, often slightly transparent, backgrounds for elements like drawers, dialogs, and content sections. */
.layout-desktop .mainDrawer, /* Main navigation drawer (Desktop) */
.layout-mobile .mainDrawer, /* Main navigation drawer (Mobile) */
.MuiPaper-root.MuiDrawer-paperAnchorDockedLeft, /* Material UI drawer paper */
.dialog, /* Dialog boxes */
.programCell-active, /* Active program cells in the TV guide */
.channelsContainer, /* Container for TV channels */
.layout-desktop .detailSectionContent, /* Content area within detail sections (Desktop) - Consider backdrop transparency rules */
.layout-mobile .detailSectionContent, /* Content area within detail sections (Mobile) */
.layout-tv .detailSectionContent, /* Content area within detail sections (tv) */
.trackSelections, /* Audio/Subtitle track selection area */
.MuiPaper-root.MuiPopover-paper
{
background: var(--secondary-background-transparent) !important;
}
/* ~~~~~~~~~~~~~~~~~~~~ DYNAMIC BACKGROUNDS (ACTIVE DEVICES) ~~~~~~~~~~~~~~~~~~~~ */
/* Provides a set of alternate background colors, often used for cards in the "Active Devices" section. */
.defaultCardBackground1 { background-color: var(--primary-alt1) !important; }
.defaultCardBackground2 { background-color: var(--primary-alt2) !important; }
.defaultCardBackground3 { background-color: var(--primary-alt3) !important; }
.defaultCardBackground4 { background-color: var(--primary-alt4) !important; }
.defaultCardBackground5 { background-color: var(--primary-alt5) !important; }
/* ~~~~~~~~~~~~~~~~~~~~ LAYOUT - GENERAL ~~~~~~~~~~~~~~~~~~~~ */
/* == Poster Card Size Reduction (Landscape) == */
/* Reduces the width of portrait-oriented cards on wider screens in landscape. */
@media (min-width: 50em) and (orientation: landscape) {
.overflowPortraitCard { /* used for "More like this" sections */
width: 15% !important;
}
}
/* == Rounded Progress Bars == */
/* Applies rounding to all progress elements and their WebKit-specific parts. */
progress,
progress::-webkit-progress-bar, /* Track of the progress bar (WebKit) */
progress::-webkit-progress-value /* Filled part of the progress bar (WebKit) */
{
border-radius: var(--rounded-cards) !important;
overflow: hidden; /* Ensures inner parts respect the rounding */
}
/* == Default Logo Styling == */
/* Styles for the Jellyfin logo when a custom one isn't set by the user. */
.pageTitleWithDefaultLogo {
background-image: var(--logo) !important; /* Uses the --logo variable, ensure it's defined in your color scheme files */
background-size: 100% !important; /* Make logo responsive within its container */
}
/* Desktop logo dimensions and positioning. */
.layout-tv .pageTitleWithLogo, .layout-desktop .pageTitleWithLogo {
margin-left: 25px !important;
height: 60px !important;
width: 140px !important;
}
/* Mobile logo dimensions and positioning. */
.layout-mobile .pageTitleWithLogo {
height: 30px !important;
width: 100px !important;
margin: 0 1em 0 .5em !important;
padding: 10px !important;
}
/* General page title margin (when logo is not present or text only). */
[dir="ltr"] .pageTitle {
margin: 0 1em 0 .5em !important;
}
/* Fix for empty page titles that might otherwise take up space due to margin. */
[dir="ltr"] .pageTitle:not(.pageTitleWithLogo):empty {
margin: 0 !important;
}
/* == Dialog Styling == */
/* Basic styling for dialog boxes. */
.dialog {
background-color: var(--secondary-background-color) !important; /* Re-affirm background, could be inherited */
border-radius: var(--rounded-cards) !important;
border: 1px solid var(--alt-accent-color);
}
/* Margin for titles within action sheets (a type of dialog). */
.actionSheetTitle {
margin: 10px 20px !important;
}
.actionSheetMenuItem.emby-button:hover, .listItem:hover {
background-color: var(--secondary-accent-color) !important; /* Accent color on hover */
border-radius: var(--rounded-cards) !important;
}
.actionSheetContent {
background: var(--secondary-background-transparent) !important;
backdrop-filter: var(--blur) !important;
border-radius: var(--rounded-cards) !important;
}
/* == Mobile Cast & Crew Card Size == */
/* Adjusts the size of cast and crew portrait cards on mobile devices. */
/* Small mobile devices */
@media (min-width: 25em) {
.layout-mobile #castContent .card.overflowPortraitCard,
.layout-mobile #guestCastContent .card.overflowPortraitCard {
width: 30% !important;
font-size: 90% !important;
}
}
/* iPads in portrait */
@media (min-width: 50em) and (orientation: portrait) {
.layout-mobile #castContent .card.overflowPortraitCard,
.layout-mobile #guestCastContent .card.overflowPortraitCard {
width: 18% !important;
font-size: 90% !important;
}
}
/* iPads/tablets in landscape */
@media (min-width: 50em) and (orientation: landscape) {
.layout-mobile #castContent .card.overflowPortraitCard,
.layout-mobile #guestCastContent .card.overflowPortraitCard {
width: 12% !important;
font-size: 90% !important;
}
}
/* Desktop cast and crew card size. */
.layout-desktop #castContent .card.overflowPortraitCard,
.layout-desktop #guestCastContent .card.overflowPortraitCard {
width: 10em !important; /* Fixed width for desktop */
}
/* ~~~~~~~~~~~~~~~~~~~~ LAYOUT - HEADER ~~~~~~~~~~~~~~~~~~~~ */
/* == Header Base Styling == */
/* Basic transparency and padding for the main header. */
.skinHeader, .skinHeader-withBackground.osdHeader {
background-color: transparent !important;
background: transparent !important;
}
.layout-desktop .skinHeader,
.layout-tv .skinHeader {
padding-top: 1.5em !important; /* Top padding for desktop and TV layouts */
}
.layout-tv .skinHeader {
padding-bottom: 10px !important; /* Specific bottom padding for TV layout */
}
/* == ZestyTheme-Inspired Header Tabs & Right Section == */
/* Styles for header tabs and the right-aligned header items, creating a pill-shaped, blurred effect. */
.headerTabs, /* Container for navigation tabs within the header */
.headerRight /* Container for icons/buttons on the right of the header */
{
background: var(--header-background-color) !important; /* Use a variable for background, ensure it's defined (e.g., semi-transparent white) */
border-radius: 100px !important; /* Creates the pill shape */
color: var(--secondary-background-color) !important; /* Text color, assuming a light header background means dark text */
backdrop-filter: blur(50px) !important; /* Strong blur effect */
box-shadow: 0px 0px 10px 10px rgba(0,0,0,0.25) !important;
}
/* == Header Button Hover & Focus (Right Section) == */
/* Accent color for icon buttons in the right header section on hover/focus. */
.headerRight .paper-icon-button-light:hover,
.headerRight .paper-icon-button-light:hover:not(:disabled),
.headerRight .paper-icon-button-light:focus,
.headerRight .paper-icon-button-light:focus:not(:disabled)
{
color: var(--primary-accent-color) !important;
}
/* == Header Text Color & Positioning == */
/* Styling for text elements within the header tabs/buttons. */
.homeLibraryText, /* Text for the "Home" or library buttons */
.emby-button-foreground /* General foreground (text/icon) for Emby buttons */
{
color: var(--secondary-background-color) !important; /* Dark text, assuming light header background */
transition: color 0.2s ease; /* Smooth color transition on hover/state change */
top: unset !important; /* Resets any default vertical positioning */
position: relative; /* Ensures proper behavior within flex containers */
}
/* == Header Tab Button Styling == */
/* Styling for individual tab buttons and the home/library button in the header. */
#indexPage .homeLibraryButton, /* Home button specifically on the index page */
.emby-tab-button /* General tab buttons */
{
background: transparent !important; /* Start with a transparent background */
min-width: 0 !important; /* Allow shrinking */
max-width: 50vw !important; /* Limit maximum width */
width: fit-content !important; /* Fit width to content */
transition: background-color 0.2s ease; /* Smooth background transition */
border-radius: 100px !important; /* Start with applied Border Radius */
}
/* Desktop-specific margin for tab/home buttons. */
.layout-desktop .homeLibraryButton,
.layout-desktop .emby-tab-button {
margin: .5em !important;
}
/* == Header Tab Button Hover/Focus Effects == */
/* Defines hover and focus appearance for header tabs, using primary accent. */
.raised:hover .homeLibraryText,
.emby-tab-button:hover .emby-button-foreground {
color: var(--text-color) !important; /* Text color on hover (e.g., white for contrast with accent background) */
transition: color 0.2s ease;
}
#indexPage .homeLibraryButton:hover,
.emby-tab-button:hover {
border-radius: 100px !important; /* Maintain pill shape on hover */
background-color: var(--primary-accent-color) !important; /* Use primary accent for background on hover */
}
/* Smooth scrolling for tab sliders */
.scrollSlider,
.emby-scroller {
scroll-behavior: smooth !important;
-webkit-overflow-scrolling: touch !important;
}
/* Remove default outline/shadow on focus for a cleaner look. */
.raised.homeLibraryButton.emby-button:hover,
.emby-tab-button:hover,
.homeLibraryButton:focus {
outline: none !important;
box-shadow: none !important;
}
/* Remove default underline/after-element effect on tab hover. */
.emby-tab-button:hover::after {
background: unset !important;
}
/* == Active Header Tab Styling == */
/* Styles for the currently active header tab. */
.emby-tab-button-active {
background-color: var(--primary-accent-color) !important;
border-radius: 100px !important; /* Pill shape */
color: var(--text-color) !important; /* Text color for active tab (e.g., white) */
}
.emby-tab-button-active > .emby-button-foreground {
color: var(--text-color) !important; /* Ensure foreground text also matches active state color */
}
/* == Header Tabs & Right Section Positioning (Desktop) == */
/* Fine-tunes positioning and sizing for desktop header elements. */
.layout-tv .headerTabs, .layout-desktop .headerTabs {
margin-bottom: 2vh !important;
margin-left: auto !important;
margin-right: auto !important;
margin-top: -58px !important; /* Negative margin to pull it up relative to other header elements */
font-size: 12px !important; /* Custom font size for tabs */
width: fit-content !important;
}
.layout-tv .headerRight, .layout-desktop .headerRight {
height: 45px !important;
padding: 2px 5px !important;
position: absolute !important; /* Absolute positioning for precise placement */
right: 12px !important;
}
.layout-tv .emby-tab-button {
height: 40px !important;
font-size: 15px;
}
/* Ensures tab buttons align content correctly and have appropriate padding. */
.emby-tab-button {
height: 30px !important; /* Match a consistent height */
display: inline-flex !important; /* For proper alignment of content */
align-items: center !important; /* Vertical centering */
justify-content: center !important;/* Horizontal centering */
padding: 0 15px !important; /* Horizontal padding within tabs */
}
/* --- End of Zesty Header Styles Integration --- */
/* == Header Left Section Styling (Desktop) == */
/* Styling for the left part of the header, typically containing back/menu buttons. */
.layout-desktop .headerLeft:not(.libraryDocument:has(.videoPlayerContainer) .headerLeft) { /* Exclude when video player is active */
padding: 2px !important;
top: -3px !important; /* Slight upward adjustment */
border-radius: 5px !important;
flex-grow: 0 !important; /* Prevent growing to fill space */
-webkit-flex-grow: 0 !important;
}
/* Fallback for browsers not supporting :has() selector (e.g., older Jellyfin Media Player versions). */
@supports not selector(:has(*)) {
.layout-desktop .headerLeft {
padding: 2px !important;
top: -3px !important;
background-color: transparent !important; /* Keep transparent for fallback to match modern browser behavior */
border-radius: 50px !important; /* Different rounding for fallback */
}
}
/* == Header Button Icon Alignment == */
/* Adjusts vertical alignment of icons within header buttons for Mobile. */
.layout-mobile .emby-button-foreground {
text-shadow: -2px 2px 12px #000000eb !important; /* Text shadow for mobile header icons for readability */
}
/* ~~~~~~~~~~~~~~~~~~~~ LAYOUT - MAIN DRAWER (SIDEBAR) ~~~~~~~~~~~~~~~~~~~~ */
/* == Sidebar Dynamic Styling (Desktop - Default Behavior) == */
/* Styles for the main navigation drawer (sidebar) to make it appear dynamically (slides in/out). */
.layout-desktop .mainDrawer:not(.dashboardDocument) {
left: -320px !important; /* Initially positioned off-screen to the left */
z-index: 1099 !important; /* High z-index to appear above other content */
border-top-right-radius : 30px !important;
border-bottom-right-radius : 30px !important;
backdrop-filter: blur(30px) !important;
width: 275px !important;
transition: transform .24s ease-out,left .26s ease-out,-webkit-transform .24s ease-out !important; /* Smooth transition for sliding */
}
/* Shows the hamburger menu button when the drawer is dynamic. */
.layout-desktop .mainDrawerButton:not(.dashboardDocument) {
display: inline-flex !important;
}
/* Resets content margin when the drawer is dynamic (no longer permanently shifted). */
.layout-desktop .libraryPage:not(#editItemMetadataPage),
.layout-desktop .appfooter {
margin-left: 0px !important;
}
/* Move .quickConnectSettingsContainer to the center of the screen */
.layout-desktop div#quickConnectPreferencesPage.libraryPage.userPreferencesPage[data-role="page"] {
display: flex;
justify-content: center;
}
/* == Sidebar Styling (Mobile) == */
/* Basic styling for the mobile sidebar. */
.layout-mobile .mainDrawer {
width: 250px !important;
backdrop-filter: blur(50px) !important;
border-top-right-radius : 30px !important;
border-bottom-right-radius : 30px !important;
}
.layout-mobile .mainDrawer-scrollContainer {
margin-top: 15px !important; /* Top margin for scrollable content */
}
/* == Sidebar Scroll Container & Button Positioning == */
/* Adjusts padding/margin for the scrollable area within the sidebar. */
.layout-desktop .mainDrawer-scrollContainer { /* Applies to the dynamic desktop drawer now */
margin-top: 15px !important;
margin-left: 10px !important;
}
/* Specific padding for the dashboard's static sidebar. */
.layout-desktop .dashboardDocument .mainDrawer-scrollContainer {
padding-top: 75px !important; /* Accounts for header height */
margin-left: 10px !important;
background: var(--secondary-background-color) !important;
}
/* == Dashboard Top Bar Styling (MUI Override) == */
/* Removes background and shadow from a Material UI AppBar element likely used in the dashboard top. */
.css-fknfom { /* This is a generated MUI class name, may be fragile if Jellyfin updates MUI versions/styling */
background: none !important;
box-shadow: none !important;
}
/* == Sidebar Navigation Buttons == */
/* Styling for individual navigation options within the sidebar. */
.navMenuOption,
.navMenuOption:hover,
.navMenuOption-selected {
width: 85% !important; /* Relative width */
margin: auto !important; /* Centering */
text-align: center !important;
height: 45px !important; /* Fixed height */
margin-top: 3px !important;
margin-bottom: 3px !important;
border-radius: 10px !important; /* Rounded corners */
transition: .2s !important; /* Smooth transitions for hover effects */
text-shadow: 1px 1px 5px rgba(0, 0, 0, 0.7);
}
/* Hover effect for non-selected sidebar buttons. */
.navMenuOption:hover:not(.navMenuOption-selected) {
background: var(--primary-background-transparent) !important; /* Dark semi-transparent background */
color: var(--primary-accent-color) !important; /* Text color changes to accent on hover */
transform: scale(1.05) !important; /* Slight scaling effect */
}
/* Styling for selected sidebar buttons. */
.navMenuOption-selected {
background: var(--secondary-accent-color) !important; /* Uses secondary accent for background */
color: var(--primary-accent-color) !important; /* Uses primary accent for text */
}
/* == Sidebar Button Icons & Text Alignment == */
/* Adjusts the position of icons and text within sidebar navigation buttons. */
.navMenuOptionIcon,
.navMenuOptionText {
position: inherit !important; /* Resets to default positioning behavior */
right: 10% !important; /* Shifts content slightly to the right (may need review based on desired layout) */
margin-top: 0 !important;
}
/* == Sidebar Fixes for Specific Pages/States == */
/* Ensures the dynamic sidebar is hidden on pages where it's not needed (e.g., video player, login page). */
.layout-desktop .hide-scroll .mainDrawer,
.layout-desktop .hideMainDrawer .mainDrawer {
left: -320px !important; /* Keep it off-screen */
}
/* Static sidebar behavior specifically for the dashboard. */
.layout-desktop .dashboardDocument .mainDrawer {
top: 0px !important;
left: 0px !important; /* Positioned on-screen */
width: 300px !important; /* Slightly wider for dashboard view */
z-index: 998 !important; /* Below header but above page content */
background: var(--secondary-background-color) !important; /* Solid background */
border-radius: 0 !important; /* No rounding for static full-height sidebar */
transition: none !important; /* No transition needed for static element */
}
/* Adjusts the main page content on the dashboard to accommodate the static sidebar. */
.layout-desktop .dashboardDocument .mainAnimatedPage {
left: 260px !important;
}
.layout-desktop div#dashboardPage {
left: 260px !important;
}
.localUsers .cardText-secondary {
height: 4em !important;
font-size: 10px;
}
/* Make device cards and media library cards smaller for compact layout */
#devicesPage .cardScalable, #mediaLibraryPage .cardScalable {
height: 10vh;
}
/* ~~~~~~~~~~~~~~~~~~~~ LAYOUT - MOBILE HEADER ~~~~~~~~~~~~~~~~~~~~ */
/* Styles specific to the mobile header behavior and appearance. */
.layout-mobile .skinHeader {
transition: .5s !important; /* Short transition for header movements */
}
/* Default state for unpinned (scrolled down) header. */
.layout-mobile .headroom--unpinned {
transform: none;
}
/* When tabs are visible in the mobile header and it's unpinned, hide the top part of the header. */
.layout-mobile .headroom--unpinned:has(.headerTabs.sectionTabs:not(.hide)) {
transform: translateY(-50%);
}
/* When scrolled (not at the top), apply a blurred background to the mobile header. */
.layout-mobile .headroom--not-top {
background: var(--secondary-background-transparent) !important; /* Blurred background using secondary accent */
backdrop-filter: blur(var(--blur)) !important;
}
/* Remove background from the right header section when scrolled (it inherits from headroom--not-top).
.layout-mobile .headroom--not-top .headerRight {
background: none !important;
} */
/* Transparent header when at the very top of the page or when tabs are visible (overriding the scrolled style). */
.layout-mobile .headroom--top,
.layout-mobile .headroom--not-top:has(.headerTabs.sectionTabs:not(.hide)) {
background: transparent !important;
backdrop-filter: none !important;
}
/* Styles for the right header section when at the top (pill shape, blur). */
.layout-mobile .headroom--top .headerRight {
background: var(--header-background-color) !important; /* Re-apply defined header background */
border-radius: 100px !important;
backdrop-filter: blur(50px) !important; /* Strong blur */
box-shadow: 1px 3px 6px rgba(var(--secondary-background-color),.5); /* Dark shadow */
color: var(--secondary-background-color) !important; /* Dark text */
height: 40px !important;
padding: 0 10px !important;
}
/* Styling for mobile header tabs (pill shape, light background, blur). */
.layout-mobile .headerTabs {
height: 40px !important;
font-size: 12px !important;
margin-left: auto !important;
margin-right: auto !important;
width: auto !important;
max-width: 100% !important;
margin-bottom: 1em !important;
}
/* Ensure mobile tab buttons match the height of the tabs container. */
.layout-mobile .emby-tab-button {
height: 40px !important;
}
/* == Mobile Header - Small Screen Adjustments (< 380px width) == */
/* Adjusts header layout on very small mobile screens to prevent overlap. */
@media (max-width: 380px) {
/* Center page title below other header elements if no logo is present. */
.layout-mobile .pageTitle:not(.pageTitleWithLogo):not(:empty) {
position: absolute !important;
margin-left: 50% !important;
transform: translate(-50%, 0) !important;
top: 60px !important;
}
/* Adjust alignment when the centered title is present. */
.layout-mobile .headerTop:has(.pageTitle:not(.pageTitleWithLogo):not(:empty)) {
-webkit-align-items: start !important;
align-items: start !important;
}
/* Increase header height to accommodate the moved title. */
.layout-mobile .skinHeader:has(.pageTitle:not(.pageTitleWithLogo):not(:empty)) {
height: 110px !important;
}
/* Further increase header height if tabs are also visible with the moved title. */
.layout-mobile .skinHeader:has(.pageTitle:not(.pageTitleWithLogo):not(:empty)):has(.sectionTabs:not(.hide)) {
height: 140px !important;
}
/* Add padding to library pages to prevent content from going under the taller header. */
.layout-mobile .libraryPage:not(.noSecondaryNavPage) {
padding-top: 9.5em !important;
}
/* Adjust unpinned header transformation when title and tabs are present. */
.layout-mobile .headroom--unpinned:has(.headerTabs.sectionTabs:not(.hide)):has(.pageTitle:not(.pageTitleWithLogo):not(:empty)) {
transform: translateY(-60%);
}
}
/* ~~~~~~~~~~~~~~~~~~~~ LAYOUT - CONTENT AREA ~~~~~~~~~~~~~~~~~~~~ */
/* == Horizontal Scroll Menu Fix == */
/* Adjusts margin for horizontally scrolling sections (e.g., on home page) to prevent cutoff. */
.emby-scroller {
margin-right: 3.3% !important; /* Consolidated from separate desktop/mobile rules */
}
/* == Collection Items Alignment Fix (Desktop) == */
/* Corrects padding for items within a collection view. */
.layout-desktop .collectionItems .collectionItemsContainer {
padding-left: 0% !important;
}
/* == Hide "Next Up" Section == */
/* Completely hides the "Next Up" section from the home page or series pages. */
/* div.nextUpSection {
display: none;
} */
/* == Hide "Upcoming on TV" Section == */
/* Hides the "Upcoming" schedule list and section title for TV series. */
#seriesScheduleList,
#seriesScheduleSection {
display: none !important;
}
.separator-icon {
color: var(--primary-accent-color) !important;
font-size: 2vh !important;
}
/* ~~~~~~~~~~~~~~~~~~~~ CARDS & LIST ITEMS ~~~~~~~~~~~~~~~~~~~~ */
/* == Universal Card Rounding == */
/* Applies consistent rounding and overflow hiding to all card components and their inner parts. */
.card,
.cardBox,
.cardScalable,
.cardPadder,
.cardImageContainer,
.blurhash-canvas, /* Canvas used for blurhash placeholders */
.cardContent,
.cardOverlayContainer
{
border-radius: var(--rounded-cards) !important;
overflow: hidden !important; /* Crucial for rounded corners on elements with backgrounds/images */
}
.cardOverlayButton {
border-radius: 10px !important;
}
.itemSelectionPanel {
border: none !important;
background-color: transparent !important;
border-radius: var(--rounded-cards) !important;
}
.checkboxOutline.multiSelectCheckboxOutline {
width: 100% !important;
height: 100% !important;
}
.checkboxOutline {
border-radius: var(--rounded-cards) !important;
}
.emby-checkbox:checked+span+.checkboxOutline.multiSelectCheckboxOutline {
background: rgba(var(--primary-r), var(--primary-g), var(--primary-b), 0.5) !important;
border: 5px solid var(--primary-accent-color) !important;
backdrop-filter: var(--blur) !important;
}
.itemSelectionPanel .material-icons.check:before {
content: 'check';
font-size: 5em !important;
color: white !important;
text-shadow: 0 0 15px rgba(0,0,0,0.7);
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.cardText-secondary+.itemSelectionPanel>.checkboxContainer, .cardText.cardTextCentered:not(.cardText-secondary,.cardText-first)+.itemSelectionPanel>.checkboxContainer {
height: calc(100% - 3em);
}
.itemSelectionPanel .checkboxContainer {
height: calc(100% - 1.5em);
}
/* Removes default background from card padders to rely on cardBox or image. */
.cardPadder {
background: none !important;
}
/* == General Card & List Item Styling == */
/* Additional rounding for specific card and list elements. */
.cardBox { /* Redundant if .card already covers this, but ensures specificity */
border-radius: var(--rounded-cards) !important;
}
.paperList { /* Container for lists, often in settings */
border-radius: var(--rounded-cards) !important;
}
/* Styling for list items in desktop and TV layouts, adding padding, transition, and rounding. */
.layout-desktop .listItem,
.layout-tv .listItem {
padding-inline: 15px !important; /* Horizontal padding */
transition: .2s !important;
border-radius: var(--rounded-cards) !important;
}
#childrenContent .listItem {
padding-left: 1em !important;
padding-right: 1em !important;
padding-top: 1em !important;
padding-bottom: 1em !important;
border-radius: 28px !important;
}
@media (orientation: portrait) {
.layout-mobile .listItemImage {
min-height: 5em !important;
}
}
.listItemImageButton:hover {
background: none !important;
translate: 0 -3px !important;
}
.listItemImageButton{
background: none !important;
color: white !important
}
.layout-mobile #childrenContent .listItem {
margin-right: 2em !important;
}
.listItem-content {
align-items: flex-start !important;
}
.playstatebutton-icon-played {
color: lawngreen !important; /* Accent color for watched state icon */
}
/* Hover effect for list items: background change and slight scaling. */
.listItem {
transition: background 0.2s ease, box-shadow 0.2s ease, translate 0.2s ease !important;
}
.listItem:hover {
background: var(--alt-accent-color) !important;
translate: 0 -3px !important;
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25) !important;
}
/* == Card Hover Effects (Outline & Dim) == */
/* Adds an accent-colored border and a dimming overlay on hover for various card types. */
.cardBox-bottompadded.cardBox > .cardScalable {
border: 2px solid transparent; /* Reserve space for hover border */
}
div.card-withuserdata.card-hoverable.card:hover > .cardBox-bottompadded.cardBox > .cardScalable,
div.groupedCard.card-hoverable.overflowSquareCard.card:hover > .cardBox-bottompadded.cardBox > .cardScalable,
div.card-hoverable.squareCard.card:hover > .cardBox-bottompadded.cardBox > .cardScalable {
border: 2px solid var(--primary-accent-color) !important;
box-shadow: 0 0 3px rgba(255, 255, 255, .5) !important; /* Subtle white shadow for emphasis */
}
/* The dimming overlay using a pseudo-element. */
div.card-withuserdata.card-hoverable.card:hover > .cardBox-bottompadded.cardBox > .cardScalable::before,
div.groupedCard.card-hoverable.overflowSquareCard.card:hover > .cardBox-bottompadded.cardBox > .cardScalable::before,
div.card-hoverable.squareCard.card:hover > .cardBox-bottompadded.cardBox > .cardScalable::before {
content: "";
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background-color: rgba(31, 31, 31, 0.4); /* Dark semi-transparent overlay */
z-index: -1; /* Position behind card content but above card background/image if any */
border-radius: var(--rounded-cards); /* Match card rounding */
}
/* Ensures cards are positioned relatively for the ::before pseudo-element to work correctly. */
div.card-withuserdata.card-hoverable.card,