ComponentsSite blocks

Menu / price list

Restaurant menus and spa or salon price lists — also a QR-menu page. Each category is a labelled section with a sticky jump bar of plain anchors, prices are tabular and formatted by Intl (the full currency name for screen readers), tags are words (never emoji), the 14 EU allergens are localized, unavailable items say “Not today” instead of a strikethrough and missing prices read “Market price”. Zero JavaScript.

blocks/site/menu-list.tsx, blocks/site/registry-2.ts, styles/blocks.csstheme · material · accent · density · font

Menu

Prices in Turkish lira, VAT included. No service charge is added to the bill.

Installation

$ pnpm add @vamos-ui/react

The whole kit as one package — get updates by bumping the version. Add the styles to globals.css: @import "@vamos-ui/react/styles.css";

Usage

import { MenuList } from "@vamos-ui/react/blocks";

<MenuList
  title="Tonight at *Kıyı*"
  priceNote="Prices include VAT. No service charge is added."
  categories={[{ title: "Cold meze", items: [
    { name: "Haydari", description: "Strained yoghurt, dill.", prices: [{ amount: { amount: "180", currency: "TRY" } }], tags: ["vegetarian"], allergens: ["milk"] },
  ] }]}
/>

Examples

Photo (brunch)

A 72px square photo per item; items without one keep the column.

Served Saturdays and Sundays, 09:00–14:00. VAT included.

Service list (spa, Turkish)

Service · duration · price rows; several durations become small columns; “Randevu” links are named after the service.

Fiyat listesi

Fiyatlara KDV dahildir. Randevuya 15 dakika önce gelmenizi rica ederiz.

QR menu at phone width

The category bar scrolls horizontally and sticks under the top edge.

VAT included.

Full menu page (restaurant, Turkish)

The whole menu on the site itself instead of a link to an external QR menu: headingLevel={1} gives h1 → h2 categories → h3 dishes; dietary tags, allergens, several prices, market price, “Bugün yok”.

Kıyı Meyhane · Moda

Menü

Mezeler her sabah, balık günün tezgâhından.

Fiyatlara KDV dahildir; servis ücreti eklenmez. Alerjen bilgisi için ekibimize danışın.

API

MenuList

PropTypeDefault
variant
Layout.
"classic" | "photo" | "service-list""classic"
categories
Empty categories are hidden (shown in edit mode).
{ title; note?; anchor?; items: MenuItem[] }[]—
categories[].items
{ name, description?, prices: { label?, amount?: Money }[] (1–4), duration?, tags?, allergens?, image?, unavailable?, bookHref? }
MenuItem[]—
tags
Rendered as accent-ink words (MENU_TAGS). vegan, vegetarian, gluten-free, dairy-free and halal also map to schema.org suitableForDiet.
("vegetarian" | "vegan" | "gluten-free" | "dairy-free" | "nut-free" | "halal" | "spicy" | "new" | "chef-pick" | "to-share" | "seasonal")[]—
allergens
gluten, crustaceans, eggs, fish, peanuts, soybeans, milk, nuts, celery, mustard, sesame, sulphites, lupin, molluscs.
Allergen[]—
priceNote
Tax / service note (required by the house rules).
ReactNode—
showNav
Sticky category jump bar.
booleanmore than 2 categories
bookHref
service-list: booking page for every row.
string—
showAllergens
Allergen line under items.
booleantrue
labels / locale
Tag and allergen names, Market price, Not today, Book.
Partial<Site2Labels> / string—
headingLevel
Outline level of the title; categories and dishes follow (1 → h2 categories, h3 dishes — a whole menu page). Without a title, categories take this level.
1 | 2 | 32
categories[].items[].image
photo variant: 72px square, sizes="72px".
SiteImage—
theme / anchor / id / className / components / editMode
Shared block props.
BlockBaseProps—

menuJsonLd({ categories, name? })

PropTypeDefault
returns
schema.org Menu → MenuSection → MenuItem + Offer (+ suitableForDiet).
object—