#!/usr/bin/env python3
"""
SHIRAZ KITCHEN & WINE BAR — The Cellar Book
Spring 2026 Edition · Michelin-level design elevations
"""
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib.colors import HexColor, Color
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.utils import ImageReader
import sys, os, math
pdfmetrics.registerFont(TTFont('Lora', '/usr/share/fonts/truetype/google-fonts/Lora-Variable.ttf'))
pdfmetrics.registerFont(TTFont('Lora-Italic', '/usr/share/fonts/truetype/google-fonts/Lora-Italic-Variable.ttf'))
pdfmetrics.registerFont(TTFont('Poppins-Medium', '/usr/share/fonts/truetype/google-fonts/Poppins-Medium.ttf'))
pdfmetrics.registerFont(TTFont('Poppins-Light', '/usr/share/fonts/truetype/google-fonts/Poppins-Light.ttf'))
pdfmetrics.registerFont(TTFont('Poppins-LightItalic', '/usr/share/fonts/truetype/google-fonts/Poppins-LightItalic.ttf'))
pdfmetrics.registerFont(TTFont('UnivRoman', 'UniversityRoman_Bd_Bt.ttf'))
SER="Lora"; SER_I="Lora-Italic"; SAN="Poppins-Light"; SAN_M="Poppins-Medium"; BRAND="UnivRoman"
PW,PH=letter; ML=0.65*inch; MR=0.65*inch; MT=0.6*inch; MB=0.7*inch
CW=PW-ML-MR; CX=PW/2; RX=PW-MR
NOIR=HexColor("#0D0B07"); INK=HexColor("#211E17"); CHARCOAL=HexColor("#302A22")
TOBACCO=HexColor("#5F5545"); STONE=HexColor("#7D7060"); FAWN=HexColor("#9D8D7A")
GOLD=HexColor("#8B7D5E"); DUST=HexColor("#DBC9B2"); IVORY=HexColor("#F7F2EA")
WINE=HexColor("#6B2D3C")
def gold_a(a): return Color(0.545,0.490,0.369,a)
def dust_a(a): return Color(0.859,0.788,0.698,a)
class CellarBook:
def __init__(s,fn):
s.c=canvas.Canvas(fn,pagesize=letter); s.c.setTitle("Shiraz Kitchen & Wine Bar - The Cellar Book")
s.pg=0; s.y=PH-MT; s._w=False
def new_page(s):
if s.pg>0: s.c.showPage()
s.pg+=1; s.y=PH-MT; s.c.setFillColor(IVORY); s.c.rect(0,0,PW,PH,fill=1,stroke=0)
def footer(s,wine=False):
c=s.c; c.setFont(BRAND,10); c.setFillColor(FAWN)
c.drawCentredString(CX,28,f"Shiraz Kitchen & Wine Bar \u00b7 {s.pg}")
if wine or s._w: c.setFont(SAN,6.5); c.setFillColor(GOLD); c.drawString(ML,16,"\u25c6 prestige selection")
def check(s,n):
if s.y-nx1:
s.c.setFillColor(dust_a(0.4)); s.c.setFont(SAN,4); x=x1
while x=500
c.setFont(SAN,9.5); c.setFillColor(STONE)
if cbn: c.drawString(ML,y+1.5,str(cbn))
c.drawString(ML+28,y+1.5,str(bn)); x=ML+58
if trophy: c.setFont(SAN,6); c.setFillColor(GOLD); c.drawString(x,y+2,"\u25c6"); x+=10
c.setFont(SER,12); c.setFillColor(CHARCOAL); c.drawString(x,y,name); nw=c.stringWidth(name,SER,12)
c.setFont(SER_I,9.5); c.setFillColor(TOBACCO); c.drawString(x+nw+6,y+0.5,str(vin)); vw=c.stringWidth(str(vin),SER_I,9.5)
ps=str(price); c.setFont(SAN,11); c.setFillColor(GOLD if trophy else CHARCOAL)
c.drawRightString(RX,y,ps); pw=c.stringWidth(ps,SAN,11); s._dots(x+nw+5+vw+8,RX-pw-6,y); s.y-=19
def spr(s,name,price):
s.check(16); c=s.c; y=s.y; c.setFont(SER,12); c.setFillColor(CHARCOAL); c.drawString(ML+8,y,name)
nw=c.stringWidth(name,SER,12); ps=str(price); c.setFont(SAN,11); c.setFillColor(CHARCOAL)
c.drawRightString(RX,y,ps); pw=c.stringWidth(ps,SAN,11); s._dots(ML+8+nw+6,RX-pw-6,y); s.y-=16
def si(s,t):
s.c.setFont(SER_I,8.5); s.c.setFillColor(FAWN); s.c.drawCentredString(CX,s.y,t); s.sp(12)
def ck_header(s,title,price=None):
s.check(30); c=s.c; y=s.y; g=6; c.setFont(BRAND,13); c.setFillColor(INK)
tw=c.stringWidth(title.upper(),BRAND,13); c.drawCentredString(CX,y,title.upper())
c.setStrokeColor(dust_a(0.5)); c.setLineWidth(0.3)
c.line(ML+0.8*inch,y+2,CX-tw/2-g,y+2); c.line(CX+tw/2+g,y+2,RX-0.8*inch,y+2); y-=18
if price: c.setFont(SER_I,9); c.setFillColor(TOBACCO); c.drawCentredString(CX,y,price); y-=18
s.y=y
def ck(s,name,desc,price=None):
s.check(32); c=s.c; y=s.y; label=name.upper()
if price: label+=" "+str(price)
c.setFont(SAN_M,11); c.setFillColor(CHARCOAL); c.drawCentredString(CX,y,label); y-=14
c.setFont(SER_I,9); c.setFillColor(TOBACCO); c.drawCentredString(CX,y,desc); y-=18; s.y=y
def ck_seasonal(s,name,tagline,desc,price):
s.check(46); c=s.c; y=s.y; c.setFont(SAN_M,11); c.setFillColor(CHARCOAL)
c.drawCentredString(CX,y,name.upper()+" "+str(price)); y-=14
c.setFont(SER_I,10.5); c.setFillColor(TOBACCO); c.drawCentredString(CX,y,tagline); y-=13
c.setFont(SER,9); c.setFillColor(STONE); c.drawCentredString(CX,y,desc); y-=18; s.y=y
def toc_entry(s,title,page):
c=s.c; y=s.y; c.setFont(SER,11); c.setFillColor(CHARCOAL); c.drawString(ML+0.4*inch,y,title)
c.setFont(SAN,11); c.drawRightString(RX-0.4*inch,y,str(page))
tw=c.stringWidth(title,SER,11); pw=c.stringWidth(str(page),SAN,11)
s._dots(ML+0.4*inch+tw+8,RX-0.4*inch-pw-8,y); s.y-=18
def toc_spacer(s): s.y-=10
def cover(s):
s.pg+=1; c=s.c; c.setFillColor(IVORY); c.rect(0,0,PW,PH,fill=1,stroke=0)
lp=os.path.join(os.path.dirname(__file__) or '.','logo_entry.png')
if os.path.exists(lp):
logo=ImageReader(lp); lw=3.0*inch; lh=lw*0.8; lx=CX-lw/2; ly=PH-MT-50-lh
c.drawImage(logo,lx,ly,lw,lh,mask='auto'); y=ly-20
else: y=PH/2+100
c.setFont(SAN,15); c.setFillColor(WINE); c.drawCentredString(CX,y,"T H E C E L L A R"); y-=28
c.setFont(SER_I,8.5); c.setFillColor(GOLD); c.drawCentredString(CX,y,"Wine Spectator Award of Excellence"); y-=32
s._motif(y+6); y-=22
c.setFont(SER_I,9.5); c.setFillColor(TOBACCO)
c.drawCentredString(CX,y,'\u201cBe happy for this moment. This moment is your life.\u201d'); y-=14
c.setFont(SAN,7); c.setFillColor(STONE); c.drawCentredString(CX,y,"\u2014 Omar Khayyam"); y-=30
c.setFont(SAN,8); c.setFillColor(STONE); c.drawCentredString(CX,y,"S P R I N G 2 0 2 6")
def welcome(s):
s.new_page(); c=s.c; s.sp(80); s._orn(s.y,gold_a(0.45),0.9); s.sp(30)
c.setFont(BRAND,10); c.setFillColor(GOLD); c.drawCentredString(CX,s.y,"A N O T E F R O M O U R C E L L A R"); s.sp(32)
for l in ["In my mother Iran\u2019s kitchen in Tehran, every meal began","with an act of love \u2014 a table set not merely to feed,","but to honor the guest. That spirit lives in every glass","we pour at Shiraz Kitchen.","","Every bottle was chosen the way my mother chose her","ingredients \u2014 with intention, with care, with a story.","These 235+ selections span the limestone slopes of Burgundy,","the volcanic soils of Sicily, small-lot Oregon Pinot,","and the great houses of Bordeaux.","","There are no filler wines here. If it\u2019s on these pages,","someone at our table fell in love with it.","","Please \u2014 take your time. This is your table."]:
c.setFont(SER_I,10.5); c.setFillColor(CHARCOAL)
if l=="": s.sp(10)
else: c.drawCentredString(CX,s.y,l); s.sp(16)
s.sp(20); c.setFont(SER,11); c.setFillColor(CHARCOAL); c.drawCentredString(CX,s.y,"Reza Parhizkaran"); s.sp(14)
c.setFont(SER_I,9); c.setFillColor(TOBACCO); c.drawCentredString(CX,s.y,"Chef-Owner & Founder"); s.footer()
def back_cover(s):
s.new_page(); c=s.c; s.sp(140)
lp=os.path.join(os.path.dirname(__file__) or '.','logo_entry.png')
if os.path.exists(lp):
logo=ImageReader(lp); lw=2.0*inch; lh=lw*0.8; lx=CX-lw/2; ly=s.y-lh
c.drawImage(logo,lx,ly,lw,lh,mask='auto'); s.y=ly-30
s._motif(s.y+6); s.sp(30)
c.setFont(SER_I,10); c.setFillColor(CHARCOAL); c.drawCentredString(CX,s.y,"White Plains"); s.sp(14)
c.setFont(SER,9); c.setFillColor(TOBACCO); c.drawCentredString(CX,s.y,"1 North Broadway, White Plains, NY 10601"); s.sp(22)
c.setFont(SER_I,10); c.setFillColor(CHARCOAL); c.drawCentredString(CX,s.y,"Chelsea"); s.sp(14)
c.setFont(SER,9); c.setFillColor(TOBACCO); c.drawCentredString(CX,s.y,"252 Seventh Avenue, New York, NY 10001"); s.sp(36)
s._orn(s.y,gold_a(0.35),0.6); s.sp(24)
c.setFont(SER_I,9.5); c.setFillColor(TOBACCO); c.drawCentredString(CX,s.y,"shirazkitchen.com"); s.sp(14)
c.setFont(SER,8.5); c.setFillColor(STONE); c.drawCentredString(CX,s.y,"@shirazkitchen"); s.sp(40)
c.setFont(SER_I,9); c.setFillColor(FAWN)
c.drawCentredString(CX,s.y,"\u201cA good wine is a salutation from the earth"); s.sp(13)
c.drawCentredString(CX,s.y,"to the sun, and the sun back to the earth.\u201d"); s.sp(14)
c.setFont(SAN,7); c.setFillColor(STONE); c.drawCentredString(CX,s.y,"\u2014 a Persian proverb")
def build(s):
s.cover()
s.new_page(); s.footer()
s.ck_header("Cocktails","17")
for n,d in [("Paris to Shiraz","ros\u00e9, watermelon juice, lemon juice, elderflower syrup"),("Heart on Fire","mezcal, fig infused vodka, jalape\u00f1o, agave syrup, lime"),("Mezcalita","mezcal, passionfruit, lime, Tajin rim"),("Call Me Honey","bourbon, pear, honey, lemon, cinnamon"),("Love & Poetry","gin, apricot jam, rose water"),("Fig in the Fog","fig infused vodka, lime juice, pomegranate"),("Mediterranean Mule","saffron, vodka, ginger, lime juice"),("111 Espresso","vanilla vodka, tia maria, espresso")]: s.ck(n,d)
s.sp(4); s._orn(s.y,dust_a(0.5),0.4); s.sp(14)
s.ck_header("Seasonal Cocktails")
s.ck_seasonal("Persian Toddy","black tea rising in steam, whiskey in the shadows, herbs that remember home.","black tea, whiskey or bourbon, honey, lemon juice, cinnamon, tarragon",22)
s.ck_seasonal("Gheshang","golden threads, midnight coffee, secrets only the night understands.","vodka, saffron, fresh espresso, rosewater, cardamom, finished with saffron",25)
s.sp(8); s.ck_header("Mocktails","12")
for n,d in [("Mango Mule","mango juice, tarragon, lime juice, ginger beer"),("Last Stop, Tehran","mint syrup, cucumber, lemon juice"),("Sarmast","saffron, ginger, lemon juice"),("Yaare-H Aziz","watermelon juice, rose water, lemon, mineral water"),("Hungry to Know You","freshly brewed black tea, saffron, lemon, organic honey")]: s.ck(n,d)
s.sp(10); s.section_c("Beer"); s.c.setFont(SER,10); s.c.setFillColor(CHARCOAL)
s.c.drawCentredString(CX,s.y,"Stella 8 \u00b7 Stone IPA 8 \u00b7 Duvel 12 \u00b7 Athletic NA 8"); s.sp(16)
s.welcome()
# TOC
s.new_page(); s.footer(); s.sp(20); s.c.setFont(BRAND,16); s.c.setFillColor(WINE)
s.c.drawCentredString(CX,s.y,"THE CELLAR"); s.sp(8); s._orn(s.y,dust_a(0.5),1.2); s.sp(24)
c=s.c; c.setFont(SAN,9); c.setFillColor(TOBACCO); c.drawString(ML+0.4*inch,s.y,"section"); c.drawRightString(RX-0.4*inch,s.y,"page")
s.sp(6); c.setStrokeColor(dust_a(0.4)); c.setLineWidth(0.3); c.line(ML+0.4*inch,s.y,RX-0.4*inch,s.y); s.sp(10)
for e in [("Cocktails & Mocktails",2),None,("White Wine by the Glass",5),("Ros\u00e9 Wine by the Glass",5),("Red Wine by the Glass",5),None,("Champagne & Sparkling",6),("Cellar Selections",6),None,("Sauvignon Blanc",7),("Ros\u00e9 \u00b7 German \u00b7 Italian White",7),("Chardonnay",7),("Burgundy White",8),None,("Cabernet Sauvignon",8),("Meritage & Red Blends",9),("Pinot Noir",10),("Shiraz \u00b7 Syrah",10),("Burgundy Red",11),None,("Bordeaux \u00b7 Rh\u00f4ne \u00b7 Bandol",11),("Spain \u00b7 Argentina",12),("Tuscany \u00b7 Piedmont",13),("Veneto \u00b7 Sicily",14),None,("Half Bottles & Dessert",14),None,("Spirits",15),("Scotch \u00b7 Japanese Whisky",17),("Ap\u00e9ritif \u00b7 Cognac \u00b7 Amari",18)]:
if e is None: s.toc_spacer()
else: s.toc_entry(e[0],e[1])
s.sp(30); s.c.setFont(SER_I,8); s.c.setFillColor(TOBACCO)
s.c.drawCentredString(CX,s.y,"All wines served at proper cellar temperature. Please ask your sommelier for guidance."); s.sp(12)
s.c.drawCentredString(CX,s.y,"Vintages subject to availability. A 20% gratuity will be added to parties of six or more.")
# BTG
s.new_page(); s.footer(wine=True)
s.section("White Wine by the Glass"); s.somm_note("Crisp, aromatic, food-friendly \u2014 each chosen to open a meal or stand on its own"); s.col_btg()
for w in [("HW1","Terlato Family Vineyards, Pinot Grigio, Italy","2022",16,62),("HW2","Soalheiro Primeiras Vinhas, Alvarinho, Portugal","2023",16,62),("HW3","Sonoma-Cutrer, Chardonnay, Russian River, Sonoma","2023",18,70),("HW4","Cloudy Bay, Sauvignon Blanc, Marlborough, NZ","2024",18,70),("HW5","Duckhorn Vineyards, Sauvignon Blanc, North Coast","2024",18,70),("HW6","Schloss Vollrads, Riesling Kabinett, Germany","2018",18,65),("HW7","Tenuta San Giacomo, Gavi del Comune di Gavi","2024",18,65),("HW8","Finca Allende, Rioja Blanco, Spain","2020",20,75),("HW9","Pierre Martin, Sancerre 'Chavignol', Loire","2024",20,75),("HW10","Alta Mora, Etna Bianco, Sicily","2023",20,75)]: s.btg(*w)
s.sp(10); s.section_c("Ros\u00e9 Wine by the Glass"); s.col_btg()
s.btg("HR1","Gerard Bertrand, Cote des Roses, Languedoc","2024",18,70)
s.btg("HR2","Ch\u00e2teau d'Esclans, Whispering Angel, Provence","2024",18,70)
s.sp(10); s.section("Red Wine by the Glass"); s.somm_note("From everyday elegance to cellar-worthy depth \u2014 these reward our grilled meats and stews"); s.col_btg()
for w in [("HRD4","Ch\u00e2teau Rollan de By, M\u00e9doc, France","2014",18,70),("HRD5","Il Poggione, Rosso Di Montalcino, Tuscany","2021",18,70),("HRD7","Justin, Cabernet Sauvignon, Paso Robles","2022",18,65),("HRD1","Louis Sipp, Pinot Noir Bio, Alsace, France","2022",18,70),("HRD3","Numanthia Termes, Tempranillo, Toro, Spain","2021",18,70),("HRD2","Two Hands, 'Angels Share' Shiraz, McLaren Vale","2022",18,70),("HRD6","Vi\u00f1a Cobos, Cocodrilo Corte Malbec, Mendoza","2022",18,70)]: s.btg(*w)
s.sp(10); s.section_c("Caymus, Poured for You"); s.col_btg()
s.btg("CY1","Conundrum, Red Blend, California","2022",18,70); s.btg("CY2","Emmolo, Merlot, Napa Valley","2021",25,90)
# CHAMPAGNE + CELLAR
s.new_page(); s.footer(wine=True)
s.section("Champagne & Sparkling"); s.somm_note("Every table deserves a reason to celebrate"); s.col_bot()
for w in [("--","Chandon, Garden Spritz, 187ml","--",18),("--","Chandon, Brut Ros\u00e9, 187ml","--",18),("--","LE BLANC Organic French Bubbly, 0.0% Alcohol","--",55),("--","Domaine Carneros by Taittinger, Brut Ros\u00e9","--",70),("--","Louis Roederer, Brut Premier, Champagne, 375ml","--",75),("--","Veuve Clicquot, Brut R\u00e9serve Cuv\u00e9e, Champagne","--",100),("--","Louis Roederer, Cristal Brut, Champagne","--",400)]: s.bot(*w)
s.sp(12); c=s.c; bt=s.y+8; bh=19*5+50
c.setFillColor(dust_a(0.08)); c.rect(ML-4,s.y-bh+20,CW+8,bh,fill=1,stroke=0)
c.setStrokeColor(GOLD); c.setLineWidth(0.4); c.line(ML,bt,RX,bt); c.line(ML,s.y-bh+20,RX,s.y-bh+20)
s.section("Cellar Selections by the Bottle","A rotating list at special pricing"); s.col_bot()
for w in [("SEL5","Flowers, Chardonnay, Sonoma Coast","2023",69),("SEL1","Flowers, Pinot Noir, Sonoma Coast","2023",69),("SEL4","Numanthia Termes, Tempranillo, Tinta de Toro","2021",65),("SEL3","Orin Swift 'Palermo', Cabernet Sauvignon, Napa","2022",75),("SEL2","Jordan, Cabernet Sauvignon, Sonoma","2018",89)]: s.bot(*w)
# WINE PAGES
s._w=True; s.new_page(); s.footer()
s.section("Sauvignon Blanc","Loire \u00b7 Marlborough \u00b7 Napa"); s.col_bot()
for w in [("SB7","Alphonse Mellot, Sancerre La Moussi\u00e8re, Loire","2024",75),("SB3","Buissonne, Sancerre 'Pierre A Feu', Loire","2024",75),("SB1","Cakebread Cellars, Napa Valley","2023",70),("SB5","Cloudy Bay, Marlborough, New Zealand","2024",70),("SB6","Duckhorn Vineyards, North Coast","2024",70),("SB2","J. Rochioli, Russian River, Sonoma","2022",90),("SB4","Pierre Martin, Sancerre 'Chavignol', Loire","2024",75)]: s.bot(*w)
s.sp(14); s.section("Ros\u00e9","Provence & Beyond"); s.col_bot()
for w in [("R5","Ch\u00e2teau d'Esclans, Whispering Angel, Provence","2024",70),("R4","Ch\u00e2teau Minuty, Prestige, C\u00f4tes de Provence","2024",70),("R3","Domaines Ott 'BY.OTT', Provence","2024",75),("R1","Domaines Ott 'Mireille', Provence","2024",115),("R6","Gerard Bertrand, Gris Blanc, Languedoc","2024",70),("R2","Maison Saint Aix, Vin De Provence","2024",70)]: s.bot(*w)
s.sp(14); s.section("Germany \u00b7 Spain \u00b7 Portugal","White Wines"); s.col_bot()
for w in [("GSP2","Finca Allende, Rioja Blanco, Spain","2020",75),("GSP1","Schloss Vollrads, Riesling Kabinett, Rheingau","2018",68),("GSP3","Soalheiro, Alvarinho, Portugal","2023",62)]: s.bot(*w)
s.sp(14); s.section("Italian White","From the Alps to Sicily"); s.col_bot()
for w in [("IW1","Alta Mora, Etna Bianco, Sicily","2023",75),("IW3","Livio Felluga, Collio, Friuli","2022",70),("IW6","Piero Busso 'Arbe', Piedmont","2024",70),("IW5","Santa Margherita, Pinot Grigio, Alto Adige","2024",70),("IW4","Terlato Family Vineyards, Pinot Grigio","2022",62),("IW2","Tenuta San Giacomo, Gavi del Comune di Gavi","2024",65)]: s.bot(*w)
s.sp(14); s.section("Chardonnay","Russian River to Mendoza")
s.somm_note(["We favor balance over butter \u2014 wines with orchard fruit,","mineral lift, and just enough oak to frame the finish."]); s.col_bot()
for w in [("CH5","Alexana Winery, Terroir Series, Willamette Valley","NV",65),("CH1","Cakebread Cellars, Napa Valley","2022",95),("CH2","Flowers, Sonoma Coast","2023",110),("CH8","Jordan, Russian River Valley","2022",105),("CH6","Kistler, Sonoma Coast","2022",100),("CH3","Sequoia Grove, Napa Valley","2023",75),("CH4","Sonoma-Cutrer, Russian River, Sonoma","2023",70),("CH7","Terrazas de los Andes, Reserva, Mendoza","2024",65)]: s.bot(*w)
s.sp(14); s.section("Burgundy, France","White")
s.somm_note(["Grower estates from Chablis to the C\u00f4te de Beaune \u2014","each bottle a conversation between limestone and light."]); s.col_bot()
for w in [("BW11","Albert Bichot, Bourgogne Aligot\u00e9","2023",65),("BW12","Albert Bichot, Montagny Premier Cru","2023",85),("BW10","Bouchard A\u00een\u00e9 & Fils, M\u00e2con-Villages","2023",65),("BW8","Charl\u00e8ne et Laurent Pinson, Chablis 1er Cru Fourchaume","2023",100),("BW6","Chavy-Chouet, Bourgogne Blanc Les Femelottes","2021",80),("BW1","Domaine Camu Fr\u00e8res, Bourgogne Blanc","NV",60),("BW4","Domaine Jolly Et Fils, Chablis","2023",90),("BW9","Domaine Jessiaume, Bourgogne Chardonnay","2022",75),("BW5","Domaine Paul Pillot, Bourgogne Chardonnay","2022",80),("BW7","H\u00e9ritiers du Comte Lafon, Pouilly-Fuiss\u00e9","2023",98),("BW3","Meursault Les Clous, Grand Vin De Bourgogne","2020",165),("BW2","Roger Lassarat, Pouilly-Fuiss\u00e9 Terroir","NV",100)]: s.bot(*w)
s.sp(14); s.section("Cabernet Sauvignon","Napa Valley & Beyond")
s.somm_note(["From collector\u2019s cellars to everyday elegance. These reward our","slow-braised lamb and saffron-laced stews with structure and depth."]); s.col_bot()
for w in [("A1","Accendo Cellars, Napa Valley","2018",750),("A2","Au Sommet, Napa Valley","2015",600),("A2","Bella Union, Napa Valley","2019",110),("A2","Buehler Vineyards 'Estate', Napa Valley","2019",90),("A3","C.J. Melka, Napa Valley","2018",200),("A5","Caymus Vineyards, Napa Valley","2017",138),("A3","Caymus Vineyards, Special Selection, Napa Valley","2018",350),("A3","Chimney Rock, Stags Leap District, Napa Valley","2014",160),("A9","Chimney Rock, Stags Leap, Napa Valley","2021",125),("A4","Darioush, Napa Valley","2018",250),("A4","Darioush, Darius II, Cabernet Sauvignon, Napa Valley","2022",750),("A4","Dominus Estate, Dominus, Napa Valley","2020",600),("A4","Dominus Estate, Dominus, Napa Valley","2021",650),("A4","Double Diamond, Napa Valley","2017",175),("A4","Faust, Napa Valley","2021",115),("A5","Heitz Wine Cellars, Napa Valley","2018",150),("A9","Iconoclast, Napa Valley","2021",85),("A5","Inspire by Boyanc\u00e9, Napa Valley","2013",120),("A6","Jordan, Cabernet Sauvignon, Sonoma","2014",140),("HW","Justin, Cabernet Sauvignon, Paso Robles","2022",65),("A6","Kintera, Napa Valley","2018",400),("A6","Markham, Napa Valley","2020",95),("A3","Mullan Road Cellar, Walla Walla, WA","2022",90),("A13","My Favorite Neighbor, Oakville, Napa Valley","2019",150),("A14","Nickel & Nickel, Napa Valley","2018",245),("A7","Nickel & Nickel, Sullenger Vineyard, Napa Valley","2023",250),("A7","Orin Swift 'Palermo', Napa Valley","2022",110),("A7","Paul Hobbs, Napa Valley","2017",250),("A8","Robert Mondavi, Oakville, Napa Valley","2019",145),("A1","Schrader CCS Beckstoffer To Kalon, Napa Valley","2019",700),("A2","Schrader Double Diamond, Oakville, Napa Valley","2021",200),("A8","Sequoia Grove, Napa Valley","2022",115),("A8","Silver Oak, Alexander Valley, Sonoma","2019",185)]: s.bot(*w)
s.sp(14); s.section("Meritage & Other Red Blends","The Art of Assembly"); s.col_bot()
for w in [("A10","Conundrum Red, California","2022",70),("A10","Insignia, Joseph Phelps, Napa Valley","2018",575),("A10","Justin Vineyards Isosceles, Paso Robles","2016",185),("B1","Klipsun 'Klipsun Vineyard', Red Mountain, WA","2020",130),("A11","Meerlust Rubicon, Stellenbosch, South Africa","2018",85),("A11","Mullan Road by Cakebread, Washington","2022",95),("A11","Napanook, Napa Valley","2016",170),("A12","Opus One, Napa Valley","2015",520),("A12","Orin Swift, Papillon, Napa Valley","2019",160),("A12","Overture Red, Napa Valley","2015",225),("B1","Quintessa, Napa Valley","2017",475),("B1","The Prisoner, Red Blend, Napa Valley","2022",100)]: s.bot(*w)
s.sp(14); s.section("Merlot"); s.col_bot()
s.bot("B2","Duckhorn Vineyards, Merlot, Napa Valley","2020",120); s.bot("B2","Emmolo, Merlot, Napa Valley","2021",90)
s.sp(14); s.section("Pinot Noir","Elegance in the Glass")
s.somm_note(["Transparent, perfumed, restless \u2014 Pinot at its best pairs","beautifully with our grilled salmon and roasted duck."]); s.col_bot()
for w in [("B3","Battle Creek Cellars 'Reserva', Willamette Valley","2021",90),("C12","Diora Estate Grown, San Bernabe, Monterey","2021",85),("SEL1","Flowers, Pinot Noir, Sonoma Coast","2023",69),("B4","Goldeneye, Anderson Valley","2018",115),("B5","Kosta Browne, Santa Rita Hills","2021",150),("B6","Lingua Franca, Tongue 'N Cheek, Eola-Amity Hills","2019",150),("HW","Louis Sipp Pinot Noir Bio, Alsace, France","2022",70),("C10","Rochioli Estate Pinot Noir","2021",195),("C9","Vosne Roman\u00e9e Premier Cru Les Chaumes, Louis Jadot","2019",180),("B6","Williams Selyem, Pinot Noir, Sonoma Coast","2018",180)]: s.bot(*w)
s.sp(14); s.section("Shiraz \u00b7 Syrah","Australia \u00b7 California \u00b7 France \u00b7 New Zealand"); s.col_bot()
for w in [("B7","Craggy Range 'Le Sol' Syrah, Hawke's Bay, NZ","2019",195),("B7","Morlet Family 'Bouquet Garni', Syrah, Sonoma","2015",210),("B8","Neyers 'Gary's' Syrah, Monterey County","2017",100),("B8","Nickel & Nickel 'Darien Vineyard' Syrah, Sonoma","2017",180),("B11","Pax, The Bench Vineyard Syrah","2022",80),("B9","Penfolds Bin 389 Cab/Shiraz, South Australia","2018",145),("B9","Stags' Leap Winery, Petite Sirah, Napa Valley","2019",95),("B11","Terminim 'Alder Springs' Syrah, Mendocino","2018",130),("B11","Torbreck, Woodcutter's Shiraz, Barossa Valley","2022",80),("B10","Two Hands 'Angels Share' Shiraz, McLaren Vale","2022",80),("B10","Two Hands 'Bella's Garden' Shiraz, Barossa Valley","2017",150),("B8","Zaca Mesa 'Clydesdale Estate', Santa Ynez Valley","2017",80)]: s.bot(*w)
s.sp(14); s.section("Burgundy, France","Red")
s.somm_note(["Small grower-producers from the C\u00f4te de Nuits and beyond \u2014","where the vigneron\u2019s hand is in every barrel."]); s.col_bot()
for w in [("C9","Albert Bichot, Clos Rousseau, Santenay","2020",95),("B11","Albert Morot 'Les Toussaints' 1er Cru, Beaune","2020",120),("C1","Chavy-Chouet, Bourgogne Rouge La Taupe","2021",85),("C8","Denis Mortet, Marsannay Les Longeroies","2022",125),("C2","Domaine Blain-Gagnard, Pommard","2017",156),("C9","Domaine Georges No\u00ebllat, C\u00f4te de Nuits-Villages","2022",120),("C2","Domaine Les Gar\u00e7ons, Brouilly","2021",85),("C1","Gevrey-Chambertin 'Meixvelle', Pierre Gelin","2017",180),("C9","Gevrey-Chambertin, Jean-Marc Millot","2023",125),("C3","Givry Le Haut Colombier Rouge, Domaine Besson","2022",87),("C1","Maison Jessiaume, Bourgogne Rouge","2022",80),("C1","Morey Saint Denis 'Les Millandes', Heresztyn-Mazzini","2014",225),("C6","Philippe Livera, Fixin, C\u00f4te de Nuits","2021",105),("C2","Rossignol-F\u00e9vrier, Volnay 1er Cru 'Robardelle'","2015",255),("C2","Savigny-l\u00e8s-Beaune 1er Cru Les Peuillets, Dom. Jean-Baptiste","2022",133)]: s.bot(*w)
s.sp(14); s.section("Bandol"); s.col_bot()
s.bot("C3","Ch\u00e2teau Val d'Arenc, Fontbrune Rouge","2018",65); s.bot("C3","Domaines Ott, Ch\u00e2teau Romassan","2016",160)
s.sp(14); s.section("M\u00e9doc"); s.col_bot()
s.bot("--","Bernard Magrez, Tour Carnet, Haut-M\u00e9doc","2019",70); s.bot("HW","Ch\u00e2teau Rollan de By, M\u00e9doc","2014",75)
s.sp(14); s.section("Rh\u00f4ne & Rh\u00f4ne Blend"); s.col_bot()
for w in [("C4","Booker 'Oublie', Paso Robles","2017",160),("C4","Calmel & Joseph, Terrasses Larzac, Languedoc","2016",95),("C4","Ch\u00e2teau La Nerthe, Ch\u00e2teauneuf-Du-Pape","2016",120),("C5","Delas, C\u00f4te-R\u00f4tie 'Seigneur de Maugiron'","2016",240),("C5","Domaine Des Lises, Crozes-Hermitage Rouge","2020",85),("C7","Domaine du Cayron, Gigondas","2021",80)]: s.bot(*w)
s.sp(14); s.section("Bordeaux","Left Bank & Right Bank")
s.somm_note(["Structure and finesse from Pauillac to Saint-\u00c9milion \u2014","wines built for our braised short rib and herb-crusted lamb."]); s.col_bot()
for w in [("C8","Castillon 'Pentimento', Michele D'Aprix","2016",95),("C6","Ch\u00e2teau Batailley, Pauillac","2014",195),("B9","Ch\u00e2teau de Ferrand, Saint-\u00c9milion","2018",100),("C6","Ch\u00e2teau de Sales, Pomerol","2019",135),("A10","Ch\u00e2teau de Pez, St. Est\u00e8phe","2017",105),("4","Ch\u00e2teau du Glana, Saint-Julien","2019",120),("3","Ch\u00e2teau Fief de la Haye, Saint-Est\u00e8phe","2019",100),("C6","Ch\u00e2teau Haut Faug\u00e8res, Saint-\u00c9milion Grand Cru","2020",90),("C7","Ch\u00e2teau Hosanna, Pomerol","2018",350),("C7","Ch\u00e2teau Lafleur-Gazin, Pomerol","2016",160),("B7","Ch\u00e2teau Lass\u00e8gue, Saint-\u00c9milion Grand Cru","2021",125),("C7","Ch\u00e2teau Les Trois Croix, Fronsac","2017",95),("C3","Ch\u00e2teau Pichon Lalande, Pauillac","2017",375),("C9","Ch\u00e2teau Pipeau, Saint-\u00c9milion Grand Cru","2020",80),("C8","Derenoncourt 'L'A', Castillon","2015",120),("C4","Le Dragon de Quintus, Saint-\u00c9milion","2022",95),("C3","Moulin De Duhart, Pauillac","2022",120),("B9","Pessac-L\u00e9ognan, Ch\u00e2teau Trigant","2017",98)]: s.bot(*w)
s.sp(14); s.section("Spain","Rioja to Priorat")
s.somm_note(["The new wave alongside timeless tradition \u2014 these pair","with our charred peppers, saffron rice, and spiced lamb."]); s.col_bot()
for w in [("B12","Allende, Rioja","2016",85),("A6","Bierzo Tinto 'Ultreia St. Jacques', Ra\u00fal P\u00e9rez","2022",75),("C8","Bodegas El Nido, Clio","2022",105),("B12","Bodegas y Vi\u00f1edos Artadi, Tempranillo","2020",85),("A2","Bodega Numanthia Termes Tempranillo, Tinta de Toro","2021",80),("B8","Clos Mogador 'Com Tu', Grenache, Montsant","2020",90),("B5","Cune Imperial Reserva, Rioja","2018",95),("B7","Finca el Puif, Priorat","2019",85),("C2","Finca Torremilanos, Ribera del Duero Crianza","2019",75),("HW","La Rioja Alta Vi\u00f1a Alberdi Reserva","2020",75),("A4","Marqu\u00e9s de Murrieta 'Dalmau' Tinto Reserva, Rioja","2020",205),("A5","Navarra Tinto 'La Dama', Domaines Lupier","2019",70),("B10","Numanthia Toro","2015",135),("B12","Ra\u00fal P\u00e9rez, Ribeira Sacra Menc\u00eda","2020",90),("A4","R\u00edas Baixas Tinto, Albamar","2023",70),("B9","Ribeira Sacra Menc\u00eda, Alvaredos-Hobbs","2019",150),("A6","Rioja Reserva 'Vi\u00f1a Ardanza', La Rioja Alta","2019",95),("A3","Sumoll/Garnatxa, Can Sumoi","2023",75)]: s.bot(*w)
s.sp(14); s.section("Argentina"); s.col_bot()
for w in [("C4","Alta Vista 'Alto', Malbec, Mendoza","2015",175),("B12","Bramare, Malbec, Luj\u00e1n de Cuyo","2020",105),("B7","Terrazas de los Andes, Grand Malbec, Mendoza","2021",85),("HW","Vi\u00f1a Cobos, Cocodrilo Corte Malbec, Mendoza","2022",70)]: s.bot(*w)
s.sp(14); s.section("Tuscany","Brunello \u00b7 Bolgheri \u00b7 Chianti")
s.somm_note(["From the hillsides of Montalcino to the coast of Bolgheri \u2014","Sangiovese and its neighbors, built for our grilled branzino and veal."]); s.col_bot()
for w in [("C5","Altesino, Brunello di Montalcino Riserva","2011",245),("C11","Biserno, Il Pino, Tenuta di Biserno","2019",170),("C12","Gaja Ca' Marcanda, Promis, Bolgheri","2016",120),("A9","Guidalberto, Tenuta San Guido, Bolgheri","2018",140),("C5","Il Poggione, Brunello di Montalcino","2015",185),("HW","Il Poggione, Rosso Di Montalcino","2021",70),("C10","L'Oca Ciuca, Brunello di Montalcino","2013",120),("C10","Libero Lazzara, Brunello di Montalcino","2018",105),("C11","Marchese Antinori, Chianti Classico Riserva","2016",110),("C11","Sassicaia, Tenuta San Guido, Bolgheri","2020",550)]: s.bot(*w)
s.sp(14); s.section("Piedmont","Barolo & Barbaresco")
s.somm_note(["The noble Nebbiolo in its purest expression \u2014 tar, roses,","and the patience of decades in every glass."]); s.col_bot()
for w in [("A1","Ceretto, Barolo 'Brunate'","2012",290),("C8","Fontanabianca, Barbaresco","2022",85),("C8","Gaja, Barbaresco","2022",750),("C8","Gaja, Barolo Conteisa","2020",850),("C9","Giacomo Ascheri, Barolo","2021",90),("C12","Marcarini, Barolo del Comune di La Morra","2019",120),("C12","Michele Chiarlo 'Reyna', Barbaresco","2019",95),("C1","Moccagatta, Barbaresco","2020",130),("C6","Paolo Scavino, Barolo","2014",140),("A1","Pio Cesare, Barbaresco","2015",175),("C12","Roberto Voerzio, Barolo del Comune di La Morra","2016",500)]: s.bot(*w)
s.sp(14); s.section("Veneto"); s.col_bot()
for w in [("C6","Allegrini, Amarone della Valpolicella","2020",185),("C7","Bertani, Amarone della Valpolicella","2012",225),("B12","Zenato, Ripassa, Valpolicella Superiore","2021",85)]: s.bot(*w)
s.sp(14); s.section("Sicily"); s.col_bot()
s.bot("C10","Benanti, Etna Rosso","2022",75); s.bot("C11","Tasca d'Almerita, Rosso del Conte","2016",110)
s.sp(14); s.section("Half Bottles & Large Format"); s.col_bot()
s.bot("--","Louis Roederer, Brut Premier, Champagne, 375ml","--",75)
s.sp(14); s.section("Dessert & Fortified Wine","Please ask your sommelier for our current offerings")
s.sp(6); s.c.setFont(SER_I,9); s.c.setFillColor(TOBACCO)
s.c.drawCentredString(CX,s.y,"Sauternes \u00b7 Port \u00b7 Madeira \u00b7 Vin Santo \u00b7 Late Harvest Riesling"); s.sp(14)
s.c.drawCentredString(CX,s.y,"Selections change with the seasons and pair beautifully with our Persian pastries")
# SPIRITS
s._w=False; s.new_page(); s.footer(); s.sp(10); s._motif(s.y+4); s.sp(18)
s.c.setFont(BRAND,14); s.c.setFillColor(INK); s.c.drawCentredString(CX,s.y,"FROM THE BAR"); s.sp(12)
s.c.setFont(SER_I,9); s.c.setFillColor(FAWN)
s.c.drawCentredString(CX,s.y,"Our bar program reflects the same philosophy as our cellar:"); s.sp(12)
s.c.drawCentredString(CX,s.y,"nothing is here by accident, everything is here by invitation."); s.sp(18)
s.section("Spirits \u2014 Vodka"); s.si("Clean canvas, infinite expression \u2014 from winter wheat to potato to corn"); s.col_spr()
for x in [("Belvedere, Rye",18),("Chopin, Potato",18),("E11even, Corn",16),("Grey Goose, Wheat",17),("Grey Goose, L'Orange",18),("Grey Goose, Citron",18),("Grey Goose, Altius, Wheat",35),("Gulf Stream, Organic Wheat, Small Batch",14),("Ketel One, Wheat",18),("Stoli Elit, Winter Wheat",22),("Tito's, Corn",17),("Truman, Winter Wheat",20)]: s.spr(*x)
s.sp(14); s.section("Gin"); s.si("Botanicals that bloom in the glass \u2014 juniper, citrus, earth"); s.col_spr()
for x in [("Barr Hill, Old Tom",18),("Bombay, London Dry",15),("Bombay, Sapphire",17),("Gulf Stream, Small Batch",15),("Hendrick's",19),("Monkey 47, Schwarzwald Dry Gin",24),("Plymouth",18),("Tanqueray, No. TEN",18)]: s.spr(*x)
s.sp(14); s.section("Tequila"); s.si("From highland agave fields to the copper still \u2014 craft and patience in every pour"); s.col_spr()
for x in [("Casa Dragones, A\u00f1ejo",32),("Casa Dragones, Joven Sipping",45),("Casa Noble, Blanco",16),("Casa Noble, Reposado",18),("Casa Noble, Marqu\u00e9s, A\u00f1ejo",36),("Casamigos, Blanco",22),("Casamigos, Reposado",25),("Casamigos, A\u00f1ejo",28),("Cincoro, Joven",25),("Clase Azul, Plata",40),("Clase Azul, Reposado",55),("Clase Azul, A\u00f1ejo",75)]: s.spr(*x)
s.section("Tequila","Continued"); s.col_spr()
for x in [("Danos Dangerous, Blanco",17),("Danos Dangerous, Reposado",20),("Danos Dangerous, A\u00f1ejo",22),("Danos Dangerous, Pineapple & Jalape\u00f1o",17),("Danos Dangerous, Coffee Reposado",17),("Don Fulano, Blanco",18),("Don Fulano, Reposado",20),("Don Fulano, A\u00f1ejo",28),("Don Julio, Silver",18),("Don Julio, Reposado",20),("Don Julio, A\u00f1ejo",22),("Don Julio, A\u00f1ejo Cristalino",24),("Don Julio, Alma Miel Joven",30),("Don Julio, 1942 A\u00f1ejo",50),("Fortaleza, Blanco",35),("Gran Patr\u00f3n, Burdeos, A\u00f1ejo","1oz 40 | 2oz 75"),("Matiari by David Partida, Silver",18),("Matiari by David Partida, Reposado",20),("Patr\u00f3n, Silver",18),("Patr\u00f3n, Reposado",20),("Patr\u00f3n, A\u00f1ejo",22),("Patr\u00f3n, Extra A\u00f1ejo",25),("Patr\u00f3n, Cristalino A\u00f1ejo",25),("Patr\u00f3n, El Cielo, 4 Distillation",35),("Patr\u00f3n, El Alto, Reposado",45),("Tequila Ocho, Plata",20),("Tequila Ocho, Reposado",24)]: s.spr(*x)
s.sp(14); s.section("Mezcal"); s.si("Smoke, earth, and wild agave \u2014 the soul of Oaxaca"); s.col_spr()
for x in [("Casamigos, Joven",25),("Clase Azul, Guerrero, Papalote",65),("Del Maguey, Vida",18),("Del Maguey, Single Village, San Luis del Rio",22),("Ilegal, Joven",16),("Ilegal, Reposado",20)]: s.spr(*x)
s.sp(14); s.section("Bourbon & American Whiskey"); s.si("Oak, caramel, and the American grain \u2014 sipped neat or in our Persian Toddy"); s.col_spr()
for x in [("Angel's Envy, Port Wine Barrel Finished",18),("Angel's Envy, Triple Oak",24),("Basil Hayden's",18),("Buffalo Trace",20),("Bulleit",18),("Elijah Craig, Small Batch",16),("Elijah Craig, 10 Year, Barrel Proof",25),("Four Roses, Single Barrel",22),("High West",17),("High West, Bourye, Limited Sightings",30),("Jack Daniel's, Tennessee Whiskey",16),("Jack Daniel's, Frank Sinatra Select",30),("Jefferson's, Ocean Aged",25),("Knob Creek, 9 Year",18),("Maker's Mark",18),("Tropical Distillery, Twin P, Florida",16),("WhistlePig, 6 Year, Piggyback",20),("WhistlePig, 10 Year, Snout to Tail",22),("WhistlePig, 21 Year, Beholden","1oz 65 | 2oz 110"),("Widow Jane, 10 Year",22),("Widow Jane, 15 Year, The Vaults",45),("Willet, Pot Still",24),("Willet, 8 Year, Wheated","1oz 25 | 2oz 45"),("Woodford Reserve",18)]: s.spr(*x)
s.sp(14); s.section("Rye Whiskey"); s.si("Spice and backbone \u2014 the whiskey that built the cocktail"); s.col_spr()
for x in [("Angel's Envy, Caribbean Rum Cask",25),("Angel's Envy, Cellar Collection Vol. 005","1oz 25 | 2oz 45"),("Bulleit, Rye",18),("High West, Double Rye",17),("High West, Midwinter Night's Dram",38),("WhistlePig, 6 Year, Piggyback",20),("WhistlePig, 10 Year Small Batch",28),("WhistlePig, 10 Year, PiggyBank, Ltd.","1oz 35 | 2oz 65"),("WhistlePig, 12 Year Old World, Wine Cask",35),("WhistlePig, 15 Year",45),("WhistlePig, 18 Year, PX Sherry Casks","1oz 40 | 2oz 75"),("WhistlePig, Boss Hog XI, Juggernaut","1oz 95 | 2oz 175")]: s.spr(*x)
s.section("Japanese Whisky"); s.si("Precision, restraint, and the art of the blend"); s.col_spr()
for x in [("Hibiki, Harmony",30),("Matsui, The Tottori",20),("Nikka, Yoichi, 10 Year, Single Malt",35),("Takamine, 8 Year, Koji-Fermented",24),("Teitessa, 30 Year, Single Grain, Ltd.",75),("The Yamazaki, 12 Year",45)]: s.spr(*x)
s.sp(14); s.section("World Whiskey"); s.col_spr()
s.spr("Crown Royal, Canadian Whisky",16); s.spr("Jameson, Irish Whiskey",18)
s.sp(14); s.section("Scotch"); s.si("Peat, heather, and the sea \u2014 from Speyside to Islay"); s.col_spr()
for x in [("Aberfeldy, 12 Year",18),("Balvenie, 14 Year, Caribbean Cask",30),("Chivas Regal, 12 Year",20),("Chivas Regal, 18 Year",28),("Dalmore, 12 Year",22),("Dewar's, White Label",15),("Dewar's, 12 Year, Bourbon Casks",16),("Dewar's, 15 Year, Special Reserve",18),("Dewar's, 18 Year",25),("Dewar's, 19 Year, Champion's Edition",26),("Dewar's, 21 Year, Oloroso Sherry Cask",35),("Glenfiddich, 12 Year",25),("Glenfiddich, 21 Year, Rum Cask",45),("Glenlivet, 12 Year",20),("Johnnie Walker, Black Label",19),("Johnnie Walker, Blue Label",50),("Lagavulin, 16 Year",28),("Macallan, 12 Year, Sherry Cask",22),("Macallan, 15 Year, Double Cask",32),("Macallan, 18 Year, Sherry Cask",60),("Macallan, Harmony, Amber Meadow",36),("Macallan, Harmony, Vibrant Oak",36),("Macallan, 200th Anniversary","1oz 125 | 2oz 200"),("Oban, 14 Year",30)]: s.spr(*x)
s.section("Ap\u00e9ritif"); s.si("The art of the aperitivo \u2014 bitter, bright, and ready for what\u2019s next"); s.col_spr()
for x in [("Aperol",16),("Campari",16),("Carpano Antica, Vermouth",16),("Lillet Blanc",14),("St Germain, Elderflower",16)]: s.spr(*x)
s.sp(14); s.section("Cognac"); s.si("Time in the glass \u2014 from VS to the extraordinary Louis XIII"); s.col_spr()
for x in [("D'Uss\u00e9, V.S.O.P",20),("D'Uss\u00e9, XO",45),("Hennessy, VS",22),("R\u00e9my Martin, V.S.O.P",20),("R\u00e9my Martin, XO",40),("R\u00e9my Martin, Louis XIII","\u00bdoz 95 | 1oz 185 | 2oz 325")]: s.spr(*x)
s.sp(14); s.section("Amari & Grappa"); s.si("The Italian digestivo tradition \u2014 bitter herbs, citrus peel, and alpine roots"); s.col_spr()
for x in [("Amaro del Capo, Calabria",16),("Averna, Sicily",16),("Cynar 70, Veneto",16),("Fernet Branca, Milano",16),("Gaja, Sperss, Grappa",30),("Jacopo Poli, Grappa di Sassicaia, 2018",30),("Montenegro, Bologna",18),("Nonino, Moscato Grappa",20),("Nonino Quintessentia, Friuli",18),("Nonino Quintessentia Riserva, Friuli",22),("Ramazzotti, Milano",16),("Varnelli, Sibilia, Marche",18)]: s.spr(*x)
s.sp(14); s.section("After Dinner"); s.si("Linger a little longer \u2014 the evening\u2019s sweetest final act"); s.col_spr()
for x in [("Bailey's, Irish Cream",16),("Chartreuse, Green",28),("Disaronno, Amaretto",18),("Frangelico, Hazelnut",16),("Grand Marnier",18),("Grand Marnier, Cuv\u00e9e du Centenaire",50),("Limoncello Di Capri",15),("Molinari, Sambuca",20),("Patr\u00f3n, XO Cafe",18),("Romana, Black Sambuca",15)]: s.spr(*x)
s.back_cover()
s.c.save(); print(f"\u2713 Generated \u2014 {s.pg} pages",file=sys.stderr)
if __name__=="__main__":
pdf=CellarBook("ShirazKitchen_CellarBook_Spring_2026.pdf"); pdf.build(); print(f"\u2713 Generated \u2014 {pdf.pg} pages")