145

Recipe App Website Template

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

A working phone app for recipes and meal planning: tonight's dinner with a swipe deck to swap it, a photo recipe library with search and filters, recipes that scale and shop themselves, a cook mode with several running timers, a draggable weekly plan and an aisle-sorted shopping list. Full screen on a phone, live in a phone frame on a desktop.

FlipDraggable advanced
19 more details
touch-gesturestouch-dragdraggabledragflip-layoutfiltertabscountdownstate-transitiondialog-animationkeyboard-navigationfocus-managementtheme-switchmicro-interactionstaggerprogressive-enhancementcard-stacklocal-storageweb-audio

Released

About this template

A complete phone app UI for a cooking product, delivered as a mobile web app you can open, tap and hand to a developer: recipe and cookbook apps, meal-kit companions, meal planners, grocery and supermarket apps, cookery schools. The worked example is Supper, a home cooking app for a household of four in Leeds, with sixteen dishes photographed overhead on dark stone so the colour on every screen comes from the food.

Read the full template overview

The interface is warm paper with recipe names and cook steps set in a book serif, a quiet sans for everything you operate, and one paprika accent kept for the primary action. Tonight's dinner leads the home screen; the recipe opens on a bled photograph; cook mode sets one step per screen in large type with timers that keep running while you move on.

On a phone the app is the page, with a tab bar and sheets that rise from the bottom. On a desktop it runs live in a phone frame standing across the seam of a bay-leaf green ground and a full-height photograph of the screen's dish, with notes on what to try and a contents strip of all nine screens, so a buyer can use it with a mouse and keyboard.

Make it yours by renaming the app, swapping the photographs in the image manifest, and editing the recipe, plan and list content in the HTML. Colours and both faces are tokens in one stylesheet, and a UI elements page shows every building block in every state.

Recipe App - website template preview

What's included

10 items
  • Nine screens: Today, Recipes, Recipe, Cook mode, Plan, List, You, Welcome and a UI elements page, on one stylesheet and one script
  • Full screen on phones; on desktops the live app stands in a phone frame between notes and a full-height dish photograph
  • Swipe deck on Today: drag or press to swap tonight's dinner, with the replaced dish going to the back of the deck
  • Recipe library with live search by name or ingredient, single-choice filters, saved recipes and sort, reflowing with Flip
  • Recipe screen that scales every quantity with a servings stepper, switches metric and US units, and adds missing ingredients to the list
  • Cook mode with swipe, button and arrow-key steps, several timers running at once with rings, pause, an extra minute and a done alert
  • Weekly plan with drag handles, a Move menu for keyboards, a recipe picker for free nights and three other weeks
  • Shopping list that files new items by aisle, ticks items into a basket, and removes rows by swipe with undo
  • Settings for household size, diet, units, appearance, timer sound and reminders, kept on the device
  • Light and dark themes on the same tokens, sixteen bundled food photographs, self-hosted Petrona and Figtree

Perfect for

5 use cases
  • Recipe and cookbook apps
  • Meal planning and meal-kit companion apps
  • Grocery, supermarket and shopping list apps
  • Nutrition and healthy eating apps
  • Cookery school and food brand apps

How it works

5 sections

One app shell, two presentations

Every screen is a plain HTML page holding the same shell: a status bar, the scrolling app, a tab bar and its sheets. Below 600px the shell is the page and the document scrolls. From 600px it becomes a phone frame with its own scroller, and from 1100px wide the notes, contents strip and photograph appear around it. Media queries alone switch between them.

Content lives in the markup

Recipes, plan days and list items are ordinary HTML with data attributes for time, tags, quantities and aisles. The script reads those attributes to filter, scale and sort, so changing a dish means editing its card and the picker entry, with no data file to keep in step.

Interactions

Draggable carries the dinner deck, the cook mode steps, the plan handles, list swipes and sheet handles, each with a button or keyboard route beside it. Flip reflows the recipe grid, the plan swap and the move into the basket. Sheets and dialogs trap focus, close on Escape or the scrim, and return focus to the control that opened them.

State on the device

Saved recipes, units, household size, timer sound, theme and anything added to the list are kept in localStorage, so the recipe follows the units chosen on You and the list shows what the recipe added. Reads and writes are guarded, so a private window starts fresh.

Fallbacks

Without JavaScript or with the GSAP CDN blocked, every page reads as a complete document: the deck becomes a list, cook mode lists its steps in order, and the onboarding questions stack. Reduced motion keeps every control and state and drops the slides, flips and springs.

Plugins Flip, Draggable
Difficulty Advanced
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (9 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

Which kinds of app can this become besides a recipe app?

Any phone product built around food or a weekly routine: a meal-kit companion, a meal planner, a supermarket or grocery delivery app, a nutrition tracker or a cookery school. The tab bar, swipe deck, plan, cook-along steps and list are general patterns; change the copy, the sixteen photographs and the accent, and the screens re-point without layout work.

Is it a native app or a website?

It is a mobile web app: static HTML, CSS and one script that run full screen in a phone browser and can be added to the home screen. It is not an iOS or Android project. Many teams use it as the front end of a progressive web app, or as a working prototype and handover reference for a native build.

Does anything save to a server?

No. Saved recipes, units, household size, theme and items added to the shopping list are kept in the browser's localStorage only, and the delete-account and export rows show what the app would say. Connect those actions, the plan and the list to your own API or a backend such as Supabase or Firebase when you build it out.

How do I add my own recipes?

Each recipe card in recipes.html carries its name, time, tags and searchable ingredients in data attributes; copy a card, change those and point its image at a new file. recipe.html is the detail layout: each ingredient line holds its metric and US quantity for four servings, which the servings stepper and units switch scale from.

Can I change how long the cook mode timers run?

Yes. Each step with a timer has a button carrying its minutes and label in data attributes, so editing those changes the timer. Several can run at once in the dock, each with pause, an extra minute and remove, and the finished alert plays a short tone chosen on the You screen, generated in the browser with no audio files.

How do I replace the food photographs?

The sixteen dishes are Pexels photographs baked to WebP in assets/img, listed with their sources in assets/img-manifest.json. Replace a file with your own at the same proportions, or edit the manifest and rerun the bake. Keep one lighting style across the set; the dark overhead shots are what let the warm paper interface stay quiet.

Paid template

Purchase to unlock the code.

Buying Recipe App 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 the folder and serve it, or open index.html directly:

Code snippet omitted: it ships with the download.

  1. Load /index.html (or the folder with a trailing slash) so the relative assets/ paths resolve.
  2. Open it on a phone, or narrow the browser below 600px, to see the app full screen.
  3. Rename the app: the wordmark is .brand-name and .brand-mark on every page and in .ob-brand on the Welcome screen.

No build step. Each page is a plain HTML file with assets/style.css, GSAP, Flip and Draggable from a CDN, and assets/script.js.

Using It With Your Own Design

  • Colour: the tokens at the top of assets/style.css. Light is :root; dark restates the same names under :root[data-theme="dark"] and the prefers-color-scheme block. --accent is the primary action, saved state and active tab; --herb means done or checked; --night is the fixed dark surface for the Tonight card, captions and toasts. The measured contrast pairs are in the first comment.
  • Type: Petrona (recipe names, titles, cook steps) and Figtree (everything you operate) are self-hosted in assets/fonts/ with their licence. Swap --font-display and --font-ui and the @font-face rules.
  • Shape: --radius sets cards and rows; buttons and chips are pills. --pad is the screen gutter, --tab-h the tab bar height.
  • Desktop stage: --stage is the green ground. Remove .stage-notes, .stage-photo or .stage-contents from a page to drop that part of the presentation; the app still sits in its frame. Delete the stage wrapper markup entirely if you only ship to phones.

Screens and Configuration

Shared shell

Every app page has the same structure inside .stage: .stage-bar (brand and theme switch), .device > .device-screen holding .status-bar, main.app, .tabbar, the page's sheets and dialogs, the All screens sheet and .toasts, then .stage-notes, .stage-photo and .stage-contents. Below 600px only the app shows and the document scrolls; from 600px .app becomes the scroller inside the frame. Mark the current tab and contents link with aria-current="page".

Hooks

Hook Does
data-topbar Top bar that shows the screen title once the large h1 scrolls away
data-sheet / data-sheet-open="id" / data-sheet-close Bottom sheet, its opener and closers; data-sheet-grab drags it down
data-dialog / data-dialog-open="id" / data-dialog-close Centred dialog
data-stepper with data-min, data-max Minus and plus around an output; emits a stepper event
data-save="id" Heart toggle, remembered across pages
data-menu / data-menu-btn / data-menu-list Popup menu with arrow keys and Escape
data-reveal, data-reveal-group Entrance fade on load

Recipes

Each .rcard in recipes.html carries data-recipe (image name), data-name (searchable name and ingredients, lower case), data-time (minutes), data-tags (quick, veg, pasta, curry, soup, fish, sweet) and data-order. Filter chips match a tag through data-filter. Add a chip and a tag to add a filter.

recipe.html is the detail layout. Each li[data-ing] holds data-m and data-u as quantity|unit for four servings (metric and US); counts use an empty unit, and data-one gives the singular name. Units are g, ml, tbsp, tsp, cups, cm, in, oz or a count. Ticked boxes are what you already have; the rest go to the add-to-list sheet with their data-aisle.

Cook mode

Steps are li[data-cook-step] in [data-cook-track]; the last one is the finished screen. A timer is a button with data-timer-start, data-min and data-label. The ingredients sheet marks the ones each step uses from STEP_USES near the top of initCook() in assets/script.js. The screen asks the browser to stay awake while open where the Wake Lock API is available.

Plan

Week 0 is the markup in plan.html; the other weeks and their date labels are the WEEKS object in initPlan(). The picker sheet lists every recipe as button[data-pick] with its name, time, kind and ingredients, and the plan builds its cards from those, so a new recipe needs one picker entry.

List

Aisles are section[data-aisle]. New items are filed by the keyword lists in KEYWORDS inside initList(); anything unmatched goes to Other. Items added from a recipe or the plan are stored on the device and appear with a New tag.

Front end only

Nothing is sent anywhere. Saved recipes, units, household size, diet, timer sound, theme and list additions are kept in localStorage (supper-state, supper-theme). Export, delete account and sign out show the app's messages only. Connect them, the plan and the list to your own API when you build it out.

Photographs

The sixteen dishes and the welcome photograph are Pexels photographs (Pexels licence), baked to WebP derivatives in assets/img/: a 4:5 card and a square for each dish, a portrait for each screen's desktop photograph, and the recipe hero. assets/img-manifest.json lists every source URL, crop and size. To replace one, drop in your own file under the same name at the same proportions, or edit the manifest and regenerate with the asset baking script that ships with GSAP Vault (bun scripts/build-template-assets.ts <slug>). Keep one lighting style across the set.

Sources: pexels.com/photo/ IDs 39641632 (salmon), 37180954 (rigatoni), 11829700 (spaghetti), 7865794 (tomato soup), 20004858 (green soup), 10345736 (butter chicken), 6358975 (lamb curry), 9809033 (prawn curry), 17593648 (katsu), 10506640 (halloumi), 4224305 (fried rice), 3648978 (shakshuka), 6978146 (rice bowl), 12077972 (cucumber), 36866901 (tacos), 17260332 (tart), 19461069 (welcome).

Palette

Token Light Dark Role
--ground #F6F1E8 #14120F Paper behind every screen
--surface #FFFFFF #1E1B17 Cards, rows, tab bar
--raised #EDE6DA #2A2620 Chips, fields, steppers
--ink #1F1A15 #F2ECE2 Text
--accent #B23A1E #EE7A5A Primary action, saved, active tab
--herb #3D5A3A #9DBB8F Checked, done, switches
--stage #2E3A2B #161C15 Desktop ground around the phone

Accessibility

  • Native buttons, links, checkboxes, radios and selects throughout; custom faces keep the real inputs underneath.
  • Sheets and dialogs are modal: focus moves in, Tab is trapped, Escape and the scrim close them, focus returns to the opener, and the rest of the screen is inert.
  • Every drag has a keyboard or button route: deck buttons, cook mode buttons and arrow keys, plan Move menu and arrow keys on the handle, a remove button on every list row.
  • Timer changes and counts are announced through live regions; the timer done alert is role="alert".
  • Reduced motion keeps every state and drops the slides, flips and springs. Without JavaScript the pages read as complete documents.

Dependencies

  • GSAP 3.12+ with Flip and Draggable (demo built against 3.15.0), loaded from jsDelivr with defer.
  • No other libraries. Fonts and images are bundled.

Teardown

Each page runs its own script on load and needs no teardown between pages (plain navigation with a CSS view transition where supported). The cook mode timers run on one interval for the life of the page. If you move the screens into a single-page framework, call each screen's initialiser on mount, clear the timer interval and kill the Draggable instances it created on unmount.

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