Home Blog Page 196

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!

Summer Vegetable Sauté with Ravioli

0
Three plates of ravioli on a black background

Summer is packed full of fun activities that often leave it difficult to juggle a busy schedule and mealtime preparations. We love this vegetable ravioli recipe by TABLE Magazine contributor Anna Frankllin. She uses farm-fresh ingredients with packaged ravioli to create a quick and simple satisfying summer 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 Whole Foods 365’s Spinach Ricotta 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

Summer Veggie Sauté with Ravioli


5 Stars 4 Stars 3 Stars 2 Stars 1 Star


  • Author:
    Anna Franklin

Description

A refreshing summer dish.


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 Shenot Vidalia Grilling Sauce
  • 2 tbsp cold butter1 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 Shenot Vidalia Grilling 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.

window.trCommon={“minRating”:6,”ajaxurl”:”https://www.tablemagazine.com/wp-admin/admin-ajax.php”,”ratingNonce”:”22aecf09b7″,”postId”:1635};
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 Styling by Anna Franklin
Story by Star Laliberte
Photography by Dave Bryce 

Don’t miss a single delicious thing:

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.

Creamy, Dairy-Free Avocado Gazpacho

0
A creamy avocado gazpacho free of the top 8 food allergens, easily enjoyable for everyone.

This verdant take on traditional gazpacho contains tons of good-for-you ingredients including three ripe avocados, garlic and coconut milk, and stores without browning thanks to fresh-squeezed lime juice. Simply place all of the ingredients in a high-speed blender, process until creamy, pour into bowls and let your guests get creative with toppings. They’ll appreciate the fresh flavor and beautiful presentation, and dairy-free diners will love that there’s no cream, milk or butter.

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

CREAMY, DAIRY-FREE AVOCADO GAZPACHO RECIPE

Prep time: 15 minutes

Blend time: 2 minutes

Total time: 17 minutes

Servings: 6 servings

Ingredients

3 ripe but not brown avocados, skins and seeds removed

3 cloves of garlic, peeled

1 green onion, coarsely chopped (white and green parts)

1 small handful of cilantro, stems removed

Zest of one lime

¼ cup fresh-squeezed lime juice

2 cups stock such as chicken, or, to make the dish vegan, vegetable stock

½ cup coconut milk

1 tsp salt

½ tsp pepper

½ tsp smoked paprika

Instructions

1. Place avocados, garlic, green onion, cilantro, lime zest, lime juice, stock, coconut milk, salt, pepper and smoked paprika in a blender.

2. Blend on high until creamy, about 2 minutes.

3. .Pour into bowls, top creatively and serve along with soy-free tortilla chips

Optional topping ideas

Salsa or pico de gallo

Smoked paprika

Bacon bits

Green onion

Cilantro

Blue corn tortilla chips

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

Try some of TABLE’s other allergen-free recipes:

Allergen-Free Chocolate Treats

Chicken Harissa Pasta

Asian-Inspired Chicken Noodle Soup

Don’t miss a single delicious thing:

Subscribe to TABLE Magazine here!

What Comes Naturally

0
Natural and biodynamic wine has found its stride in Pittsburgh––and it’s no wonder. Better for the environment, and lower in artificial ingredients, natural wine is a great fit for those aiming to be more conscious of our consumption footprint. TABLE Contributor Lindsay Anne Herring interviews a trio of bottle-shop owners about going natural. Above: Kolin Smith pours a tasting of one of Apteka’s natural wines.

Apteka

Run by Kate Lasky and Tomasz Skowronski, Bloomfield’s much-celebrated Apteka is a vegan exploration of Eastern and Central European cuisine, drawing on Lasky’s Pittsburgh roots and Skowronski’s Polish heritage. To go along with their intricate plant-based dishes, they offer a variety of natural wines from their bottle shop, featuring terroirs that are often overshadowed.

Natural wine has been a journey for Kate and Tomasz. Pennsylvania doesn’t make it easy for small businesses looking to import special wines for their menus. “When we want to pull from certain off-the-beaten-path Slovakian or Hungarian producers, we are paying more than you would at retail in Manhattan,” says Tomasz. “You have to really fight for wine in Pennsylvania. If you’re trying to carve out a themed wine list, especially if your theme is Old-World Central Europe, it gets tricky.”

Double Fried Chicken Sandwich from GG’s Café. A crispy breast of chicken between fry bread with their tangy Pickliz mustard sauce.

“Natural wine generally fits into our ethos as a restaurant and what we care about in the world, with better farming and more intentional production. A lot of natural wine producers are smaller operations––which, as a DIY-business, we can relate to,” comments Tomasz.

Their travels to Europe have been a big influence. “We go regularly to Europe because Tomasz’s family is from Poland,” says Kate. “Otherwise, he’s stuck with mine, and perhaps that gets old,” she adds jokingly. “This October we did a really remarkable trip where we met the people who are making the wine [that] we are most excited about.”

What makes Apteka a standout purveyor of natural wine? Tomasz comments, “I think we sincerely approach what this project is. The producers struggle with the same things we do, so it’s really relatable. To work with a fruit and to end up with something completely different, and contending with all of the variables––everything is so intentional. They grow weird grapes and are confident in their own style. They don’t care what’s popular. A lot are just like … ‘This is what we’re doing.’ Who doesn’t want to see someone who is driven by an inner truth of what should be done?” aptekapgh.com

Nine O’Clock Wines

Best-friend duo Celine Roberts and Christie Kliewer, known as Nine O’Clock Wines, believe in “fun over formality” and “education over exclusivity” when it comes to wine. Their company works to support new and diverse winemakers, and to force a closer look at wine labor. “I have a firm understanding that price is a barrier for people,” says Celine. “That’s not something that we can necessarily correct on our own, but what we can do as two women who own a tiny business is make it seem less intimidating.”

One thing that intrigues them about natural wine is the fermentation process that takes place in the bottle. It happens in ways that aren’t comparable to conventional forms of wine production. “Wines, when they’re left to their own devices, are constantly changing, and to expect this totally uniform presentation of a thing that is living and made from the ground isn’t compatible with conventional ways of making things exactly the same for monetization. To maximize profits,” comments the duo. “A little bit of natural variation aligns itself with how the world is, as opposed to how we would like to form it. It’s a living, breathing thing.”

Because part of their mission is to educate others on the world of natural wine, Celine and Christie have some great tips for those just getting into it. “You pick your focal point. Are you planning the meal around the food or the wine? Then, treat it like you would any other wine. Taste it. Do you like it? Then let’s say for scallops, you make a white wine sauce. Pull a Julia Child. Open a bottle of wine, pour yourself a glass, taste it, work with your ingredients, and if you like it add some to the pan to deglaze it.”

Their last tip for enjoying a bottle of natural wine? “We believe wine should be shared.

Because of sharing with others, we pick up on notes we wouldn’t otherwise.” nineoclockwines.com

Tina’s Bar & Bottle Shop

Step into Tina’s and you are transported into a space that makes you feel at home. Access and equity are throughlines at Tina’s, allowing its spectacular cocktail list to thrive in a supportive, fun space.

“What is important for meat Tina’s is allowing people to come sit at the table with me,” says Sarah Shaffer, the founder and owner of Tina’s. “Let’s grow our knowledge together.”

That’s how Sarah started the bottle shop and wine program. “I created this bar so that I could be the bridge between the everyday Pittsburgh citizen and the elevated bar concepts that were coming to our city. In the early 2010s we were seeing this massive surge in cocktail bars that were charging NYC cocktail prices. And it was just not kind to the community.” To help change this, Sarah leaned into affordable yet eco-friendly bottles. “At that price point, we could start to welcome everyone to the table.”

Why biodynamic wines? “I think so many people miss the point. The grape is not the wine. The grape is a fruit, the final step from that plant at the end of the season. In the wine, we taste the soil, we taste everything that we get from the ground. Obviously, that’s terroir. But, to go a step further, the biodynamics of wines aren’t altering or externally meddling with what’s happening there. It’s just letting nature do what it needs to do.”

Sarah continues. “That’s something that is pretty readily accepted worldwide, not so here. Some people shy away from it, thinking it’s not real or that it’s some sort of funny, astrological pattern.” Sarah’s travels make it clear that biodynamic and natural wine is anything but. It is, though, a way to travel and understand the world. “Especially in natural wine and biodynamic wine,” says Sarah, “you’re getting an intimate look, not only into that region’s terroir, but also if you do a little research on the producer and the person behind the wine, you get to learn more about the culture of each of these regions as well.”

Making sure her team is always open and willing to discuss natural wine with her customers is incredibly important to Sarah. “When I do the wine list, we all do it together. I select the bottles. We try them and come up with the tasting notes together. My team is then able to talk about the wines with our guests.” tinaspgh.com

STORY BY LINDSAY ANNE HERRING / PHOTOGRAPHY BY LAURAN PETRILLA

Don’t miss a single delicious thing.

Subscribe to TABLE Magazine here!