:root {
  --color-bg: #4c4c4c;
  --color-fg: #e8e1d0;
  --color-muted-fg: #a0a0a0;
  --color-panel-bg: #3a393a;
  --color-highlight-bg: #19347c;
  --color-highlight-fg: #ffffff;
  --color-border: #7a797a;
  --color-border-highlight: #5964fc;
  --color-input-bg: #1f1e1f;
  --color-button-bg: #4c4c4c;
  --color-button-hover: #676767;
  --color-node-solution-fg: #000000;
  --color-node-solution-bg: #f6f664;
  --color-piece-bg: #e8e1d0;
  --color-piece-fg: #3a393a;
  --color-piece-highlight-bg: #cfddff;
  --font-mono: 'DejaVu Sans Mono', monospace;
}

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  display: flex;
  flex-direction: column;
  height: 100vh;
  font-family: var(--font-mono);
  background-color: black;
  color: var(--color-fg);
}

aside {
  z-index: 1;
  position: fixed;
  top: 5px;
  left: 5px;
  width: 30%;
  max-width: 42ch;
  padding: 5px;
  overflow: auto;
  border: 1px solid var(--color-border);
  font-size: 1em;
  background-color: var(--color-panel-bg);
}

#warningText {
  background-color: darkred;
  color: white;
  border: 1px solid orange;
  padding: 5px;
}

p {
  margin-bottom: 1rem;
}

hr {
  margin-top: 1rem;
  margin-bottom: 1rem;
  border: 1px solid var(--color-border);
  border-top: 0;
}

form {
  display: flex;
  flex-direction: column;
  gap: 15px;
}

label {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 5px;
}

.button-group {
  display: flex;
  flex-direction: column;
  gap: 5px;
}

.button-group > * { flex: 1; }

.label-text {
  flex: 1;
}

.help-text {
  white-space: nowrap;
  font-size: 0.7em;
  color: var(--color-muted-fg);
}

input, textarea {
  min-width: 6ch;
  max-width: 18ch;
  padding: 3px;
  font-family: var(--font-mono);
  font-size: inherit;
  background-color: var(--color-input-bg);
  color: var(--color-fg);
  border: 1px solid var(--color-border);
}

button {
  padding: 3px;
  font-family: var(--font-mono);
  font-size: inherit;
  background-color: var(--color-button-bg);
  color: var(--color-fg);
  border: 1px solid var(--color-border);
  cursor: pointer;
}

button:hover  {
  background-color: var(--color-button-hover);
}

button:active {
  border-color: var(--color-border-highlight);
  background-color: var(--color-highlight-bg);
  color: var(--color-highlight-fg);
}

main {
  z-index: 0;
  flex: 1;
  overflow: auto;
  background-color: var(--color-bg);
  scrollbar-color: var(--color-fg) var(--color-panel-bg);
  overscroll-behavior: none;
  cursor: grab;
}

main.active { cursor: grabbing; }

#puzzleTree {
  width: fit-content;
  min-width: 64%;
  margin: 2rem 2rem 2rem 32%;
  user-select: none;
}

.puzzle-node {
  display: flex;
  flex-direction: column;
  align-items: center;
  height: fit-content;
  padding: 5px;
  gap: 5px;
}

.puzzle-node-info {
  position: relative;
  width: fit-content;
  padding: 5px;
  background-color: var(--color-panel-bg);
  border: 1px solid var(--color-border);
  cursor: initial;
}

.puzzle-node-costs {
  font-size: 0.7em;
  white-space: nowrap;
}

.puzzle-board {
  display: grid;
  gap: 2px;
}

.puzzle-board > * {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  aspect-ratio: 1;
  min-width: 2.5ch;
  font-size: 1rem;
  background-color: var(--color-piece-bg);
  color: var(--color-piece-fg);
}

.puzzle-node-highlighted > .puzzle-node-info {
  border-color: var(--color-border-highlight);
  background-color: var(--color-highlight-bg);
  color: var(--color-highlight-fg);
  font-weight: bold;
}

.puzzle-node-highlighted > .puzzle-node-info .puzzle-board > * {
  background-color: var(--color-piece-highlight-bg);
}

.puzzle-node-has-children > .puzzle-node-info .puzzle-children-line {
  position: absolute;
  left: 50%;
  bottom: -8px;
  height: 7px;
  border: 1px solid var(--color-panel-bg);
}

.puzzle-node-unvisited {
  opacity: 0.6;
}

.puzzle-node-has-children > .puzzle-children {
  display: flex;
  flex-direction: row;
  margin: auto;
  border: 2px solid var(--color-panel-bg);
  border-bottom: 0;
}

.puzzle-node:has(.puzzle-children:hover) > .puzzle-node-info .puzzle-children-line,
.puzzle-children:hover {
  border-color: var(--color-muted-fg);
}

.puzzle-node-highlighted > .puzzle-node-info .puzzle-children-line,
.puzzle-node-highlighted > .puzzle-children {
  border-color: var(--color-border-highlight);
}

.puzzle-node-highlighted:has(.puzzle-children:hover) > .puzzle-node-info .puzzle-children-line,
.puzzle-node-highlighted > .puzzle-children:hover {
  border-color: var(--color-piece-highlight-bg);
}

.puzzle-node-solution > .puzzle-node-info {
  border-color: var(--color-border);
  background-color: var(--color-node-solution-bg);
  color: var(--color-node-solution-fg);
}

.puzzle-node-solution > .puzzle-node-info .puzzle-board > * {
  background-color: var(--color-panel-bg);
  color: var(--color-node-solution-bg);
}

.puzzle-space,
.puzzle-node-highlighted > .puzzle-node-info .puzzle-board .puzzle-space {
  background-color: transparent;
}

@media (orientation: portrait) {
  aside {
    position: static;
    width: 100%;
    max-width: unset;
    padding: 1rem;
    border-top: 0;
    border-right: 0;
    border-left: 0;
    font-size: 1em;
  }

  .button-group {
    flex-direction: row;
  }

  #puzzleTree {
    margin-left: 2rem;
  }
}
