How to make a camera move along and arbitrary set left-right axis

So I am trying to make a rail shooter game however I want the camera to always move left or right around the player when the left or right key is pressed. at the moment I am using a rotation on a pivot to determine the camera’s position. However, when using the Y-axis and rotating the pivot up, it makes the camera move in a diagonal orbit instead of left to right. How would I be able to set up a system so the camera only moves left and right on the pivot but not diagonal?

Here is my code:

    public GameObject target;
    public float rotateSpeed = 5;
    public float minConstraintsX, maxConstraintsX;
    Vector3 offset;

    void Start()
    {
        offset = target.transform.position - transform.position;
    }

    void LateUpdate()
    {
        float horizontal = Input.GetAxis("Horizontal") * rotateSpeed;
        float vertical = Input.GetAxis("Vertical") * rotateSpeed;

        target.transform.Rotate(0, horizontal, 0, Space.Self);
        target.transform.rotation = ClampRotationAroundXAxis(target.transform.rotation);
        target.transform.Rotate(vertical, 0, 0);

        float desiredAngleY = target.transform.eulerAngles.y;
        float desiredAngleX = target.transform.eulerAngles.x;
        Quaternion rotation = Quaternion.Euler(desiredAngleX, desiredAngleY, 0);
        transform.position = target.transform.position - (rotation * offset);
        transform.LookAt(target.transform);
    }

    Quaternion ClampRotationAroundXAxis(Quaternion q)
    {
        q.x /= q.w;
        q.y /= q.w;
        q.z /= q.w;
        q.w = 1.0f;

        float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan(q.x);

        angleX = Mathf.Clamp(angleX, minConstraintsX, maxConstraintsX);

        q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX);

        return q;
    }

Thanks in advance

There are two commonly used options:

  1. Instead of doing a delta rotation every frame where you are rotating from your previous rotation to your new one, you can make an entirely new rotation every frame. To do this you would want to keep track of your own Vector3 rotAngles and modify them every frame, then set rotation = Quaternion.Euler(rotAngles). This will make sure you never rotate from an already tilted rotation.
  2. The second solution, which is closer to what you already have, is to use transform.RotateAround() where you can specify your own axis rather than using a local axis. You would probably want to use transform.RotateAround(transform.position, Vector3.up, angle).