Home Blog Page 290

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.

Gluten‑Free Pound Cake with Stewed Fruit & Mascarpone

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

“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.

Recipe, Story, Styling, and Photography by Quelcy Kogel 

Subscribe to TABLE Magazine‘s print edition.

Cherry Mint Cooler

0
Robust cherry flavor shines in this vodka cocktail.

The robust cherry flavor of Red Ribbon’s flagship Cherry Supreme Soda truly shines in this inviting vodka cocktail. Intended as a cool refreshing summer cocktail, this cooler could easily be enjoyed anytime of the year.

CHERRY MINT COOLER COCKTAIL RECIPE

Ingredients

2 parts vodka
5 parts Red Ribbon Cherry Soda
1 part fresh lime juice
4 sprigs of mint

Instructions

  1. Muddle vodka and mint and let sit.

2. Strain vodka from mint and combine with all other ingredients.

3. Garnish with fresh sprig of mint and enjoy!

Recipe by Justin Matase / Photography by Jeff Swensen / Story by Star Laliberte

Subscribe to TABLE Magazine’s print edition.

Italian Almond Creme Soda Cocktail

0
Take a walk down memory lane with the nostalgic flavor of this cocktail.

A cocktail with a nostalgic flavor. Creme soda takes us down a walk on memory lane. Remember the satisfying flavor of that sweet soda on a hot summer day after playing in the yard with your friends or returning from a bike ride through your neighborhood? We’re all grown up now, and playing in the yard with friends looks a little more like relaxing on the patio after a long workday, and bike rides are more like sweating out the weekend in front of a large screen with an all-access membership to countless workouts. But we still enjoy a good creme soda. It’s just now they are the boozy kind!

Italian Almond Cream Soda Cocktail Recipe

Ingredients

1 part Wigle Coffee Liqueur
2 parts bourbon
1 bar spoon Maraschino Liqueur
5 parts Red Ribbon Almond Cream Soda

Instructions

  1. In a glass with ice, mix the first three ingredients.
  2. Top with soda, garnish, and enjoy!

Recipe by Justin Matase / Photography by Jeff Swensen / Story by Star Laliberte

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Orange Soda Gin Spritz

0
A bright and refreshing cocktail to satisfy your sweet citrus craving.

This citrus forward cocktail was crafted by TABLE Publisher Justin Matase with summer sipping in mind. Incredibly refreshing with a beautiful balance of bitter and sweet, this drink awakens your senses with every taste. Rub the orange rind across the rim of your glass and enjoy a burst of orange with every fizzy nip.

ORANGE SODA GIN SPRITZ RECIPE

Ingredients

2 parts gin

1/2 part Campari

5 parts Red Ribbon Orange Soda

1 part fresh lemon juice

1 part fresh orange juice

Garnish with fresh orange rind

Instructions

In a glass with ice, mix gin, Campari, lemon juice, and orange juice.

Top with soda, garnish, and enjoy!

RECIPE BY JUSTIN MATASE / PHOTOGRAPHY BY JEFF SWENSEN / STORY BY STAR LALIBERTE

Try these other delicious summer cocktails:

Stay-Cation Cocktail

Pineapple Jalepeño Margarita

Blueberry Lavender Buck

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Bacon Wrapped Scallops with Mango & Pineapple Salsa

0
Bacon wrapped scallops with a fruity salsa will become a summertime favorite.

Lately we find ourselves gravitating towards the use of fruity salsas to accompany a variety of proteins. No matter the choice of meat, a fruit salsa adds brightness and tang that are very complimentary, especially to a fattier more decadent piece of meat.

The mango pineapple salsa in this dish really cuts through the fattiness of the bacon and gives a nice textural experience with every bite.

Serve alongside a simple salad of mixed greens or some fresh asparagus gently roasted for a light and refreshing summer meal.

BACON WRAPPED SCALLOPS WITH MANGO & PINEAPPLE SALSA RECIPE

Ingredients

For the salsa

1 mango, diced

2 cups pineapple, diced

1 jalapeno, minced

1/2 red bell pepper, diced

1/2 red onion, diced

1 tbsp salt

3 sprigs cilantro, chopped

Juice of one lime

Mix everything together in a bowl and chill until ready to serve.

For the scallops

1 lb scallops (roughly 12)

6 pieces of bacon, cut in half

Instructions

Wrap each scallop with 1/2 of a piece of bacon and secure with a toothpick or skewer.

Season with salt and pepper and sear in a pan on medium heat until bacon is crispy and scallops are golden brown.

Be sure to rotate the scallops so each side gets golden brown.

Serve with salsa.

RECIPE & STYLING BY ANNA CALABRESE / STORY BY STAR LALIBERTE / PHOTOGRAPHY BY LAURA PETRILLA

Try some of TABLE’s other summer recipes:

Summer Veggie Sauté with Ravioli

Summer Squash Roll-Ups

Strawberry Pecan Salad

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Vegetable Sauté with Ravioli

0
Three plates of ravioli on a black background

We love this vegetable ravioli recipe by TABLE Magazine contributor Anna Franklin. She uses farm-fresh ingredients with packaged ravioli to create a quick and simple satisfying meal.

Picking the Best Ravioli 

You’ll find just about every ingredient here at your local farmers’ market. Stock up on fresh local ingredients and make your weekday schedule a little less hectic with this ravioli recipe. Cappello’s Five Cheese Ravioli is a good choice, or Via Emilia’s Organic Ricotta & Spinach Ravioli will also pair nicely with the salad ingredients. You also can’t beat Wegmans Organic Cheese Ravioli for a plain canvas to allow the vegetable flavor to shine through.

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
Three plates of ravioli on a black background

Vegetable Sauté with Ravioli


  • Author: Anna Franklin

Description

A scrumptious way to get your nutrients in.


Ingredients

Scale
  • 1 zucchini, chopped
  • 1 yellow squash, chopped
  • 2 heirloom tomatoes, chopped
  • 1/2 red onion, chopped
  • 3 cloves garlic, minced
  • 1 tbsp extra virgin olive oil
  • 1 tsp salt
  • 1/4 cup Braswell’s Vidalia Onion Steak Sauce
  • 2 tbsp cold butter
  • 1 package of your favorite ravioli, cooked using packaging direction


Instructions

  1. In a large saute pan, heat olive oil and toss in chopped veggies, let everything cook down. The tomatoes should start to get a little saucy.
  2. Add in salt and Vidalia Onion Steak Sauce, simmer for 4 more minutes.
  3. Toss in cold butter and stir until it is melted.
  4. Toss in boiled ravioli and serve with shredded parmesan.

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

Subscribe to TABLE Magazine here!

Gluten-Free, Vegan Jammy Blueberry Bars

0
dessert bars

Make the most of blueberry season with these delicious and easy (as pie) blueberry bars, which also happen to be free of gluten, dairy, soy, and all of the top eight most common food allergens. The crust mixture is the same as the crumble that sits over the top, so you only need one bowl, and the jammy blueberry filling comes together in one saucepan. The delicious results can be served as dessert, packed as a snack for on the go, or even eaten for a quick breakfast with vegan vanilla yogurt. Enjoy!

For more allergen-free recipes and perspectives, visit Liz Fetchin’s blog, Octofree.

What is Soy-Free Earth Balance?

You may notice soy-free Earth Balance as a part of our ingredient list but are not sure what it is. It’s simply a butter substitute that you can find even at Walmart. Earth Balance Soy-Free Buttery Spread typically uses vegetable oils. This includes ingredients like sunflower oil, canola oil, and palm fruit oil. These oils provide a smooth, creamy texture and a rich, buttery flavor. Plus, it’s one of the best butter substitutes you can use for gluten-free, vegan baking.

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

dessert bars

Gluten-Free, Vegan Jammy Blueberry Bars


5 Stars 4 Stars 3 Stars 2 Stars 1 Star


  • Author:
    Liz Fetchin
  • Total Time: 1 Hour

  • Yield: 8 Servings 1x

Description

Make a tray full of Jammy Blueberry Bars that anyone can dive into!


Ingredients


Scale

For the crust/crumble topping:

  • 1 ½ cups gluten-free flour
  • 1 cup gluten-free old-fashioned rolled oats
  • ½ cup packed brown sugar
  • 1 ½ tsp ground cinnamon
  • ¼ tsp baking soda
  • ¼ tsp salt
  • 12 tbsp soy-free Earth Balance (measure after melting in the microwave)
  • 2 tsp vanilla extract

For the filling:

  • 2 ½ cups fresh blueberries, washed, dried and stems removed
  • 3 tbsp maple syrup
  • 1 tbsp cornstarch
  • ¼ tsp vanilla extract
  • Zest of one lemon
  • Pinch of salt


Instructions

  1. Preheat the oven to 350 degrees F.
  2. Line an 8X8” baking pan with parchment paper so the paper covers the bottom and sides of the pan and spray the paper with olive, canola or another non-soy-based oil to avoid sticking.
  3. In a large mixing bowl, combine flour, oats, brown sugar, cinnamon, baking soda and salt and stir to combine.
  4. Add melted butter and vanilla and stir until a crumbly dough forms (don’t be afraid to use your hands).
  5. Pour half of the dough into the prepared pan, pressing it until it forms an even layer covering the bottom of the pan only.
  6. Place the remaining dough into the refrigerator.
  7. Make the filling: Place the blueberries, maple syrup, vanilla extract, cornstarch, lemon zest and salt into a medium saucepan over medium heat.
  8. Stir with a wooden spoon until blueberries start to liquefy and bubble, using the spoon to mash them a bit. Cook for an additional 3 minutes, stirring frequently so the blueberries don’t burn, until they resemble whole fruit jam.
  9. Pour the blueberry mixture over the dough in the pan and spread it so it makes an even layer.
  10. Remove the remaining dough from the refrigerator and crumble it over top of the blueberry filling.
  11. Bake for 30 minutes or until topping is golden brown.
  12. Remove from oven and cool completely, then carefully pull out of the pan by the edges of the parchment paper, place on a cutting board and cut into eight bars.
  13. Gluten-Free, Vegan Jammy Blueberry Bars stay delicious in the refrigerator for up to a week.

  • Prep Time: 15 Minutes
  • Cook Time: 45 Minutes

window.trCommon={“minRating”:6,”ajaxurl”:”https://www.tablemagazine.com/wp-admin/admin-ajax.php”,”ratingNonce”:”e2d1901e73″,”postId”:1629};
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 and Story by Liz Fetchin
Styling by Keith Recker
Photography by Jeff Swensen

Subscribe to TABLE Magazine‘s print edition.

Vegan Squash Curry

0
You’ll enjoy sunshine in a bowl with seasonal ingredients kissed by umami flavor in this vegan curry dish.

Vegan curry can be delicious and complex, but always seems like it’s missing some of its umami flavor because of the omission of one of the main ingredients in traditional curries: fish sauce. Which is why when we discovered Ocean’s Halo Vegan Fish Sauce made with seaweed, we had to give it a go in a vegan curry featuring squash, zucchini, and other seasonal produce. The result is fresh, flavorful sunshine in a bowl. Find Ocean’s Halo Vegan Fish Sauce at Whole Foods Market, at some WalMart locations, and at Thrive Market. Note: If you can’t find vegan fish sauce, you can substitute coconut aminos in its place. Enjoy!

For more allergen-free recipes and perspectives, visit Liz Fetchin’s blog, Octofree at octofree.com.

VEGAN SQUASH CURRY RECIPE

Prep time: 15 minutes

Cook time: 30 minutes

Total time: 45 minutes

Servings: 5 servings

Ingredients

1 tbsp sesame oil

2 cloves minced garlic

1 tsp minced ginger

¼ cup finely chopped green onion

Salt, pepper, and red pepper flakes to taste

1 zucchini, sliced into half moons

1 squash, sliced into half moons

1 small red bell pepper, seeds and ribs removed, sliced into thin strips

1 small hot pepper such as a bird’s eye or hot chili pepper, seeds removed and finely chopped

½ cup dino kale, stripped and sliced into thin strips

15 ounces of chickpeas, drained and rinsed

2 tbsp soy-free yellow curry paste (I used Mekhala)

1 can coconut milk

1 tbsp vegan fish sauce(such as Ocean’s Halo)

Juice and zest of one lime

Juice and zest of one lemon

Instructions:

1. Heat a large saute pan over medium heat.

2. Add sesame oil, then garlic, ginger and green onion.

3. Season with salt, pepper and red pepper flakes to taste (add more if you like hot curry).

4. Saute until garlic becomes fragrant and slightly brown, about 3 minutes.

5. Add zucchini, summer squash, red bell pepper, hot pepper, dino kale and chickpeas and saute until squash and zucchini are soft and slightly browned.

6. Add curry paste and stir until ingredients are evenly coated in the paste.

7. Add coconut milk, vegan fish sauce, lemon zest and juice and lime zest and juice.

8. Bring to a boil, then reduce heat and allow to simmer for about 15 minutes.

9. Serve over steamed jasmine or basmati rice and top with optional garnishes such as green onion, red pepper flakes, Thai basil and sesame seeds.

RECIPE & STORY BY LIZ FETCHIN / STYLING BY KEITH RECKER / PHOTOGRAPHY BY JEFF SWENSEN

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

Forging Forward: The Future Is Now!

0
By offering low cost training, nonprofit Tech25 opens up a more equitable future through technology. Shown here, Andre Schrock basking in the hi-tech glow of a demonstration. 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!

Among 2020’s relatively few positive messages: the event production and broadcast industries have learned how to survive, pivot and thrive during uncertain times. As the world learns how to exist with Covid-19, the event and media sectors have made strides to keep people connected through both distanced technologies and safer in-person experiences. While we can’t go back to “normal,” the goal for professionals now is to see how the next generation will innovate when creating gatherings and cultural events right for tomorrow’s world.

But even industries like this one aren’t always easy to break into. The lack of accessibility to the tech world has created barriers for people looking to work as installation professionals, audio engineers, lighting designers, projectionists, digital content creators, project managers and more. Even though the cultural sector in our region is booming (over 32,000 jobs worth $641million in household wages, according to the Pittsburgh Arts Council), without a traditional four-year degree from schools like Point Park University, entry opportunities in this industry are limited at best.

Tech25, a 501c3 nonprofit organization operated by 25 Carrick Ave Project, is looking to change that by making event technology education and training more accessible for those first breaking into the industry, or more established pros who want to add some new skills to their portfolios (or buff up the old ones). Located in the South Hilltop neighborhood of Carrick, youth and adult program participants benefit from entry-level access into positions that pay living wages.

“Because many of our students come from underserved communities, we rely on subsidies from foundations, corporate sponsors and individual donors to support our programs,” said Jordan Gillam, director of education. “This allows our students – many of whom traditionally lack access and experience inequities – and our educators to focus on the training. Our ability to offer these programs for free, and compensating trainees through paid earn-to-learn apprenticeships, have helped bridge the gap for those who rely on their daily income and can’t afford the cost of traditional schooling,” he added.

Through Tech25, underserved and under-resourced youth engage in workforce development programs, audio engineering workshops, summer camps and more. “Tech 25 allowed me to really get my foot in the door to a career path that I really enjoy and also feels incredibly rewarding,” said Eddin Delic, a 25-year-old from the South Hills and a recent graduate of the program..

Eddin left college during the pandemic quarantine because he found online classes difficult for his style of learning. Discovering Tech 25 allowed him to move his career forward during these tumultuous times.  “The most powerful tools we have as humans are education and communication. Programs like Tech 25 help bridge those and further develop the skills to make a real Impact on people’s lives for the better,” said Eddin. “Since attending these courses, I’ve worked at numerous venues and buildings around the city and was able to build my own network as well to help other people follow this same career path that I’ve chosen.”

Let’s continue to work together and fund opportunities that keep talent in our region, create economic growth and provide living wages to people who make our world a more enjoyable place to be. Join The Pittsburgh Foundation’s ONE DAY campaign to provide support to Tech 25 on Aug. 9. Together, we can create a vibrant, more equitable world!

 
Learn more about Tech25 HERE and support their essential assistance to low income families who need help navigating our complex legal system.

At work in the Tech25 classroom with Carolyn Slothour, lead educator, Andre Schrock, apprentice, and Eric Hoodwink, educator and former apprentice. Photo by Justin Merriman.

Greg Hooks, a Tech25 apprecntice, installs event technology. Photo by Justin Merriman.

Apprentice Brandon Gilliam adjusts an installation in the Tech25 classroom, while fellow apprentice Greg Hooks observes . Photo by Justin Merriman.

Apprentice Brandon Gilliam adjusts an installation in the Tech25 classroom, while fellow apprentice Greg Hooks observes . 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

Neighborhood Legal Services

Fishes and Loaves

Build the Community Center

Healthy Start

STORY BY NATALIE BENCIVENGA

PHOTOGRAPHY BY JEFF SWENSEN

Don’t miss a single fascinating thing!

Subscribe to TABLE Magazine.

Don't Miss