Home Blog Page 195

Grilled Pork Chops with Grilled Pineapple

0
Pork, pineapple, and peaches on the grill make for a sweet summertime meal.

This recipe from our friend Chef Jackie Page of Jackie Kennedy Catering comes together quickly and saves you from heating up the kitchen on a hot summer day.

Using your grill to cook pork chops makes short work of the task. But keep in mind that when grilling pork it is always a good idea to choose chops with a little fat on them in order to yield a more tender and juicy result. And using your grill to caramelize the sugar in the pineapple brings out added sweetness that is very complementary to the pork chops.

Serve with Jackie’s Grilled Peach Salad (recipe below) to make this a complete meal.

GRILLED PORK CHOPS WITH GRILLED PINEAPPLE RECIPE

Ingredients

4 boneless pork chops

salt and pepper to taste

2 tbsp smoked paprika

2 tbsp olive oil

Fresh Pineapple slices

Sliced red bell pepper

Instructions

Season pork chops with salt, pepper, paprika, and olive oil.

Place on a pre-heated grill.

Grill pork chops for 2-3 minutes on each side.

Move chops to indirect heat, flipping once until they reach an internal temp of 165°.

Grill pineapple and red bell pepper slices until they have nice grill marks on both sides.

Serve pork chops with grilled pineapple and red bell pepper slices on top.

GRILLED PEACH SALAD

Ingredients

4 Peaches

1/2 cup brown sugar

1 tbsp. Cinnamon

4 tbsp Olive oil

Mixed greens or lettuce of choice

4 oz. Goat cheese

salt and pepper to taste

Balsamic glaze

Instructions

Cut peaches in half and remove pit.

Season the halved peaches with a little cinnamon, olive oil and brown sugar.

Grill in a grill pan or on outdoor grill until seared with good grill marks.

Put lettuce on a platter, arrange peaches, and dollop with goat cheese.

Add salt and pepper to taste and drizzle with balsamic glaze.

Serves 8

RECIPE BY JACKIE PAGE / STYLING BY KEITH RECKER / PHOTOGRAPHY BY JEFF SWENSEN / STORY BY STAR LALIBERTE

Try these other recipes from TABLE Magazine:

Fried Chicken

Summer Veggie Sauté with Ravioli

Skirt Steak and Scallion Salsa

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Chicken Caprese

0
Chef Jackie Page serves summer on a plate with this fresh and delicious easy-peasy Chicken Caprese.

It doesn’t need to be complicated to be delicious. That is why we love this recipe from our friend and TABLE contributor Chef Jackie Page of Jackie Kennedy Catering.

Some very tasty dishes are often those that are the easiest to prepare. This is especially true when you take advantage of the full and subtle flavors of fresh ingredients. For a burst of summer’s finest flavors, serve this dish alongside Jackie’s Grilled Peach Salad (recipe below). From start to finish you’ll have this dinner on the table in under an hour.

CHICKEN CAPRESE RECIPE

Ingredients

4 boneless skinless chicken breast

Salt and pepper

1 tbsp Italian seasoning

2 tbsp olive oil

1 pint cherry tomatoes

2 medium burrata balls

8 fresh basil leaves

Instructions

Pre-heat oven to 375°.

Roast chicken and tomatoes in a shallow dish in the oven for 30 minutes.

After cooking, top chicken with tomato, cut Burrata in half and place on top of chicken and tomatoes, and finish with torn fresh basil.

GRILLED PEACH SALAD

Ingredients

4 Peaches

1/2 cup brown sugar

1 tbsp. Cinnamon

4 tbsp Olive oil

Mixed greens or lettuce of choice

4 oz. Goat cheese

salt and pepper to taste

Balsamic glaze

Instructions

Cut peaches in half and remove pit.

Season the halved peaches with a little cinnamon, olive oil and brown sugar.

Grill in a grill pan or on your outdoor grill seared with good grill marks.

Put lettuce on a platter, arrange peaches, and dollop with goat cheese.

Add salt and pepper to taste and drizzle with balsamic glaze.

Serves 8

RECIPE BY JACKIE PAGE / STYLING BY KEITH RECKER / PHOTOGRAPHY BY JEFF SWENSEN / STORY BY STAR LALIBERTE

Try these other recipes from TABLE Magazine:

Fried Chicken

Summer Veggie Sauté with Ravioli

Skirt Steak and Scallion Salsa

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Crab and Jarlsberg Quiche

0
Simplicity meets luxury with this flavor-packed quiche recipe from Chef Jackie Page.

Look no further if you’re trying to find a simple yet lavish quiche recipe. Chef Jackie Page, TABLE contributor and chef/owner of Jackie Kennedy Catering, is sharing this flavor-packed recipe with our readers. The distinct nuttiness of the Jarlsberg with the sweetness of the lump crab meat delivers a 5-star flavor with every luxurious bite.

Serve for breakfast with fresh seasonal fruits, or later in the day, from brunch through dinner, with a tossed salad of greens for a light and satisfying meal.

CRAB & JARLSBERG QUICHE RECIPE

Ingredients

For the filling

8 oz of jumbo lump crab meat

2 scallions thinly sliced

4 eggs

1 cup of heavy whipping cream

4oz. Jarlsberg cheese shredded

1 tsp. salt

1 tsp. pepper

For the crust

1 1/2 cups of flour

1 stick of unsalted butter

3-4 tablespoons of water

(you can also use a store bought crust)

Instructions

For the crust

Add the flour and chopped butter in food processor and process until pebbly.

Add 1 tablespoon of water at a time until the dough forms a ball.

Remove from processor and knead a couple of times.

Place in plastic wrap and put in the refrigerator until ready to use.

For the quiche

Roll out the dough to fit your pie pan, or use an already prepared crust.

Add crab meat, scallions, and cheese to the crust.

Beat eggs with heavy whipping cream and pour over the crab and cheese mixture.

Bake for 30 minutes at 375° or until filling is set.

Serves 6-8.

RECIPE BY JACKIE PAGE / STYLING BY KEITH RECKER / PHOTOGRAPHY BY JEFF SWENSEN / STORY BY STAR LALIBERTE

Try some of TABLE’s other breakfast/brunch recipes:

Breakfast Strata with Caramelized Onions, Dates and Gruyere

Jen Clark’s Carrot Cake Baked Oatmeal

Chia Seed Pudding

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Roasted Veggies on the Grill

0
Intensify the flavor of your vegetables by utilizing the high dry heat of your grill.

ROASTED VEGGIES ON THE GRILL RECIPE

Ingredients

2 zucchini

2 squash

1 eggplant

1/2 pound fresh mushrooms

1 red pepper

1 orange pepper

1 red onion

extra virgin olive oil

Garlic powder

Onion powder

Salt and pepper

Fresh thyme

For confit potatoes:

4 baking potatoes

1 lb of melted butter

Salt and pepper

Instructions

Slice zucchini, eggplant and yellow squash on the bias, leave peppers whole, and slice red onions keeping each cut together. Slice mushrooms if large, or leave whole if not. Toss the vegetables with olive oil and seasonings, then place on the grill. Cook on both sides until browned (or even lightly charred). Once you remove the vegetables slice the peppers into big pieces and place all vegetables on a serving platter.

RECIPE BY JACKIE PAGE / STYLING BY KEITH RECKER / PHOTOGRAPHY BY JEFF SWENSEN

Try some of TABLE’s other summer veggie recipes:

Grilled Zucchini with Tahini Yogurt Sauce and Corn Relish

Summer Veggie Sauté with Ravioli

Summer Squash Roll-Ups

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Farm to Table, Buy Local

0
A farmers’ market for everyday. Photography by Jeff Swensen

Farm to Table Buy Local is a 501c3 non profit that connects people to local farms and community gardens.

We provide a myriad of programming to promote real, fresh, local food, including food deliveries, garden

education classes, and helping people access food assistance programs. We work in schools, community

centers, affordable housing, and child care centers. The Heinz Endowments has supported our mission

through grant awards since 2018.

Welcome to Farm to Table Buy Local’s 2022 Western PA Local Food Guide! We’ve partnered with

TABLE Magazine to publish this extensive list of CSAs, farms, farmers markets, retailers, u-pick farms,

butchers, dairies that are located throughout the Western Pennsylvania region. The abundance of

agricultural producers in Western Pennsylvania allows us to eat local all year round. More importantly,

buying direct from local farms and food producers strengthens our local food system.

I love the feeling of driving around a corner and seeing a farmers market or farm store. I usually

stop by to shop. Whether I’m at home in Pittsburgh or working throughout Western Pennsylvania, I can

always count on finding some delicious food. I take these opportunities to stock up on our family’s favorite

local foods: milk, butter, yogurt, eggs, cheese, baked goods, oatmeal, flour, honey, maple syrup, fruits,

vegetables, meat, herbs and even beans. It’s a completely different shopping experience. You can smell

the freshness of the food, sometimes see the fields where the food was grown and talk to the people who

planted the seeds, tended the crops, fed the animals or tapped the trees.

Another way to buy local is to subscribe to a CSA (Community Supported Agriculture). There are

many types of farms and local businesses that deliver to your neighborhood, or even direct to your home.

I subscribe to a few throughout the year and I love to teach my kids what’s in season. Most farms offer

customizable shares to cater to dietary needs and household sizes.

Many farms and farmers markets accept SNAP (Supplemental Nutrition Assistance Program) benefits,

WIC (Women-Infant-Children) vouchers, farmers market nutrition vouchers and other programs to help

low income households access fresh food. Non profits in the region help consumers connect to these

programs.

Growing a garden is the closest thing to free food that you can get! Even a container of basil or mint

growing on your windowsill can provide nourishment, beauty and a connection to nature. Community

gardens are located throughout our region. Some are extending the harvest by adding greenhouses, hoop

houses, solar energy and more.

Visit Farm to Table, Buy Local for more information about our upcoming programs.

Warm Regards,

Erin Hart

Executive Director

Farm to Table Buy Local

412-657-3028

erin@farmtotablepa.com

National Farmers’ Market Week 2022 – August 7-13

2022 FARM TO TABLE GUIDE

Don’t miss a single farm fresh thing!

Subscribe to TABLE Magazine

Campo Lavender Margarita

0
Fresh from Los Poblanos, a refreshing cocktail made from their signature crop.

A post-spa-treatment margarita sounds, heavenly, doesn’t it? Los Poblanos director of wine and spirits, Dylan Storment, agrees.

CAMPO LAVENDER MARGARITA RECIPE

Recipe by Director of Wine & Spirits, Dylan Storment

2 oz of your favorite tequila (We use Tepozan Blanco.)

1 oz of your favorite orange liqueur (We use Bauchant.)

1 oz  fresh squeezed lemon juice

1  oz fresh squeezed lime juice

3/4 oz Los Poblanos Lavender Simple Syrup

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

RECIPE BY DYLAN STORMENT / PHOTOGRAPHY BY DOUG MERRIAM

Try these other delicious cocktails:

Sangre Sunset

Pineapple Jalapeño Margarita

Sandia Sunset Campari

Don’t miss a single sippable thing:

Subscribe to TABLE Magazine here!

Forging Forward: Justice for All

0
Adam DiBuo, Managing Attorney for Housing at Neighborhood Legal Services, consults with a client alongside Doreen Mitchell, NLS’s Housing Coordinator. Photo by Justin Merriman

Forging Forward 2022 is a series of six articles about organizations helping our region make progress on the significant issues challenging our friends and neighbors. The series is presented with the generous support of The Pittsburgh Foundation.  

The #ONEDAY Critical Needs Campaign, a day of online giving to organizations doing vital work, is on August 9: mark your calendars and plan to be part of something great!

While the ideal of equal treatment under the law may still be an aspiration in the United States, there are organizations working to close the equity gaps in our legal process. Since 1966, Neighborhood Legal Services (NLS) works tirelessly to support our communities. Our low-income neighbors and those in under-resourced areas, in particular, can find support at NLS at little to no cost to help protect their legal rights around poverty law issues. Housing, family law, and protection from abuse are just some of the many issues that NLS can help address.

“We protect basic needs, like a civil and legal ER,” said Christine Kirby, NLS’s director of development. “When you’ve exhausted other services – like rental assistance and nutritional benefits – and you have nowhere else to turn, contact us,” she added.

Most of NLS’s clients are near or below the federal government’s definition of poverty. Women make up the majority of NLS’s clientele (74%), and the organization addresses the needs of a diverse range of racial and ethnic communities and age groups. 79% of its clients have children under 18 years old, meaning that family needs are a huge part of the work of the organization.

During the pandemic, the organization saw an uptick in need for unemployment, custody and family safety, and housing support. “We had a lot of cases involving housing because landlords were refusing to make repairs if people didn’t pay rent. We also were there on hand to help people navigate this system. Things bubbled up in different ways,” she added.

Legal issues involving bankruptcy, disability rights, consumer law, employment law and elder law are just a few of the areas NLS can help individuals and families with. Having the ability to expunge a criminal record so that someone can then access safe housing and find employment is one of many examples as to how the organization helps to restore the balance for people who may not otherwise have any legal support.

“None of our rights mean anything if we can’t enforce them,” said Kristine Bergstrom, executive director.  With a staff of about 80 – higher than ever before – including 40 lawyers, as well as administrators, paralegals and social workers, the organization works to address the justice gap. NLS is also supported by 300 pro bono attorneys who primarily assist with PFAs – regardless of income. “We employ experts in poverty law,” added Bergstrom.

The most challenging aspect to their work is bringing awareness to communities that theNLS exists at free or little charge to them. “NLS offers a more robust availability of legal services, and at the same time we work hard to promote legal literacy so that we can help prevent a legal catastrophe from happening,” said Bergstrom.

Informing clients that justice should be a right and not a privilege means more investment in legal aid and preventative strategies. “We must look at the whole person and not as a victim of circumstance,” said Kirby. “We try to make it easier for people to access legal representation so that people know their rights.”

“NLS is the protector for the other services and rights that people have,” said Bergstrom. “You can get food stamps and housing, but nothing means anything if they can take it away and no one can take it to court to enforce your rights. We are the protector.”

To help keep legal services available to everyone in Allegheny, Beaver, Butler, and Lawrence Counties in Pennsylvania, please consider donating during the Pittsburgh Foundation’s ONE DAY campaign to provide support to NLS on August 9. Together, we can create a just and more equitable world!

Get to know Neighborhood Legal Services here, and support its work to address our neighbors in need.

Read about other organizations doing vital work to help our neighbors in Western Pennsylvania by reading more in our Forging Forward series, presented with the support of The Pittsburgh Foundation:

Tech 25: The Future is Now

Outreach Teen and Family Services

Neighborhood Legal Services

Fishes and Loaves

Build the Community Center

Healthy Start

Doreen Mitchell, Housing Coordinator at Neighborhood Legal Services. Photo by Justin Merriman

Christine Kirby, Development Director at Neighborhood Legal Services. Photo by Justin Merriman

Adam DiBuo checks the law at Neighborhood Legal Services. Photo by Justin Merriman

Get to know other organizations doing vital work to help our neighbors in Western Pennsylvania by reading more in our Forging Forward series, presented with the support of The Pittsburgh Foundation:

Tech 25: The Future is Now

Outreach Teen and Family Services

STORY BY NATALIE BENCIVENGA

PHOTOGRAPHY BY JUSTIN MERRIMAN

Don’t miss a single fascinating thing!

Subscribe to TABLE Magazine.

Local In Lawrenceville

0
Bryanna Johnson, manager of Lawrenceville Farmer’s Market. Photo by Nina Katz.

FROM MAY TO NOVEMBER, PITTSBURGH BECOMES HOME TO OVER A DOZEN FARMER’S MARKETS, ALL DOLING OUT FRESH, LOCAL PRODUCE AND OTHER PROVISIONS TO RESIDENTS AND VISITORS TO THE CITY. WEEKENDS MAY BE RESERVED FOR THE FAMOUSLY LONG LINE-INDUCING BLOOMFIELD AND SQUIRREL HILL MARKETS, BUT ON ANY GIVEN DAY OF THE WEEK, THERE ARE FARMER’S MARKETS ACROSS THE CITY, WAITING FOR YOUR PERUSAL. ON TUESDAY AFTERNOONS, IN ITS NEW LOCATION ON 41ST AND WILLOW STREET, LAWRENCEVILLE IS HOME TO A SMALL, BUT MIGHTY, FARMER’S MARKET.

            “Let me just count really quick to make sure I get this right.” Lawrenceville Farmer’s Market manager Bryanna Johnson puts down her water bottle, holds out her fingers, and starts counting forwards from the year 2011, the market’s inaugural summer. “…10, 11, 12. We are in our 12th season” says Johnson, celebratorily, who has led the market since 2021. Born and raised in New Jersey, Johnson graduated college and found herself ping ponging between jobs at non-profits, in restaurants, marketing agencies, and even collegiate athletics. When Johnson saw that Lawrenceville United had posted an application for Farmer’s Market manager, something clicked, as if she had found a way to combine all the things she liked about her past work experiences into just one job.

Now over a year into her role, and five as a Pittsburgh resident, Johnson works hard to make the market a community hub. “Over the past couple of years, especially with COVID, the farmer’s market has become this place where people come for a social experience” says Johnson, who on top of everything else plans for each market to feature a different community partnership with a Pittsburgh-serving organization. State representative Sara Innamorato is at the market each week answering questions and sharing information about state programs and benefits. Come the Fall, skip the line at CVS and get your flu shot at the market. (Okay, so you might still have to wait in a line, but at least you’ll be surrounded by those spicy and sweet autumnal aromas).

Community organizing is just the beginning of a long list of skills Johnson uses to keep the Lawrenceville Farmer’s Market a happenin’ place. As she lists them, I begin to lose track of just how many duties she, as the Market Manager, is responsible for. Vendor procurement and vetting, market setup and breakdown, managing social media, and volunteer coordinator are just a few of the big ones. “That’s so many hats!”, I say. Johnson snaps the air with her fingers and laughs. “Thank goodness I have such a big market bag.”

Johnson and I spoke in mid-July when her market bag in question was filling up with dark red, juicy cherries, and blushing peaches. “I have been eating so many cherries,” she admits. “I have not baked with them; I have not done anything but eat my way through pints and pints of fresh cherries for the past few weeks. They are amazing. I did however bake with my peaches. I made a sesame peach crisp with tahini, and it was so good.”

Glimpses of freshness and plenty at the Lawrenceville Farmer’s Market. Photos by Nina Katz.

But on a day Johnson would call a success, she only has a moment to spare on her own rounds of buying stone fruit, a weekly fix of kale, and a very special Ube tart. From the moment the 3 PM cowbell clangs, signifying that the market is open, ‘til the very last tent is stowed away at market’s end, Johnson will have spent the market assisting customers as they navigate their way from stall to stall, and checking in on vendors, volunteers, and community partners. She likes to see that even if people are doing most of their grocery shopping elsewhere, they are coming to the market to meet people who are growing food locally, and maybe even try something new, something that reminds them of home, or something that they love coming back for each week.

The Lawrenceville Farmer’s Market is a program of Lawrenceville United. It takes place every Tuesday, rain or shine, from 3-7pm, May 17 through November 22 at Bay 41, 115 41st Street, Pittsburgh, PA 15201

STORY AND PHOTOGRAPHY BY NINA KATZ

Whip up some something delicious with your farmer’s market finds:

Grilled Zucchini with Tahini Yogurt Sauce and Corn Relish

Summer Veggie Sauté with Ravioli

 Summer Squash Roll Ups

Don’t miss a single fascinating thing!

Subscribe to TABLE Magazine.

Grilled Zucchini with Tahini Yogurt Sauce and 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.

Gluten-Free Pound Cake with Stewed Fruit and Mascarpone

0
Gluten-free pound cake topped with Stewed Fruit and Mascarpone.
When “waste not, want not” turns into a dessert.

“Have your frosé and eat your cake too” is a new motto I’m workshopping.

I was judgmental about frosé at the outset, but I gave it a go, and to my surprise, it was worth the hype. Crisp, refreshing, and dangerously easy to drink. If you have made it before, you know that at the end of the process, you’re left with a pot of stewed fruit. I’m a big believer in the “waste not, want not” ethos, so I couldn’t just pitch that fruit. Logically, my solution was to bake a cake to be the bearer of said fruit. Smart, right? And sustainable!

Whole-Grain and Gluten-Free in Cake Recipes

This cake is whole-grain and gluten-free, but don’t let that scare you. Whole grains do add a little more texture, but It’s not cardboard. The main whole-grain flour is sorghum, which you can typically find at the East End Food Coop if you’re in Pittsburgh or online through Bob’s Red Mill. Often used in its sweetener form in southern cooking, whole-grain sorghum adds an earthy, nutty, mild, and sweet flavor to baking.

If this grainy tidbit interests you, be sure to check out my cookbook, The Gluten-Free Grains Cookbook, for an even nerdier, deep dive into whole grains.

Recipe adapted ever so slightly from Bob’s Red Mill.

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

Gluten-free pound cake topped with Stewed Fruit and Mascarpone.

Gluten-Free Pound Cake with Stewed Fruit and Mascarpone


5 Stars 4 Stars 3 Stars 2 Stars 1 Star


  • Author:
    Quelcy Kogel

Description

Indulge in a cake that’s a whole-grain slice, perfect for anyone’s dietary needs.


Ingredients


Scale

  • 1 cup (137 g) brown rice flour
  • 3/4 cup (104 g) sorghum flour
  • 1/4 cup (28.25 g) tapioca flour
  • 2 tsp (8 g) baking powder
  • 1 tsp Xanthan Gum
  • 1/2 tsp Kosher Salt
  • 1 cup unsalted butter, softened
  • 1 cup (214 g) organic granulated cane sugar
  • 4 eggs
  • 2 tsp vanilla extract
  • Stewed fruit (from frozé) or fresh berries
  • Mascarpone


Instructions

  1. Preheat the oven to 350°F and grease a 9 x 5-inch loaf pan.
  2. Whisk together flours, tapioca starch, baking powder, xanthan gum and salt.
  3. In a separate bowl, cream butter and sugar until light and fluffy, about 5 minutes.
  4. Add eggs one at a time, mixing well after each one.
  5. Add vanilla extract and mix until incorporated.
  6. Add the dry ingredients to the wet and mix until well blended.
  7. Spread batter into the prepared pan and bake for 60 minutes, or until a toothpick comes outclean.
  8. Cool cake in pan for 10 minutes, then remove cake and cool completely on a wire rack.
  9. Serve with stewed fruit and a dollop of mascarpone.

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

Recipe, Story, Styling, and Photography by Quelcy Kogel 

Subscribe to TABLE Magazine‘s print edition.