Home Blog Page 68

Prime Steak Tartare

0
Aerial view of Prime Steak Tartare on a small, black, bowl looking plate.

Chef Kathleen Crook’s recipe for Prime Steak Tartare is a master class in restraint and a valuable reminder that the best ingredients are best handled simply. Her dish is a classic, beautifully executed interpretation of a perennial steakhouse favorite. marketsteersteakhouse.com

Ingredients

  • 1 shallot, minced

  • 2 tsp ketchup

  • 1 tsp Worcestershire sauce

  • 2 tsp Dijon mustard

  • 2 dashes hot sauce

  • 2 tsp brandy

  • 1 gherkin, minced

  • 1 tbsp flat-leaf parsley

  • Sea salt as needed

  • 3 oz beef filet

Instructions

  1. Mix all ingredients together. Toss with the meat and serve Prime Steak Tartare cold.

Story by Gabe Gomez/ Styling and Photography Douglas Merriam

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine New Mexico here!

Summertime Souvlaki and Tzatziki

0
Fresh, summery flavors come forward in this easy-to-make dish.

Are you looking for an easy to make lunch or dinner that will also be a crowd-pleaser? Look to the simple, straightforward Greek tradition of souvlaki and tzatziki. Their freshness and appealing flavor will be a surefire hit!

SIMPLE SUMMER SOUVLAKI RECIPE

1/3 cup olive oil

2 lemons, juiced and zested

1 ½ tsp salt

¼ tsp black pepper

1 tsp oregano, dried or fresh

1 tsp dill

10 cloves garlic, chopped

1-1 ½ lb  fresh chicken tenders

1.     In a nonreactive mixing bowl, whisk together all ingredients except the fresh chicken tenders.

2.     Add fresh chicken tenders and toss until coated. Cover and marinate overnight in refrigerator.

3.     Remove from refrigerator about an hour before grilling. As soon as they have reached room temperature, space them generously on the grill over medium flame.

4.     Cook for 4 minutes on each side and check for doneness.

5.     Once cooked through, serve immediately with grilled pita bread, chopped tomatoes, fresh cucumbers and peppers, fresh herbs, olives, and homemade tzatziki.

SUMMER TZATZIKI RECIPE

2 cups grated cucumber, skin on

2 cups full-fat Greek yogurt

3 tbsp olive oil

2 tbsp fresh mint, chopped

1 tbsp fresh lemon juice

Zest of 1 lemon

3 fresh garlic cloves, minced

1 tsp sea salt

¼ tsp black pepper

1 pinch of ground cumin

1.     Grate the cucumbers by hand on a box grater. Using your hands, squeeze as much liquid as you can out of the grated cucumber, and place in a mixing bowl.

2.     Add all remaining ingredients to the bowl and stir well to combine.

3.     Cover and refrigerate for at least an hour, but preferably overnight. Stir again just prior to serving, and garnish with additional chopped mint.

4.     Serve as a condiment to souvlaki, grilled lamb or grilled pork, or as a dip for fresh crudites.

STORY BY KEITH RECKER / PHOTOGRAPHY BY DAVE BRYCE

Try some of TABLE’s other grilled treats:

Grilled Porch Chops with Grilled Pineapple

Skirt Steak and Scallion Salsa

Faith in BBQ

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Campo Lavender Margarita

0
Two glasses with a pale yellow margarita with lime slices floating on top.

A post-spa-treatment margarita with a dash of calming lavender sounds heavenly, doesn’t it? Los Poblanos director of wine and spirits, Dylan Storment, agrees, hence why he mixed us up this Campo Lavender Margarita. It’s got the acidity of citrus with the mellow, floral notes of their signature lavender syrup. But, just in case you can’t make it out to Los Poblanos to pick up their simple syrup or lavender sugar-salt, you can always make your own at home or grab them from a local shop. So, sit back, relax, and let this Campo Lavender Margarita take all your troubles away.

Print
clock clock iconcutlery cutlery iconflag flag iconfolder folder iconinstagram instagram iconpinterest pinterest iconfacebook facebook iconprint print iconsquares squares iconheart heart iconheart solid heart solid icon
Two glasses with a pale yellow margarita with lime slices floating on top.

Campo Lavender Margarita


  • Author: Dylan Storment

Description

Soothing lavender meets bright citrus in this margarita.


Ingredients

Scale


Instructions

  1. Combine all ingredients in shaker, shake for 10 seconds.
  2. Do a half crust of Los Poblanos culinary lavender-sugar-salt blend on glass.
  3. Strain into favorite glass over new ice.

Recipe by Dylan Storment
Photography by Doug Merriam

Subscribe to TABLE Magazine‘s print edition.

Campo Lamb Birria

0
The Lamb Birria at Los Poblanos’ restaurant Campo is a classic.

This recipe is very much measured by handfuls and feelings. The tortillas are the Sonoran wheat tortillas made at Albuquerque’s Los Poblanos with the rendered lamb fat from the braise. The lamb itself comes from the local Manzanares family’s Shepherd’s Lamb label, which raises the only certified-organic lamb in the state.

What is Birria? 

Birria is a traditional Mexican dish, originally from the state of Jalisco. It typically consists of tender, slow-cooked meat—often goat, but sometimes beef or lamb, like in this recipe —marinated in a flavorful blend of spices, including chili peppers, garlic, cumin, and oregano. The meat is cooked until it’s juicy and easily shreds apart for easy, enjoyable eating.

Print
clock clock iconcutlery cutlery iconflag flag iconfolder folder iconinstagram instagram iconpinterest pinterest iconfacebook facebook iconprint print iconsquares squares iconheart heart iconheart solid heart solid icon
The Lamb Birria at Los Poblanos’ restaurant Campo is a classic.

Campo Lamb Birria


  • Author: Los Poblanos

Description

One of the best ways to enjoy lamb.


Ingredients

Scale
  • 300 g sifted Sonoran flour from Southwest Grain Collaborative
  • 300 g all-purpose flour
  • 15 g baking powder
  • 25 g salt
  • 50 g lamb fat (We use the heavily spiced and flavorful lamb fat that comes from the lamb braise for this dish. You can use any fat you choose.)
  • 40 g warm water


Instructions

  1. Mix the dry ingredients together, cut the fat in with fingertips, add warm water and gently combine using a spoon. The mix will be sticky so try not to get too much on your hands.
  2. Let rest for 30 minutes or so, then portion to desired weight. We use 75-gram portions at the restaurant. Let rest for anywhere from 15 minutes to overnight.
  3. They are best rolled out 12-36 hours after being portioned. We roll them out about 2 mm thick and grill them directly over the grill here at Campo.
  4. The hominy is processed here from NM blue corn out of Tamaya and Mexican June white corn from the Schneiders in Santa Fe (Southwest Grain Collaborative). We nixtamalize the corn the night before we need it. We rinse and cook in fresh water with garlic, bay leaf, and salt until tender.
  5. The vegetables are seasonal, but usually include turnips cooked in butter along with the hominy, and a grilled vegetable such as asparagus.

Try a Delicious Southwest Cocktail

Photography by Mary West

Subscribe to TABLE Magazine‘s print edition.

Grilled Zucchini with Tahini Yogurt & Corn Relish

0
a plate of grilled zucchini in a yogurt sauce adn with a corn relish sits on a green plate witha. fork full above it.

Zucchini has always proven to be one of the most plentiful harvests of the summer months. You know this to be true if you’ve ever planted it in your own garden. And while you often you hear people speak of the same few ways in which to use up the abundance of this summer vegetable, it really is much more versatile than the traditional stuffed zucchini, or zucchini bread.

Our friend and Contributing Editor Anna Franklin gives us a fine example of how to easily use this squash. Try it in a quick side dish, a starter, or an appetizer. Plus, you’ll want to serve it with a fresh baguette or a crusty loaf of bread.

What is Tahini?

Tahini is a tangy condiment that uses ground sesame seeds and is a staple in Middle Eastern and Mediterranean cuisines. It’s a paste with a rich, nutty flavor and a smooth, creamy texture. You’ll see it is used in a variety of cultural dishes, from hummus and baba ganoush to salad dressings, sauces, and marinades. It’s a great source of protein and healthy fats, making it a nutritious addition to any meal.

Recipe and Styling by Anna Franklin
Story by Star Laliberte
Photography by Dave Bryce 

Subscribe to TABLE Magazine’s print edition.

Grilled Asparagus with Hatch Green Chile Ricotta

0
Grilled asparagus with green chile ricotta sits on a black plate.

American author Thomas Wolfe suggests, wistfully, that you can never go home again. He says that the experiences that serve as brick and mortar to our memories are sometimes best to leave in the past.

Think then about the faces and lives in a restaurant kitchen. About a chef who came alive to the food world through endless prep work, marathon doubles, and an avalanche of brunch rushes. Consider that those repetitive acts led to jobs in esteemed restaurants across the country, appearances in national cooking shows, ownership of a restaurant empire across California, as well as accolades too numerous to count.

Dakota Weiss and Her Grilled Asaparagus with Hatch Green Chile Ricotta

Think about Dakota Weiss, executive chef at Coyote Café, the storied Santa Fe restaurant where she then staged after culinary school and now leads through its latest iteration of Southwestern cuisine. Just this once, Thomas Wolfe may have it wrong. She is home again––with fresh, imaginative and palate-tingling results.

Because Dakota’s signature voice brings worldly nuance to our local food scene, we asked her to choose local ingredients and present us with three recipes. On one recent early morning, we watched her in the calm and quiet of Coyote’s kitchen as she brought these ingredients to life in ways that are as grounded in memories as they are alive as well as relevant in the present. Hence, her recipe for Grilled Asparagus with Hatch Green Chile Ricotta.

Print
clock clock iconcutlery cutlery iconflag flag iconfolder folder iconinstagram instagram iconpinterest pinterest iconfacebook facebook iconprint print iconsquares squares iconheart heart iconheart solid heart solid icon
Grilled asparagus with green chile ricotta sits on a black plate.

Grilled Asparagus with Hatch Green Chile Ricotta


  • Author: Dakota Weiss
  • Yield: Serves 4

Description

Vegetables don’t have to be served in a boring way!


Ingredients

Scale

For the grilled asparagus:

  • 1 bunch extra-large asparagus
  • Pinch sea salt
  • Pinch black pepper
  • 2 tbsp EVOO

For the hatch green chile ricotta cheese:

  • 1 gallon whole milk
  • 2 cups heavy cream
  • ½ cup lemon juice
  • 2 tbsp distilled vinegar
  • 2 cups hatch green chile, roasted, peeled, and diced½ tbsp kosher salt

For the truffled mustard vinaigrette:

  • 2 shallots
  • 2 garlic cloves
  • 2 tbsp whole grain mustard
  • ½ cup lemon juice
  • ½ cup rice vinegar
  • 1 cup EVOO
  • ½ cup white truffle oil
  • Kosher salt to taste

For the brioche croutons:

  • 1 cup brioche, cut into micro-small dices
  • ¼ cup EVOO
  • Kosher salt to taste

For the salad:

  • 2 red endives
  • 2 yellow endives
  • 2 tbsp chives, chopped
  • Kosher salt to taste
  • Black pepper to taste


Instructions

For the grilled asparagus:

  1. Cut the bottoms of the asparagus to get rid of the woody stems.
  2. Toss the asparagus with the salt, pepper, and olive oil
  3. Grill on high heat until lightly charred. The asparagus should still be crunchy.

For the hatch green chile ricotta cheese:

  1. Add the milk and cream into a heavy-bottomed pot. Bring to a boil.
  2. Turn off the heat and add the lemon juice and vinegar.
  3. Stir a few times until you see the milk start to curdle.
  4. Slowly pour the contents of the pot into a bowl that is lined with cheesecloth.
  5. Let the whey completely drain out of the curds.
  6. Gently scrape the curds off the cheesecloth and put into a bowl.
  7. Chop the green chile finely and stir into the curds. Season the cheese with salt to taste.

For the truffled mustard vinaigrette:

  1. Using a hand blender, add the shallots, garlic, mustard, lemon juice, and rice vinegar into a large jar and mix well.
  2. Slowly add the two oils to emulsify and then season with salt.

For the brioche croutons:

  1. Sauté the brioche in the oil until golden brown and season with salt.
  2. Pour onto a sheet tray lined with paper towels to soak up extra oil.

Building the plate:

  1. Toss the endives with the truffled vinaigrette, chives, salt, and pepper.
  2. Pipe the Hatch Green Chile Ricotta Cheese into a long rectangular shape.
  3. Carefully place the endive, alternating the red and yellow, into the ricotta at an angle.
  4. Place about 5 grilled asparagus lying next to the endive.
  5. Sprinkle the croutons all over.
  6. Drizzle a little of the truffled vinaigrette over the whole dish.

Recipe by Chef Dakota Weiss
Story by Gabe Gomez
Styling by Keith Recker
Photography Gabriella Marks

Subscribe to TABLE Magazine’s print edition.

Grilled Quail with Truffled‑Balsamic Reduction

0
An aerial view of a blue plate with grilled quail with balsamic reduction.
Coyote Café’s Chef Dakota Weiss's grilled quail with balsamic reduction sings New Mexico pecans and figs.

American author Thomas Wolfe suggested, wistfully, that you can never go home again––that the experiences that serve as brick and mortar to our memories are sometimes best left in the past.

Think then about the faces and lives in a restaurant kitchen. About a chef who came alive to the food world through endless prep work, marathon doubles, and an avalanche of brunch rushes. Consider that those repetitive acts led to jobs in esteemed restaurants across the country, appearances in national cooking shows, ownership of a restaurant empire across California, and accolades too numerous to count.

Think about Dakota Weiss, executive chef at Coyote Café, the storied Santa Fe restaurant where she staged after culinary school and now leads through its latest iteration of Southwestern cuisine? Just this once, Thomas Wolfe may have gotten it wrong. She’s come home again––with fresh, imaginative and palate-tingling results.

Because Dakota’s signature voice brings worldly nuance to our local food scene, we asked her to choose local ingredients and present us with three recipes. On one recent early morning, we watched her in the calm and quiet of Coyote’s kitchen as she brought these ingredients to life in ways that are as grounded in memories (does anyone remember the youthful thrill of 1970s Pop Rocks candy?) as they are alive and relevant in the present. coyotecafe.com

Grilled Quail with Truffled-Balsamic Reduction, Mesilla Pecan-Fig Crumble & Aji Amarillo

Serves 4

For the quail:

  • 4 quails

  • 2 rosemary sprigs

  • 2 thyme sprigs

  • Salt to taste

  • Black pepper to taste

  • 2 garlic cloves

  • ¼ cup blended oil

Instructions

1.     Clip the wings off the quail. Poke a tiny hole in one of the legs and pull the tip of the other leg through that so it looks like the legs are naturally crossed.

2.     Add the herbs, garlic, and oil in a blender and mix well.

3.     Rub the herb puree all over the quail and allow them to marinate for an hour or so.

For the Truffle-Balsamic Reduction:

  • 1 cup balsamic vinegar

  • ¼ cup white truffle oil

  • ¼ cup soy sauce

  • 1 ½ tbsp cornstarch

  • 1 tbsp cold water

Instructions

1.     Add the balsamic vinegar, truffle oil, and soy into a pot and bring it to a boil, reducing the mixture by a quarter.

2.     Whisk together the cornstarch and water.

3.     Slowly add that mixture to the reduction and cook out the starch. The sauce should thicken until it coats a spoon.

For the Mesilla Pecan-Fig Crumble:

  • 6 oz Mesilla pecans, toasted

  • 4 oz dried Mission figs

  • 1 tsp Urfa Biber chili flakes

  • 1 tsp cumin

  • 1 tsp hibiscus, dried

  • 1 tsp juniper berry

  • Kosher salt to taste

Instructions

Take all ingredients and add to a Robot-Coupe food processor. Mix until you have a crumble-like consistency.

Building the Plate:

1.     Grill the quail for about 2 ½ minutes on each side getting nice grill marks.

2.     Using a spoon, make a circle (1 ½ times larger than the quail) with the truffle balsamic. Place the grilled quail right on top of that.

3.     Put the pecan crumble on top of the quail breast.

4.     Add a dollop of Aji Amarillo paste to the plate.

5.     Garnish with any herbal microgreens.

 Story by Gabe Gomez/ Styling by Keith Recker / Photography Gabriella Marks

Try Chef Weiss’s other locavore recipes:

Grilled Asparagus

Buttermilk Vanilla Panna Cotta with Strawberry Pop Rocks

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine New Mexico here!

Panna Cotta, Strawberries, Basil Sorbet & Strawberry Pop Rocks

0
Coyote Café’s Chef Dakota Weiss's recipe for buttermilk panna cotta is rich, subtle, and smooth as velvet with a literal “pop” at the end.

Sweet panna cotta with fresh strawberries, an herby basil sorbet, and… strawberry Pop Rocks? That’s right this tingling, popping candy is the star of this summery dessert.

About the Panna Cotta, Strawberries, Basil Sorbet & Strawberry Pop Rocks Recipe

American author Thomas Wolfe suggests, wistfully, that you can never go home again––that the experiences that serve as brick and mortar to our memories are sometimes best to leave in the past.

Think then about the faces and lives in a restaurant kitchen. About a chef who came alive to the food world through endless prep work, marathon doubles, and an avalanche of brunch rushes. Consider that those repetitive acts led to jobs in esteemed restaurants across the country, appearances in national cooking shows, ownership of a restaurant empire across California, as well as accolades too numerous to count.

Think about Dakota Weiss, executive chef at Coyote Café, the storied Santa Fe restaurant where she staged after culinary school and now also leads through its latest iteration of Southwestern cuisine. Just this once, Thomas Wolfe may be wrong. She’s come home again––with fresh, imaginative and also palate-tingling results.

Because Dakota’s signature voice brings worldly nuance to our local food scene, we asked her to choose local ingredients and present us with three recipes. On one recent early morning, we watched her in the calm and quiet of Coyote’s kitchen as she brought these ingredients to life in ways that are as grounded in memories (does anyone also remember the youthful thrill of 1970s Pop Rocks candy?) as they are alive and relevant in the present.

Recipe by Chef Dakota Weiss
Story by Gabe Gomez
Styling by Keith Recker
Photography Gabriella Marks

Subscribe to TABLE Magazine’s print edition.

Crispy Duck Leg Confit

0
Duck legs arranged in a line with various sauces

The timeless elegance of French cuisine dives into the realm of delectable indulgence with Crispy Duck Leg Confit with roasted potatoes, fragrant basil pesto, and a tantalizing blood orange beurre blanc. Imagine the tender and succulent duck leg, lovingly cooked in its luxurious fat, until the meat is imbued with a depth of flavor that only time and patience can create. The basil pesto adds an herbaceous burst of freshness and complexity to the dish, while the blood orange beurre blanc brings zesty, citrusy notes in a velvety, buttery, tangy embrace. Friends, prepare your palates for an exquisite dining experience that combines tradition, innovation, and a touch of theatrical flair.

Recipe by Chef Jackson Ault
Story by Kristin Kovacic
Photography by Tira Howard
Styling by Keith Recker

Subscribe to TABLE Magazine here!

Healthy Mocktail Shots

0
4 glasses of different sizes almost filled with green, red, and orange-colored healthy shots. Best Mocktail Recipes

Ah, mocktail shots, the alternative to their spirited counterparts without an ounce of regret or debaucherous proof on Instagram, all while keeping your well-being intact. These concoctions are a masterful blend of nature’s finest gifts — succulent fruits, fragrant herbs, and sweetness. With each sip, your senses are transported to a world where vibrant flavors linger harmoniously. So raise your glasses to these health-conscious mocktail shots, a toast to savoring life’s pleasures without compromise, all in the name of wellness and happiness. Chin-chin!

What’s In Our Round of Mocktail Shots

Make each one on their own, or serve as a round of shots together for a glass-clinking that won’t leave you felling less than your best. We’re serving up a Green Juice Mocktail shot, a Turmeric Ginger Health Shot, a Bloody Mary mix (to ration out into shots), and a Green Smoothie shot. They’re as multi-colored as they are delicious! If you find yourself hooked on wellness shots, there are also many options out there to try.

Print

clock clock iconcutlery cutlery iconflag flag iconfolder folder iconinstagram instagram iconpinterest pinterest iconfacebook facebook iconprint print iconsquares squares iconheart heart iconheart solid heart solid icon

4 glasses of different sizes almost filled with green, red, and orange-colored healthy shots. Best Mocktail Recipes

Healthy Shots: Mocktail Recipes


5 Stars 4 Stars 3 Stars 2 Stars 1 Star


  • Author:
    Reid Putlitz

Description

A lineup of shots with more nutritional value than your average vodka shot.


Ingredients


Scale

For the Green Juice Mocktail Shot

  • 1 cup of fresh spinach
  • 8 kale leaves (stalks included)
  • 4 fresh basil leaves
  • 1 cucumber
  • 1 lime
  • 1-inch piece of fresh ginger
  • 2 pears
  • 4 oz fresh pineapple
  • 1 can of pineapple or grapefruit Spindrift
  • Mint for garnish

For the Bloody Mary Shot

  • 3 cups Muir Glen fire-roasted tomatoes, drained
  • 3 tbsp lemon juice
  • 1 tbsp grated horseradish
  • 2 tbsp vegan Worcestershire
  • 1 tbsp fresh grated garlic
  • 2 tbsp Tabasco sauce
  • 1 ½ tsp celery salt
  • 1 tbsp Old Bay seasoning
  • 1 tsp coarse ground black pepper
  • ½ cup pickle brine

For the Turmeric Ginger Health Shot

  • 6 oz fresh Ginger root
  • 6 oz fresh turmeric root
  • 3 oz fresh squeezed lemon juice
  • Pinch of Cayenne

For the Green Smoothie Shot

  • 1.5 oz kale
  • 1.5 oz spinach
  • 3.6 oz banana
  • 2 pitted dates
  • 10 oz coconut water
  • A handful of ice

 


Instructions

For the Green Juice Mocktail Shot

  1. Juice all veggies, fruit, and greens together using the cucumber to push through the basil, spinach, and kale.
  2. Freeze juice in a round ice cube mold.
  3. Place the ice cube in a low ball cocktail glass and fill the glass up half full of Spindrift.
    Garnish with fresh mint. Serves 1.

For the Bloody Mary Shot

  1. Drain the tomatoes and puree in a blender.
  2. Mix in all other ingredients.
  3. Use Old Bay seasoning on the rim.
  4. Garnish with reckless abandon. Serves 6.

For The Turmeric Ginger Shot 

  1. Juice the ginger and turmeric together.
  2. Add lemon juice and cayenne to the ginger and turmeric juice.
  3. Add one drop of oil of oregano oil. (Makes 10 oz; suggested serving size is 2 oz)

For the Green Smoothie Shot

  1. Freeze contents of smoothie kit (kale, spinach, banana, and dates).
  2. Combine contents with ice and coconut water into a blender and blend until smooth. Serves 1.

window.trCommon={“minRating”:6,”ajaxurl”:”https://www.tablemagazine.com/wp-admin/admin-ajax.php”,”ratingNonce”:”b38309bfe9″,”postId”:3377};
window.TastyRecipes = window.TastyRecipes || {};

window.TastyRecipes.smoothScroll = {
init() {
document.addEventListener( ‘click’, ( e ) => {
let anchor = e.target;
if ( anchor.tagName !== ‘A’ ) {
anchor = anchor.closest( ‘a.tasty-recipes-scrollto’ );
}

if ( ! anchor || ! anchor.classList.contains( ‘tasty-recipes-scrollto’ ) ) {
return;
}

const elementHref = anchor.getAttribute( ‘href’ );
if ( ! elementHref ) {
return;
}

e.preventDefault();
this.goToSelector( elementHref );
});
},
goToSelector( selector ) {
const element = document.querySelector( selector );
if ( ! element ) {
return;
}
element.scrollIntoView( { behavior: ‘smooth’ } );
}
};

document.addEventListener(
‘DOMContentLoaded’,
() => window.TastyRecipes.smoothScroll.init()
);

(function(){

var bothEquals = function( d1, d2, D ) {
var ret = 0;
if (d1<=D) {
ret++;
}
if (d2<=D) {
ret++;
}
return ret === 2;
};

var frac =function frac(x,D,mixed){var n1=Math.floor(x),d1=1;var n2=n1+1,d2=1;if(x!==n1)while(bothEquals(d1,d2,D)){var m=(n1+n2)/(d1+d2);if(x===m){if(d1+d2d2)d2=D+1;else d1=D+1;break}else if(xD){d1=d2;n1=n2}if(!mixed)return[0,n1,d1];var q=Math.floor(n1/d1);return[q,n1-q*d1,d1]};frac.cont=function cont(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-AD){if(Q_1>D){Q=Q_2;P=P_2}else{Q=Q_1;P=P_1}}if(!mixed)return[0,sgn*P,Q];var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]};

window.tastyRecipesVulgarFractions = JSON.parse(decodeURIComponent(“%7B%22%C2%BC%22%3A%221%2F4%22%2C%22%C2%BD%22%3A%221%2F2%22%2C%22%C2%BE%22%3A%223%2F4%22%2C%22%E2%85%93%22%3A%221%2F3%22%2C%22%E2%85%94%22%3A%222%2F3%22%2C%22%E2%85%95%22%3A%221%2F5%22%2C%22%E2%85%96%22%3A%222%2F5%22%2C%22%E2%85%97%22%3A%223%2F5%22%2C%22%E2%85%98%22%3A%224%2F5%22%2C%22%E2%85%99%22%3A%221%2F6%22%2C%22%E2%85%9A%22%3A%225%2F6%22%2C%22%E2%85%9B%22%3A%221%2F8%22%2C%22%E2%85%9C%22%3A%223%2F8%22%2C%22%E2%85%9D%22%3A%225%2F8%22%2C%22%E2%85%9E%22%3A%227%2F8%22%7D”));

window.tastyRecipesFormatAmount = function(amount, el) {
if ( parseFloat( amount ) === parseInt( amount ) ) {
return amount;
}
var roundType = ‘frac’;
if (typeof el.dataset.amountShouldRound !== ‘undefined’) {
if (‘false’ !== el.dataset.amountShouldRound) {
if ( ‘number’ === el.dataset.amountShouldRound ) {
roundType = ‘number’;
} else if (‘frac’ === el.dataset.amountShouldRound) {
roundType = ‘frac’;
} else if (‘vulgar’ === el.dataset.amountShouldRound) {
roundType = ‘vulgar’;
} else {
roundType = ‘integer’;
}
}
}
if (‘number’ === roundType) {
amount = Number.parseFloat(amount).toPrecision(2);
} else if (‘integer’ === roundType) {
amount = Math.round(amount);
} else if (‘frac’ === roundType || ‘vulgar’ === roundType) {
var denom = 8;
if (typeof el.dataset.unit !== ‘undefined’) {
var unit = el.dataset.unit;
if ([‘cups’,’cup’,’c’].includes(unit)) {
denom = 4;
if (0.125 === amount) {
denom = 8;
}
if (“0.1667″ === Number.parseFloat( amount ).toPrecision(4)) {
denom = 6;
}
}
if ([‘tablespoons’,’tablespoon’,’tbsp’].includes(unit)) {
denom = 2;
}
if ([‘teaspoons’,’teaspoon’,’tsp’].includes(unit)) {
denom = 8;
}
}
var amountArray = frac.cont( amount, denom, true );
var newAmount = ”;
if ( amountArray[1] !== 0 ) {
newAmount = amountArray[1] + ‘/’ + amountArray[2];
if (‘vulgar’ === roundType) {
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (newAmount === window.tastyRecipesVulgarFractions[vulgar]) {
newAmount = vulgar;
}
});
}
}
if ( newAmount ) {
newAmount = ‘ ‘ + newAmount;
}
if ( amountArray[0] ) {
newAmount = amountArray[0] + newAmount;
}
amount = newAmount;
}
return amount;
};

window.tastyRecipesUpdatePrintLink = () => {

const printButton = document.querySelector( ‘.tasty-recipes-print-button’ );

if ( ! printButton ) {
return;
}

const printURL = new URL( printButton.href );
const searchParams = new URLSearchParams( printURL.search );

const unitButton = document.querySelector( ‘.tasty-recipes-convert-button-active’ );
const scaleButton = document.querySelector( ‘.tasty-recipes-scale-button-active’ );

let unit = ”;
let scale = ”;

if ( unitButton ) {
unit = unitButton.dataset.unitType;
searchParams.delete(‘unit’);
searchParams.set( ‘unit’, unit );
}

if ( scaleButton ) {
scale = scaleButton.dataset.amount;
searchParams.set( ‘scale’, scale );
}

const paramString = searchParams.toString();
const newURL = ” === paramString ? printURL.href : printURL.origin + printURL.pathname + ‘?’ + paramString;
const printLinks = document.querySelectorAll( ‘.tasty-recipes-print-link’ );

printLinks.forEach( ( el ) => {
el.href = newURL;
});

const printButtons = document.querySelectorAll( ‘.tasty-recipes-print-button’ );
printButtons.forEach( ( el ) => {
el.href = newURL;
});
};

document.addEventListener( ‘DOMContentLoaded’, () => {

if ( ! window.location.href.includes( ‘/print/’ ) ) {
return;
}

const searchParams = new URLSearchParams( window.location.search );

const unit = searchParams.get( ‘unit’ );
const scale = searchParams.get( ‘scale’ );

if ( unit && ( ‘metric’ === unit || ‘usc’ === unit ) ) {
document.querySelector( ‘.tasty-recipes-convert-button[data-unit-type=”‘ + unit + ‘”]’ ).click();
}

if ( scale && Number(scale) > 0 ) {
document.querySelector( ‘.tasty-recipes-scale-button[data-amount=”‘ + Number(scale) + ‘”]’ ).click();
}
});
}());

(function(){
var buttonClass = ‘tasty-recipes-scale-button’,
buttonActiveClass = ‘tasty-recipes-scale-button-active’,
buttons = document.querySelectorAll(‘.tasty-recipes-scale-button’);
if ( ! buttons ) {
return;
}

buttons.forEach(function(button){
button.addEventListener(‘click’, function(event){
event.preventDefault();
var recipe = event.target.closest(‘.tasty-recipes’);
if ( ! recipe ) {
return;
}
var otherButtons = recipe.querySelectorAll(‘.’ + buttonClass);
otherButtons.forEach(function(bt){
bt.classList.remove(buttonActiveClass);
});
button.classList.add(buttonActiveClass);

var scalables = recipe.querySelectorAll(‘span[data-amount]’);
var buttonAmount = parseFloat( button.dataset.amount );
scalables.forEach(function(scalable){
if (typeof scalable.dataset.amountOriginalType === ‘undefined’
&& typeof scalable.dataset.nfOriginal === ‘undefined’) {
if (-1 !== scalable.innerText.indexOf(‘/’)) {
scalable.dataset.amountOriginalType = ‘frac’;
}
if (-1 !== scalable.innerText.indexOf(‘.’)) {
scalable.dataset.amountOriginalType = ‘number’;
}
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (-1 !== scalable.innerText.indexOf(vulgar)) {
scalable.dataset.amountOriginalType = ‘vulgar’;
}
});
if (typeof scalable.dataset.amountOriginalType !== ‘undefined’) {
scalable.dataset.amountShouldRound = scalable.dataset.amountOriginalType;
}
}
var amount = parseFloat( scalable.dataset.amount ) * buttonAmount;
amount = window.tastyRecipesFormatAmount(amount, scalable);
if ( typeof scalable.dataset.unit !== ‘undefined’ ) {
if ( ! scalable.classList.contains(‘nutrifox-quantity’) ) {
if ( ! scalable.classList.contains(‘nutrifox-second-quantity’) ) {
amount += ‘ ‘ + scalable.dataset.unit;
}
}
}
scalable.innerText = amount;
});

var nonNumerics = recipe.querySelectorAll(‘[data-has-non-numeric-amount]’);
nonNumerics.forEach(function(nonNumeric){
var indicator = nonNumeric.querySelector(‘span[data-non-numeric-label]’);
if ( indicator ) {
nonNumeric.removeChild(indicator);
}
if ( 1 !== buttonAmount ) {
indicator = document.createElement(‘span’);
indicator.setAttribute(‘data-non-numeric-label’, true);
var text = document.createTextNode(‘ (x’ + buttonAmount + ‘)’);
indicator.appendChild(text);
nonNumeric.appendChild(indicator);
}
});

window.tastyRecipesUpdatePrintLink();
});
});
}());

window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.cookMode = {
wakeLockApi: false,
wakeLock: false,
cookModeSelector: ‘.tasty-recipes-cook-mode’,
init() {
if (“wakeLock” in navigator && “request” in navigator.wakeLock) {
this.wakeLockApi = navigator.wakeLock;
}

const cookModes = document.querySelectorAll(this.cookModeSelector);

if (cookModes.length > 0) {
for (const cookMode of cookModes) {
if (this.wakeLockApi) {
cookMode.querySelector(‘input[type=”checkbox”]’).addEventListener(“change”, event => {
this.checkboxChange(event.target);
}, false);
} else {
cookMode.style.display = “none”;
}
}
}
},
checkboxChange(checkbox) {
if (checkbox.checked) {
this.lock();
} else {
this.unlock();
}
},
setCheckboxesState(state) {
const checkboxes = document.querySelectorAll(this.cookModeSelector + ‘ input[type=”checkbox”]’);
for (const checkbox of checkboxes) {
checkbox.checked = state;
}
},
async lock() {
try {
this.wakeLock = await this.wakeLockApi.request(“screen”);
this.wakeLock.addEventListener(“release”, () => {
this.wakeLock = false;
this.setCheckboxesState(false);
});
this.setCheckboxesState(true);
} catch (error) {
this.setCheckboxesState(false);
}
},
unlock() {
if (this.wakeLock) {
this.wakeLock.release();
this.wakeLock = false;
}
this.setCheckboxesState(false);
}
};

(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
document.addEventListener(“DOMContentLoaded”, callback);
}
})(() => {
window.TastyRecipes.cookMode.init();
});

window.TastyRecipes = window.TastyRecipes || {};

window.TastyRecipes.staticTooltip = {
element: null,
tooltipElement: null,
deleting: false,
init( element ) {
if ( this.deleting ) {
return;
}
this.element = element;
this.buildElements();
},
destroy() {
if ( ! this.tooltipElement || this.deleting ) {
return;
}

this.deleting = true;
this.tooltipElement.classList.remove( ‘opened’ );

setTimeout( () => {
this.tooltipElement.remove();
this.deleting = false;
}, 500 );
},
buildElements() {
const tooltipElement = document.createElement( ‘div’ );
tooltipElement.classList.add( ‘tasty-recipes-static-tooltip’);
tooltipElement.setAttribute( ‘id’, ‘tasty-recipes-tooltip’ );

const currentTooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
if ( currentTooltipElement ) {
document.body.replaceChild( tooltipElement, currentTooltipElement );
} else {
document.body.appendChild( tooltipElement );
}

this.tooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
},
show() {
if ( ! this.tooltipElement ) {
return;
}

const tooltipTop = this.element.getBoundingClientRect().top
+ window.scrollY
– 10 // 10px offset.
– this.tooltipElement.getBoundingClientRect().height;
const tooltipLeft = this.element.getBoundingClientRect().left
– ( this.tooltipElement.getBoundingClientRect().width / 2 )
+ ( this.element.getBoundingClientRect().width / 2 ) – 1;
const posLeft = Math.max( 10, tooltipLeft );
this.maybeRemoveTail( posLeft !== tooltipLeft );

this.tooltipElement.setAttribute( ‘style’, ‘top:’ + tooltipTop + ‘px;left:’ + posLeft + ‘px;’ );
this.tooltipElement.classList.add( ‘opened’ );

},
maybeRemoveTail( removeTail ) {
if ( removeTail ) {
this.tooltipElement.classList.add( ‘tr-hide-tail’ );
} else {
this.tooltipElement.classList.remove( ‘tr-hide-tail’ );
}
},
changeMessage( message ) {
if ( ! this.tooltipElement ) {
return;
}
this.tooltipElement.innerHTML = message;
}
};

window.TastyRecipes.ajax = {
sendPostRequest( url, data, success, failure ) {
const xhr = new XMLHttpRequest();
xhr.open( ‘POST’, url, true );
xhr.send( this.preparePostData( data ) );

xhr.onreadystatechange = () => {
if ( 4 !== xhr.readyState ) {
return;
}
if ( xhr.status === 200 ) {
success( JSON.parse( xhr.responseText ) );
return;
}

failure( xhr );
};

xhr.onerror = () => {
failure( xhr );
};
},
preparePostData( data ) {
const formData = new FormData();

for ( const key in data ) {
formData.append( key, data[key] );
}
return formData;
},
};

window.TastyRecipes.ratings = {
defaultRating: 0,
currentRatingPercentage: 100,
savingRating: false,
init( minRating ) {
this.minRating = minRating;

this.formWatchRating();
this.closeTooltipWhenClickOutside();
this.addBodyClassBasedOnSelectedRating();
this.backwardCompFormRatingPosition();
},
formWatchRating() {
const ratings = document.querySelectorAll(‘.tasty-recipes-no-ratings-buttons [data-rating]’);
if ( ratings.length {
event.preventDefault();
this.defaultRating = event.target.closest( ‘.checked’ ).dataset.rating;
this.setCheckedStar( event.target );
this.maybeSendRating( this.defaultRating, event.target );
this.setRatingInForm( this.defaultRating );
} );
}
},
closeTooltipWhenClickOutside() {
window.addEventListener( ‘click’, e => {
// Bailout (don’t remove the tooltip) when the clicked element is a rating star, or it’s the tooltip itself.
if ( e.target.closest( ‘.tasty-recipes-rating’ ) || e.target.classList.contains( ‘tasty-recipes-static-tooltip’ ) ) {
return;
}

window.TastyRecipes.staticTooltip.destroy();
} );
},
setRatingInForm( rating ) {
const ratingInput = document.querySelector( ‘#respond .tasty-recipes-rating[value=”‘ + rating + ‘”]’ );
if ( ! ratingInput ) {
return;
}
ratingInput.click();
},
addBodyClassBasedOnSelectedRating() {
const ratingInputs = document.querySelectorAll( ‘input.tasty-recipes-rating’ );
if ( ! ratingInputs ) {
return;
}
for ( const ratingInput of ratingInputs ) {
ratingInput.addEventListener( ‘click’, currentEvent => {
const selectedRating = currentEvent.target.getAttribute( ‘value’ );
this.handleBodyClassByRating( selectedRating );
this.toggleCommentTextareaRequired( selectedRating );
} );
}
},
handleBodyClassByRating( rating ) {
if ( rating < this.minRating ) {
document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' );
return;
}
document.body.classList.add( 'tasty-recipes-selected-minimum-rating' );
},
toggleCommentTextareaRequired( rating ) {
const commentTextarea = document.getElementById( 'comment' );
if ( ! commentTextarea ) {
return;
}

if ( rating {
window.TastyRecipes.staticTooltip.changeMessage( response.data.message );
window.TastyRecipes.staticTooltip.show();
this.updateAverageText( response.data, recipeCardElement );
this.maybeFillCommentForm( response.data );

// Hide the tooltip after 5 seconds.
setTimeout( () => {
this.maybeResetTooltip( recipeCardElement, response.data, rating );
}, 5000 );
},
() => {
this.resetTooltip( recipeCardElement );
}
);
},
updateAverageText( data, recipeCardElement ) {
if ( ! data.average ) {
return;
}
this.setRatingPercent( data );

if ( ! data.count ) {
return;
}

const quickLink = document.querySelector( ‘.tasty-recipes-rating-link’ );
if ( quickLink ) {
this.setTextInContainer( quickLink, data );
this.setPartialStar( quickLink );
}

const cardStars = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
cardStars.dataset.trDefaultRating = data.average;
this.setTextInContainer( recipeCardElement.querySelector( ‘.tasty-recipes-rating’ ), data );
},
setTextInContainer( container, data ) {
if ( ! container ) {
return;
}

if ( data.label ) {
const ratingLabelElement = container.querySelector( ‘.rating-label’ );
if ( ratingLabelElement ) {
ratingLabelElement.innerHTML = data.label;
}
return;
}

const averageElement = container.querySelector( ‘.average’ );
if ( averageElement ) {
averageElement.textContent = data.average;
}

const countElement = container.querySelector( ‘.count’ );
if ( countElement ) {
countElement.textContent = data.count;
}
},
setPartialStar( container ) {
const highestStar = container.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( highestStar ) {
highestStar.dataset.trClip = this.currentRatingPercentage;
}
},
setRatingPercent( data ) {
this.defaultRating = data.average.toFixed( 1 );
const parts = data.average.toFixed( 2 ).toString().split( ‘.’ );
this.currentRatingPercentage = parts[1] ? parts[1] : 100;
if ( this.currentRatingPercentage === ’00’ ) {
this.currentRatingPercentage = 100;
}
},
setCheckedStar( target ) {
const cardRatingContainer = target.closest( ‘.tasty-recipes-ratings-buttons’ );
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( selectedRatingElement ) {
delete selectedRatingElement.dataset.trChecked;
}

const thisStar = target.closest( ‘.tasty-recipes-rating’ );
thisStar.dataset.trChecked = 1;
thisStar.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = 100;
},
maybeFillCommentForm( data ) {
if ( ! data.comment || ! data.comment.content ) {
return;
}

const commentForm = document.querySelector( ‘#commentform’ );
if ( ! commentForm ) {
return;
}

const commentBox = commentForm.querySelector( ‘[name=comment]’ );
if ( ! commentBox || commentBox.value ) {
return;
}

// Add comment details for editing.
commentBox.innerHTML = data.comment.content;
if ( data.comment.name ) {
commentForm.querySelector( ‘[name=author]’ ).value = data.comment.name;
commentForm.querySelector( ‘[name=email]’ ).value = data.comment.email;
}
},
maybeResetTooltip( recipeCardElement, data, rating ) {
if ( this.savingRating === rating ) {
this.resetTooltip( recipeCardElement, data );
}
},
resetTooltip( recipeCardElement, data ) {
window.TastyRecipes.staticTooltip.destroy();
this.savingRating = false;

// Reset the default rating.
const cardRatingContainer = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
if ( cardRatingContainer ) {
this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating;
cardRatingContainer.dataset.trDefaultRating = this.defaultRating;

this.resetSelectedStar( cardRatingContainer, data );
}
},
resetSelectedStar( cardRatingContainer ) {
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( selectedRatingElement ) {
selectedRatingElement.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = this.currentRatingPercentage;
selectedRatingElement.parentNode.dataset.trChecked = 1;
}

const previousSelectedElement= cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( previousSelectedElement ) {
const currentSelectedRating = previousSelectedElement.querySelector(‘[data-rating]’);
if ( currentSelectedRating !== selectedRatingElement ) {
delete previousSelectedElement.dataset.trChecked;
}
}
},
backwardCompFormRatingPosition() {
const ratingsButtons = document.querySelector( ‘#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons’ );
if ( ! ratingsButtons ) {
return;
}
const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons);
if ( ! ratingsButtonsStyles.display.includes( ‘flex’ ) ) {
ratingsButtons.style.direction = ‘rtl’;
}

if ( typeof tastyRecipesRating !== ‘undefined’ ) {
// Select the rating that was previously selected in admin.
ratingsButtons.querySelector( ‘.tasty-recipes-rating[value=”‘ + tastyRecipesRating + ‘”]’ ).checked = true;
}

const ratingSpans = ratingsButtons.querySelectorAll( ‘.tasty-recipes-rating’ );
for (const ratingSpan of ratingSpans) {
ratingSpan.addEventListener( ‘click’, event => {
if ( ratingSpan === event.target ) {
return;
}
ratingSpan.previousElementSibling.click();
} );
}
}
};

(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
window.addEventListener( ‘load’, callback );
}
})(() => {
window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 );
});

Recipes by Reid Putlitz
Photography by Josiah Hull
Styling by Laura Goble

Subscribe to TABLE Magazine’s print edition.

Related News

Create a free account, or log in.

Gain access to read this article, plus limited free content.

Yes! I would like to receive new content and updates.