Victor Ohiri
Perfectly Hooked
A shop, a gallery and a custom-order page for a handmade crochet brand.
- Role
- Direction
- Supplied by
- The business supplied the photographs, names and copy.
- Stack
- Next.js, React, TypeScript, Tailwind CSS, GSAP, Three.js, WebGL, Supabase
01 / 08
The idea
A shop of 23 pieces, a gallery of 14 pictures and loops, and a page to ask for a custom order.
02 / 08
The problem
The business is someone else’s. The photographs, names and prices come from her original site and aren’t confirmed yet.
It isn’t launched: payments and custom requests are built but switched off.
One site had to do three jobs: sell the pieces, show the handmade work, and take a request for something made to order.
The business supplied the photographs, videos and wording, so nothing could be invented to fill a gap: availability wasn’t supplied, so pieces say “Ask about availability”, and delivery fees aren’t made up, so the bag says delivery is arranged after ordering.
03 / 08
The approach
Every effect borrows from crochet: pictures revealed by sweeping rows, a thread drawn down the page as you scroll, a menu worked like rows of stitches.
04 / 08
The decisions
Nothing is made up. A piece that isn’t on the business’s price list has no price and a descriptive name, and where an order or a request can’t be taken yet the site says so and offers WhatsApp instead of pretending.
A price is never trusted from the browser. The browser sends only what was ordered; the server looks the names and prices up again, and checks the payment provider’s signature before it believes a payment.
Custom requests are stored with Row Level Security on and no public access, with reference photos in a private bucket, and the form reports success only after the database confirms the save.
Motion respects the visitor. People with Reduce Motion on keep a calm fade-in, and a Full animations switch lets someone on a phone set to Reduce Motion turn the effects back on.
Cookies are a plain choice, not a wall: one slim line, two buttons, and a link in the footer to change it.
05 / 08
The design
Photography first. Square corners, an ivory page with a fine grain, burgundy as the only accent.
On desktop, one strand of yarn hangs down the hero.

06 / 08
The build
Next.js, TypeScript and Tailwind, with GSAP for motion and Three.js for the yarn. The yarn loads only on wide screens with a mouse, so phones download no 3D code.
Touching an Atelier photograph turns it to water. Stitch your name crochets what you type.
Checkout never lets the browser set a price: the server works it out again.
Public pages are generated ahead of time and cached; only the checkout’s return page and the API routes run on demand.
Originals are kept untouched and the web versions are generated: photographs as AVIF or WebP with a blur preview, and videos as silent loops that load only near the screen and pause when off it.
The basics are built in: a skip link, visible focus, labelled forms with announced errors, and native dialogs for the bag, the menu and the picture viewer.
- Framework
- Next.js 16, React 19, TypeScript
- Motion
- GSAP, Three.js, WebGL
- Backend
- Supabase, Paystack
- Source
- Private repository



07 / 08
The details
Stitch your name crochets the word you type, row by row. Atelier photographs open in a lightbox.


08 / 08
Current state
It works and is waiting on its owner. Not public yet: the pictures are captures of it running locally.
Its own notes record a check on the production build: the largest paint at about a second, no layout shift, and about 300 kB of JavaScript on the home page.
What is left is the business’s to confirm: the names and prices matched by look, availability and delivery, and the keys that switch payments and requests on.
Next project Studio website, 2026

Tara Designs






