/* ----------------------------------------- */
/*  Main Menu                                */
/* ----------------------------------------- */

#menu {
  width: 360px;
  flex: none;
  overflow: hidden;
  background: var(--color-cool-5-75);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  box-shadow: 0 0 30px #000;
  border-radius: 6px;
  pointer-events: all;
  z-index: calc(var(--z-index-window) + 1);
  outline: none;
  border: none;

  /* Open and Close Animation */
  visibility: hidden;
  max-height: 0;
  transition: visibility 0s 250ms, max-height 250ms ease-in-out;
  &.active {
    transition: max-height 250ms ease-in-out;
    visibility: visible;
    max-height: 50%;
  }

  /* Menu Items */
  #main-menu-items {
    width: 100%;
    display: flex;
    flex-direction: column;
    gap: 1rem;
    padding: 1rem 1.5rem;
    li {
      align-items: center;
      cursor: var(--cursor-pointer);
      gap: 1.5rem;
      color: var(--color-light-1);
      > i {
        flex: 0 0 24px;
        font-size: var(--font-size-18);
        opacity: 0.5;
      }
      h2 {
        font-size: var(--font-size-24);
        margin: 0;
      }
      &:hover {
        text-shadow: 0 0 10px var(--color-shadow-primary);
      }
    }
  }
}

@media (prefers-reduced-transparency) {
  #menu {
    background: var(--color-cool-5);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

/* ----------------------------------------- */
/*  Hotbar                                   */
/* ----------------------------------------- */

#hotbar {
  --hotbar-size: 60px;
  --button-size: 24px;
  flex: none;
  width: max-content;
  height: var(--hotbar-size);
  margin: 0 0 16px;
  gap: 8px; // 0.5rem

  &.compact, &.md.offset, &.sm {
    height: calc((var(--hotbar-size) * 2) + 8px);
    #action-bar { width: calc((var(--hotbar-size) * 5) + 32px); }
  }

  &.offset:not(.lg, .min) {
    --offset: 0;
    transform: translateX(var(--offset));
  }

  &.min { transform: translateX(-70px); }

  &.faded-ui {
    transition: opacity var(--ui-fade-delay) var(--ui-fade-duration), transform 250ms ease;
    &:hover { transition: opacity var(--ui-fade-duration), transform 250ms ease; }
  }

  // Action Bar
  #action-bar {
    flex: none;
    width: auto;
    height: 100%;
    gap: 8px; // 0.5rem
    justify-content: center;
    flex-wrap: wrap;
    pointer-events: all;
    .slot {
      position: relative;
      flex: none;
      width: var(--hotbar-size);
      height: var(--hotbar-size);
      border: 2px solid transparent;
      border-radius: 10px;
      background: var(--slot-color, var(--color-cool-5-90));
      cursor: var(--cursor-pointer);
      .key {
        position: absolute;
        top: 0;
        left: 0;
        width: 20px;
        line-height: 20px;
        padding-right: 2px; // Push numbers towards left
        background: var(--key-bg-color-empty, var(--color-cool-5));
        border-radius: 10px 0 8px 0;
        color: var(--key-text-color, var(--color-light-1));
        text-align: center;
        pointer-events: none;
      }
      &.full .key { background: var(--key-bg-color-full, var(--color-cool-5)); }
      .slot-icon {
        width: 100%;
        height: 100%;
        border: none;
        border-radius: 10px;
        pointer-events: none;
      }
      &:hover {
        border: 2px solid var(--color-warm-1);
      }
      &.drop-target {
        background: var(--color-cool-4);
        border: 2px solid var(--color-warm-2);
      }
    }
  }

  // Control Buttons
  button {
    --button-text-color: var(--color-light-1);
    --button-hover-text-color: var(--color-warm-2);
    padding: 0;
    transition: opacity 0.25s;
    pointer-events: all;
    &:hover {
      opacity: 1.0;
      box-shadow: none;
    }
    &:focus {
      outline: none;
      box-shadow: none;
    }
  }
  .hotbar-controls {
    flex: none;
    height: var(--hotbar-size);
    justify-content: space-evenly;
    flex-wrap: nowrap;
    gap: 4px; // 0.25rem
    button {
      --button-size: 1.5rem;
      --control-size: 1.5rem;
    }
  }
  #hotbar-controls-left {
    align-content: flex-end;
  }
  #hotbar-controls-right {
    align-items: stretch;
    > div.flexcol { justify-content: space-evenly; }
  }

  /** Page Controls */
  #hotbar-page-controls {
    position: relative;
    justify-content: space-between;
    .hotbar-page-control {
      --button-text-color: var(--page-control-color, var(--color-cool-5));
      --fa-display: inline-grid;
      font-size: var(--font-size-18);
    }
    .page-next {
      &::before {
        transform: scaleX(0.75);
      }
    }
    .page-prev {
      &::before {
        transform: scaleX(0.75) scaleY(-1);
      }
    }
    .hotbar-page-number {
      width: 20px;
      height: 20px;
      margin: -10px 0 0 -10px;
      position: absolute;
      top: 50%;
      left: 50%;
      text-align: center;
      color: var(--color-light-2);
    }
  }
}

/* ----------------------------------------- */
/*  Game Pause                               */
/* ----------------------------------------- */

#pause {
  width: 100%;
  height: 180px;
  position: fixed;
  top: calc(50vh - 100px);
  left: 0;
  background: linear-gradient(to right,
    transparent 0%,
    var(--color-cool-5-50) 40%,
    var(--color-cool-5-50) 60%,
    transparent 100%
  );
  display: none;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 1.5rem;
  pointer-events: none;
  z-index: calc(var(--z-index-canvas) + 1);

  &.paused {
    display: flex;
    animation: pulse 3s ease-in-out infinite;
  }

  @keyframes pulse {
    0% {
      transform: scale(1.0);
    }
    50% {
      transform: scale(1.025);
    }
    100% {
      transform: scale(1.0);
    }
  }

  img {
    height: 100px;
    width: 100px;
    border: none;
    box-shadow: none;
    --fa-animation-duration: 5s;
  }

  figcaption {
    margin: 0;
    padding: 0;
    font-size: var(--font-size-24);
    font-family: var(--font-serif);
    text-transform: uppercase;
    font-weight: bold;
    color: #ada7b8;
    letter-spacing: 0.3em;
    line-height: 1rem;
    font-style: normal;
  }
}

/* ------------------------------------------ */
/*  Players                                   */
/* ------------------------------------------ */

#players {
  flex: none;
  gap: 8px;
  color: var(--text-color);
  font-size: var(--font-size-12);

  #players-active,
  #players-inactive {
    pointer-events: all;
    width: 200px;
    background: var(--background-color);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    padding: 6px 8px;
  }
  #players-active {
    flex: none;
  }

  /* Inactive Players (Expand and Collapse) */
  #players-inactive {
    max-height: 0;
    visibility: hidden;
    transition: max-height 0.5s ease-in-out, visibility 0.5s 0s;
  }
  #players-expand {
    transition: transform 0.25s;
  }
  &.expanded {
    #players-inactive:not(:empty) {
      visibility: visible;
      max-height: 300px;
    }
    #players-expand {
      transform: rotate(180deg);
    }
  }

  .players-list {
    gap: 4px;
  }
  .player {
    color: var(--player-name-color);
    line-height: 20px;
    gap: 4px;
    &.idle .player-name {
      color: var(--player-name-idle-color);
      &::after {
        content: "\f880";
        font-family: var(--font-awesome);
        margin-left: 0.5em;
      }
    }
    &.self .player-name {
      color: var(--player-name-self-color);
    }
    &::before {
      content: "";
      display: block;
      box-sizing: border-box;
      width: 12px;
      height: 12px;
      background: var(--player-color);
      border: 1px solid var(--player-border);
      border-radius: 100%;
    }
  }

  /* Performance Monitoring */
  #performance-stats {
    font-family: var(--font-monospace);
    gap: 8px;
    #latency {
      flex: none;
    }
    #fps {
      flex: 1;
    }
    label {
      margin-right: 4px;
    }
    .good .average { color: var(--color-rating-good); }
    .fair .average { color: var(--color-rating-fair); }
    .poor .average { color: var(--color-rating-poor); }
    button {
      --button-size: 20px;
      background: none;
      border: none;
      pointer-events: all;
    }
  }
}

/* ----------------------------------------- */
/*  Scene Controls                           */
/* ----------------------------------------- */

#scene-controls {
  flex: 1; // Fill available column
  width: 100%;
  overflow: hidden;
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  gap: 8px; // 0.5rem
  pointer-events: none;

  > menu {
    flex: none;
    height: 100%;
    list-style: none;
    margin: 0;
    padding: 0;
    gap: 8px; // 0.5rem
  }

  // Controls are always a single column
  #scene-controls-controls {
    width: var(--control-size);
  }

  // Tools can wrap to multiple columns
  #scene-controls-tools {
    flex-wrap: wrap;
  }
}

/* ---------------------------------------- */
/*  Scene Navigation                        */
/* ---------------------------------------- */

#scene-navigation {
  flex: 1;
  overflow: visible;
  max-height: 100%;
  padding-right: 30px; // For button
  gap: 0.5rem;
  position: relative;

  #scene-navigation-expand {
    position: absolute;
    top: 4px;
    right: 0;
    width: 24px;
    height: 24px;
    font-size: var(--font-size-12);
    text-align: center;
    line-height: 24px;
    pointer-events: all;
    > i {
      pointer-events: none;
      transition: transform 0.25s;
    }
  }

  // Active or Inactive Scenes
  .scene-navigation-menu {
    justify-content: flex-start;
    flex-wrap: wrap;
    gap: 0.5rem;
    list-style: none;
    margin: 0;
    padding: 0;

    // Single Scene
    .scene {
      width: 100%;
      max-width: 20vw;
      position: relative;
      padding: 0.5rem;
      font-size: var(--font-size-12);
      transition: background-color, opacity, color 0.25s;
      display: block;

      .scene-name {
        display: block;
      }
    }

    // Scene Icons
    .scene.active,
    .scene.view,
    .scene.gm {
      padding-right: 1.5rem; // Reserve space for icon
      &::after {
        display: flex;
        height: 100%;
        position: absolute;
        right: 0.5rem;
        top: 0;
        justify-content: center;
        align-items: center;
        content: "\f070"; // GM-Only
        font-family: var(--font-awesome);
        font-size: var(--font-size-10);
        color: var(--color-text-emphatic);
        opacity: 0.5;
      }
    }

    // Active Scene
    .scene.active {
      border-color: var(--toggle-border-color);
      &::after {
        content: "\f005"; // Active Scene
      }
    }

    // Viewed Scene
    .scene.view {
      border-color: var(--toggle-border-color);
      &::after {
        content: "\f192"; // Viewed Scene
      }
    }

    // Hovered Scene
    .scene:hover .scene-name {
      text-shadow: 0 0 2px var(--color-shadow-highlight);
    }

    // Drag-and-Drop Target
    .scene.drop-target-before,
    .scene.drop-target-after {
      &::before {
        display: block;
        content: "";
        border-top: 2px solid var(--color-border-highlight);
        width: 100%;
        position: absolute;
        left: 0;
        top: -6px;
      }
    }
    .scene.drop-target-after::before {
      top: unset;
      bottom: -6px;
    }

    // Player Pips
    .scene-players {
      display: flex;
      gap: 2px;
      list-style: none;
      margin: 0;
      padding: 0;
      position: absolute;
      bottom: -6px;
      left: 2px;
      .scene-player {
        width: 12px;
        height: 12px;
        line-height: 10px;
        background: var(--color-bg);
        border: 1px solid var(--color-border);
        border-radius: 100%;
        color: #FFF;
        font-size: 8px; // non-scaling
        text-align: center;
      }
    }
  }

  // Inactive Scenes
  #scene-navigation-active {
    flex: none;
  }
  #scene-navigation-inactive {
    flex: 1;
    height: 0; // Workaround to get full-height wrapping to work
    padding-bottom: calc(var(--hotbar-height) + 1rem); // Allow space for hotbar
    visibility: hidden;
  }

  // Expanded List
  &.expanded {
    #scene-navigation-inactive {
      visibility: visible;
    }
    #scene-navigation-expand > i {
      transform: rotate(180deg);
    }
  }
}

/* ---------------------------------------- */
/* Notifications                            */
/* ---------------------------------------- */

#notifications {
  position: fixed;
  top: 10vh;
  width: 100%;
  margin: 0;
  padding: 0 20%;
  flex: none;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  list-style: none;
  z-index: var(--z-index-notification);
  pointer-events: none;

  > .notification {
    box-shadow: 0 0 10px black;
    &::after {
      content: "\f057";
      font-family: var(--font-awesome);
      font-weight: 900; // fa-solid
      position: absolute;
      top: -4px;
      right: -4px;
      width: 16px;
      line-height: 16px;
    }
  }
}

.notification {
  --border-color: transparent;
  --background-color: rgb(0 0 0 / 50%);
  --icon-glyph: "";

  position: relative;
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0.5rem 1rem;
  background: var(--background-color);
  border: 1px solid var(--border-color);
  border-radius: 5px;
  color: var(--color-light-3);
  font-size: var(--font-size-14);
  line-height: 1em;
  text-shadow: 1px 1px black;
  pointer-events: all;

  > p {
    margin: 0;
    order: 1;
  }

  > .pct {
    display: none;
    font-weight: bold;
    margin-right: 0.5rem;
    order: 0;
  }

  &::before {
    content: var(--icon-glyph);
    font-family: var(--font-awesome);
    font-weight: 900; // fa-solid
    margin-right: 8px;
  }

  &.info {
    --icon-glyph: "\f05a";
    --background-color: var(--color-level-info-bg);
    --border-color: var(--color-level-info)
  }

  &.warning {
    --background-color: var(--color-level-warning-bg);
    --border-color: var(--color-level-warning);
    --icon-glyph: "\f071";
    color: var(--color-light-2);
  }

  &.error {
    --background-color: var(--color-level-error-bg);
    --border-color: var(--color-level-error);
    --icon-glyph: "\f06a";
  }

  &.success {
    --background-color: var(--color-level-success-bg);
    --border-color: var(--color-level-success);
    --icon-glyph: "\f00c";
  }

  /** Progress Bars */
  &.progress {
    background: linear-gradient(90deg,
    var(--background-color) var(--pct),
    var(--border-color) calc(var(--pct) + 2px),
    rgb(0 0 0 / 80%) calc(var(--pct) + 2px),
    rgb(0 0 0 / 50%) 100%
    );
    > .pct {
      display: inline-block;
    }
  }

  /** Software Update Channels */
  &.channel-hint {
    width: 100%;
    flex: none;
  }
  &.stable {
    --background-color: rgba(138, 211, 4, 0.4);
    --icon-glyph: "\f6d9";
  }
  &.testing {
    --background-color: rgba(211, 192, 4, 0.4);
    --icon-glyph: "\f0ad";
  }
  &.development {
    --background-color: rgba(211, 119, 4, 0.4);
    --icon-glyph: "\f6e3";
  }
  &.prototype {
    --background-color: rgba(211, 20, 4, 0.4);
    --icon-glyph: "\f1e2";
  }
}

/* ---------------------------------------- */
/*  Faded Elements                          */
/* ---------------------------------------- */

.faded-ui {
  opacity: var(--ui-fade-opacity);
  transition: opacity var(--ui-fade-delay) var(--ui-fade-duration); // Delay before fading out
  &:hover {
    transition: opacity var(--ui-fade-duration); // Fade in immediately
    opacity: 1.0;
  }
}
