```ts
export function nameStepDistances(steps: any[]): { names: string[], lifts: number[], colours: string[], tally: { [x: string]: number }, widest: number } {
    if (!Array.isArray(steps) || steps.length === 0) throw new Error("Invalid input");

    const stepNames = ["unison", "minor second", "major second", "minor third", "major third", "perfect fourth", "tritone", "perfect fifth", "minor sixth", "major sixth", "minor seventh", "major seventh"];
    const sweetLeftovers = new Set([0, 3, 4, 5, 7, 8]);
    const sharpLeftovers = new Set([1, 2, 6, 10, 11]);

    const names: string[] = [];
    const lifts: number[] = [];
    const colours: string[] = [];
    const tally: { [x: string]: number } = {};

    let widestReach = -Infinity;
    let widestIndex = -1;

    for (let i = 0; i < steps.length; i++) {
        const step = steps[i];
        if (!Array.isArray(step) || step.length !== 2) throw new Error("Invalid input");

        const [mark1, mark2] = step;
        if (!Number.isInteger(mark1) || !Number.isInteger(mark2)) throw new Error("Invalid input");

        const reach = Math.abs(mark2 - mark1);
        const lift = Math.floor(reach / 12);
        const leftover = reach % 12;
        const name = stepNames[leftover];
        const colour = sweetLeftovers.has(leftover) ? "sweet" : sharpLeftovers.has(leftover) ? "sharp" : "";

        names.push(name);
        lifts.push(lift);
        colours.push(colour);

        tally[name] = (tally[name] || 0) + 1;

        if (reach > widestReach) {
            widestReach = reach;
            widestIndex = i;
        }
    }

    return { names, lifts, colours, tally, widest: widestIndex };
}
```