045
AI ready Refreshed

Web Design Agency Website Template

£29 View live demo or the whole Vault, £79.20

Includes the original v1 design as a separate download.

A seven-page site for a web design studio, led by one signal colour on stone: a poster-size word changes with each client while their photograph changes beside it, and every project arrives as a full band in that client's own colour with working website screens. Shown as Tallow & Finch, an Exeter studio building shops for food, drink and retail.

ScrollTrigger Lenis advanced
14 more details
pinningscrubsnaptext-animationclip-pathvariable-fontscroll-linked-colorcount-upscroll-revealstaggerclick-togglekeyboard-navigationprogressive-enhancement 4 colour palettes

About this template

A seven-page site for a studio that designs and builds websites for other people: home, a work index, two case studies, services with prices, the studio and a project planner. It ships as a finished site for a fictional seven-person studio, Tallow & Finch in Exeter, whose clients are a bakery, a cider maker, an ironmonger, a lido, a potter and a gin distillery, so every heading, price and case study is already written in plain sentences.

Read the full template overview

The look is one signal colour, tomato, on warm stone, and nothing else the studio owns. The home page opens on a pinned poster: a single word in tomato at poster scale (bread., cider., hinges., swims., bowls., gin.) that changes with each client while that client's photograph wipes in beside it. Each word is fitted to the same measure on the display face's width axis, so a short word runs wide and a long one runs narrow, and that fitting carries through the case-study titles, the team names and the phone menu.

The work is the content. Every project is a full-width band in its client's own colour with three of their website's screens, and each browser screen works: pick a collection slot, switch a shop to trade prices, search an ironmonger's catalogue, book a swim, join a waitlist, pass an age gate. The bakery case study builds its site in front of you, from grey boxes to words to colour, and lets you use the real collection planner; the services page has a price and timeline builder with the studio's actual starting prices.

To make it yours, repaint the tomato pair and give each project band its client's colour; the reskin suits a digital agency, Shopify or e-commerce studio, app studio, SEO agency or freelance web designer as readily as a studio for food and drink brands.

Web Design Agency Template - website template preview

What's included

12 items
  • Six plain pages (home, work, two case studies, services, studio, start a project) on one stylesheet and one script, with a short cross-page fade where browsers support it
  • A pinned poster hero: a tomato word at poster scale changes with each of six clients while their photograph wipes up beside it, with a numbered index that jumps to any client
  • Display type fitted to its measure on a variable font's width axis, so every client word, case title, team name and phone menu link fills the same line
  • A work index of full-width bands, each in the client's own colour, with a desktop screen, a phone screen and a detail card per project, filterable by platform
  • Six working website mockups: collection slots, retail and trade prices, catalogue search, session timetables, a drop countdown with waitlist, and an age gate
  • A case study that builds the client's site in a browser frame as you scroll, from grey wireframe to real words to colour and photographs, then scrolls the finished page
  • A full-size collection planner with day, slot capacity, quantities and a running basket, plus a retail and trade price table on the second case study
  • A price and timeline builder: choose a build and add-ons and the total, weeks, phase bars and likely launch week update
  • A team picker that sets the chosen person's first name as the poster word, and a project planner that writes the visitor's brief in plain sentences as they choose
  • A designed phone menu: a tomato sheet with every page name fitted to its width, keyboard and Escape support, and a no-JavaScript fallback to the footer page list
  • Four palettes, tomato on stone, cobalt on near-white, acid green on ink and aubergine on blush, each a one-attribute swap that repaints the studio colour while client bands keep their own
  • Every measured contrast pair in the stylesheet header; complete pages with JavaScript off, with reduced motion and with the animation library blocked

Perfect for

6 use cases
  • Web design and development studios that sell scoped website projects
  • Shopify and e-commerce agencies showing client shops at screen size
  • Digital agencies, app studios and product design consultancies with a case-study-led portfolio
  • SEO and content agencies that want prices and process on the page
  • Freelance web designers presenting work, services and rates across a few pages
  • Any studio that wants each client's own colour to carry the work list

How it works

5 sections

Six plain pages

Each page is an ordinary HTML file that loads the same stylesheet and script, and the script runs only what it finds on that page. Delete a section or a whole page and the rest keeps working. Supporting browsers crossfade between pages; nothing has to be routed or re-initialised.

The poster hero

The home page pins a stage of six client words and six photographs. Scrolling moves through them one at a time, the letters of the old word leaving and the new word rising while the next photograph wipes up over the last, and the scroll settles on each client. The numbered index under the photograph jumps straight to any of them.

Fitted display type

Display lines are set in a variable face with a width axis. Each line is measured after the fonts load and given the width that fills its column, so a three-letter word and a seven-letter word sit on the same measure. Lines are refitted on resize; without JavaScript they fall back to a fixed narrow cut that wraps if it must.

Client bands and working screens

Each project is a band whose colour and ink come from two values on the band itself, and the header takes those colours while a band sits beneath it. The browser screens are real HTML with native radios, buttons and search fields, so they work with a keyboard and several of them still switch state with JavaScript off.

Without JavaScript or motion

Content is readable before any script runs, and a blocked animation library leaves the plain document. With reduced motion nothing is pinned: the hero index swaps word and photograph instantly, the case-study site shows finished, and figures show their final values.

Plugins ScrollTrigger
Difficulty Advanced
Smooth scroll Lenis integration
Colour palettes 4 ready-made palettes, each measured for AA contrast. Switch with one attribute, or copy the values you want into :root. Try them in the preview above.
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (7 pages, lowest score shown), from the latest scan. A measurement of the demo as shipped, not a promise for your page.

Accessibility
100
Best practices
100

No performance score, on purpose. That figure depends on how you deploy: your server's compression and caching, your CDN, the connection and the device doing the test, none of which the code controls. The same page can score very differently on two consecutive runs, so measure it where it will live.

Questions about this template

Is this only for a studio that builds sites for food and drink brands?

No. The fiction is a worked example. The structure is any studio selling scoped projects: a web design agency, a Shopify or e-commerce studio, an app studio, an SEO agency or a freelance web designer. Change the six client words, photographs, band colours and screens, and the poster hero and work bands read as yours.

How do I put my own client work in the bands?

Each band takes two colours, the client's colour and the ink that reads on it, and holds three screens: a browser, a phone and a detail card. Replace the screen contents with your client's real pages or screenshots. The mockups are ordinary HTML, so you can keep one working control per client or swap in a static image.

Can I change the words in the poster hero?

Yes. Each state is three pieces of markup: one short word, one photograph with its caption, and one numbered link in the index. Every word is fitted to the same width automatically, so anything from three to about nine letters works. Keep between three and eight states for a comfortable scroll; the pin length follows the number of words.

Are the prices in the services builder real?

They are the fictional studio's starting prices, written to be realistic for a small UK studio. Change the build and add-on prices shown in the markup, then the matching numbers in the builder's short settings list in the script; the total, weeks, phase bars and likely launch week all recalculate from those numbers.

Does the start a project form send anything?

No. The planner is a static front end: it collects what the visitor sells, the build they need, a budget band, a launch month, their current site, name, email and a message, and shows a thank-you state without sending. Connect it to Formspree, Netlify Forms or your CRM before launch.

Do the collection planner and age gate save anything?

No. They are working previews of client websites: the planner reserves nothing, the waitlist adds no one and the age gate stores no answer, and the planner says so when used. They exist to show visitors what you build, so keep them as demonstrations or replace them with screenshots of your own client work.

Paid template

Purchase to unlock the code.

Buying Web Design Agency Template opens the HTML, CSS and JavaScript source, the full documentation, an AI setup prompt for your editor, and every update we ship to it. Standard license: unlimited personal and commercial projects. Every paid product is tested for desktop and mobile layouts, reduced-motion handling, animation cleanup and keyboard controls wherever there is something to operate.

£29 Standard license, unlimited projects

Browse free effects

Or the whole library: the Vault, £79.20, one payment.

Documentation

Quick Start

  1. Unzip and open index.html in a browser, or serve the folder with any static server (npx serve .).
  2. Every page is a plain HTML file: index.html (Home), work.html (all six projects), work-heavitree-bakehouse.html and work-creedy-cider.html (case studies), services.html (prices and the builder), studio.html (the team) and start.html (project planner).
  3. All pages share assets/style.css and assets/script.js. There is no build step.
  4. Deploy the folder as it is to any static host.

Using It With Your Own Design

  • The studio colour: --signal (display text and fills) and --signal-ink (the cut for small text) at the top of assets/style.css, or one of the four ready palettes (see Palettes below). Tomato on stone is large-text contrast only, so it is used at 24px and up; anything smaller uses --signal-ink. Repaint the pair together and re-measure.
  • Client colours: each band, case-study opener and next-project link carries its colours inline: style="--band: #C98A35; --band-ink: #1E1B18". --band-ink must read on --band at 4.5:1. Avoid a band colour close to your studio colour, or the one-colour idea blurs.
  • Ground and ink: --ground, --ground-deep, --paper, --ink and --ink-soft in the same token block.
  • Type: Anybody (display, a variable face with a width axis) and Work Sans (everything else), self-hosted in assets/fonts/. Display lines are fitted to their column on the width axis, so any replacement display face needs a wdth axis too, or remove the data-fit attributes and size the lines yourself.
  • Copy and clients: all text is in the HTML. The six clients appear on the home page (poster states and three bands), on work.html (six bands) and in the two case studies.
  • Photographs: see Images below.

Pages and Configuration

Page Sections Hands-on piece
Home Poster hero, three client bands, four services with prices, how a project goes, price line, footer Hero index; the working screens in each band
Work Statement, filter, six client bands Platform filter; six working screens
Case study (Heavitree) Client-colour opener and facts, site in the shop, the brief, the site being built, collection planner, results, quote, next project Collection planner
Case study (Creedy) Opener, site in the orchard, the brief, retail and trade price table, results, previous project Price table
Services Three engagements and a care plan, price and timeline builder, week by week, questions Price builder
Studio Team poster, the room, principles, tools and address Team picker
Start a project Statement and founder chip, planner, live brief card Planner and brief

Every feature looks for its own data- hook and does nothing when the markup is missing, so you can delete a section, or a page and its links, without touching the script.

Navigation

Desktop links sit in the header with aria-current="page" on the current page. Under 900px the links give way to a Menu button that opens a full-height sheet in the signal colour listing every page, each name fitted to the sheet's width. Without JavaScript the Menu control is a link to the page list in the footer (#site-pages). When you add or remove a page, edit the header, the sheet and the footer list on every page.

The poster hero (Home)

[data-hero] holds three matching lists: the words ([data-word], each letter wrapped in <span class="ch">), the photographs ([data-shot], each a <figure> with a caption) and the index links ([data-goto="n"], numbered from 0). Keep the three in the same order. With motion allowed the section pins and scroll moves through the states; under reduced motion the index swaps word and photograph instantly. The first photograph is the page's largest image, so it is preloaded in the <head>; change that preload if you change the first photograph.

Client bands

An article.band with data-band and data-kind (space-separated: shopify, craft, booking, used by the Work filter). Inside: the name, a one-sentence outcome, a short list of services and place, then .band__screens with a .browser, a .phone and a .card. The browser screen's contents are ordinary HTML styled per client by a site--<name> class; swap them for screenshots (<img> inside .browser__view) if you prefer. While a band sits under the header, the header takes the band's colours.

Working screens

Each client's browser screen has one control: [data-slots] (collection slot), [data-creedy] (retail and trade prices, from each price's data-retail and data-trade), [data-marlowes] (catalogue search over the listed lines), the Quayside day tabs (CSS only), [data-okafor] (countdown to the next Thursday at 7pm, and the waitlist button) and [data-pellow] (age gate). None of them saves anything.

Work filter

Radio chips in [data-filter] filter the bands with CSS, so the filter works without JavaScript. To add a platform, add a chip with the id kind-<name>, the matching rule near .work:has(...) in the stylesheet, and the word in each band's data-kind.

Case study

The opener is a section.opener with the client's colours inline and the title split into two fitted lines. [data-build] is the scroll sequence: the site inside the frame ([data-bsite]) starts as grey bars (every text run is wrapped as <span class="wf"><span class="wt">…</span></span>), takes its words, then its colours and photographs, then scrolls. The four notes beside it light in step. [data-planner] is the collection planner; slot capacities are in the caps list inside initPlanner in the script.

Price builder (Services)

[data-builder] reads the chosen build and add-ons. Build prices, add-on prices and phase weeks are in the builds list and the add-on lines inside initBuilder; the labels in the markup show the same numbers, so change both.

Team (Studio)

Each portrait is a button.person with data-first (the poster word) and data-role (the sentence under it). Clicking, tapping or pointing at a portrait sets the poster.

Project planner (Start)

A normal <form> with radio chips, a select and text fields. The brief card writes one sentence per answer and compares the budget with the build's starting price. start.html?project=<client> prefills the planner from a band's "Ask us about this project" link. The form sends nothing: it validates and shows a thank-you state. Set its action or post it to Formspree, Netlify Forms or your CRM before launch.

Palettes

The studio owns one signal colour; four palettes ship in assets/style.css. Each palette sets the ground, paper, ink and signal colours only. Client band colours belong to each project and stay the same in every palette, and so do the caption chips over photographs and the paper inside client mockups (the fixed --chip* and --mock-* tokens).

Palette data-palette Ground Signal Display face
Tomato (default) none stone #DEDAD1 tomato #DB3B22 Anybody + Work Sans
Cobalt cobalt near-white #F5F5F2 cobalt #2445D9 Anybody + Work Sans
Acid acid ink #131412 (dark) acid green #C6F21E Anybody + Work Sans
Blush blush pale pink #F3DAD5 aubergine ink #2E1226 Anybody + Work Sans

To use one, set it on the root element of every page: <html lang="en-GB" data-palette="cobalt">. Or copy that block's values into :root at the top of the stylesheet and delete the alternate blocks. The faces do not change between palettes, because the poster words rely on Anybody's width axis.

Token Default Role
--ground #DEDAD1 Page ground
--ground-deep #CFCAC0 Hairlines; never text
--paper #EEEBE4 Cards, form fields, the price builder, the brief card
--ink #1E1B18 Text (11.8:1 on ground)
--ink-soft #4D4740 Secondary text (6.3:1 on ground)
--signal #DB3B22 The studio colour: statements, poster words, prices, numerals, the phone menu sheet (3.23:1 on ground, large text only)
--signal-ink #A82814 Small signal-coloured text: nav, labels, clock, links, focus rings (5.05:1 on ground)
--on-signal #FFFFFF Text on signal fills (4.51:1)

In the default the signal colour passes only as large text, so anything under 24px uses --signal-ink. Measured pairs for every palette are listed in the comment at the top of assets/style.css; re-measure if you mix your own.

Client bands in the example: ochre #C98A35, orchard #2F5A3A, navy #1F3A5C, aqua #7FC4CB, clay #D9B3A0, sea #0F4C5C. Each pairs with a dark or light ink set on the band.

Images

The photographs are bundled in assets/img/ as optimised WebP derivatives (about 2.6 MB in total), cropped, resized and lightly desaturated from the originals listed in assets/img-manifest.json. The stock photographs are from Pexels, used under the Pexels licence:

Files Shows Source
hero-bread Hands holding a scored sourdough loaf https://www.pexels.com/photo/30927893/
hero-cider Red apples on a canvas sheet at harvest https://www.pexels.com/photo/8283792/
hero-hinges An ironmonger by shelves of small boxes https://www.pexels.com/photo/14458537/
hero-swims A seafront lido at sunset https://www.pexels.com/photo/19847806/
hero-bowls Hands painting a handmade mug https://www.pexels.com/photo/18960521/
hero-gin A copper still in a distillery https://www.pexels.com/photo/10040004/
heavitree-loaves Loaves in paper bags on shelves https://www.pexels.com/photo/34273595/
heavitree-sourdough A floured round loaf https://www.pexels.com/photo/27165968/
heavitree-rye Loaves on wooden racks https://www.pexels.com/photo/30473094/
creedy-orchard Apple trees beside a grass path https://www.pexels.com/photo/2965607/
creedy-hands Cupped hands holding apples https://www.pexels.com/photo/9835096/
marlowes-drills Vintage hand drills on shelves https://www.pexels.com/photo/15404056/
marlowes-hook A brass wall hook https://www.pexels.com/photo/36650043/
marlowes-hinge An iron strap hinge on an old door https://www.pexels.com/photo/13425281/
quayside-pool Swimmers in a sea pool from above https://www.pexels.com/photo/6775404/
quayside-swimmer A swimmer resting at the pool edge https://www.pexels.com/photo/5952863/
okafor-shelves Shelves of handmade pots https://www.pexels.com/photo/26733186/
okafor-glaze, okafor-white Stacked handmade bowls https://www.pexels.com/photo/33367176/, https://www.pexels.com/photo/6611419/
pellow-coast Cliffs and surf https://www.pexels.com/photo/18729882/
pellow-still A distiller beside a still https://www.pexels.com/photo/17046817/
case-heavitree-shop Bread on shelves behind a counter https://www.pexels.com/photo/3639541/
case-heavitree-counter A baker handing a bag over the counter https://www.pexels.com/photo/7447285/
case-creedy-path A path between apple trees https://www.pexels.com/photo/28387811/
case-creedy-bottles Bottles and a crate of apples https://www.pexels.com/photo/34525378/
studio-table, studio-room The studio by the window; hands laying out printed layouts https://www.pexels.com/photo/36765696/, https://www.pexels.com/photo/36765667/

The seven team-* portraits and the cider-* and gin bottles are AI-generated images, made for this template; the people are not real and the labels are blank. Replace the portraits with photographs of your own team.

Files ending -600 and -800 are smaller copies that phones download instead; a replacement needs both sizes. To use your own photograph, replace a file with one of the same name and similar proportions and update its alt text and caption. If you work from this repository's tooling, edit the manifest and regenerate with bun scripts/build-template-assets.ts web-design-agency-template --force.

Accessibility

  • Native links, buttons, radios, checkboxes, selects and inputs throughout, including inside the website screens; visible focus outlines on stone and on every client colour.
  • The phone menu is a real button with aria-expanded, focus moved into the sheet and kept there, Escape and a tap outside to close, and focus returned to the button.
  • The poster words are decorative copies of the index (hidden from assistive technology); the index links and photograph captions carry the same content as text.
  • The team picker uses aria-pressed and announces the new name and role; the planner's brief card, the price builder and the working screens announce changes in polite live regions.
  • Reduced motion: no pin, no letter animation and no cross-page fade; the hero index swaps states instantly, the case-study site shows finished and every figure shows its final value.
  • Without JavaScript every page is a complete document: the hero shows its first client, the work filter and day tabs still work, and the phone menu links to the footer page list.

Dependencies

  • GSAP with ScrollTrigger. Built against 3.15.0; works with 3.12+.
  • Lenis for optional smooth scrolling. Built against 1.3.17. Turn it off with ?smooth=off in the URL or data-smooth="off" on <html>.
  • Anybody and Work Sans, self-hosted in assets/fonts/.

Fonts

Anybody and Work Sans are self-hosted in assets/fonts/ as the Latin subsets Google Fonts serves (both are variable fonts; Anybody is cut to weight 900 across its full width range). Every page preloads Anybody, which sets the poster words; the inner pages also preload Work Sans, which sets their opening statement. The home page leaves Work Sans to load normally so the first photograph downloads sooner. Licence: SIL Open Font License 1.1, full text in assets/fonts/OFL.txt (Anybody: Copyright 2020 The Anybody Project Authors, https://github.com/Etceteratype/Anybody; Work Sans: Copyright 2019 The Work Sans Project Authors, https://github.com/weiweihuanghuang/Work-Sans).

Teardown

Each page is a plain document, so features run once on load and need no teardown between pages. The page's GSAP work lives in one gsap.context() (exposed as window.gsapContext) and one gsap.matchMedia(), reverted on pagehide; switching reduced motion on or off at runtime tears down the pins and Lenis and rebuilds the right version. A host page's own window.lenis is never created over or destroyed.

Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.