{"slug":"carafe","name":"Carafe – All-Day Café & Bistro","version":"1.0.0","category":"local business","priceCents":1800,"ui_library":{"version":"1.5.1","files":["html/src/js/_tt/accordion-disclosure.js","html/src/js/_tt/announce.js","html/src/js/_tt/copy-button.js","html/src/js/_tt/dialog.js","html/src/js/_tt/field-ids.js","html/src/js/_tt/field.js","html/src/js/_tt/focusables.js","html/src/js/_tt/form-error-summary.js","html/src/js/_tt/form.js","html/src/js/_tt/layer.js","html/src/js/_tt/mode.js","html/src/js/_tt/pending.js","html/src/js/_tt/presence.js","html/src/js/_tt/reduced-motion.js","html/src/js/_tt/roving.js","html/src/js/_tt/sheet-drawer.js","html/src/js/_tt/tabs.js","src/components/ui/_tt/accordion-disclosure.axes.ts","src/components/ui/_tt/accordion-disclosure.fixtures.ts","src/components/ui/_tt/accordion-disclosure.tsx","src/components/ui/_tt/anchor.ts","src/components/ui/_tt/capture.ts","src/components/ui/_tt/card-panel.axes.ts","src/components/ui/_tt/card-panel.fixtures.ts","src/components/ui/_tt/card-panel.tsx","src/components/ui/_tt/dropdown-menu.axes.ts","src/components/ui/_tt/dropdown-menu.fixtures.ts","src/components/ui/_tt/dropdown-menu.tsx","src/components/ui/_tt/field-ids.ts","src/components/ui/_tt/field.axes.ts","src/components/ui/_tt/field.capture.ts","src/components/ui/_tt/field.fixtures.ts","src/components/ui/_tt/field.tsx","src/components/ui/_tt/focusables.ts","src/components/ui/_tt/form-error-summary.axes.ts","src/components/ui/_tt/form-error-summary.fixtures.ts","src/components/ui/_tt/form-error-summary.tsx","src/components/ui/_tt/form.axes.ts","src/components/ui/_tt/form.fixtures.ts","src/components/ui/_tt/form.part.tsx","src/components/ui/_tt/form.ts","src/components/ui/_tt/host.ts","src/components/ui/_tt/ids.ts","src/components/ui/_tt/layer.ts","src/components/ui/_tt/layout-effect.ts","src/components/ui/_tt/presence.ts","src/components/ui/_tt/recipe.ts","src/components/ui/_tt/reduced-motion.ts","src/components/ui/_tt/roving.ts","src/components/ui/_tt/sheet-drawer.axes.ts","src/components/ui/_tt/sheet-drawer.fixtures.ts","src/components/ui/_tt/sheet-drawer.tsx","src/components/ui/_tt/tabs.axes.ts","src/components/ui/_tt/tabs.fixtures.ts","src/components/ui/_tt/tabs.tsx"]},"license":"standard","description":"Carafe is a cafe website template built in Tailwind and React for an independent all-day café or bistro, and for the freelancer or two-person agency handing one over on a fixed fee. Its signature is the clipped slip. The menu card is set once a season; today's soup, a dish that sold through, the terrace closing for the season and “weekend brunch is walk-in only until the 27th” are dated paper sheets clipped over the card's corner, each one striking the row underneath it, hiding that row's photograph, and disappearing by itself the moment it expires. A slip is data rather than a notice: it carries a kind, a target, a date window and its typed lines, and slipsFor() throws at build time on an orphan target, a replaced dish the target service does not serve, an unknown hours row, a policy on a service that takes no bookings, or a window that ends before it starts. Thirteen routes ship. Five public pages, each of them built in both languages: a home page that opens on whichever of the five services is being served at the hour a visitor arrives, the whole card by time of day, hours and access and house rules, the booking policy, and the privacy notice. Then three that stay in one language: an editing guide, a living component styleguide, and a 404 that still says what is on. The fixture is one spine. Mireille, a 34-seat café-bistro on rue Beaubien Est in Rosemont, Montréal, with a bilingual card of 52 items across 10 sections and 5 services, 12 of them photographed and 40 rendered as type-only rows, because a menu component that only survives a dozen dishes with pictures has not been tested. Every figure on every page resolves through that one file: open until 17:00, laptops away until 14:30, the second batch of kouign-amann at 14:30 and usually gone by 11:00, the washed Sidamo that went on the grinder last Tuesday, and “card last changed Mon 14 Sep”, which is the maximum modified date over the whole card rather than a line somebody remembers to update. The editing guide is a route, not a PDF. /handover renders the six bands of the home page live under numbered stamps, maps every region on screen to the fixture field that fills it and the WordPress screen that will edit it, walks the four editing tasks a café owner performs after handover, shows all five slip kinds beside the five shapes the build refuses to draw, and states six boundaries plainly. The fixture is shaped as that content model key by key, so the WordPress block theme and its companion plugin are a port rather than a rewrite. Three presets ship as token swaps with identical composition: Zinc, a Paris-style zinc bar in stamp red; Cresson, a morning-and-brunch café in watercress green with a blush slip; Faïence, a tiled bakery-café in enamel cobalt with an apricot slip. Each is one attribute on the root element, and each was authored in OKLCH and verified pair by pair in light and dark across 84 tokens per mode. Twenty-two photographs were generated for this theme and ship with it: one counter at five hours of one day, twelve dishes, the room, the façade and its terrace, the grinder, and the same counter wiped down at dusk. The hero sets its type straight onto the photograph with no gradient scrim, because the overlay region of every plate that can be a hero was measured on the encoded file instead. Self-hosted Brygada 1918, Radio Canada and Sometype Mono, three faces for three materials: the card is typeset, the slip is typed, the chrome is UI. Built for Tailwind v4, Next.js 15 and React 19, with every colour, size, radius and face in theme.css. What it does not do is as deliberate. No cart, no checkout, no delivery, no PDF menu, no star ratings, no Instagram embed, no gift-card commerce, and no claim about a table being free. Booking is one documented provider seam plus a link to the café's own reservation page; takeaway is the same shape, a named link-out with the commission-free direct option stated, and no order form. A gift voucher is an enquiry, written by hand at the counter. Three things the build earns and states: no third-party script anywhere, so the site needs no cookie banner; access facts a wheelchair user can act on, a door 86cm wide, a washroom door of 80cm with a grab rail and tables at 74cm; and every photograph generated for this theme, with no stock. The site is bilingual fr-CA and en-CA from one string layer and one component tree, French served under /fr with a dropdown switch in the header on every page, foreign-language runs marked so a screen reader says them correctly on either build, and the enquiry form ships a Law 25 privacy notice in both languages naming what it collects, who reads it and how long it is kept.","summary":"For an all-day café or bistro: a cafe website template tailwind where the card is set once a season and today's changes are dated slips that expire themselves.","tags":["cafe website template tailwind","all-day cafe website template","bistro website template react","coffee shop website template nextjs","brunch restaurant website template"],"accent_mode":"second-hue","palette":{"bg":"#e7e1d9","surface":"#fdfaf6","accent":"#efc848","text":"#201b16","line":"#cfc7bf"},"darkMode":true,"pages":[{"path":"/","title":"Mireille — all-day café and bistro","sections":["site-header","hero-served","served-card","on-the-grinder","visit-strip","site-footer"]},{"path":"/menu","title":"The card, by time of day","sections":["site-header","menu-index","menu-dayparts","menu-drinks","site-footer"]},{"path":"/visit","title":"Hours, access and how to get in","sections":["site-header","hours-card","house-rules","find-us","site-footer"]},{"path":"/book","title":"Booking a table, and what is walk-in","sections":["site-header","booking-policy","booking-seam","site-footer"]},{"path":"/notices","title":"Personal information, and what we do with it","sections":["site-header","notices","site-footer"]},{"path":"/fr","title":"Mireille — café-bistro, du matin au soir","sections":["site-header","hero-served","served-card","on-the-grinder","visit-strip","site-footer"],"editions":["react"]},{"path":"/fr/menu","title":"La carte, par moment de la journée","sections":["site-header","menu-index","menu-dayparts","menu-drinks","site-footer"],"editions":["react"]},{"path":"/fr/visit","title":"Heures, accès et comment entrer","sections":["site-header","hours-card","house-rules","find-us","site-footer"],"editions":["react"]},{"path":"/fr/book","title":"Réserver une table, et ce qui est sans réservation","sections":["site-header","booking-policy","booking-seam","site-footer"],"editions":["react"]},{"path":"/fr/notices","title":"Renseignements personnels, et ce que nous en faisons","sections":["site-header","notices","site-footer"],"editions":["react"]},{"path":"/handover","title":"Editing guide","kind":"document","sections":["site-header","handover-map","handover-tasks","handover-slips","handover-limits","site-footer"]},{"path":"/components","title":"The parts, unassembled","sections":["site-header","token-sheet","site-footer"]},{"path":"/404","title":"That page is not on the card","sections":["site-header","not-found","site-footer"]}],"components":[{"name":"booking-policy","file":"src/components/booking-policy.tsx","renders":"The opener of /book: the booking policy as a card, one row per service with its hours and whether it takes a table, the live policy slip clipped to the corner striking the brunch row with its stamped mark, and the party limit, the group threshold and the fifteen-minute hold in the card's second column."},{"name":"booking-seam","file":"src/components/booking-seam.tsx","renders":"The seam by site.booking.mode: the partner widget in its container, the filled link-out, or the walk-in statement, each with the fallback link under it; the two-top supper photograph beside it; and the enquiry block with the group and voucher policy."},{"name":"enquiry-form","file":"src/components/enquiry-form.tsx","renders":"The theme's one form: a subject select, name, email, party size and date, with the café's own sentence per constraint, the typed error summary, focus moved to the summary or the single failing control, and a receipt that says a table is not held until somebody answers."},{"name":"find-us","file":"src/components/find-us.tsx","renders":"The close of /visit: the bus, the metro, where parking is free, the bike racks, the door's width, the washroom and the room's tables, the phone and the email, the room photograph, the address in a copyable block with its coordinates, and the repeated Get directions beside the geo: handoff."},{"name":"handover-annotation","file":"src/components/handover-annotation.tsx","renders":"The annotation parts /handover is drawn with: the numbered stamp in the slip's own stamp-red mono, the two column heads, the typed where-list that pairs a file or screen with its fields, and the flat caveat panel a boundary is stated in."},{"name":"handover-limits","file":"src/components/handover-limits.tsx","renders":"Six boundaries as native disclosures, closed: the companion plugin, dark mode, translation, the unconfirmed booking provider, the two demo routes that never become templates, and how a cached page still knows what is being served."},{"name":"handover-map","file":"src/components/handover-map.tsx","renders":"The annotated render: the six bands of / rendered live under their own numbered stamps, the menu card drawn part by part with its stamps in the margin, and every one of the twelve regions mapped to the fixture field that fills it and the WordPress screen that will edit it."},{"name":"handover-slips","file":"src/components/handover-slips.tsx","renders":"The five slip kinds, each as the real sheet from the fixture beside the job it does, the effect it has on the card, and the fields that write it in both builds, plus the five shapes the build refuses to draw."},{"name":"handover-tasks","file":"src/components/handover-tasks.tsx","renders":"The four editing tasks from the buyer research, walked end to end in two columns: update a dish, change a price, replace an image with its crop and focal point, and point a visitor at a reservation. Two carry the caveat that the port cannot do the same thing."},{"name":"hero-served","file":"src/components/hero-served.tsx","renders":"Hero archetype A4: the full-bleed counter photograph of whatever daypart is being served, the served-now chip, the derived daypart clause in Brygada italic, the filled Get directions action and the walk-in reassurance line. At 375 the picture is a 4:5 crop and the words sit under it, on zinc."},{"name":"hours-card","file":"src/components/hours-card.tsx","renders":"The opener of /visit: the façade and terrace photograph beside the heading, and the week as a card with every live hours slip clipped on, the terrace row struck, today's row marked, and the between-services gap and the last order derived onto the card's foot."},{"name":"house-rules","file":"src/components/house-rules.tsx","renders":"Laptops at all five services from the daypart table with the right-now clause lifted out of it, the dog, terrace and children rules, the group threshold, and the reason behind the laptop rule in a native disclosure."},{"name":"menu-dayparts","file":"src/components/menu-dayparts.tsx","renders":"The five daypart bands in stacked layout, each opening on its 21:9 counter plate and carrying a card of thumbnail rows cropped by each dish's measured focal point, with the day's slips clipped on, the replaced row struck and un-photographed, and the service's number as the card's mark."},{"name":"menu-drinks","file":"src/components/menu-drinks.tsx","renders":"The closing band: the nine drinks served at every hour, printed once instead of on all five cards, with their add-on pricing. No plate and no slip, so the page ends on type."},{"name":"menu-index","file":"src/components/menu-index.tsx","renders":"The opener of /menu: the five services as a numbered contents page, each row carrying its days and hours, its dish count, its price range and whether it is served now, today or not today, over the card's front matter (the allergy statement, the tax note and the date the card last changed)."},{"name":"not-found","file":"src/components/not-found.tsx","renders":"The closed-counter photograph with the same measured overlay geometry the hero uses, the clock-free full-day state listing every service with its days and times, the week's hours, the address and the way back to the card."},{"name":"on-the-grinder","file":"src/components/on-the-grinder.tsx","renders":"Today's espresso and filter with roaster, origin, process and since-date, the bake batches with their authored usually-gone times, and the square grinder photograph."},{"name":"served-card","file":"src/components/served-card.tsx","renders":"The served daypart's card in switcher layout with type-only rows: folder tabs for all five dayparts (the ones not served today present and disabled), today's slips clipped to the card's top-right corner, the replaced row struck and stamped, the soup's description supplied by the special slip, and the freshness stamp on the card foot."},{"name":"notices","file":"src/components/notices.tsx","renders":"/notices: the six fields the enquiry form collects as a card, one row each with what the field is for, the named person responsible and the retention window beside them, then five closed native disclosures answering what the café does with it, the rights, who else sees it, why there is no cookie banner, and what can be promised about an allergy."},{"name":"ui/structured-data","file":"src/components/ui/structured-data.tsx","renders":"One CafeOrCoffeeShop JSON-LD node per indexable route, derived from the same fixture the page draws: the address and the real coordinates, the weekly hours read off the daypart table, the dated closures read off the hours slips, and on /menu the whole card as a Menu of ten MenuSections and fifty-two MenuItems with CAD offers."},{"name":"ui/diet-filter","file":"src/components/ui/diet-filter.tsx","renders":"/menu's four dietary marks as a button group with the AND rule stated beside it, a live count of the rows that match, a per-band count in every card head, and a clear control that returns focus to the first mark. Every row stays in the document; nuts are marked and never filtered."},{"name":"ui/locale-switch","file":"src/components/ui/locale-switch.tsx","renders":"The language switch in two forms from one list: a dropdown in the header showing the language you are reading (EN and a chevron) whose open list carries both, the active one checked, and a flat pair of links in the footer and the narrow-width nav panel. Every option is a real link to the same page in the other language, carrying lang and hreflang, with the abbreviation aria-hidden beside the language's own name for a screen reader. A site with one locale renders nothing."},{"name":"site-footer","file":"src/components/site-footer.tsx","renders":"The week's hours from the one hours record, the address block, the freshness stamp (\"Card last changed Mon 14 Sep\"), the tax note and the two demo-only editing links."},{"name":"site-header","file":"src/components/site-header.tsx","renders":"The site header: wordmark, the three primary routes with aria-current, the derived open-status dot, the language dropdown, a quiet Book a table action and the mode toggle. The status moves under the bar at 375 and the language switch moves into the nav panel below md, rather than either being dropped."},{"name":"token-sheet","file":"src/components/token-sheet.tsx","renders":"The styleguide's token panel: surfaces, ink, the slip's own non-inverting material, status, the 1.250 type ladder and the three presets, every swatch reading its live custom property."},{"name":"ui/accordion-disclosure","file":"src/components/ui/accordion-disclosure.tsx","renders":"Vendored library part: a native <details> row for a paragraph the reader may want, with a rotating hairline marker and a crawlable panel."},{"name":"ui/button","file":"src/components/ui/button.tsx","renders":"Filled, quiet and ghost, with hover, active, disabled and pending states. Carries data-cta so the CTA check can tell the hero's one primary from the header's quiet action."},{"name":"ui/card-panel","file":"src/components/ui/card-panel.tsx","renders":"Vendored library part: the white-stock, square-cornered, hairline card every menu, hours and booking card is drawn in, with an optional muted header mark and a bleed extent."},{"name":"ui/chip","file":"src/components/ui/chip.tsx","renders":"The served-now chip — the theme's one full-radius object, on the accent, with an ink label at 11.79:1."},{"name":"ui/clipped-card","file":"src/components/ui/clipped-card.tsx","renders":"The signature's geometry: a card whose masthead shares its row with the day's slips and whose rows come after both, the sheets overhanging the right edge by 24px and crossing the top hairline by the clip alone, with nothing absolutely positioned so no gesture and no edition can misplace a slip."},{"name":"ui/copy-line","file":"src/components/ui/copy-line.tsx","renders":"The address in mono on a recessed ground, selectable whole, with one button that copies it, a polite status line beside the button, and a selection fallback when the clipboard is refused."},{"name":"ui/dietary-mark","file":"src/components/ui/dietary-mark.tsx","renders":"The V, VG, GF, DF and N letters printed beside a dish, as <abbr>, plus the expanded key printed once per card."},{"name":"ui/field","file":"src/components/ui/field.tsx","renders":"Vendored library part: label, optional marker, one message line, and rest, invalid, valid, read-only and disabled states on a recessed --field ground."},{"name":"ui/form","file":"src/components/ui/form.tsx","renders":"Vendored library part: the group-enquiry form's submission, fieldset and receipt region."},{"name":"ui/ground","file":"src/components/ui/ground.tsx","renders":"The ground layer: a grayscale drawing read as a luminance mask over a --texture-ink layer, so the file carries no colour and one asset serves both modes and all three presets."},{"name":"ui/form-error-summary","file":"src/components/ui/form-error-summary.tsx","renders":"Vendored library part: the typed summary that names every failed field and moves focus to it, in the critical role with an icon and the words."},{"name":"ui/hours-row","file":"src/components/ui/hours-row.tsx","renders":"One row of the hours record, with the today state and the struck state an hours slip puts it in."},{"name":"ui/input","file":"src/components/ui/input.tsx","renders":"The text, textarea and select control recipe, identified by its recessed ground and its label rather than by its border. The select keeps the native control and replaces only the platform arrow, with one chevron from the ladder."},{"name":"ui/item-row","file":"src/components/ui/item-row.tsx","renders":"One row of the card, in both variant states (type-only and 96px thumbnail), with the superseded state that strikes the row, stamps the slip mark in the price column and hides the thumbnail."},{"name":"ui/logo","file":"src/components/ui/logo.tsx","renders":"The wordmark in Brygada italic, with the brand name wrapped for rebrand-before-buy."},{"name":"ui/mode-toggle","file":"src/components/ui/mode-toggle.tsx","renders":"Light and dark written to <html> and remembered, with an accessible name that changes with the state and no server-side guess."},{"name":"ui/nav","file":"src/components/ui/nav.tsx","renders":"The three primary routes, with aria-current and an underline carrying the open route."},{"name":"ui/slip","file":"src/components/ui/slip.tsx","renders":"The signature: a square sheet of thin coloured paper held by a flat two-rectangle clip, typed in mono with a stamp-red date box and a posted-by line, in all five kinds. Plus the stamped mark a superseded row carries."},{"name":"ui/status-dot","file":"src/components/ui/status-dot.tsx","renders":"\"Open until 17:00\" — a graphic-tier dot and the derived sentence beside it, so the distinction is never colour alone."},{"name":"ui/tabs","file":"src/components/ui/tabs.tsx","renders":"Vendored library part: the daypart switcher as folder tabs cut into the card's top edge, with roving focus and the selected tab losing its bottom hairline."},{"name":"ui/text-link","file":"src/components/ui/text-link.tsx","renders":"A link in prose on its own --link role, with the underline as the affordance."},{"name":"visit-strip","file":"src/components/visit-strip.tsx","renders":"The address as the heading, the transit, access, laptop and dog rules, the phone, today's hours row and the terrace row struck by its hours slip, the booking line derived from the booking rows minus any live policy slip, and the end repeat of Get directions."},{"name":"ui/sheet-drawer","file":"src/components/ui/sheet-drawer.tsx","renders":"The narrow-width navigation panel: card stock arriving from the top edge over one veil, with a dialog role, a focus trap, Escape, a scroll lock and no entrance."},{"name":"ui/mobile-nav","file":"src/components/ui/mobile-nav.tsx","renders":"The header's md:hidden menu: a 44px trigger and the three routes as 56px rows, each with the one clause that says what it leads to, over the two languages listed flat and a quiet Book a table."},{"name":"ui/dropdown-menu","file":"src/components/ui/dropdown-menu.tsx","renders":"The theme's one menu, on the card's own stock: square, hairline, unlifted, placed rather than animated. Two radio rows with the check column reserved on both so the labels do not shift, each row a real link, the active one checked; arrows move, Home and End jump, a letter jumps, Enter chooses, Tab and Escape close and return focus to the trigger."}],"tokens":{"--background":"#e7e1d9","--foreground":"#201b16","--card":"#fdfaf6","--card-foreground":"#201b16","--secondary":"#d6cfc6","--secondary-foreground":"#201b16","--muted":"#f1ece5","--muted-foreground":"#605953","--border":"#cfc7bf","--primary":"#ca1001","--primary-foreground":"#ffffff","--primary-hover":"#ac0a00","--primary-active":"#8f0700","--accent":"#efc848","--accent-foreground":"#201b16","--link":"#933b23","--link-hover":"#802910","--ring":"#094d9a","--field":"#f3efeb","--field-border":"#a49d96","--control-border":"#766f66","--selection":"#ead8ab","--selection-foreground":"#201b16","--selection-border":"#856d30","--positive":"#1c6734","--positive-foreground":"#ffffff","--positive-soft":"#dff3e2","--positive-border":"#9dcaa5","--positive-fill":"#167e3c","--warning":"#874e01","--warning-foreground":"#ffffff","--warning-soft":"#fdead6","--warning-border":"#dcb48d","--warning-fill":"#a76200","--critical":"#852132","--critical-foreground":"#ffffff","--critical-soft":"#fee4e5","--critical-border":"#e6a9ab","--critical-fill":"#96283a","--slip":"#ffe9b2","--slip-ink":"#261f16","--slip-muted":"#5c5245","--slip-stamp":"#932412","--slip-edge":"#bfaa77","--clip":"#261f16","--on-photo":"#f9f6f2","--shadow-color":"#18130d","--texture-ink":"rgb(24 19 13 / 0.065)","--texture-ink-card":"rgb(24 19 13 / 0.059)","--radius":"0.25rem","--radius-card":"0rem","--radius-chip":"9999px","--icon-stroke":"1.5","--ease-house":"cubic-bezier(0.2, 0, 0, 1)","--duration-micro":"120ms","--duration-state":"150ms","--duration-settle":"180ms","--distance-settle":"4px","--text-caption":"0.75rem","--leading-caption":"1.4","--text-small":"0.875rem","--leading-small":"1.45","--text-body":"1rem","--leading-body":"1.55","--text-lead":"1.125rem","--leading-lead":"1.6","--text-d1":"1.5rem","--leading-d1":"1.25","--tracking-d1":"-0.005em","--text-d2":"1.875rem","--leading-d2":"1.2","--tracking-d2":"-0.01em","--text-d3":"clamp(1.875rem, 1.6rem + 1.4vw, 2.34375rem)","--leading-d3":"1.15","--tracking-d3":"-0.012em","--text-d4":"clamp(2.125rem, 1.7rem + 2.2vw, 2.9296875rem)","--leading-d4":"1.1","--tracking-d4":"-0.015em","--tracking-label":"0.08em","--weight-display":"500","--font-display":"var(--font-carafe-display), Iowan Old Style, Georgia, serif","--font-text":"var(--font-carafe-text), ui-sans-serif, system-ui, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-carafe-mono), ui-monospace, 'Courier New', monospace"},"tokensDark":{"--background":"#16120e","--foreground":"#e9e5de","--card":"#25201b","--card-foreground":"#e9e5de","--secondary":"#322d28","--secondary-foreground":"#e9e5de","--muted":"#1c1814","--muted-foreground":"#a39d96","--border":"#423d37","--primary":"#da2d1d","--primary-foreground":"#ffffff","--primary-hover":"#c60d00","--primary-active":"#ab0a00","--accent":"#dbb73f","--accent-foreground":"#261f16","--link":"#ed8b74","--link-hover":"#ff9d85","--ring":"#77aaef","--field":"#110d09","--field-border":"#58534c","--control-border":"#756f68","--selection":"#3d2e04","--selection-foreground":"#e9e5de","--selection-border":"#a38948","--positive":"#6fc884","--positive-foreground":"#16120e","--positive-soft":"#172a1b","--positive-border":"#34613f","--positive-fill":"#50b76c","--warning":"#eeac5a","--warning-foreground":"#16120e","--warning-soft":"#31210f","--warning-border":"#704c23","--warning-fill":"#dd9231","--critical":"#f17883","--critical-foreground":"#16120e","--critical-soft":"#351b1d","--critical-border":"#7b4246","--critical-fill":"#d45765","--slip":"#ffe9b2","--slip-ink":"#261f16","--slip-muted":"#5c5245","--slip-stamp":"#932412","--slip-edge":"#a79260","--clip":"#918b83","--on-photo":"#f9f6f2","--shadow-color":"#040201","--texture-ink":"rgb(206 194 176 / 0.128)","--texture-ink-card":"rgb(206 194 176 / 0.144)","--radius":"0.25rem","--radius-card":"0rem","--radius-chip":"9999px","--icon-stroke":"1.5","--ease-house":"cubic-bezier(0.2, 0, 0, 1)","--duration-micro":"120ms","--duration-state":"150ms","--duration-settle":"180ms","--distance-settle":"4px","--text-caption":"0.75rem","--leading-caption":"1.4","--text-small":"0.875rem","--leading-small":"1.45","--text-body":"1rem","--leading-body":"1.55","--text-lead":"1.125rem","--leading-lead":"1.6","--text-d1":"1.5rem","--leading-d1":"1.25","--tracking-d1":"-0.005em","--text-d2":"1.875rem","--leading-d2":"1.2","--tracking-d2":"-0.01em","--text-d3":"clamp(1.875rem, 1.6rem + 1.4vw, 2.34375rem)","--leading-d3":"1.15","--tracking-d3":"-0.012em","--text-d4":"clamp(2.125rem, 1.7rem + 2.2vw, 2.9296875rem)","--leading-d4":"1.1","--tracking-d4":"-0.015em","--tracking-label":"0.08em","--weight-display":"500","--font-display":"var(--font-carafe-display), Iowan Old Style, Georgia, serif","--font-text":"var(--font-carafe-text), ui-sans-serif, system-ui, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-carafe-mono), ui-monospace, 'Courier New', monospace"},"compatibility":{"next":">=15 <17","react":">=19 <20","tailwind":">=4 <5"},"dependencies":["lucide-react"],"editions":{"react":{"source":"src","runtime":"react"},"html":{"source":"html/src","output":"html/dist","engine":"nunjucks","runtime":"vanilla","buildRequired":false}},"design":{"typefaces":{"display":"Brygada 1918","text":"Radio Canada","mono":"Sometype Mono"},"typeRatio":1.25,"signature":"The clipped slip: a square sheet of thin coloured paper held by a flat two-rectangle clip over a menu card's top-right corner, typed in mono with a stamp-red date box, bound to data by kind, target and a date window. A replaces, hours or policy slip strikes the row beneath it and hides that row's thumbnail; an expired slip disappears and the card underneath is the truth again. slipsFor() throws at build on an orphan target, a replaced dish not served in that daypart, an unknown hours row, a policy on an unbookable daypart, or an inverted date window. It recurs on /, /menu, /visit, /book and /components, each with a visible supersede.","heroArchetype":"A4","sanctionedDeviation":"The display face sets body copy inside the menu card only: dish names and descriptions are both Brygada 1918, because a printed menu is one typeset face. It buys three materials reading as three faces with no decoration — the card typeset, the slip typed, the chrome UI.","motionPersonality":"near-static: paper is set down, not animated","undertone":"a zinc counter at midday, stamp red on cool grey","surface_kind":"marketing","built_against":"2026-09-16","recipe":{"primary":"the printed menu card","secondary":"the clipped day slip"},"brand_pyramid":["current","printed","unfussy"],"levers":{"theme":"light","density":"comfortable","accent_mode":"duotone","motion":"still","borders":"hairline","radius":"zero","texture":"grain","shadow":"raised-only"},"icons":{"set":"lucide","stroke":1.5,"ladder":["size-4","size-5","size-6"],"contexts":{"nav":"glyph","panel_header":"mark","fact_row":"none","feature_grid":"none"}},"disclosure":{"helper_line":"one-clause","sentence":"hint","paragraph":"details","parallel_views":"tabs","secondary_object":"route"},"cta":{"header":"quiet","hero":"filled","repeats":["end"],"mobile":"inline"},"colour_budget":{"brand_max_pct":null,"concentration_pct":70,"regions":["hero-overlay","slip"]},"exemplars":[{"name":"a bistro's printed carte with a dated insert","slice":"the permanent card plus an override that expires, never a redesign"},{"name":"a gate-change slip clipped over a printed schedule","slice":"a dated paper override that strikes one row and leaves the rest true"}],"anti_list":["hero sliders, parallax, autoplay video, Ken Burns","gold serif on black moody fine dining","warm cream with an orange accent, the coffee-bean beige cafe landing","breakfast/lunch/dinner tabs that ignore the hour","invented social proof, star ratings, review counts","Instagram grids, newsletter pop-ups, AI chat widgets","overhead flat-lay dish grids","chalkboard textures, handwriting faces, rotated casual slips","PDF or image menus","a cart, online ordering or a confirmed reservation"],"strict":["harmony","disclosure"]}}