Hermes Agent commited on
Commit
0dcccee
·
1 Parent(s): d4eac6b

fix(ui): eliminate duplicate poster on detail page, restore cast & crew card dimensions, tighten landscape buttons spacing, and show topbar on home/library

Browse files
Files changed (2) hide show
  1. apex/ui/abyss.css +149 -33
  2. apex/ui/spotlight-loader.js +13 -19
apex/ui/abyss.css CHANGED
@@ -4248,7 +4248,7 @@ div[data-category="nextup"] .cardImageContainer img,
4248
 
4249
  /* 3. Dedicated Library/Catalog views (3-Column Grid ONLY on Non-Home Library Pages) */
4250
  @media (max-width: 600px) and (orientation: portrait) {
4251
- .page:not(#indexPage) .itemsContainer,
4252
  div[data-role="page"]:not(#indexPage) .itemsContainer,
4253
  .pageTabContent:not(#homeTab) .itemsContainer,
4254
  .itemsContainer.itemsContainer-wrap,
@@ -4271,7 +4271,7 @@ div[data-category="nextup"] .cardImageContainer img,
4271
  scroll-snap-type: none !important;
4272
  }
4273
 
4274
- .page:not(#indexPage) .itemsContainer > .card,
4275
  div[data-role="page"]:not(#indexPage) .itemsContainer > .card,
4276
  .pageTabContent:not(#homeTab) .itemsContainer > .card,
4277
  .itemsContainer.itemsContainer-wrap > .card,
@@ -4334,7 +4334,7 @@ div[data-category="nextup"] .cardImageContainer img,
4334
 
4335
  /* 4. LANDSCAPE MODE & WIDESCREEN: HIGH DENSITY CARDS (7-8 Cards Per Row) */
4336
  @media (orientation: landscape), (min-width: 601px) {
4337
- .page:not(#indexPage) .itemsContainer,
4338
  div[data-role="page"]:not(#indexPage) .itemsContainer,
4339
  .pageTabContent:not(#homeTab) .itemsContainer,
4340
  .itemsContainer.itemsContainer-wrap,
@@ -4356,7 +4356,7 @@ div[data-category="nextup"] .cardImageContainer img,
4356
  width: 100% !important;
4357
  }
4358
 
4359
- .page:not(#indexPage) .itemsContainer > .card,
4360
  div[data-role="page"]:not(#indexPage) .itemsContainer > .card,
4361
  .pageTabContent:not(#homeTab) .itemsContainer > .card,
4362
  .itemsContainer.itemsContainer-wrap > .card,
@@ -4623,52 +4623,60 @@ header .pageTitle,
4623
 
4624
  /* ========================================================
4625
  DETAIL PAGE: MOBILE PORTRAIT & DEFAULT CLEAN LAYOUT
4626
- Clean poster card thumbnail + left-aligned stacked title & metadata
4627
  ======================================================== */
4628
  @media (orientation: portrait) {
4629
- #itemDetailPage .detailRibbon,
4630
- .layout-mobile #itemDetailPage .detailRibbon {
4631
  display: flex !important;
4632
  flex-direction: row !important;
4633
  align-items: flex-start !important;
4634
  flex-wrap: wrap !important;
 
 
4635
  width: 100% !important;
4636
- max-width: 100% !important;
4637
- padding: 16px 16px 12px 16px !important;
4638
- gap: 14px !important;
4639
  box-sizing: border-box !important;
4640
  position: relative !important;
4641
- background: transparent !important;
4642
  }
4643
 
4644
- /* Fixed Clean Poster Thumbnail in Portrait */
4645
  #itemDetailPage .detailImageContainer,
4646
  .layout-mobile #itemDetailPage .detailImageContainer {
4647
  display: block !important;
4648
  visibility: visible !important;
4649
  opacity: 1 !important;
4650
  position: relative !important;
4651
- width: 108px !important;
4652
- min-width: 108px !important;
4653
- max-width: 108px !important;
4654
- height: 162px !important;
4655
  aspect-ratio: 2 / 3 !important;
4656
- border-radius: 10px !important;
4657
  overflow: hidden !important;
4658
  margin: 0 !important;
4659
  padding: 0 !important;
4660
- flex-shrink: 0 !important;
4661
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.75) !important;
4662
  border: 1px solid rgba(255, 255, 255, 0.14) !important;
4663
  }
4664
 
 
 
 
 
 
 
 
 
 
4665
  #itemDetailPage .detailImageContainer .card,
4666
  .layout-mobile #itemDetailPage .detailImageContainer .card,
4667
  #itemDetailPage .detailImageContainer .cardScalable {
4668
  width: 100% !important;
4669
  height: 100% !important;
4670
  aspect-ratio: 2 / 3 !important;
4671
- border-radius: 10px !important;
4672
  overflow: hidden !important;
4673
  margin: 0 !important;
4674
  position: relative !important;
@@ -4680,14 +4688,27 @@ header .pageTitle,
4680
  display: none !important;
4681
  }
4682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4683
  #itemDetailPage .infoWrapper,
4684
  .layout-mobile #itemDetailPage .infoWrapper {
4685
  display: flex !important;
4686
  flex-direction: column !important;
4687
  align-items: flex-start !important;
4688
  justify-content: flex-start !important;
4689
- flex: 1 1 calc(100% - 128px) !important;
4690
- min-width: 0 !important;
4691
  gap: 3px !important;
4692
  margin: 0 !important;
4693
  padding: 0 !important;
@@ -4758,7 +4779,7 @@ header .pageTitle,
4758
  gap: 10px !important;
4759
  width: 100% !important;
4760
  flex-basis: 100% !important;
4761
- margin-top: 10px !important;
4762
  overflow-x: auto !important;
4763
  padding-bottom: 4px !important;
4764
  }
@@ -4823,13 +4844,19 @@ button:has(svg[data-testid="PeopleIcon"]),
4823
  overflow-y: auto !important;
4824
  }
4825
 
4826
- #itemDetailPage .detailLogo,
4827
- .layout-mobile #itemDetailPage .detailLogo {
4828
- display: none !important;
4829
- visibility: hidden !important;
4830
- height: 0 !important;
4831
- margin: 0 !important;
4832
- }
 
 
 
 
 
 
4833
 
4834
  #itemDetailPage .itemBackdrop,
4835
  .layout-mobile #itemDetailPage .itemBackdrop {
@@ -4863,8 +4890,8 @@ button:has(svg[data-testid="PeopleIcon"]),
4863
  position: relative !important;
4864
  width: 100% !important;
4865
  box-sizing: border-box !important;
4866
- padding: 16px 28px 12px 185px !important;
4867
- min-height: 230px !important;
4868
  display: flex !important;
4869
  flex-direction: column !important;
4870
  align-items: flex-start !important;
@@ -4987,12 +5014,15 @@ button:has(svg[data-testid="PeopleIcon"]),
4987
 
4988
  #itemDetailPage .mainDetailButtons,
4989
  .layout-mobile #itemDetailPage .mainDetailButtons {
 
 
 
4990
  display: flex !important;
4991
  flex-direction: row !important;
4992
  align-items: center !important;
4993
  flex-wrap: nowrap !important;
4994
- gap: 10px !important;
4995
- margin-top: 6px !important;
4996
  width: 100% !important;
4997
  }
4998
 
@@ -5232,3 +5262,89 @@ body:not(.hide-apex-topbar) .libraryPage:not(#itemDetailPage) {
5232
  padding-top: 56px !important;
5233
  box-sizing: border-box !important;
5234
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4248
 
4249
  /* 3. Dedicated Library/Catalog views (3-Column Grid ONLY on Non-Home Library Pages) */
4250
  @media (max-width: 600px) and (orientation: portrait) {
4251
+ .page:not(#indexPage):not(#itemDetailPage) .itemsContainer,
4252
  div[data-role="page"]:not(#indexPage) .itemsContainer,
4253
  .pageTabContent:not(#homeTab) .itemsContainer,
4254
  .itemsContainer.itemsContainer-wrap,
 
4271
  scroll-snap-type: none !important;
4272
  }
4273
 
4274
+ .page:not(#indexPage):not(#itemDetailPage) .itemsContainer > .card,
4275
  div[data-role="page"]:not(#indexPage) .itemsContainer > .card,
4276
  .pageTabContent:not(#homeTab) .itemsContainer > .card,
4277
  .itemsContainer.itemsContainer-wrap > .card,
 
4334
 
4335
  /* 4. LANDSCAPE MODE & WIDESCREEN: HIGH DENSITY CARDS (7-8 Cards Per Row) */
4336
  @media (orientation: landscape), (min-width: 601px) {
4337
+ .page:not(#indexPage):not(#itemDetailPage) .itemsContainer,
4338
  div[data-role="page"]:not(#indexPage) .itemsContainer,
4339
  .pageTabContent:not(#homeTab) .itemsContainer,
4340
  .itemsContainer.itemsContainer-wrap,
 
4356
  width: 100% !important;
4357
  }
4358
 
4359
+ .page:not(#indexPage):not(#itemDetailPage) .itemsContainer > .card,
4360
  div[data-role="page"]:not(#indexPage) .itemsContainer > .card,
4361
  .pageTabContent:not(#homeTab) .itemsContainer > .card,
4362
  .itemsContainer.itemsContainer-wrap > .card,
 
4623
 
4624
  /* ========================================================
4625
  DETAIL PAGE: MOBILE PORTRAIT & DEFAULT CLEAN LAYOUT
4626
+ Clean single poster card + side-by-side title & metadata
4627
  ======================================================== */
4628
  @media (orientation: portrait) {
4629
+ #itemDetailPage .detailPagePrimaryContainer,
4630
+ .layout-mobile #itemDetailPage .detailPagePrimaryContainer {
4631
  display: flex !important;
4632
  flex-direction: row !important;
4633
  align-items: flex-start !important;
4634
  flex-wrap: wrap !important;
4635
+ padding: 16px !important;
4636
+ gap: 16px !important;
4637
  width: 100% !important;
 
 
 
4638
  box-sizing: border-box !important;
4639
  position: relative !important;
4640
+ z-index: 2 !important;
4641
  }
4642
 
4643
+ /* Fixed Single Clean Poster Thumbnail in Portrait */
4644
  #itemDetailPage .detailImageContainer,
4645
  .layout-mobile #itemDetailPage .detailImageContainer {
4646
  display: block !important;
4647
  visibility: visible !important;
4648
  opacity: 1 !important;
4649
  position: relative !important;
4650
+ width: 110px !important;
4651
+ min-width: 110px !important;
4652
+ max-width: 110px !important;
4653
+ height: 165px !important;
4654
  aspect-ratio: 2 / 3 !important;
4655
+ border-radius: 12px !important;
4656
  overflow: hidden !important;
4657
  margin: 0 !important;
4658
  padding: 0 !important;
4659
+ flex: 0 0 110px !important;
4660
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.75) !important;
4661
  border: 1px solid rgba(255, 255, 255, 0.14) !important;
4662
  }
4663
 
4664
+ /* Guarantee never more than one poster in portrait */
4665
+ #itemDetailPage .detailImageContainer ~ .detailImageContainer,
4666
+ #itemDetailPage .detailImageContainer:nth-of-type(n+2) {
4667
+ display: none !important;
4668
+ visibility: hidden !important;
4669
+ width: 0 !important;
4670
+ height: 0 !important;
4671
+ }
4672
+
4673
  #itemDetailPage .detailImageContainer .card,
4674
  .layout-mobile #itemDetailPage .detailImageContainer .card,
4675
  #itemDetailPage .detailImageContainer .cardScalable {
4676
  width: 100% !important;
4677
  height: 100% !important;
4678
  aspect-ratio: 2 / 3 !important;
4679
+ border-radius: 12px !important;
4680
  overflow: hidden !important;
4681
  margin: 0 !important;
4682
  position: relative !important;
 
4688
  display: none !important;
4689
  }
4690
 
4691
+ #itemDetailPage .detailRibbon,
4692
+ .layout-mobile #itemDetailPage .detailRibbon {
4693
+ display: flex !important;
4694
+ flex-direction: column !important;
4695
+ align-items: flex-start !important;
4696
+ justify-content: flex-start !important;
4697
+ flex: 1 1 calc(100% - 136px) !important;
4698
+ min-width: 0 !important;
4699
+ gap: 4px !important;
4700
+ margin: 0 !important;
4701
+ padding: 0 !important;
4702
+ background: transparent !important;
4703
+ }
4704
+
4705
  #itemDetailPage .infoWrapper,
4706
  .layout-mobile #itemDetailPage .infoWrapper {
4707
  display: flex !important;
4708
  flex-direction: column !important;
4709
  align-items: flex-start !important;
4710
  justify-content: flex-start !important;
4711
+ width: 100% !important;
 
4712
  gap: 3px !important;
4713
  margin: 0 !important;
4714
  padding: 0 !important;
 
4779
  gap: 10px !important;
4780
  width: 100% !important;
4781
  flex-basis: 100% !important;
4782
+ margin-top: 12px !important;
4783
  overflow-x: auto !important;
4784
  padding-bottom: 4px !important;
4785
  }
 
4844
  overflow-y: auto !important;
4845
  }
4846
 
4847
+ /* Completely hide detailLogo in all orientations to eliminate duplicate ghost posters */
4848
+ #itemDetailPage .detailLogo,
4849
+ .layout-mobile #itemDetailPage .detailLogo,
4850
+ .layout-desktop #itemDetailPage .detailLogo,
4851
+ .layout-tv #itemDetailPage .detailLogo {
4852
+ display: none !important;
4853
+ visibility: hidden !important;
4854
+ width: 0 !important;
4855
+ height: 0 !important;
4856
+ margin: 0 !important;
4857
+ padding: 0 !important;
4858
+ pointer-events: none !important;
4859
+ }
4860
 
4861
  #itemDetailPage .itemBackdrop,
4862
  .layout-mobile #itemDetailPage .itemBackdrop {
 
4890
  position: relative !important;
4891
  width: 100% !important;
4892
  box-sizing: border-box !important;
4893
+ padding: 16px 24px 12px 180px !important;
4894
+ min-height: auto !important;
4895
  display: flex !important;
4896
  flex-direction: column !important;
4897
  align-items: flex-start !important;
 
5014
 
5015
  #itemDetailPage .mainDetailButtons,
5016
  .layout-mobile #itemDetailPage .mainDetailButtons {
5017
+ position: relative !important;
5018
+ bottom: auto !important;
5019
+ left: auto !important;
5020
  display: flex !important;
5021
  flex-direction: row !important;
5022
  align-items: center !important;
5023
  flex-wrap: nowrap !important;
5024
+ gap: 12px !important;
5025
+ margin: 8px 0 0 0 !important;
5026
  width: 100% !important;
5027
  }
5028
 
 
5262
  padding-top: 56px !important;
5263
  box-sizing: border-box !important;
5264
  }
5265
+
5266
+
5267
+ /* ========================================================
5268
+ CAST & CREW / PEOPLE SECTION - PROPER CARD PROPORTIONS
5269
+ ======================================================== */
5270
+ #castContent,
5271
+ #guestCastContent,
5272
+ #peopleSection,
5273
+ .peopleSection,
5274
+ div[data-category="people"],
5275
+ div[data-category="cast"] {
5276
+ display: flex !important;
5277
+ flex-direction: row !important;
5278
+ flex-wrap: nowrap !important;
5279
+ overflow-x: auto !important;
5280
+ overflow-y: hidden !important;
5281
+ gap: 12px !important;
5282
+ padding: 8px 4px 16px 4px !important;
5283
+ box-sizing: border-box !important;
5284
+ -webkit-overflow-scrolling: touch !important;
5285
+ }
5286
+
5287
+ #castContent .card,
5288
+ #guestCastContent .card,
5289
+ #peopleSection .card,
5290
+ .peopleSection .card,
5291
+ div[data-category="people"] .card,
5292
+ div[data-category="cast"] .card,
5293
+ .card[data-type="Person"],
5294
+ .personCard {
5295
+ width: 120px !important;
5296
+ min-width: 120px !important;
5297
+ max-width: 120px !important;
5298
+ flex: 0 0 120px !important;
5299
+ margin: 0 !important;
5300
+ display: flex !important;
5301
+ flex-direction: column !important;
5302
+ align-items: center !important;
5303
+ text-align: center !important;
5304
+ box-sizing: border-box !important;
5305
+ }
5306
+
5307
+ #castContent .cardScalable,
5308
+ #guestCastContent .cardScalable,
5309
+ #peopleSection .cardScalable,
5310
+ .peopleSection .cardScalable,
5311
+ div[data-category="people"] .cardScalable,
5312
+ div[data-category="cast"] .cardScalable,
5313
+ .personCard .cardScalable {
5314
+ width: 120px !important;
5315
+ height: 160px !important;
5316
+ aspect-ratio: 3 / 4 !important;
5317
+ border-radius: 12px !important;
5318
+ overflow: hidden !important;
5319
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.6) !important;
5320
+ border: 1px solid rgba(255, 255, 255, 0.1) !important;
5321
+ position: relative !important;
5322
+ }
5323
+
5324
+ #castContent .cardImage,
5325
+ #guestCastContent .cardImage,
5326
+ .personCard .cardImage,
5327
+ #castContent img,
5328
+ #guestCastContent img,
5329
+ .personCard img {
5330
+ width: 100% !important;
5331
+ height: 100% !important;
5332
+ object-fit: cover !important;
5333
+ border-radius: 12px !important;
5334
+ position: absolute !important;
5335
+ top: 0 !important;
5336
+ left: 0 !important;
5337
+ }
5338
+
5339
+ #castContent .cardText,
5340
+ #guestCastContent .cardText,
5341
+ .personCard .cardText {
5342
+ width: 120px !important;
5343
+ max-width: 120px !important;
5344
+ white-space: nowrap !important;
5345
+ overflow: hidden !important;
5346
+ text-overflow: ellipsis !important;
5347
+ font-size: 0.85rem !important;
5348
+ text-align: center !important;
5349
+ margin-top: 4px !important;
5350
+ }
apex/ui/spotlight-loader.js CHANGED
@@ -765,30 +765,24 @@ function findHomeTab() {
765
  if (tvTopbar) {
766
  var isVideo = !!document.querySelector(".videoPlayerContainer:not(.hide), #videoOsdPage:not(.hide), video");
767
  var hash = (window.location.hash || "").toLowerCase();
768
- var isAuthOrStartup = !!document.querySelector(
769
- "#serverMismatchPage, .serverMismatchPage, #loginPage:not(.hide), .loginPage:not(.hide), " +
770
- "#selectServerPage:not(.hide), .selectServerPage:not(.hide), #forgotPasswordPage:not(.hide), " +
771
- ".manualLoginForm, .splashLogo:not(.hide), .manualServerContainer, input[type='password']"
772
- );
773
- var isHiddenRoute = hash.indexOf("dashboard") !== -1 ||
774
- hash.indexOf("settings") !== -1 ||
775
- hash.indexOf("login") !== -1 ||
776
- hash.indexOf("selectserver") !== -1 ||
777
- hash.indexOf("servermismatch") !== -1 ||
778
- hash.indexOf("forgotpassword") !== -1 ||
779
- hash.indexOf("details") !== -1 ||
780
- hash.indexOf("itemdetails") !== -1;
781
-
782
- var isDetailPage = !!document.querySelector("#itemDetailPage:not(.hide), .itemDetailPage:not(.hide)");
783
- var isUserLoggedIn = (window.ApiClient && typeof window.ApiClient.isLoggedIn === "function") ? window.ApiClient.isLoggedIn() : (window.ApiClient && !!window.ApiClient.accessToken());
784
-
785
- if (isVideo || isHiddenRoute || isDetailPage || isAuthOrStartup || !isUserLoggedIn) {
786
  tvTopbar.classList.remove("is-visible");
787
  document.body.classList.remove("show-apex-topbar");
788
  tvTopbar.style.display = "none";
789
  tvTopbar.style.visibility = "hidden";
790
  return;
791
- } else {
792
  tvTopbar.classList.add("is-visible");
793
  document.body.classList.add("show-apex-topbar");
794
  tvTopbar.style.display = "flex";
 
765
  if (tvTopbar) {
766
  var isVideo = !!document.querySelector(".videoPlayerContainer:not(.hide), #videoOsdPage:not(.hide), video");
767
  var hash = (window.location.hash || "").toLowerCase();
768
+
769
+ // Strictly detect auth / startup / error / server mismatch pages
770
+ var isMismatch = !!document.querySelector("#serverMismatchPage, .serverMismatchPage") || (document.body.innerText && document.body.innerText.indexOf("Server Mismatch") !== -1);
771
+ var isAuthScreen = !!document.querySelector("#loginPage:not(.hide), .loginPage:not(.hide), #selectServerPage:not(.hide), .selectServerPage:not(.hide), .manualLoginForm, .manualServerContainer");
772
+ var isAuthRoute = hash.indexOf("login") !== -1 || hash.indexOf("selectserver") !== -1 || hash.indexOf("servermismatch") !== -1 || hash.indexOf("forgotpassword") !== -1;
773
+ var isDetailPage = !!document.querySelector("#itemDetailPage:not(.hide), .itemDetailPage:not(.hide)") || hash.indexOf("details") !== -1;
774
+ var isSettingsRoute = hash.indexOf("dashboard") !== -1 || hash.indexOf("settings") !== -1;
775
+
776
+ // Positive check for main catalog / home navigation
777
+ var isHomeOrLibrary = !!document.querySelector("#indexPage, .homePage, #homeTab, .pageTabContent, .itemsContainer, iframe.featurediframe, #moviesPage, #tvShowsPage");
778
+
779
+ if (isVideo || isMismatch || isAuthScreen || isAuthRoute || isDetailPage || isSettingsRoute) {
 
 
 
 
 
 
780
  tvTopbar.classList.remove("is-visible");
781
  document.body.classList.remove("show-apex-topbar");
782
  tvTopbar.style.display = "none";
783
  tvTopbar.style.visibility = "hidden";
784
  return;
785
+ } else if (isHomeOrLibrary) {
786
  tvTopbar.classList.add("is-visible");
787
  document.body.classList.add("show-apex-topbar");
788
  tvTopbar.style.display = "flex";