
    :root {
      --melody-white-count: 8;
      --melody-white-width: calc(100% / var(--melody-white-count));
      --melody-black-width: calc(var(--melody-white-width) * 0.58);
    }
    .melody-wrapper {
      max-width: 960px;
      margin: 0 auto 32px;
      display: grid;
      gap: 20px;
    }
    .melody-controls {
      display: flex;
      flex-wrap: wrap;
      gap: 12px;
      align-items: center;
      justify-content: center;
      background: #fff;
      border-radius: 12px;
      box-shadow: 0 4px 16px rgba(15, 23, 42, 0.08);
      padding: 16px 20px;
    }
    .melody-controls button {
      margin: 0;
      padding: 10px 18px;
      font-size: 1rem;
      border-radius: 10px;
      border: none;
      background: #2563eb;
      color: #fff;
      font-weight: 600;
      transition: background 0.2s ease;
      cursor: pointer;
    }
    .melody-controls button.secondary {
      background: #475569;
    }
    .melody-controls button.secondary:hover {
      background: #334155;
    }
    .melody-controls button:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
    .melody-hud {
      display: flex;
      gap: 16px;
      justify-content: center;
      flex-wrap: wrap;
      color: #1f2937;
      font-weight: 600;
    }
    .melody-hud span.value {
      color: #2563eb;
      margin-left: 4px;
    }
    #staffCanvas {
      width: 100%;
      max-width: 720px;
      margin: 0 auto;
      display: block;
      background: #fff;
      border-radius: 12px;
      box-shadow: 0 4px 16px rgba(15, 23, 42, 0.08);
    }
    #pianoCanvas {
      width: 100%;
      max-width: 720px;
      height: 200px;
      margin: 0 auto;
      display: block;
      background: #f8fafc;
      border-radius: 16px;
      box-shadow: 0 4px 16px rgba(15, 23, 42, 0.08);
      border: 1px solid #cbd5e1;
    }
    #melodyStatus {
      min-height: 34px;
      font-size: 1.05rem;
      font-weight: 600;
      text-align: center;
      color: #0f172a;
      transition: color 0.2s ease;
    }
    #melodyStatus.success {
      color: #0f766e;
    }
    #melodyStatus.error {
      color: #b91c1c;
    }
    .melody-wrapper.is-mistake {
      animation: melodyMistakePulse 0.65s ease;
      box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.25), 0 10px 28px rgba(239, 68, 68, 0.35);
    }
    @keyframes melodyMistakePulse {
      0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.3); }
      25% { transform: scale(1.02); box-shadow: 0 0 0 6px rgba(239, 68, 68, 0.2); }
      55% { transform: scale(0.995); box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.35); }
      100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); }
    }
    #melodyStatus.info {
      color: #2563eb;
    }
    @media (max-width: 640px) {
      .melody-controls {
        justify-content: stretch;
      }
      .melody-controls button {
        flex: 1 1 auto;
      }
      #pianoCanvas {
        height: 180px;
      }
    }
