/* ==========================================================================
   Commonly used properties
   ========================================================================== */
:root {
  /* Colors */
  /* Used for navbar, menu and picture modal backgrounds */
  --color-dark: #343a40;
  /* Used for background of the detail pane and for text color on dark backgrounds */
  --color-light: #fff;
  /* Used for table headers and the dividing line between panes */
  --color-table-header: #515a63;
  /* Used for the border of table headers and the border of the picture modal */
  --color-border: #788694;
  /* Used to dim the background when the filter menu or picture modal is active */
  --color-alpha-darken-50: rgba(0, 0, 0, 0.5);
  /* Used when hovering over the navigation tabs, for the title separator in the filter menu and for the series dropdown shadow */
  --color-alpha-brighten-10: rgba(255, 255, 255, 0.1);
  /* Used to mark the active navigation tab and for the border of active filters */
  --color-alpha-brighten-20: rgba(255, 255, 255, 0.2);
  /* Used when toggling a filter */
  --color-alpha-brighten-50: rgba(255, 255, 255, 0.5);
  /* Used for dimming the filter menu (sub)headings */
  --color-alpha-brighten-70: rgba(255, 255, 255, 0.7);

  /* Fixed dimensions */
  --navbar-height: 50px;
  --filter-show-button-size: 38px;
  --filter-button-size: 32px;
  /* Maximum width of the filter menu */
  --filter-menu-width: 480px;
  /* Maximum width of the picture modal */
  --modal-max-width: 992px;
  /* Optimal width of the game list and details panels (60%-40%) on a large screen */
  --panel-details-max-width: 40vw;
  --panel-gamelist-max-width: 60vw;

  /* Font sizes */
  --font-size-base: 0.875rem;
  --font-size-title: 1.1rem;
  --font-size-subtitle: 0.9rem;
  --font-size-filter: 0.8rem;

  /* Transitions */
  --transition-panel: transform 0.2s ease-in-out;
  --transition-overlay: opacity 0.2s ease-in-out;
  --transition-navigation: background-color 0.2s ease-in-out;
  --transition-filter: all 0.2s ease-in-out;
  --transition-row: background-color 0.15s ease-in-out;

  /* Spacing */
  --spacing-xs: 0.25rem;
  --spacing-sm: 0.5rem;
  --spacing-md: 1rem;
  --spacing-lg: 1.5rem;

  /* Border radius */
  --border-radius-sm: 0.25rem;
  --border-radius-md: 0.375rem;

  /* Z-index values */
  --z-overlay: 99;
  --z-panel: 100;
  --z-panel-header: 101;
  --z-navbar: 200;
}

/* ==========================================================================
   Dark Mode Theme
   ========================================================================== */
[data-theme="dark"] {
  /* Panel backgrounds */
  --color-panel-bg: #1a1a1a;
  /* Text on panels */
  --color-panel-text: #e0e0e0;
  /* Borders and dividers */
  --color-panel-border: #404040;
  /* Table row backgrounds (same as panel for consistency) */
  --color-row-bg: #1a1a1a;
  /* Table row hover */
  --color-row-hover: #2a2a2a;
}

/* Dark mode: Apply colors to light panels */
[data-theme="dark"] #panel-gamelist,
[data-theme="dark"] #panel-details,
[data-theme="dark"] body {
  background-color: var(--color-panel-bg);
  color: var(--color-panel-text);
}

[data-theme="dark"] #panel-details {
  border-left-color: var(--color-panel-border);
}

/* Dark mode: Table styling */
[data-theme="dark"] .table {
  color: var(--color-panel-text);
  --bs-table-bg: transparent;
}

[data-theme="dark"] .table thead th {
  color: #fff !important;
}

[data-theme="dark"] .table tbody tr {
  background-color: var(--color-row-bg);
  border-color: var(--color-panel-border);
}

[data-theme="dark"] .table tbody tr:hover {
  background-color: var(--color-row-hover);
}

[data-theme="dark"] .table td {
  color: var(--color-panel-text);
  border-color: var(--color-panel-border);
}

/* Dark mode: Bootstrap overrides for backgrounds */
[data-theme="dark"] .bg-light {
  background-color: var(--color-row-bg) !important;
  color: var(--color-panel-text) !important;
}

[data-theme="dark"] .bg-warning-subtle {
  background-color: rgba(255, 193, 7, 0.15) !important;
  color: #ffc107 !important;
}

[data-theme="dark"] .bg-danger-subtle {
  background-color: rgba(220, 53, 69, 0.15) !important;
  color: #dc3545 !important;
}

[data-theme="dark"] .text-secondary,
[data-theme="dark"] .text-muted {
  color: #adb5bd !important;
}

/* Dark mode: Selected row highlighting */
[data-theme="dark"] .table tbody tr.table-secondary {
  --bs-table-bg: #404040 !important;
  --bs-table-bg-type: #404040 !important;
  background-color: #404040 !important;
  color: var(--color-panel-text) !important;
}

[data-theme="dark"] .table tbody tr.table-secondary td {
  background-color: #404040 !important;
  color: var(--color-panel-text) !important;
}

[data-theme="dark"] .table tbody tr.table-secondary:hover {
  --bs-table-bg: #4a4a4a !important;
  --bs-table-bg-type: #4a4a4a !important;
  --bs-table-hover-bg: #4a4a4a !important;
  background-color: #4a4a4a !important;
}

[data-theme="dark"] .table tbody tr.table-secondary:hover td {
  background-color: #4a4a4a !important;
}

/* Dark mode: Progress bar background */
[data-theme="dark"] .progress {
  background-color: #404040 !important;
}

/* Dark mode: Smooth transitions (only for table elements, not panels) */
.table,
.table tbody tr {
  transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
}

/* ==========================================================================
   Page-wide styles
   ========================================================================== */
/* force fill viewport height */
html,
body {
  height: 100%;
  width: 100%;
  overflow: hidden;
  /* Prevent scrolling of the main frame */
  position: fixed;
  /* Disable double-tap to zoom */
  touch-action: manipulation;
}

.full-height {
  height: 100%;
}

/* ==========================================================================
   List and details panels
   ========================================================================== */
#main-content,
#panel-gamelist,
#panel-details {
  height: calc(100dvh - var(--navbar-height));
}

#panel-gamelist {
  max-width: var(--panel-gamelist-max-width);
}

#panel-details {
  max-width: var(--panel-details-max-width);
  height: calc(100dvh - var(--navbar-height));
  overflow-y: auto;
  border-left: 1px solid var(--color-dark);
}

/* Remove gaps between tables in details panel */
.details-table-container {
  margin-bottom: -1rem;
}

.panel-overlay {
  position: fixed;
  inset: 0;
  background: var(--color-alpha-darken-50);
  opacity: 0;
  pointer-events: none;
  transition: var(--transition-overlay);
  z-index: var(--z-overlay);
  display: none;
}

.panel-overlay.active {
  display: block;
  opacity: 1;
  pointer-events: auto;
}

/* ==========================================================================
   Tables
   ========================================================================== */
.table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-size: var(--font-size-base);
}

.table tbody tr {
  transition: var(--transition-row);
}

.table tbody tr:hover {
  background-color: var(--color-alpha-brighten-10);
}

/* Pointer cursor for clickable list rows */
#game-list tbody tr,
#console-list tbody tr,
#hardware-list tbody tr,
#collectible-list tbody tr {
  cursor: pointer;
}

/* Default cursor for warning/info rows */
#game-list tbody tr.no-match,
#console-list tbody tr.no-match,
#hardware-list tbody tr.no-match,
#collectible-list tbody tr.no-match {
  cursor: default;
}

th {
  border-inline-end: 1px solid var(--color-table-header);
  position: sticky;
  top: 0;
}

th:last-child {
  border-inline-end: none;
}

.table .thead-custom th {
  color: var(--color-light);
  background-color: var(--color-table-header);
  border-color: var(--color-border);
}

/* Details Panel Table Layout */
.detail-label,
.detail-value {
  width: auto;
}

.table td:last-child.detail-value {
  width: 100%;
}

.table td.detail-label:first-child {
  white-space: nowrap;
  padding-inline-start: var(--spacing-lg);
}

/* ==========================================================================
   Buttons
   ========================================================================== */
.button-inactive:active {
  background-color: transparent !important;
  color: #f8f9fa !important;
  border-color: #f8f9fa !important;
}

.button-navbar {
  width: var(--filter-show-button-size);
  height: var(--filter-show-button-size);
  padding: 0;
}

/* ==========================================================================
   Navigation bar
   ========================================================================== */
.games-navbar {
  height: var(--navbar-height);
  background-color: var(--color-dark);
  display: flex;
  align-items: center;
  position: relative;
  z-index: var(--z-navbar);
}

.games-navbar .text-center {
  position: static;
  transform: none;
  margin: 0 auto;
  flex-grow: 1;
  flex-shrink: 1;
  min-width: 0;
  text-align: center;
}

.navbar-title {
  color: var(--color-light);
  cursor: default;
  font-size: var(--font-size-title);
  padding: var(--spacing-sm) var(--spacing-md);
  user-select: none;
  margin: 0;
  min-width: 0;
  flex-shrink: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.button-back-static {
  position: absolute;
  color: var(--color-light);
  inset-inline-start: var(--spacing-md);
  top: 50%;
  transform: translateY(-50%);
  cursor: pointer;
}

/* Navigation tabs */
.navigation-tabs {
  display: flex;
  padding: var(--spacing-xs);
  margin-inline: var(--spacing-md);
  gap: var(--spacing-xs);
  min-width: fit-content;
}

.navigation-tab {
  padding: var(--spacing-sm) var(--spacing-md);
  color: var(--color-light);
  border-radius: var(--border-radius-sm);
  text-decoration: none;
  font-size: var(--font-size-subtitle);
  display: flex;
  align-items: center;
  gap: var(--spacing-sm);
  transition: var(--transition-navigation);
}

.navigation-tab:hover {
  color: var(--color-light);
  background: var(--color-alpha-brighten-10);
}

.navigation-tab.active {
  background: var(--color-alpha-brighten-20);
}

/* ==========================================================================
   Filter/sort menu
   ========================================================================== */
.filter-menu {
  background-color: var(--color-dark);
  color: var(--color-light);
  width: var(--filter-menu-width);
}

.filter-menu .filter-menu-header {
  padding-left: var(--spacing-md);
  padding-right: var(--spacing-md);
  height: var(--navbar-height);
  border-bottom: 1px solid var(--color-alpha-brighten-10);
}

.filter-menu .filter-menu-title {
  font-size: var(--font-size-title);
}

.filter-menu .filter-title {
  font-size: var(--font-size-subtitle);
}

.filter-title {
  color: var(--color-alpha-brighten-70);
}

.filter-menu .btn-close {
  filter: invert(1) grayscale(100%) brightness(200%);
}

.filter-menu .grid-container {
  display: grid;
  gap: var(--spacing-sm);
}

.filter-menu .grid-3 {
  grid-template-columns: repeat(3, 1fr);
}

.filter-menu .grid-4 {
  grid-template-columns: repeat(4, 1fr);
}

.filter-menu .grid-5 {
  grid-template-columns: repeat(5, 1fr);
}

.filter-menu .offcanvas-body button.btn:not(.button-navbar) {
  padding: var(--spacing-xs) var(--spacing-sm);
  font-size: var(--font-size-filter);
  height: var(--filter-button-size);
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--border-radius-sm);
  transition: var(--transition-filter);
}

.filter-menu .offcanvas-body button.btn:not(.button-navbar):hover {
  transform: scale(1.05);
}

.filter-menu .offcanvas-body button.btn:not(.button-navbar):active {
  transform: scale(0.98);
}

.filter-menu .offcanvas-body button.btn:not(.button-navbar).active {
  animation: pulseButton 0.3s ease-in-out;
}

@keyframes pulseButton {
  0% {
    transform: scale(1);
  }

  50% {
    transform: scale(1.1);
  }

  100% {
    transform: scale(1);
  }
}

.filter-menu #all {
  grid-column: 1 / -1;
}

.filter-menu .form-select {
  background-color: var(--color-dark);
  color: var(--color-light);
  border: 1px solid var(--color-light);
  /* Dropdown arrow */
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
}

.filter-menu .form-select:focus {
  border-color: var(--color-alpha-brighten-50);
  box-shadow: 0 0 0 0.25rem var(--color-alpha-brighten-10);
}

.maestro-footer {
  border-top: 1px solid var(--color-alpha-brighten-10);
}

.maestro-footer a {
  color: var(--color-light);
}

/* ==========================================================================
   Picture modal
   ========================================================================== */
.modal-dialog {
  max-width: min(95vw, var(--modal-max-width));
  width: fit-content;
  margin-block: var(--spacing-sm);
  margin-inline: auto;
}

.modal-content {
  border: 1px solid var(--color-border);
  background-color: var(--color-dark);
  border-radius: var(--border-radius-md);
  overflow: hidden;
  width: fit-content;
  transition: width 0.3s ease, height 0.3s ease;
}

.modal-header {
  border-bottom: none;
  padding: 0;
}

.modal-header .table {
  margin-bottom: 0;
}

.modal-header .thead-custom {
  background-color: var(--color-dark);
  border-start-start-radius: var(--border-radius-md);
  border-start-end-radius: var(--border-radius-md);
}

.modal-header .thead-custom th {
  border: none;
  background-color: var(--color-dark);
}

.modal-body {
  background-color: var(--color-dark);
  border-end-start-radius: var(--border-radius-md);
  border-end-end-radius: var(--border-radius-md);
  width: fit-content;
  /* Ensure a minimal size to prevent crushing the title/back button
   * when the image is loading or does not exist. */
  min-width: 300px;
  min-height: 200px;
}

.modal-body img {
  box-sizing: border-box;
  color: var(--color-light);
  max-height: 80vh;
  max-width: min(95vw, var(--modal-max-width));
  object-fit: contain;
  display: inline;
  padding: 0 10px 10px 10px;
}

.modal.fade .modal-dialog {
  opacity: 0;
  transform: none;
  transition: var(--transition-overlay);
}

.modal.show .modal-dialog {
  opacity: 1;
  transform: none;
  transition: var(--transition-overlay);
}

/* Modal navigation buttons */
.modal-nav-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background: rgba(0, 0, 0, 0.5);
  border: none;
  color: var(--color-light);
  width: 50px;
  height: 50px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 10;
  transition: background 0.2s ease;
}

.modal-nav-btn:hover {
  background: rgba(0, 0, 0, 0.7);
  color: var(--color-light);
}

.modal-nav-prev {
  left: 10px;
}

.modal-nav-next {
  right: 10px;
}

/* ==========================================================================
   Progress Bars
   ========================================================================== */
.progress-bar {
  transition: width 0.6s ease-in-out;
}

/* ==========================================================================
   Utility Classes
   ========================================================================== */
.scrollable {
  /* Show scroll bars if content overflows */
  overflow-y: auto;
  /* Prevent iOS overscroll bounce */
  overscroll-behavior-y: none;
}

/* ==========================================================================
   Responsive Design
   ========================================================================== */
@media (max-width: 1200px) {

  /* On mobile, the details panel is hidden by default, and is displayed over the game list then toggled */
  #panel-details {
    display: none;
    position: fixed;
    /* Anchor to top (below navbar) and bottom to ensure full height without overflow */
    top: var(--navbar-height);
    bottom: 0;
    left: 0;
    right: 0;
    /* Prevent see-through to the game list */
    background: var(--color-light);
    /* Render above the game list */
    z-index: var(--z-panel);
    /* Allow full width instead of the side-by-side layout*/
    max-width: 100%;
    /* Remove the left border, as no side-by-side content is shown */
    border-left: none;
    /* Scroll in from the bottom */
    transform: translateY(100%);
    transition: var(--transition-panel);
    /* Ensure scrolling works within the panel */
    overflow-y: auto;
    height: auto;
  }

  #panel-details.active {
    display: block;
    transform: translateY(0);
  }

  #panel-details .thead-custom {
    position: sticky;
    top: 0;
    z-index: var(--z-panel-header);
    background-color: var(--color-dark);
  }

  #panel-gamelist,
  #panel-details {
    max-width: 100%;
  }

  .navbar-title {
    padding: var(--spacing-sm) 0;
  }

  .games-navbar .text-center {
    margin: 0 auto;
  }

  .navigation-tab {
    /* Reduce spacing between buttons on smaller screens */
    padding: var(--spacing-sm);
  }

  .navigation-tab span {
    /* Show only icons on smaller screens */
    display: none;
  }
}

td.d-sm-table-cell .fa-star,
td.d-sm-table-cell .fa-star-half-stroke {
  /* Shrink rating stars a little bit for the game list */
  font-size: 0.875em;
}

/* ==========================================================================
   CSS-based Star Ratings (Performance Optimization)
   Uses pseudo-elements to render stars instead of creating DOM elements
   Reduces DOM operations by ~95% (1 element vs 6 elements per rating)
   ========================================================================== */

.rating-stars {
  display: inline-block;
  color: var(--bs-warning, #ffc107);
  line-height: 1;
  white-space: nowrap;
}

/* Not rated state - plain text, no icons */


/* Generate star content using CSS pseudo-elements */
.rating-stars:not(.not-rated)::before {
  font-family: "Font Awesome 7 Free";
  font-weight: 900;
  /* Solid weight for full/half stars */
  font-style: normal;
  font-variant: normal;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
}

.rating-stars:not(.not-rated)::after {
  font-family: "Font Awesome 7 Free";
  font-weight: 400;
  /* Regular weight for empty stars */
  font-style: normal;
  font-variant: normal;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
}

/* Full stars (solid) in ::before */
/* Combinations of Full and Half stars */

/* 0 Full */
.rating-stars[data-full="0"][data-half="1"]::before {
  content: "\f5c0";
}

/* 1 Full */
.rating-stars[data-full="1"][data-half="0"]::before {
  content: "\f005";
}

.rating-stars[data-full="1"][data-half="1"]::before {
  content: "\f005\f5c0";
}

/* 2 Full */
.rating-stars[data-full="2"][data-half="0"]::before {
  content: "\f005\f005";
}

.rating-stars[data-full="2"][data-half="1"]::before {
  content: "\f005\f005\f5c0";
}

/* 3 Full */
.rating-stars[data-full="3"][data-half="0"]::before {
  content: "\f005\f005\f005";
}

.rating-stars[data-full="3"][data-half="1"]::before {
  content: "\f005\f005\f005\f5c0";
}

/* 4 Full */
.rating-stars[data-full="4"][data-half="0"]::before {
  content: "\f005\f005\f005\f005";
}

.rating-stars[data-full="4"][data-half="1"]::before {
  content: "\f005\f005\f005\f005\f5c0";
}

/* 5 Full */
.rating-stars[data-full="5"][data-half="0"]::before {
  content: "\f005\f005\f005\f005\f005";
}

/* Empty stars (regular) in ::after */
.rating-stars[data-empty="1"]::after {
  content: "\f006";
}

.rating-stars[data-empty="2"]::after {
  content: "\f006\f006";
}

.rating-stars[data-empty="3"]::after {
  content: "\f006\f006\f006";
}

.rating-stars[data-empty="4"]::after {
  content: "\f006\f006\f006\f006";
}

.rating-stars[data-empty="5"]::after {
  content: "\f006\f006\f006\f006\f006";
}

/* Maintain size compatibility with table cells */
td.d-sm-table-cell .rating-stars {
  font-size: 0.875em;
}

/* ==========================================================================
   Statistics Page
   ========================================================================== */
.stats-nav-bar {
  background-color: var(--color-table-header);
  color: var(--color-light);
}

.stats-card {
  border-color: var(--color-border) !important;
  background-color: var(--color-light);
}

.stats-card-header {
  background-color: var(--color-table-header);
  color: var(--color-light);
  border-bottom: 1px solid var(--color-border);
}

/* Dark Mode Overrides for Statistics */
/* Nav bar and card headers keep the same color as light mode */

[data-theme="dark"] .stats-card {
  background-color: var(--color-panel-bg);
  border-color: var(--color-panel-border) !important;
  color: var(--color-panel-text);
}

[data-theme="dark"] .stats-card-header {
  border-color: var(--color-panel-border);
}

[data-theme="dark"] .stats-card .text-muted {
  color: #adb5bd !important;
  /* Ensure muted text is readable */
}
