Rebecca H. Hairdresser (Manchester)

I never understood my accounts before — my old accountant didn’t explain anything. Since joining Wexley, everything’s clear, and I get instant WhatsApp support whenever I need it.

Everything Finally Makes Sense

William J. Subcontractor (Tamworth)

I was told by HMRC I owed £10,000 when I was due a £1,800 refund. Wexley stepped in, disputed it, and got it corrected with my contractor. HMRC confirmed everything — refund sorted.

They Sorted My HMRC Mess Fast

Marco Z. Barber (Sutton Coldfield)

I never knew the difference between a sole trader and a limited company — no one ever explained it properly. Wexley broke it all down clearly and now I actually understand how my business works.

Finally Understand My Business

Amir H. Construction (Leeds)

They made setting up my business simple and explained every step clearly. The Central London address adds real credibility when clients look us up.

Professional From Start to Finish

Natasha R. Contractor (Wales)

I’d never had much help with CIS before, but Wexley made everything clear and easy to follow. They explained each step and sorted everything quickly — really simplified the whole process.

Made My CIS So Easy to Understand

import * as React from "react";
import { motion, useAnimationFrame } from "framer-motion";
import { addPropertyControls, ControlType } from "framer";

type Props = {
  images: string[];
  height: number;
  speed: number;
  gap: number;
  pauseOnHover: boolean;
};

export default function ImageCarousel(props: Partial<Props>) {
  const {
    images = [],
    height = 220,
    speed = 60,
    gap = 20,
    pauseOnHover = true,
  } = props;

  const trackRef = React.useRef<HTMLDivElement>(null);
  const [x, setX] = React.useState(0);
  const [paused, setPaused] = React.useState(false);

  // Duplicate list for infinite scrolling
  const loopImages = React.useMemo(() => [...images, ...images], [images]);

  useAnimationFrame((t, delta) => {
    if (paused || images.length === 0) return;
    const move = (speed * delta) / 1000;
    let next = x - move;

    const track = trackRef.current;
    if (track) {
      const halfWidth = track.scrollWidth / 2;
      if (Math.abs(next) >= halfWidth) next += halfWidth;
    }
    setX(next);
  });

  return (
    <div
      style={{
        width: "100%",
        height,
        overflow: "hidden",
        display: "flex",
        alignItems: "center",
        cursor: pauseOnHover ? "grab" : "default",
      }}
      onMouseEnter={() => pauseOnHover && setPaused(true)}
      onMouseLeave={() => pauseOnHover && setPaused(false)}
    >
      <motion.div
        ref={trackRef}
        style={{
          display: "flex",
          gap,
          transform: `translate3d(${x}px, 0, 0)`,
          willChange: "transform",
        }}
      >
        {loopImages.map((src, i) => (
          <img
            key={i}
            src={src}
            style={{
              height,
              width: "auto",
              flexShrink: 0,
              userSelect: "none",
              pointerEvents: "none",
              borderRadius: 20,
            }}
          />
        ))}
      </motion.div>
    </div>
  );
}

addPropertyControls(ImageCarousel, {
  images: {
    type: ControlType.Array,
    title: "Images",
    propertyControl: { type: ControlType.Image },
  },
  height: { type: ControlType.Number, title: "Height", min: 100, max: 400, defaultValue: 220 },
  speed: { type: ControlType.Number, title: "Speed", min: 10, max: 300, defaultValue: 60 },
  gap: { type: ControlType.Number, title: "Gap", min: 0, max: 100, defaultValue: 20 },
  pauseOnHover: { type

Sarah K. Cleaning Services (London)

My last accountant never replied. Wexley’s team are always available — even on WhatsApp. It feels like I’ve got someone dedicated just to me.

Everything’s Digital and Easy

Nadia R. Beauty Studio Owner (Glasgow)

I didn’t expect accounting to be this easy. Wexley made everything digital and quick. I get reminders, updates, and real answers when I need them.

Modern, Fast, and Friendly