:root {
  --output-color: hsl(0deg 0% 0% / 80%);
  --output-background: hsl(0deg 0% 100%);
  --output-border-dark: hsl(0deg 0% 80%);
  --output-border-mid: hsl(0deg 0% 85%);
  --output-border-light: hsl(0deg 0% 92%);
  --line-num-color: hsl(212deg 8% 47%);
  --run-button-color-active: hsl(0deg 0% 100%);
  --modal-circle-color: hsl(0deg 0% 35%);
  --main-width: 100%;
  --main-translate: none;
  --editor-width: auto;
  --editor-padding-bottom: 16px;
  --editor-border: 1px solid var(--border-color);
  --canvas-size: min(33vw, 60vh);
  --wrapper-max-width: calc(75ch + var(--canvas-size) + 32px);
  --console-width: var(--canvas-size);
  --output-width: calc(var(--canvas-size) + 2px);
  --output-border: 1px solid var(--output-border-mid);
  --output-border-top-width: 23px;
  --output-border-radius: 6px;
  --output-border-width: 1px;
  --modal-section-width: 18rem;
  --sidebar-width: min(100vw, 18rem);
  --sample-selector-width: 180px;
  --sample-selector-index-width: 32px;
  --sample-selector-gap: 6px;
  --sample-selector-color: hsl(210deg 5% 15%);
  --sample-selector-background: hsl(0deg 0% 100%);
  --sample-selector-border-width: 0;
  --sample-selector-index-background: hsl(0deg 0% 85%);
}
/* light theme colors
   minimal example: frontend/css/switch.html */
:root:has(#dark-theme:not(:checked)) {
  --sample-selector-color: hsl(0deg 0% 0%);
  --sample-selector-background: hsl(0deg 0% 92%);
  --sample-selector-index-background: hsl(0deg 0% 100%);
  --sample-selector-border-width: 1px;
}
@media (max-width: 767px) {
  /* responsive mobile */
  :root {
    --header-img-top: 0.2em;
    --main-width: 200vw;
    --main-translate: 0;
    --output-width: 100vw;
    --output-border: none;
    --output-border-top-width: 0;
    --output-border-radius: 0;
    --output-border-width: 0;
    --editor-border: none;
    --editor-padding-bottom: 72px;
    --editor-width: 100vw;
    --canvas-size: min(100vw, 60vh);
    --console-width: 100vw;
    --modal-section-width: 100vw;
  }
}

@media (max-width: 350px) {
  :root {
    --sample-selector-width: 128px;
  }
}
/* --- Global -------------------------------------------------------- */
body {
  font-family: var(--font-family);
  letter-spacing: 0.15px;
  tab-size: 4;
  background: var(--background);
  color: var(--color);
  overflow: clip;
  height: 100dvh;
}

/* --- Header -------------------------------------------------------- */
button.arrow {
  border-radius: 6px;
  border: 1px solid var(--border-color);
  height: 28px;
  width: 28px;
}
button.arrow:not(:disabled):hover {
  background: var(--primary-button-color);
  color: var(--color-accent-hover);
}
button.arrow:disabled {
  color: var(--border-color);
  cursor: default;
}
button.arrow svg {
  margin-left: auto;
  margin-right: auto;
}

#sample-selector {
  display: flex;
  gap: var(--sample-selector-gap);
  padding: 0 var(--sample-selector-gap);
  font-size: 0.875rem;
  width: var(--sample-selector-width);
  background: var(--sample-selector-background);
  color: var(--sample-selector-color);
  margin-left: 6px;
  margin-right: 6px;
  border-radius: 6px;
  height: 28px;
  border: var(--sample-selector-border-width) solid var(--border-color);
}
#sample-selector:hover {
  color: var(--color-accent);
}
#sample-index {
  display: inline-block;
  border-radius: 6px;
  width: var(--sample-selector-index-width);
  font-size: 0.75rem;
  background: var(--sample-selector-index-background);
  padding: 0 2px;
}
#sample-index.hidden {
  display: none;
}
#sample-title {
  text-align: start;
  display: inline-block;
  width: calc(
    var(--sample-selector-width) - var(--sample-selector-index-width) - 3 *
      var(--sample-selector-gap)
  );
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  text-decoration: underline;
  text-underline-offset: 0.2em;
  text-decoration-thickness: 1px;
}
#sample-index.hidden + #sample-title {
  text-align: center;
  margin: auto;
}

button.share {
  display: flex;
}

button.share > div {
  width: 1.2em;
  height: 1.2em;
  margin-right: 8px;
}

/* --- Sidebar ---------------------------------------------------------- */
#sidebar {
  display: block;
  background-color: var(--background-dimmed);
  color: #ffffffe5;
  font-family: arial, sans-serif;
  height: 100%;
  width: var(--sidebar-width);
  position: absolute;
  top: 0;
  left: 0;
  box-shadow: 1px 4px 0 0 #00000040;
  transition: translate 0.2s ease-in-out;
  opacity: 1;
}

#sidebar.hidden {
  translate: -100%;
  pointer-events: none;
}

@media (prefers-reduced-motion) {
  #sidebar {
    transition: opacity 0.2s ease-in-out;
  }
  #sidebar.hidden {
    translate: 0;
    opacity: 0;
  }
}

#sidebar header {
  border-bottom: 1px solid var(--border-color);
}

#sidebar a,
#sidebar button {
  font-family: var(--font-family);
  color: var(--color-hover);
  text-decoration: none;
  background: none;
  border: none;
  font-size: 1rem;
  cursor: pointer;
}

#sidebar header button {
  flex: 0 0 1.2em;
}

#sidebar a:hover,
#sidebar button:hover {
  color: var(--color-accent);
}

#sidebar ul {
  list-style: none;
  padding: 20px;
  line-height: 2.5;
}

#sidebar ul.icons {
  line-height: 1;
  display: flex;
  align-items: center;
  gap: 20px;
  width: 100%;
  padding: 32px 20px;
  border-top: 1px solid var(--border-color);
}

#sidebar ul.icons a {
  color: var(--color);
  display: inline-block;
  width: 28px;
  height: 28px;
  margin: 0;
  padding: 0;
}

#sidebar ul.icons a:hover {
  color: var(--color-accent);
}

#sidebar ul.icons li:last-child {
  margin-left: auto;
}
/* --- Main ---------------------------------------------------------- */
.main {
  background: var(--background);
  width: var(--main-width);
  translate: var(--main-translate);
  height: calc(100vh - var(--topnav-height));
  display: flex;
  overflow: clip;
  gap: 24px;
  padding: 20px 16px 16px;
  transition: translate 0.3s ease-in-out;
  justify-content: center;
}

@media (max-width: 767px) {
  .main.view-output:not(:has(> .hidden)) {
    translate: -100vw;
  }
  .main {
    justify-content: left;
    gap: 0;
    padding: 0;
  }
  .main .editor-wrap {
    margin-top: 4px;
  }
  .main.no-translate-transition {
    transition: translate 0s;
  }
}

@media (prefers-reduced-motion) {
  .main {
    transition: translate 0s;
  }
  .main.animate {
    animation: fadein 0.2s ease-in forwards;
  }
  @keyframes fadein {
    0% {
      opacity: 1;
    }
    50% {
      opacity: 0;
    }
    100% {
      opacity: 1;
    }
  }
}
.max-width-wrapper {
  max-width: var(--wrapper-max-width);
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  display: flex;
  flex-direction: column;
  height: calc(100% - var(--topnav-height));
  overflow: clip;
  font-family: var(--font-family-code);
  font-variant-ligatures: none;
  font-size: 1rem;
}

/* --- Editor -------------------------------------------------------- */
.editor-wrap {
  margin: 0;
  padding-bottom: var(--editor-padding-bottom);
  padding-top: 10px;
  padding-right: 1em;
  font-size: 1rem;
  flex: 1;
  overflow: auto;
  width: var(--editor-width);
  background: var(--background);
  border-radius: 6px;
  border: var(--editor-border);
}

.noscrollbar {
  /* only used on initialization to avoid scrollbar flicker */
  scrollbar-width: none;
}

.editor {
  color: var(--color);
  font-size: 1rem;
  font-family: var(--font-family-code);
  font-variant-ligatures: none;
  position: relative;
  overflow: hidden;
  width: max-content;
  min-width: 100%;
}

.editor textarea {
  line-height: inherit;
  white-space: pre-wrap;
  background: none;
  position: absolute;
  width: 100%;
  height: 100%;
  resize: none;
  caret-color: var(--color);
  padding: inherit;
  outline: none;
  font-size: inherit;
  font-family: inherit;
  font-variant-ligatures: inherit;
  letter-spacing: inherit;
  border: none;
  top: 0;
  left: 0;
  overflow: hidden;
  color: transparent;
  /* TODO: remove to make links work, but check for regression with error messages and missing cursor */
  z-index: 1;
}
.editor textarea::selection {
  background: var(--selection-highlight);
}
.editor pre {
  line-height: inherit;
  white-space: pre-wrap;
  word-break: keep-all;
  padding: 0;
  width: max-content;
  margin: 0;
  font-size: inherit;
  font-variant-ligatures: inherit;
  letter-spacing: inherit;
  pointer-events: none;
  font-family: inherit;
}
.editor pre.highlighted {
  position: relative;
  overflow: hidden;
}
.editor pre.highlighted a {
  pointer-events: auto;
}
.editor pre.lines {
  position: absolute;
  height: 100%;
  top: 0;
  left: 0;
  pointer-events: none;
  overflow: hidden;
  min-width: 100%;
}

dialog .err,
.editor pre.highlighted .err {
  background: var(--syntax-error-background);
  border-radius: 6px;
}

.editor .error {
  background: var(--syntax-error-background);
  color: var(--color);
  font-style: italic;
}

.editor .lines .num {
  position: absolute;
  color: var(--line-num-color);
  left: 0;
}

.editor .lines .txt {
  color: transparent;
  pointer-events: none;
}

.editor .lines .err.num {
  background: var(--syntax-error-background);
  color: var(--color);
}

.editor .lines .err.txt {
  left: calc(2ch + 1.2rem);
  right: 0;
  padding-left: 0.3rem;
  background: var(--syntax-error-line-background);
  border-radius: 6px;
  position: absolute;
}

.editor .lines .err.num::after {
  background-color: var(--syntax-error-background);
  mask: url("data:image/svg+xml,%3Csvg fill='currentColor' stroke='none' viewBox='0 0 10 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0 H2 L10 12 L2 24 H0V0 Z' /%3E%3C/svg%3E%0A");
  mask-size: 100% 100%;
  content: "";
  mask-repeat: no-repeat;
  width: 0.8rem;
  position: absolute;
  right: -0.7rem;
  top: 0;
  bottom: 0;
}

/* --- Output -------------------------------------------------------- */
.output {
  width: var(--output-width);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: var(--output-border-light);
  border-radius: var(--output-border-radius);
  margin: 0;
  border: var(--output-border);
  border-top-width: var(--output-border-top-width);
  outline: none;
}

.output .canvas {
  margin-left: auto;
  margin-right: auto;
  background: var(--output-background);
  width: var(--canvas-size);
  height: var(--canvas-size);
  border-top: 1px solid var(--output-border-dark);
  border-top-width: var(--output-border-width);
  border-bottom: 1px solid var(--output-border-light);
}

.output .canvas canvas {
  width: 100%;
  height: 100%;
  touch-action: pinch-zoom;
}

@media (max-height: 500px) {
  .output .canvas canvas,
  .output .canvas {
    width: calc(100vh - 250px);
    height: calc(100vh - 250px);
  }
}

.read {
  display: flex;
}

.output .console,
.output .read,
.output .input {
  padding: 16px;
  background: var(--output-background);
  color: var(--output-color);
  font-family: var(--font-family-code);
  font-variant-ligatures: none;
  border-top: 1px solid var(--output-border-dark);
  border-bottom: 1px solid var(--output-border-light);
  width: var(--console-size);
}

.output .read textarea {
  font-size: 1rem;
  font-family: var(--font-family-code);
  font-variant-ligatures: none;
  color: var(--output-color);
  background: var(--color);
  -webkit-text-fill-color: var(--output-color);
  line-height: 1.5;
  height: 1.5em;
  margin-left: 16px;
  border: none;
  outline: none;
  resize: none;
}

.output .console {
  flex: 1;
  overflow: auto;
  white-space: pre;
  border-bottom-width: var(--output-border-width);
  padding-bottom: var(--editor-padding-bottom);
}

/* --- Run ----------------------------------------------------------- */
.run {
  padding: 8px;
  padding-bottom: 12px;
}

.run.mobile {
  width: 100vw;
  position: fixed;
  bottom: 0;
  left: 0;
  border: none;
}

.run.desktop {
  border-top: 1px solid var(--output-border-dark);
  background: var(--output-background);
}

button#run,
button#run-mobile {
  width: 100%;
}

button#run:disabled,
button#run-mobile:disabled,
button#run.loading,
button#run-mobile.loading {
  color: var(--primary-button-color-disabled);
  box-shadow:
    0 4px 0 hsl(0deg 0% 60%),
    0 16px 12px -8px hsl(0deg 0% 0% / 30%),
    inset 0 -2px 1px 1px hsl(0deg 0% 60%);
}

button.running#run,
button.running#run-mobile,
button.running#run:hover,
button.running#run:active,
button.running#run-mobile:hover,
button.running#run-mobile:active {
  color: var(--run-button-color-active);
  letter-spacing: 0.2em;
  transition: 0s;
  background: linear-gradient(
    270deg,
    hsl(0deg 100% 67%) 0,
    hsl(47deg 22% 52%) 20%,
    hsl(105deg 37% 46%) 35%,
    hsl(162deg 27% 52%) 55%,
    hsl(223deg 36% 58%) 70%,
    hsl(292deg 59% 62%) 90%,
    hsl(0deg 100% 67%) 100%
  );
  animation: slide-background 1s linear infinite;
}

@keyframes slide-background {
  to {
    background-position: calc(var(--output-width) - 17px);
  }
}

/* --- Sample selection modal ---------------------------------------- */
#modal {
  position: fixed;
  z-index: 10;
  inset: 0;
  overflow: clip;
  height: 100%;
  background: var(--modal-background);
}

#modal header {
  border-bottom: 1px solid var(--border-color);
  color: hsl(0deg 0% 70%);
  background: none;
}

#modal-close {
  flex: 0 0 1.2em;
  margin-left: auto;
}

.modal-main {
  font-family: var(--font-family);
  padding: 36px 36px 16px;
  overflow-y: auto;
  display: flex;
  flex-wrap: wrap;
  height: calc(100% - var(--topnav-height));
  align-content: flex-start;
}

#modal .modal-main .section {
  width: var(--modal-section-width);
  padding-bottom: 40px;
}

#modal .modal-main h2 {
  font-size: 1rem;
  padding-bottom: 8px;
}

#modal .modal-main ul {
  padding-left: 6px;
  margin-bottom: 0;
  list-style: none;
}

#modal .modal-main li {
  padding-bottom: 6px;
  line-height: 1.6;
}

/* stylelint-disable no-descending-specificity */
#modal li a {
  font-family: var(--font-family);
  color: var(--color-dimmed);
  padding-left: 1.5rem;
  text-decoration: none;
  position: relative;
}
/* stylelint-enable no-descending-specificity */

#modal li a.highlight {
  color: var(--color-accent);
}

#modal ul li a:hover {
  color: var(--color-accent);
}

#modal ul li a::before {
  content: "";
  position: absolute;
  height: 1rem;
  left: 0;
  top: 0.125rem;
  width: 1rem;
  border: 2px solid var(--modal-circle-color);
  border-radius: 50%;
  background: var(--modal-circle-background);
  display: inline-block;
  z-index: 1;
}

#modal li a.highlight::before {
  background: var(--color-accent);
}

#modal ul li:not(:last-child) a::after {
  content: "";
  position: absolute;
  height: 100%;
  left: 0.42rem;
  top: 1rem;
  width: 2px;
  background: var(--modal-circle-color);
}

/* --- Dialogs --------------------------------------------------- */
dialog .copy {
  width: 100%;
  border-radius: 6px;
  border: 1px solid var(--border-color-dialog);
  padding: 10px 20px;
  display: flex;
  flex-direction: row;
  align-items: center;
}

dialog .icon-copy {
  color: var(--color-dimmed);
}

dialog .icon-copy:hover {
  color: var(--color-accent);
}

dialog .copy input {
  outline: none;
  background: none;
  color: var(--color-dimmed);
  border: none;
  font-size: 1rem;
  line-height: 2;
  margin: 0;
  flex: 1;
  min-width: 10em;
}
dialog .copy label {
  display: none;
}
dialog .err {
  font-family: var(--font-family-code);
  color: var(--color);
  margin-left: 8px;
  margin-right: 8px;
}

dialog .dialog-note {
  margin-bottom: 16px;
}
/* --- Utilities ----------------------------------------------------- */
.hidden {
  display: none;
}
