Skip to content

Restaurant

A dining room’s whole site: hours and phone above the fold, the menu typeset as a bill of fare, a real reservation flow, the room and the way to find it.

7 routes7 pages · 24 blocks42 files · 5,576 lineslucide-reactAdded 14 Sept 2026

What's included

  • app/about/page.tsx
  • app/book/page.tsx
  • app/contact/page.tsx
  • app/gallery/page.tsx
  • app/globals.css
  • app/layout.tsx
  • and 11 more files
  • 7 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init restaurant ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

Cotham Hill, Bristol

Thirty-eight covers, one menu, and it changes when the food does

A small dining room doing one sitting a night. Wednesday to Sunday, six until ten, and the table is yours for the evening.

Wed–Sun
Open
6pm – 10pm, kitchen closes 9.30
18 Cotham Hill
Bristol BS6 6LF
Five minutes from Clifton Down
0117 946 2210
Phone
Answered from 4pm on service days
38
Covers
One room, one sitting per table

Tonight, to begin

An extract. The full menu — three courses, the wine list and the cheese — is on the menu page, and it is the same document the kitchen is working from right now.

This week, to begin

The full menu changes when the produce does

  • Devilled eggs, brown crab, lovage(gf) (s)

    9

    Six halves. The crab is picked here on the morning it arrives.

  • Bread and cultured butter(v)

    5

    Sourdough from the Tuesday bake, salted butter churned in house.

  • Chicory, pear, hazelnut, aged ewe’s cheese(v) (gf) (n)

    11

    Bitter, sweet, salt. The pears are from a single orchard in Herefordshire.

(gf)
Gluten free
(s)
Contains shellfish
(v)
Vegetarian
(n)
Contains nuts

Please tell us about allergies when you book rather than when you arrive. We cook in one kitchen and cannot promise any dish is free of a trace, but we can usually change one.

How it works

Four things worth knowing before you book

None of them are unusual in a good restaurant and most restaurant websites leave all four out, which is why people arrive expecting something else.

  • One menu, changed when the produce changesNot seasonally and not on a schedule — when the box that arrives on Tuesday is different, the menu is different on Wednesday. It is why there is no printed menu and why the website is the menu.
  • Everything from within about ninety milesExcept the salt, the pepper and the olive oil, and we are not going to pretend otherwise. The lamb is from one farm on the Mendips and the fish comes up from Brixham on the same van every morning.
  • Six people, and that is the whole businessTwo in the kitchen, two on the floor, and the two of us who own it working both. Service charge goes to them and is split evenly including the kitchen, which is not the industry norm.
  • One sitting per tableYour table is yours for the evening. We would rather do 38 covers properly than turn 70 and ask you to leave before pudding.

Rated 4.8 across Google, OpenTable and the Good Food Guide

4.8out of 5

from 312 reviews verified reviews

5 stars
241
4 stars
52
3 stars
13
2 stars
4
1 star
2

What people say

Four of the 312. The four-star one is here on purpose — the room really is loud when it is full, and we would rather you knew that before you booked an anniversary.

“The hogget for two is the best thing I have eaten in this city. Carved at the table, gone in twenty minutes, and they were not precious about us ordering three puddings between two.”
Ffion R.Booked for an anniversary
“Small room, so book. We turned up on a Saturday without one and were sent away kindly, which is fair enough. Came back Wednesday and it was worth the wait.”
Daniel O.Local, now a regular
“Told them about a nut allergy when booking and they had already crossed two things off by the time we sat down. Nobody made it a performance. That is rarer than it should be.”
Sameera K.Dinner for four
“Excellent food, and honestly quite loud when it is full. If you want a quiet conversation take the early sitting at six rather than eight.”
Martin H.Weeknight dinner

Book a table

Wednesday to Sunday, sittings from six. Tables for six or more are best done by phone so we can talk about the menu first.

  • No deposit for tables of five or fewer
  • Cancel free up to 24 hours before
  • Step-free access, and an accessible WC

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Laurel palette, which ships in app/globals.css. Deep green on warm cream, square-cornered. Sits between Moss and Fern on hue and apart from both on background temperature — the cream is what makes it read as a dining room rather than as an eco-brand.

Get it

42 files · .zip · nothing to configure · Pro

then

cd restaurant
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/Restaurant Landingapp/page.tsx
/menuMenuapp/menu/page.tsx
/bookTable Reservationapp/book/page.tsx
/aboutAbout Page 02app/about/page.tsx
/galleryGallery / Showcaseapp/gallery/page.tsx
/contactContact Page 02app/contact/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(9 files)

  • about/page.tsx
  • book/page.tsx
  • contact/page.tsx
  • gallery/page.tsx
  • globals.css
  • layout.tsx
  • menu/page.tsx
  • not-found.tsx
  • page.tsx

components/(25 files)

  • bento-features.tsx
  • booking-scheduler.tsx
  • cta-inline-card.tsx
  • cta-split-panel.tsx
  • faq-categorized.tsx
  • faq-objection-list.tsx
  • faq-two-column.tsx
  • feature-rows.tsx
  • footer-minimal.tsx
  • hero-booking.tsx
  • hero-editorial.tsx
  • hero-media-overlay.tsx
  • job-listing-board.tsx
  • menu-course-list.tsx
  • navbar-simple.tsx
  • not-found-404.tsx
  • persona-cards.tsx
  • product-gallery.tsx
  • product-spec-split.tsx
  • stats-band.tsx
  • support-ticket-form.tsx
  • testimonial-grid.tsx
  • testimonial-ratings.tsx
  • testimonial-spotlight.tsx
  • theme-provider.tsx

Every file is listed. The 24 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Laurel palette.
 *
 * Deep green on warm cream, square-cornered. Sits between Moss and Fern on hue and apart from both on background temperature — the cream is what makes it read as a dining room rather than as an eco-brand.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 118 24% 99%;
    --foreground: 118 45% 9%;
    --card: 0 0% 100%;
    --card-foreground: 118 45% 9%;
    --popover: 0 0% 100%;
    --popover-foreground: 118 45% 9%;
    --primary: 118 48% 34%;
    --primary-foreground: 0 0% 100%;
    --secondary: 118 24% 96%;
    --secondary-foreground: 118 40% 20%;
    --muted: 118 16% 96%;
    --muted-foreground: 118 12% 41%;
    --accent: 96 48% 95%;
    --accent-foreground: 96 48% 22%;
    --destructive: 0 72% 45%;
    --destructive-foreground: 0 0% 100%;
    --border: 118 16% 90%;
    --input: 118 16% 90%;
    --ring: 118 48% 34%;

    --radius: 0.125rem;
  }

  .dark {
    --background: 118 40% 5%;
    --foreground: 118 15% 97%;
    --card: 118 32% 8%;
    --card-foreground: 118 15% 97%;
    --popover: 118 32% 8%;
    --popover-foreground: 118 15% 97%;
    --primary: 118 58% 72%;
    --primary-foreground: 118 45% 8%;
    --secondary: 118 25% 15%;
    --secondary-foreground: 118 15% 97%;
    --muted: 118 25% 15%;
    --muted-foreground: 118 12% 68%;
    --accent: 96 30% 18%;
    --accent-foreground: 96 40% 92%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 118 22% 19%;
    --input: 118 22% 19%;
    --ring: 118 58% 72%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Marketing

Open the full page for this template

Marketing Site

A pricing page that answers the objection

Landing page, pricing page, 404. The smallest thing you can put in front of a product and have it look deliberate.

3 routes3 pages13 blocksVermilion
Pro
Open the full page for this template

Content Site

The article at a real measure

A publication that happens to belong to a company: blog index, article, careers and a 404. The site for when the writing is the product — or the marketing.

4 routes4 pages10 blocksInk
Pro
Open the full page for this template

Docs Site

The three-column docs frame

The three-column docs frame — sidebar, article, on-this-page rail — plus a changelog and a 404. The part of the product a search for an error message should find.

3 routes3 pages6 blocksAzure
Pro
Open the full page for this template

Help Centre

Search that answers before the ticket

The support surface, as four routes that agree with each other: searchable answers, the docs, what changed, and a status page carrying the same incident the help page announces.

5 routes5 pages13 blocksRose
Pro
Open the full page for this template

Developer Portfolio

The terminal that introduces you

An engineer’s site rather than a designer’s: a terminal hero, thirty legible lines of real code on the home page, the projects, the writing and a CV that prints.

8 routes8 pages26 blocksPhosphor
Open the full page for this template

Personal Résumé

A CV that prints properly

A minimal personal site whose home page is the CV itself — printable, indexable, and therefore the copy that actually gets maintained. Five routes, warm paper, square corners.

6 routes6 pages17 blocksLinen
Pro
Open the full page for this template

Crypto Exchange

The live price rail

A regulated exchange, front to back: a moving price rail, a public markets screen, the custody facts, the fee schedule and the risk warning as a section rather than as small print.

8 routes8 pages30 blocksVault
Pro
Open the full page for this template

Conference Site

The agenda across three tracks

An event site built around a date: the ticket price step-up above the hero, a two-day programme across three tracks, speakers, venue and a code of conduct.

7 routes7 pages25 blocksMarquee
Pro
Open the full page for this template

Estate Agency

Map and results, scrolling apart

Property search with results already in it, a listing page that puts tenure and EPC above the prose, the agents, and a valuation route for the other half of the business.

6 routes6 pages23 blocksHeath
Pro
Open the full page for this template

Job Board

Salary on every row, grouped by craft

A two-sided board where candidates get the whole site and employers get one section and a price. Listings grouped by craft, each with a real salary range and the interview process published.

6 routes6 pages28 blocksFoundry
Open the full page for this template

Open Source Project

The install command, before anything else

A project site for a library: install command above the hero, the API in twenty lines, docs, changelog, roadmap, community, and who funds it said plainly.

7 routes7 pages21 blocksCarbon
Pro
Open the full page for this template

Directory

Facets that are not categories

A faceted index with a listing page that compares each entry against its alternatives, a paid submission route, and a published removal rate.

6 routes6 pages29 blocksMulberry
Pro
Open the full page for this template

Streaming Service

The watch screen, on the marketing page

A subscription video service: catalogue rails, a real watch screen with chapters and a transcript, one plan at one price, and the account behind it.

6 routes6 pages20 blocksNocturne