Pre-alphaThe registry and the CLI are not published yet.Roadmap
Compositions

Recipe Card

Recipe photo, name, time, servings and difficulty, ingredient chips and a cook button.

Tonight

Spicy choice
Thai red curryA fragrant, spicy curry with coconut milk, lemongrass and fresh Thai basil.
20 mins4 servingsMedium
Coconut milkBasil+8
Start cooking
Weeknight red curryThe same curry with pantry staples, ready in half the time.
12 mins2 servingsEasy
Coconut milkCurry paste+2
Start cooking

Recipe Card is designed for a vertical feed: each card takes the full width of the list, one recipe per row. There is no width to set.

Installation

npx axiom add recipe-card
pnpm dlx axiom add recipe-card
yarn dlx axiom add recipe-card
bun x axiom add recipe-card

Also copies: card, chip, badge, separator, icon, text, button and their dependencies. The file lands in components/compositions/recipe-card.tsx. It brings no tokens of its own.

The stat icons come from your icon registry. Add the ones you use to icons.tsx, for example with expo-symbols:

components/ui/icons.tsx
timer: symbol("clock", "schedule"),
servings: symbol("person.2", "group"),
difficulty: symbol("flame", "local_fire_department"),

Usage

import { RecipeCard } from "@/components/compositions/recipe-card";

<RecipeCard
	title="Thai red curry"
	description="A fragrant, spicy curry with coconut milk, lemongrass and fresh Thai basil."
	image={{ uri: recipe.photo }}
	badge="Spicy choice"
	stats={[
		{ icon: "timer", value: "20", label: "mins" },
		{ icon: "servings", value: "4", label: "servings" },
		{ icon: "difficulty", value: "Medium" },
	]}
	ingredients={recipe.ingredients}
	onPress={() => router.push(`/recipes/${recipe.id}`)}
	onAction={() => router.push(`/recipes/${recipe.id}/cook`)}
/>;

Props

PropTypeDefaultDescription
titlestring—Name of the recipe, shown as the card title.
descriptionstring—Up to two lines under the title.
imageImageSourcePropType—The dish, in 4:3 at the top of the card.
badgestring—Short label in a highlight Badge, on the photo: "Spicy", "Quick".
statsRecipeStat[]—{ icon?, value, label? }: time, servings, difficulty. Shown as “20 mins”, between lines. Three fit.
ingredientsstring[]—Shown as filled Chips. The first SHOWN_INGREDIENTS (2, a constant in the file) show; the rest are counted in a “+n” chip, read as “n more ingredients”.
actionLabelstring"Start cooking"Label of the action button.
onAction() => void—Shows the full-width button. Without it, there is no button.
onPress() => void—Makes the whole card pressable, to open the recipe. The button keeps its own press.
styleStyleProp<ViewStyle>—Extra styles for the card container, for example a margin.

Built with

  • Card: the elevated surface, its media, header and title.
  • Chip: the ingredients, filled and sm.
  • Badge: the highlight label.
  • Separator: the lines around and between the stats.
  • Icon: the stat icons, from your registry.
  • Button: the full-width action.
  • Text: the description and the stats.

Used in

No block uses Recipe Card yet.