/*
 * Exercise App - Fizzy-inspired CSS
 * Following Basecamp's Fizzy approach with OKLCH colours, CSS layers, and design tokens
 *
 * This file combines CSS organised by concern:
 * 1. Global design tokens and CSS variables (with dark mode support)
 * 2. CSS Reset (@layer reset)
 * 3. Base element styles (@layer base)
 * 4. Component styles (@layer components) - buttons, inputs, navigation, flash, cards, forms
 * 5. Utility classes (@layer utilities)
 *
 * Individual component files are maintained in this directory for organisation,
 * then combined into this single file for Propshaft compatibility.
 */

/* Global design tokens and CSS variables */
@import "components/_card_header.css";

@layer reset, base, components, utilities;

:root {
  /* Spacing (using logical properties) */
  --inline-space: 1ch;
  --block-space: 1rem;
  --block-space-half: calc(var(--block-space) / 2);
  --block-space-double: calc(var(--block-space) * 2);

  /* Typography */
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
  --font-mono: ui-monospace, monospace;

  --text-x-small: 0.75rem;
  --text-small: 0.85rem;
  --text-normal: 1rem;
  --text-medium: 1.1rem;
  --text-large: 1.5rem;
  --text-x-large: 1.8rem;

  /* OKLCH Colours - Light Mode */
  --lch-black: 0% 0 0;
  --lch-white: 100% 0 0;

  --lch-canvas: var(--lch-white);
  --lch-ink-inverted: var(--lch-white);

  --lch-ink-darkest: 26% 0.05 264;
  --lch-ink-darker: 40% 0.026 262;
  --lch-ink-dark: 56% 0.014 260;
  --lch-ink-medium: 66% 0.008 258;
  --lch-ink-light: 84% 0.005 256;
  --lch-ink-lighter: 92% 0.003 254;
  --lch-ink-lightest: 96% 0.002 252;

  --lch-blue-darkest: 26% 0.126 264;
  --lch-blue-darker: 40% 0.166 262;
  --lch-blue-dark: 57.02% 0.1895 260.46;
  --lch-blue-medium: 66% 0.196 257.82;
  --lch-blue-light: 84.04% 0.0719 255.29;
  --lch-blue-lighter: 92% 0.026 254;
  --lch-blue-lightest: 96% 0.016 252;

  --lch-green-darkest: 26% 0.071 149;
  --lch-green-darker: 40% 0.12 148;
  --lch-green-dark: 55% 0.162 147;
  --lch-green-medium: 66% 0.208 146;
  --lch-green-light: 83.92% 0.0772 145.06;
  --lch-green-lighter: 92% 0.044 144;
  --lch-green-lightest: 96% 0.022 143;

  --lch-red-darkest: 26% 0.105 34;
  --lch-red-darker: 40% 0.154 36;
  --lch-red-dark: 59% 0.19 38;
  --lch-red-medium: 66% 0.204 40;
  --lch-red-light: 84.08% 0.0837 41.96;
  --lch-red-lighter: 92% 0.03 44;
  --lch-red-lightest: 96% 0.013 46;

  --lch-yellow-darkest: 26% 0.0729 40;
  --lch-yellow-darker: 40% 0.12 50;
  --lch-yellow-dark: 58% 0.156 60;
  --lch-yellow-medium: 74% 0.184 70;
  --lch-yellow-light: 84% 0.12 80;
  --lch-yellow-lighter: 92% 0.076 90;
  --lch-yellow-lightest: 96% 0.034 100;

  /* Named Colours */
  --color-canvas: oklch(var(--lch-canvas));
  --color-ink: oklch(var(--lch-ink-darkest));
  --color-ink-inverted: oklch(var(--lch-ink-inverted));
  --color-ink-dark: oklch(var(--lch-ink-dark));
  --color-ink-medium: oklch(var(--lch-ink-medium));
  --color-ink-light: oklch(var(--lch-ink-light));
  --color-ink-lighter: oklch(var(--lch-ink-lighter));
  --color-ink-lightest: oklch(var(--lch-ink-lightest));

  --color-link: oklch(var(--lch-blue-dark));
  --color-selected: oklch(var(--lch-blue-lighter));
  --color-selected-dark: oklch(var(--lch-blue-light));
  --color-positive: oklch(var(--lch-green-dark));
  --color-negative: oklch(var(--lch-red-dark));
  --color-highlight: oklch(var(--lch-yellow-lighter));

  /* Borders */
  --border: 1px solid var(--color-ink-lighter);
  --border-radius: 0.5em;

  /* Shadows */
  --shadow: 0 0 0 1px oklch(var(--lch-black) / 5%),
            0 0.2em 0.2em oklch(var(--lch-black) / 5%),
            0 0.4em 0.4em oklch(var(--lch-black) / 5%),
            0 0.8em 0.8em oklch(var(--lch-black) / 5%);

  /* Focus Rings */
  --focus-ring-color: var(--color-link);
  --focus-ring-offset: 1px;
  --focus-ring-size: 2px;
  --focus-ring: var(--focus-ring-size) solid var(--focus-ring-color);
}

/* Dark Mode - System Preference */
@media (prefers-color-scheme: dark) {
  html:not([data-theme]) {
    --lch-canvas: 20% 0.0195 232.58;
    --lch-ink-inverted: var(--lch-black);

    --lch-ink-darkest: 96.02% 0.0034 260;
    --lch-ink-darker: 86% 0.0061 260;
    --lch-ink-dark: 73.97% 0.009 260;
    --lch-ink-medium: 62% 0.0122 260;
    --lch-ink-light: 40% 0.0148 260;
    --lch-ink-lighter: 30% 0.0178 260;
    --lch-ink-lightest: 25% 0.0204 260;

    --lch-blue-dark: 74% 0.1293 256;
    --lch-blue-light: 40% 0.094 260;
    --lch-blue-lighter: 30% 0.0452 262;

    --lch-green-dark: 73.99% 0.117 145;
    --lch-red-dark: 73.95% 0.139 42;
    --lch-yellow-lighter: 30% 0.026 50;

    --color-highlight: oklch(var(--lch-blue-lighter));

    --shadow: 0 0 0 1px oklch(var(--lch-black) / 0.42),
              0 0.2em 1.6em -0.8em oklch(var(--lch-black) / 0.6),
              0 0.4em 2.4em -1em oklch(var(--lch-black) / 0.7);
  }
}

/* Dark Mode - Explicit Theme */
html[data-theme="dark"] {
  --lch-canvas: 20% 0.0195 232.58;
  --lch-ink-inverted: var(--lch-black);

  --lch-ink-darkest: 96.02% 0.0034 260;
  --lch-ink-darker: 86% 0.0061 260;
  --lch-ink-dark: 73.97% 0.009 260;
  --lch-ink-medium: 62% 0.0122 260;
  --lch-ink-light: 40% 0.0148 260;
  --lch-ink-lighter: 30% 0.0178 260;
  --lch-ink-lightest: 25% 0.0204 260;

  --lch-blue-dark: 74% 0.1293 256;
  --lch-blue-light: 40% 0.094 260;
  --lch-blue-lighter: 30% 0.0452 262;

  --lch-green-dark: 73.99% 0.117 145;
  --lch-red-dark: 73.95% 0.139 42;
  --lch-yellow-lighter: 30% 0.026 50;

  --color-highlight: oklch(var(--lch-blue-lighter));

  --shadow: 0 0 0 1px oklch(var(--lch-black) / 0.42),
            0 0.2em 1.6em -0.8em oklch(var(--lch-black) / 0.6),
            0 0.4em 2.4em -1em oklch(var(--lch-black) / 0.7);
}
/* CSS Reset following modern best practices */

@layer reset {
  *, *::before, *::after {
    box-sizing: border-box;
  }

  * {
    margin: 0;
  }

  html {
    -webkit-text-size-adjust: none;
  }

  body {
    line-height: 1.5;
    text-rendering: optimizeSpeed;
  }

  img {
    display: block;
    max-inline-size: 100%;
  }

  input, button, textarea, select {
    font: inherit;
  }

  button {
    cursor: pointer;
  }

  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}
/* Base styles for HTML elements */

@layer base {
  html {
    font-size: 100%;
  }

  body {
    -moz-osx-font-smoothing: grayscale;
    -webkit-font-smoothing: antialiased;
    background: var(--color-canvas);
    color: var(--color-ink);
    font-family: var(--font-sans);
    line-height: 1.375;
    max-inline-size: 100vw;
    text-rendering: optimizeLegibility;
    display: flex;
    flex-direction: column;
    min-block-size: 100vh;
  }

  main {
    flex: 1;
  }

  a {
    color: var(--color-link);
    text-decoration: none;

    &:hover {
      text-decoration: underline;
    }
  }

  :is(a, button, input, textarea) {
    transition: 100ms ease-out;
    transition-property: background-color, border, color, opacity;
  }

  :focus-visible {
    outline: var(--focus-ring);
    outline-offset: var(--focus-ring-offset);
  }

  h1, h2, h3, h4, h5, h6 {
    line-height: 1.2;
    font-weight: 600;
  }

  h1 { font-size: var(--text-x-large); }
  h2 { font-size: var(--text-large); }
  h3 { font-size: var(--text-medium); }

  code, pre {
    font-family: var(--font-mono);
  }

  turbo-frame {
    display: contents;
  }

  .turbo-progress-bar {
    background-color: var(--color-link);
    height: 3px;
  }
}
/* Button components */

@layer components {
  .btn {
    --btn-border-radius: 99rem;
    --btn-background: var(--color-canvas);
    --btn-border-color: var(--color-ink-light);
    --btn-color: var(--color-ink);

    align-items: center;
    background-color: var(--btn-background);
    border-radius: var(--btn-border-radius);
    border: 1px solid var(--btn-border-color);
    color: var(--btn-color);
    cursor: pointer;
    display: inline-flex;
    font-size: 1em;
    font-weight: 600;
    gap: 0.5em;
    justify-content: center;
    padding: 0.5em 1.1em;

    &:hover {
      filter: brightness(0.9);
    }

    &:active {
      transform: scale(0.98);
    }
  }

  .btn--primary {
    --btn-background: var(--color-link);
    --btn-border-color: var(--color-link);
    --btn-color: var(--color-ink-inverted);
  }

  .btn--danger {
    --btn-background: var(--color-negative);
    --btn-border-color: var(--color-negative);
    --btn-color: var(--color-ink-inverted);
  }
}
/* Input components */

@layer components {
  .input {
    background-color: transparent;
    border-radius: var(--border-radius);
    border: 1px solid var(--color-ink-medium);
    color: var(--color-ink);
    font-size: max(16px, 1em);
    inline-size: 100%;
    line-height: inherit;
    padding: 0.5em 0.8em;

    &:focus {
      border-color: var(--color-link);
    }
  }

  textarea.input {
    resize: vertical;
  }
}
/* Navigation components */

@layer components {
  .nav {
    background: var(--color-canvas);
    border-block-end: var(--border);
    padding: var(--block-space) var(--inline-space);
  }

  .nav__links {
    display: flex;
    gap: 1.5em;
    list-style: none;
    padding: 0;
  }

  .nav__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--block-space);
    position: relative;
  }

  .nav__brand {
    font-weight: 700;
    font-size: var(--text-medium);
    white-space: nowrap;
  }

  .nav__links a {
    font-weight: 600;
  }

  /* Username dropdown */
  .nav__dropdown {
    position: relative;
  }

  .nav__dropdown-trigger {
    background: transparent;
    border: 1px solid transparent;
    padding: 0.25rem 0.5rem;
    border-radius: 0.375rem;
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    font-weight: 600;
    color: var(--color-ink);
  }

  .nav__dropdown-trigger:hover,
  .nav__dropdown-trigger:focus {
    border-color: var(--color-ink-light);
    background: color-mix(in oklch, var(--color-ink-lightest) 6%, transparent);
    outline: none;
  }

  .nav__caret { font-size: 0.8rem; opacity: 0.8; }

  .nav__dropdown-menu {
    position: absolute;
    top: calc(100% + 0.5rem);
    right: 0;
    background: var(--color-canvas);
    border: var(--border);
    border-radius: var(--border-radius);
    box-shadow: var(--shadow);
    padding: 0.5rem;
    min-width: 200px;
    z-index: 50;
  }

  .nav__dropdown-menu[hidden] { display: none; }

  .nav__dropdown-menu li { list-style: none; }

  .nav__dropdown-menu li a { display: block; padding: 0.4rem 0.6rem; }

  .nav__dropdown-divider { height: 1px; background: var(--color-ink-lightest); margin: 0.25rem 0; }

  .nav__toggle,
  .nav__burger {
    display: none;
  }

  .nav__burger {
    cursor: pointer;
    flex-direction: column;
    gap: 0.25rem;
  }

  .nav__burger span {
    display: block;
    inline-size: 24px;
    block-size: 3px;
    background: var(--color-ink);
    border-radius: 99rem;
  }

  @media (max-width: 768px) {
    .nav__inner {
      align-items: center;
    }

    .nav__links {
      position: absolute;
      inset: auto var(--inline-space) auto;
      top: 64px;
      background: var(--color-canvas);
      border: var(--border);
      border-radius: var(--border-radius);
      box-shadow: var(--shadow);
      padding: var(--block-space);
      flex-direction: column;
      gap: 0.75rem;
      align-items: flex-start;
      min-inline-size: min(320px, 90vw);
      display: none;
      z-index: 10;
    }

    .nav__toggle,
    .nav__burger {
      display: inline-flex;
    }

    .nav__toggle {
      position: absolute;
      inline-size: 32px;
      block-size: 32px;
      opacity: 0;
    }

    .nav__burger {
      align-items: center;
      justify-content: center;
      padding: 0.35rem;
      border: 1px solid var(--color-ink-light);
      border-radius: var(--border-radius);
    }

    .nav__toggle:checked ~ .nav__links {
      display: flex;
    }

    .nav__links li {
      width: 100%;
    }

    .nav__links a {
      display: inline-flex;
      width: 100%;
    }
  }
}
/* Flash message components */

@layer components {
  .flash {
    background-color: var(--color-ink);
    border-radius: 4em;
    color: var(--color-ink-inverted);
    display: inline-flex;
    font-size: var(--text-medium);
    padding: 0.7em 1.4em;
    margin-block-end: var(--block-space);
  }

  .flash--notice {
    background-color: var(--color-positive);
  }

  .flash--alert {
    background-color: var(--color-negative);
  }
}
/* Card components */

@layer components {
  .card {
    background-color: var(--color-canvas);
    border-radius: var(--border-radius);
    border: var(--border);
    padding: var(--block-space);

    &:hover {
      box-shadow: var(--shadow);
    }
  }
}
/* Form components */

@layer components {
  .form-group {
    margin-block-end: var(--block-space);
  }

  .form-label {
    display: block;
    font-weight: 600;
    margin-block-end: 0.25em;
  }

  .form-actions {
    display: flex;
    gap: 0.5em;
    margin-block-start: var(--block-space);
  }
}
/* Utility classes */

@layer utilities {
  /* Text */
  .txt-small { font-size: var(--text-small); }
  .txt-normal { font-size: var(--text-normal); }
  .txt-medium { font-size: var(--text-medium); }
  .txt-large { font-size: var(--text-large); }

  .txt-center { text-align: center; }
  .txt-ink { color: var(--color-ink); }
  .txt-subtle { color: var(--color-ink-dark); }
  .txt-positive { color: var(--color-positive); }
  .txt-negative { color: var(--color-negative); }

  /* Spacing */
  .mt-0 { margin-block-start: 0; }
  .mt-1 { margin-block-start: var(--block-space); }
  .mt-2 { margin-block-start: var(--block-space-double); }

  .mb-0 { margin-block-end: 0; }
  .mb-1 { margin-block-end: var(--block-space); }
  .mb-2 { margin-block-end: var(--block-space-double); }

  .p-0 { padding: 0; }
  .p-1 { padding: var(--block-space); }
  .p-2 { padding: var(--block-space-double); }

  /* Layout */
  .container {
    max-inline-size: 1200px;
    margin-inline: auto;
    padding-inline: var(--inline-space);
  }

  .flex { display: flex; }
  .flex-col { flex-direction: column; }
  .gap-1 { gap: var(--block-space); }
  .gap-2 { gap: var(--block-space-double); }

  /* Display */
  .hidden { display: none; }
  .block { display: block; }
  .inline-block { display: inline-block; }

  /* Lists */
  .list-none {
    list-style: none;
    margin: 0;
    padding: 0;
  }

  /* Animations */
  @keyframes flash {
    0%, 100% { opacity: 1; color: var(--color-ink); }
    50% { opacity: 0.3; color: var(--color-negative); }
  }

  .flashing {
    animation: flash 0.5s ease-in-out;
  }

  /* Pagination styling */
  .pagination {
    margin-block-start: var(--block-space-double);
  }

  .pagination nav {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    align-items: center;
  }

  .pagination nav a,
  .pagination nav span {
    display: inline-block;
    padding: 0.25rem 0.5rem;
    white-space: nowrap;
  }

  /* Email validation feedback */
  .input--valid {
    border-color: var(--color-positive);
    background-color: color-mix(in oklch, var(--color-positive) 5%, transparent);
  }

  .input--invalid {
    border-color: var(--color-negative);
    background-color: color-mix(in oklch, var(--color-negative) 5%, transparent);
  }

  .email-feedback {
    display: inline-block;
    padding: 0.35rem 0.5rem;
    border-radius: var(--border-radius);
    font-size: var(--text-x-small);
    font-weight: 500;
  }

  .email-feedback--valid {
    color: var(--color-positive);
    background-color: color-mix(in oklch, var(--color-positive) 10%, transparent);
  }

  .email-feedback--invalid {
    color: var(--color-negative);
    background-color: color-mix(in oklch, var(--color-negative) 10%, transparent);
  }
}

/* Site footer */

@layer components {
  .site-footer {
    background: var(--color-canvas);
    border-block-start: var(--border);
    padding: var(--block-space) var(--inline-space);
    text-align: center;
  }

  .site-footer__text {
    color: var(--color-ink-medium);
    font-size: var(--text-x-small);
    margin: 0;
  }
}

/* Drag and drop styles */
[draggable="true"] {
  -webkit-user-drag: element;
}

[draggable="true"].dragging {
  opacity: 0.5;
  background-color: color-mix(in oklch, var(--color-canvas-secondary) 50%, var(--color-link) 10%) !important;
}

[draggable="true"].drag-over {
  background-color: color-mix(in oklch, var(--color-canvas-secondary) 80%, var(--color-link) 20%) !important;
  border-top: 3px solid var(--color-link);
  padding-top: calc(0.75rem - 3px);
}

[draggable="true"]:hover {
  background-color: color-mix(in oklch, var(--color-canvas-secondary) 90%, var(--color-link) 10%) !important;
}

[draggable="true"] span[style*="☰"] {
  cursor: grab;
}

[draggable="true"].dragging span[style*="☰"],
[draggable="true"]:hover span[style*="☰"] {
  cursor: grabbing;
  opacity: 1;
}

