Home Blog Page 72

Chia Seed Pudding

0
Chia seed pudding served in four bowls with three steel spoons on the side
Discover the delightful goodness of Chia Seed Pudding: A wholesome and flavorful treat packed with nutrition and natural goodness

Chia Seed Pudding is an easy, delicious, and endlessly customizable dessert, or breakfast, with enough oomph for savory flavors or fresh fruit and edible flowers.

Chia Seed Pudding

INGREDIENTS

4 servings

1/2 cup chia seeds
1 can unsweetened coconut milk
1 tablespoon finely crushed piloncillo
1 tsp vanilla bean (split and seeded gently with a knife)
1/2 tablespoon Mexican cinnamon (powder)
1.5 tablespoons of sugar
1/8 teaspoon almond extract

For serving

1/2 cup blueberries
1/2 cup raspberries
1/2/cup peaches (optional)
Mint leaves

DIRECTIONS

  • Gently mix chia seeds, coconut milk, piloncillo, vanilla bean, sugar, almond extract, and half of the cinnamon in a bowl (save the rest for serving). Once the seeds begin to absorb the liquid, the mixture will thicken.
  • Add mixture to serving bowls, cups, or mason jars. Tap the sides of the container to settle the mixture and remove air pockets. Refrigerate for 2 hours prior to serving or refrigerate overnight for best results.
  • Before serving, lightly dust the pudding with the remaining cinnamon. Add berries and one mint leaf to each serving.

RECIPE BY GABE GOMEZ / STYLING AND PHOTOGRAPHY BY KEITH RECKER

Subscribe to TABLE Magazine’s print edition. 

Rub, Soak, and Slather

0
Take your summer BBQ flavors to the next level with Rhonda Schuldt’s fantastic concoctions

Long-time TABLE contributor and recipe writer Rhonda Schuldt has the perfect advice to elevate your outdoor cooking experience: Rub, Soak, and Slather your meats, fish, and veggies with her delectable concoctions. Whether it’s a tantalizing rub, a savory paste, a marinating magic, or a mouthwatering sauce, these diverse seasoning techniques offer an abundance of options for your grilling and barbecuing endeavors this summer.

Rub, Soak, and Slather

Dry Rubs

Dry rubs, a harmonious fusion of aromatic herbs and spices, offer an exquisite way to enhance the taste of meats while forming a delightful, crusty coating. Primarily employed in barbeque preparations, dry rubs work their magic when meticulously massaged into the meat, allowing the flavors to permeate and develop. For optimal results, it is recommended to let the dry rub work its wonders for several hours or even overnight in the refrigerator, enabling a deep infusion of flavors.

Lee’s Favorite Rub: Pork, Beef, Chicken

INGREDIENTS 

3/4 cup paprika
1/4 cup salt
1/4 cup ground black pepper
1/4 cup turbinado sugar or light brown sugar
2 tbsp. chili powder
2 tbsp. garlic powder
2 tbsp. onion powder
2 tbsp. celery powder
2 tbsp. ground oregano

DIRECTIONS

  1. Mix together in a bowl.

Wet Rubs /Pastes

In contrast to their dry counterparts, wet rubs offer a moist twist to the flavor-enhancing experience. By incorporating moist ingredients, these rubs transform into a luscious paste-like consistency. Just like dry rubs, the key lies in massaging the wet rub into the meat and allowing ample time in the refrigerator for the flavors to intertwine. When it comes to crafting wet rubs and pastes, the possibilities are endless. You can experiment with a wide array of fresh or dried herbs, spices, peppers, roasted or raw garlic, mustards, mayonnaise, oils, juices, and even yogurt. Not only do these wet rubs and pastes infuse delectable flavors, but they also help to maintain the succulence of meats, fish, or poultry during the roasting and grilling process.

Roasted Garlic, Horseradish, and MustardFish, Pork, Chicken, Beef, Lamb

A terrific flavor-enhancing paste. Modify it by leaving out the horseradish or changing the herbs and mustard (try honey mustard or grainy mustard) to suit your taste.

INGREDIENTS

4 cloves roasted garlic, mashed
1 tbsp. prepared horseradish
2 tbsp. Dijon mustard
1 tsp.  dried thyme
1 tsp. freshly ground black pepper
1 tsp. kosher salt (optional)

DIRECTIONS

  1. Place all ingredients in a bowl and mash together into a paste.

Marinades

Marinades, the liquid wonders of culinary mastery, possess the power to imbue meats, seafood, and vegetables with flavor while tenderizing them to perfection. The possibilities for flavor combinations are boundless, but at the core of every marinade lies an acidic tenderizing agent, such as wine, vinegar, or citrus, serving as the foundation for a harmonious blend of herbs, spices, and other ingredients. To achieve optimal results, marinating should always take place in the refrigerator and within a non-reactive container. Zip-top bags prove to be the ideal choice, allowing for easy and efficient marinating. With these simple guidelines in mind, you can embark on a culinary adventure, creating marinades that elevate your dishes to new heights of taste and tenderness.

Simply Delicious Lemon, Garlic, White Wine Marinade:  Chicken, Pork, Lamb, Beef, Fish, Seafood, Veggies

Delicious on its own, this is also an incredibly adaptable marinade base for any flavor profile you’re going for.

Basic Marinade:

INGREDIENTS Juice of one fresh lemon, approximately ¼ cup (use Meyer lemons when in season)
1/3 cup white wine
5 cloves garlic, minced
1 tsp. kosher salt
½ tsp. black pepper

DIRECTIONS

  1. Mix all ingredients together before pouring over meats or vegetables, and marinate according to the suggested time.

Exciting Flavor Adaptations to Try:

  1. Indulge in Mediterranean-inspired grilled chicken breasts or thighs by combining dried basil, oregano, and fresh or dried thyme.
  2. Elevate your grilled flank steak by using lime juice instead of lemon, and adding a dash of ground cumin, coriander, oregano, and a splash of soy sauce.
  3. Transport your taste buds to Cuba with a delectable grilled pork tenderloin: substitute the wine with the juice of a fresh orange, and infuse it with the flavors of cumin, coriander, a bay leaf, and a hint of cayenne.
  4. For an unforgettable grilled or roasted leg of lamb, double the recipe and include a generous handful of fresh, chopped rosemary.
  5. Transform grilled cauliflower into a stunning culinary delight: replace the wine with 1 cup of yogurt, and introduce grated ginger or ginger paste, garam masala, and ground coriander into the mix.

Story by Rhonda Schuldt /  Photography by Marcy Holquist / Styling by Keith Recker

Don’t miss a single delicious thing: Subscribe to TABLE Magazine here!

Barbacoa de Pollo

0
Chicken tacos on a plate
A delicious recipe from the kitchen of renowned Zapotec natural dyer Juana Gutierrez Contreras

The art, textiles, ceramics, jewelry, and more on offer at the International Folk Art Market every summer are beautiful vessels of culture. They carry the history, heritage, and personal creativity of their makers…and enable us to carry these messages home when we purchase. Because food is another way in which culture makes its way around the world, we asked IFAM’s artists to share recipes they make and eat with gusto. You can make them for your friends and family and share your thoughts about beauty and craft in the conversation that will doubtless kindle and spark.

Barbacoa de Pollo is a traditional Zapotec dish served in the autumn. Renowned natural dyer and International Folk Art Market veteran Juana Gutiérrez Contreras, a partner in her family’s Teotitlan del Valle-based textile business, Porfirio Gutiérrez y Familia, shares her recipe. Translated via telephone by family friend Robert Sturm. Gracias Juana y Robert!

Barbacoa de Pollo Recipe

INGREDIENTS 
1 large chicken, cut into pieces (she said 2.5-3 kilos, if possible)
1 pound dry guajillo chile
3 large cloves of garlic
3 medium or 2 large white onions
A few avocado leaves
2-3 T. Thyme
4 cloves
4.5” of cinnamon stick

DIRECTIONS

  1. Preheat the oven to 375 degrees.
  2. Clean the chile – remove the stems and the seeds.  Soak in hot water.
    Grill the onion and garlic on a comal (or grill pan) until they are seared and easy to peel. Remove from the pan and peel.  Add to the chile.
  3. Toast the thyme and garlic cloves on the comal (or grill) for just a few seconds until they start to release their aroma.  Process in a food processor or blender with water from the chile bath until smooth.  If the liquid is very thick, add a little more water.
  4. Clean the chicken and cut it into serving-size pieces. Arrange the chicken in a single layer in a casserole, place the cinnamon strategically, and cover it with the sauce
  5. Cook until chicken is cooked through, approximately one hour.
  6. If making tacos, shred the chicken in the kitchen, and place it in a serving dish. Serve with corn tortillas and with chopped cilantro, lemon wedges, and finely chopped romaine or cabbage. A bit of pico de gallo is never a bad idea.

Don’t miss a single delicious thing!

Subscribe to TABLE Magazine

For more information

Porfirio Gutierrez and Juana Gutierrez Contreras

International Folk Art Market

I-25 Commute Martini

0
martini glass with blackberries

A great way to learn about a place is to enjoy its local spirits. It’s incredible what a cocktail, like the I-25 Commute Martini, can do to enliven the senses, and these recipes, perfectly mixed for summer, express the flavors and magic of New Mexico. Make your commute less painful with some magic with Aristology Red Vermouth from 505Spirits.

I-25 Commute Martini

Ingredients
2 oz dry gin
1 oz Aristology Red Vermouth
Lemon twist

Instructions

  1. In a cocktail shaker filled with ice, combine gin and vermouth. Stir well, about 30 seconds, then strain into a martini glass.
  2. Garnish with lemon twist and serve.

Story, Recipe, and Styling by Gabe Gomez / Photography by Tira Howard 

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Paloma Cocktail

0
A grapefruit drink with a slice of grapefruit and a reusable straw

Ah, the Paloma Cocktail, a true work of art that effortlessly fuses the vibrancy of grapefruit with the spirited soul of tequila. It’s a libation that dares to captivate your senses, transporting you to a world where flavors sing and glasses clink with pure delight. The Paloma’s secret weapon? Freshly squeezed grapefruit juice. The bright, zesty notes come alive, ensuring a taste sensation that’s simply divine. But remember the spirit that sets this cocktail apart – blanco tequila. Its smooth character and subtle complexities intertwine with the grapefruit, elevating each sip to pure bliss. One sip, and you’ll find yourself lost in a sea of tequila-fueled tranquility.

Paloma Cocktail

INGREDIENTS 

4 oz. soda water
1½ oz. blanco tequila
½ oz. fresh lime juice
¼ oz. fresh grapefruit juice
Grapefruit slice
Kosher salt

DIRECTIONS

  1. Fill the cocktail glass two-thirds full with ice.
  2. Slowly pour approximately 2 oz. of soda water into the glass, filling it about one-third full.
  3. Add 1½ oz. of blanco tequila, ½ oz. of lime juice, ¼ oz. of grapefruit juice, and a pinch of kosher salt.
  4. Top up the glass with the remaining soda water and gently stir.
  5. Garnish with a grapefruit wedge.

Story, Recipe, and Styling by Gabe Gomez / Photography by Tira Howard 

Don’t miss a single delicious thing: Subscribe to TABLE Magazine.

 

Chicos with Red Chile

0

Dried young corn kernels are known as chicos, as well as dried New Mexican red chile, which can be found at farmers’ markets and the Santa Fe School of Cooking. Use any classic New Mexican red chile sauce, or make your own from the recipe below. Adapted from Tasting New Mexico: Recipes Celebrating 100 Years of Distinctive Home Cooking by Cheryl Alters Jamison and Bill Jamison.

Chicos with Red Chile Recipe

INGREDIENTS

2 tbsp vegetable oil, lard, or bacon drippings
1 medium onion, chopped fine
3 garlic cloves, minced
2 cups dried corn chicos
6 cups chicken, beef, or vegetable stock
½ to 1 cup red chile sauce
1 tsp salt, or more to taste

 INSTRUCTIONS

  1. Warm the oil over medium heat in a large saucepan. Stir in the onion and garlic, and sauté until just softened, about 5 minutes. Add the chicos and stock to the pan and bring to a boil.
  2. Reduce the heat to a simmer and cook uncovered for 1½ to 2 hours, until the chicos are well-softened and have lost their raw starchy flavor. They will remain a little chewy. Add hot water if the chicos begin to dry out.
  3. Add red chile sauce and, if needed, more salt. Cook for another 15-20 minutes. The chicos should remain a bit soupy.
  4. Serve hot in small bowls with some of the liquid, or drain with a slotted spoon and serve plated beside other dishes.

 For the Red Chile Sauce:

  1. Warm 2 tablespoons vegetable oil in a heavy saucepan over medium heat. Add 1 finely chopped small onion, and 2-3 minced garlic cloves, and sauté until the onion is limp.
  2. Stir in ¾ cup ground dried New Mexican red chile (mild, medium, hot, or a combination), and add 4 cups chicken or beef stock, about 1 cup at a time.
  3. Add 1 teaspoon crumbled dried Mexican oregano or marjoram and 1 teaspoon salt, and bring the sauce just to a boil. Reduce the heat to a low simmer and cook for about 20 minutes.
  4. The completed sauce should coat a spoon thickly but still drop off it easily. Use warm or refrigerate for later use. This makes about 4 cups. The sauce will keep for 5-6 days and also freezes well.

Recipe by Cheryl Alters Jamison / Photography by Douglas Merriam

A footer photo with a black background and subscribe info and button

Subscribe to TABLE Magazine‘s print edition.

Sandia Sunset Campari

0
Two Sandia Sunset Campari cocktails sit in rocks glasses, one slightly in front of the other. Orange and red in color, raspberries and oranges sit on the table around the cocktails.

A great way to learn about place is to enjoy its local spirits. It’s incredible what a cocktail can do to enliven the senses, and these recipes, perfectly mixed for summer, express the flavors and magic of New Mexico.

The gently bitter, aromatic tang of Campari is balanced with Artistology’s Red vermouth… and made refreshing with a dash of soda. This complex but light quaff has summer written all over it.

Sandia Sunset Campari Recipe

INGREDIENTS
1 1/2 oz Campari
1 1/2 oz Aristology Red Vermouth
1 to 2 oz soda water, to taste
Orange slice for garnish

INSTRUCTIONS

  1. Fill a glass with ice. 
  2. Add Campari, soda water, Aristology Red Vermouth.
  3. Stir gently. Garnish with orange. Enjoy your Sandia Sunset Campari cocktail!

Story, Recipe, and Styling by Gabe Gomez / Photography by Tira Howard 

Don’t miss a single delicious thing: Subscribe to TABLE Magazine.

Herb‑Crusted Chicken Meatballs with Smoked Garlic Aioli

0
Herb Crusted Chicken Meatballs with Smoked Garlic Aioli in a pan on the side of a fork, a napkin, and a drink

These chicken or turkey meatballs are a runaway hit.

HERB-CRUSTED CHICKEN MEATBALLS WITH SMOKED GARLIC AIOLI

INGREDIENTS

For the meatballs:
1 pound ground chicken (or turkey) 2 eggs
2 Tbsp. bread crumbs
1 tsp. onion powder
1 tsp. red pepper flakes
1 tsp. cracked black pepper 1⁄4 cup chopped parsley
1 tsp chopped rosemary
1 tsp chopped thyme
salt to taste

For the garlic aioli:
1 bulb of garlic, roasted 1⁄2 cup mayonnaise juice of one lemon
1 tsp smoked sea salt
Preheat oven to 375 degrees.
Chop herbs and set them aside; use these last.

DIRECTIONS

  1. Drizzle the whole head of garlic with olive oil and smoked sea salt. Wrap a bulb of garlic in a piece of foil nice and tight, pop it into your oven, and roast at 375 degrees for about 30-40 minutes or until the garlic is nice and soft.

  2. Once the garlic is roasted, cool it down until you are able to handle it. Squeeze the bulb and the roasted garlic cloves should easily pop out of the papery part around the garlic. Smash this with the side of your knife to create a paste.

  3. Mix together roasted garlic paste, lemon, mayonnaise, and a little extra smoked sea salt. Set aside to serve with your meatballs.
    In a bowl mix together ground meat, egg, breadcrumbs, and seasoning. Stir until evenly incorporated.

  4. Roll into 1-inch balls and then place on a parchment-lined baking sheet. Roast at 375 degrees for 20 min or until the meatballs reach an internal temp of 165 degrees.

  5. Toss cooked meatballs in the freshly chopped herbs and serve with the garlic aioli.

RECIPE AND STYLING BY ANNA CALABRESE / PHOTOGRAPHY BY DAVE BRYCE

Subscribe to TABLE Magazine’s print edition.

Babyback Ribs

0
A rack of Babyback Ribs spread out on a wooden board.
Image Courtesy of Jon Tyson

Is there anything more satisfying than sinking your teeth into a meticulously cooked rack of these succulent babyback pork delicacies? Hell’s bells, I doubt it. This outstanding recipe is bound to transport you to a state of finger-licking bliss and leave you craving for more.

Babyback Ribs Recipe

INGREDIENTS

1 rack baby back pork ribs
2 cups homemade barbeque sauce (see recipe below)
½ cup chile powder
¼ cup white sugar
¼ cup brown sugar
¼ cup paprika
¼ cup salt
1 tablespoon ground black pepper
1 tablespoon ground cumin
1 teaspoon mustard powder

INSTRUCTIONS

  1. Mix chile powder, white sugar, brown sugar, cumin, dry mustard, paprika, and salt in a small bowl until combined.
  2. Generously dry rub to all sides of the rib rack
  3. Preheat grill to 250 degrees
  4. Add ribs directly to the grill. Make sure to maintain consistency and even heat throughout the entire cooking process. Cook for two hours, approximately. The internal temperature should be 145 degrees.
  5. Once the ribs are at temperature, baste the ribs with half of the BBQ sauce. Leave them on the grill for five minutes.
  6. Remove from heat. Let ribs rest for 10 minutes. Cut and serve. Add extra BBQ sauce for dipping.

Homemade BBQ Sauce Recipe

INGREDIENTS

1 cup ketchup
2 tablespoons molasses
2 tablespoons Worcestershire sauce
1 tablespoon cider vinegar
1 teaspoon garlic powder
1/4 teaspoon mustard powder
1/2 teaspoon smoked paprika
1 teaspoon kosher salt
1 teaspoon black pepper

INSTRUCTIONS

  1. Add all ingredients to a medium saucepan. Simmer on low heat for 10 minutes. Let babyback ribs cool before serving.

Recipe by Gabe Gomez 

A footer photo with a black background and subscribe info and button
Subscribe to TABLE Magazine‘s print edition.

Roasted Squash Tacos with Sriracha Mayonnaise

0
Squash Tacos sitting on a white plate

Don’t let appearances deceive you. These vegetarian squash tacos are bursting with an abundance of flavors and packed with all the goodness your body craves. Whether it’s Taco Tuesday or any other day of the week, these babies will hit the spot like no other.

Here’s the secret to taking these beauties to a whole new level of indulgence. Picture this: crumbled feta or goat cheese delicately sprinkled on top, lending that luxurious richness. And remember the roasted pumpkin seeds, adding a delightful crunch and a touch of creaminess.

So, if you’re searching for a meat-free marvel, look no further. These vegetarian squash tacos will have you rejoicing with every mouthwatering bite. Trust me, my friends; this is a culinary experience you won’t want to miss.

Why Use Both Yellow and Butternut Squash?

Yellow squash offers a mild, slightly sweet flavor, while butternut squash brings a richer, earthier taste to the table. The combination of the two creates an interesting and complementary flavor profile. This only continues when it comes to their texture. Roasted yellow squash cooks to a tender-crisp while butternut squash is going to be slightly firmer. This play on flavors and textures makes sure not a single bite is a boring one.

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

Squash Tacos sitting on a white plate

Roasted Squash Tacos with Sriracha Mayonnaise


5 Stars 4 Stars 3 Stars 2 Stars 1 Star


  • Author:
    Sara Ghedina
  • Yield: Serves 4

Description

Ditch the chicken and try these meatless tacos made with delicious roasted squash.


Ingredients


Scale

  • 12 yellow squash
  • 1 green zucchini
  • 1 1/2 cups butternut squash, peeled and cubed
  • 1 small red onion, thinly sliced
  • 23 tbsp extra-virgin olive oil
  • 2 limes
  • 1 + 1 tsp chili pepper
  • 1/2 tsp garlic powder
  • 1 tsp Mexican oregano
  • 1/4 tsp smoked paprika
  • 1/4 tsp cayenne pepper
  • Salt and pepper, to taste
  • 1 1/2 cup purple cabbage, thinly sliced
  • 1 cup green cabbage, thinly sliced
  • 1 1/2 cans black beans
  • 1 green onion, thinly sliced
  • 1/3 cup cilantro, minced
  • 1 cup mayonnaise
  • 23 tbsp Sriracha
  • 2 tbsp fresh lemon juice
  • Salt and pepper, to taste
  • 8 corn tortillas
  • 1 avocado, sliced
  • 12 jalapeños, seeded and sliced


Instructions

  1. Preheat the oven to 400 degrees.
  2. Cut yellow squash and green zucchini into same-size chunks, then spread them onto a baking sheet along with the butternut squash and the red onion. Drizzle with 1 1/2 tablespoons olive oil and the juice of one lime, and sprinkle with chili pepper, garlic powder, oregano, smoked paprika, cayenne pepper, salt, and black pepper. Toss to coat and then roast in the oven for about 30 minutes, stirring halfway through.
  3. Meanwhile, prepare the cabbage slaw: in a medium-sized bowl, combine the purple and green cabbage, black beans, green onion, cilantro, juice of the other lime, 1 1/2 tablespoons olive oil, chili pepper, salt, and black pepper. Toss to combine, and set aside to marinate.For the Sriracha mayonnaise, place mayonnaise, Sriracha, and lemon juice in a small bowl. Stir to combine and season with salt and pepper.
  4. Warm the tortillas on each side on a small skillet over medium heat, transfer to a plate, and cover with a towel to keep warm. Repeat with each one, stacking them on top of each other.
  5. To assemble the tacos, place a spoonful of cabbage slaw in the center of each taco, top with some roasted squash and a few slices of avocado. Garnish with jalapeño slices and some cilantro leaves, and serve immediately with the Sriracha mayonnaise on the side.

window.trCommon={“minRating”:6,”ajaxurl”:”https://www.tablemagazine.com/wp-admin/admin-ajax.php”,”ratingNonce”:”70e0d6828f”,”postId”:2830};
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 );
});

Story, Styling, and Photography by Sara Ghedina

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.