• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

Sweet Family Table

  • Home
  • Recipe Index
  • Budget
  • Cheat Meal
  • Healthy
  • Keto
  • Quick
  • Vegan
  • About
  • Contact

Sweet Family Table

  • Home
  • Recipe Index
  • Budget
  • Cheat Meal
  • Healthy
  • Keto
  • Quick
  • Vegan
  • About
  • Contact

Blueberry Cinnamon Rolls

Jump to Recipe·Print Recipe

If you’re looking for a delightful way to brighten up your breakfast table, these Blueberry Cinnamon Rolls are just the ticket! Soft, fluffy rolls filled with sweet blueberry goodness and topped with creamy frosting make for a special treat that’s perfect for any occasion. Whether it’s a cozy weekend brunch or a festive family gathering, this recipe will surely become a favorite. The combination of warm cinnamon and fresh blueberries creates an irresistible aroma that fills your home, making it hard to resist diving right in!

Blueberry Cinnamon Rolls image 2
Blueberry Cinnamon Rolls image 3

Why You’ll Love This Recipe

  • Easy to Make: With straightforward steps and simple ingredients, you’ll have these delicious rolls baking in no time.
  • Family-Friendly: Everyone loves warm cinnamon rolls! The fruity twist makes them even more appealing for kids and adults alike.
  • Perfect for Meal Prep: You can prepare the dough ahead of time and bake them fresh when you need them—ideal for busy mornings!
  • Delightful Flavor: The mix of cinnamon and blueberries brings together comforting flavors that are sure to impress.
  • Versatile Treat: Enjoy them at breakfast, as a snack, or even as dessert; they fit every occasion beautifully.
Blueberry Cinnamon Rolls image 4

Ingredients You’ll Need

These Blueberry Cinnamon Rolls use simple, wholesome ingredients that you might already have in your kitchen. Let’s gather everything you need to create this delectable treat!

For the Blueberry Filling

  • 2 1/2 cups frozen wild blueberries
  • 3 tablespoons brown sugar (packed)
  • 2 teaspoons lemon juice
  • 2 tablespoons water
  • 1 tablespoon + 1 teaspoon cornstarch

For the Dough

  • 1/2 cup dark brown sugar (packed)
  • 4 tablespoons unsalted butter (room temperature)
  • 3/4 teaspoon ground cinnamon
  • 3/4 cup water
  • 1/4 cup all-purpose flour
  • 3 1/2 cups all-purpose flour (see notes for measuring below)
  • 1/3 cup granulated sugar
  • 2 teaspoons instant yeast
  • 3/4 teaspoon fine sea salt
  • 1/2 cup whole milk (room temperature)
  • 1 large egg (room temperature)
  • Tangzhong (from recipe above)
  • 1 teaspoon vanilla extract

For the Cream Cheese Frosting

  • 4 tablespoons unsalted butter (softened)
  • 2 ounces cream cheese (room temperature)
  • 4 tablespoons unsalted butter (room temperature)
  • 1 cup powdered sugar
  • 1-2 tablespoons reserved blueberry filling
  • 2 1/2 tablespoons heavy cream

Variations

This recipe is wonderfully flexible, allowing you to customize it to your liking! Here are some fun variations to try:

  • Add Nuts: Incorporate chopped walnuts or pecans into the filling for a delightful crunch.
  • Different Berries: Swap out blueberries for raspberries or strawberries for a fruity twist!
  • Vegan Option: Use plant-based milk and replace the egg with flaxseed meal mixed with water.
  • Spice it Up: Add a pinch of nutmeg or cardamom along with the cinnamon for an extra layer of flavor.

How to Make Blueberry Cinnamon Rolls

Step 1: Prepare the Blueberry Filling

Start by making the blueberry filling. In a medium saucepan over medium heat, combine frozen wild blueberries, brown sugar, lemon juice, and water. Cook until the blueberries start breaking down and release their juices. Sprinkle in cornstarch while stirring until thickened. This filling adds a fruity burst that perfectly complements the sweet rolls!

Step 2: Make the Dough

In a mixing bowl, combine dark brown sugar, softened butter, ground cinnamon, water, all-purpose flour, granulated sugar, instant yeast, fine sea salt, whole milk, egg, tangzhong, and vanilla extract. Mix until it forms a soft dough. Kneading is essential here—it develops gluten that gives the rolls their structure and chewiness.

Step 3: Rise Time

Once kneaded well, let your dough rise in a warm place until it doubles in size—about an hour. This step is crucial because it allows air bubbles to form inside the dough which makes your rolls light and fluffy.

Step 4: Assemble the Rolls

After rising, roll out your dough on a floured surface into a rectangle. Spread an even layer of blueberry filling over it. Roll tightly from one end to another and slice into equal pieces. Place them in a greased baking dish—each roll should be close together but not squished!

Step 5: Second Rise

Cover your pan with a clean cloth and allow them to rise again until puffy—about 30 minutes. This second rise ensures that each roll is airy and soft.

Step 6: Bake Your Rolls

Preheat your oven while waiting. Bake your rolls at 350°F (175°C) for about 25 minutes or until golden brown on top. Keep an eye on them—they should smell heavenly!

Step 7: Frosting Time

Once cooled slightly, whip up your cream cheese frosting by beating together softened butter and cream cheese until smooth. Gradually add powdered sugar followed by reserved blueberry filling and heavy cream until you reach desired consistency. Drizzle generously over your warm rolls before serving!

Now you’re ready to dig into these luscious Blueberry Cinnamon Rolls!

Pro Tips for Making Blueberry Cinnamon Rolls

Creating the perfect blueberry cinnamon rolls can be a delightful experience, and these tips will help you achieve bakery-level results at home!

  • Use room temperature ingredients: Ensuring your butter, milk, and egg are at room temperature helps them blend more easily into the dough, resulting in a softer texture.

  • Don’t skip the Tangzhong: This technique involves cooking a portion of the flour and water to create a roux. It traps moisture and gives your rolls a fluffy, tender crumb.

  • Let the dough rise properly: Allowing enough time for the dough to rise is crucial. It develops flavor and texture, so don’t rush this step—it can take 1-2 hours depending on your kitchen’s temperature.

  • Try freezing before baking: If you’re making these ahead of time, shape the rolls and freeze them unbaked. When you’re ready to enjoy them, let them thaw in the fridge overnight, then bake as directed.

  • Experiment with fillings: While blueberries are delicious, don’t hesitate to mix in other fruits or spices—like lemon zest or nutmeg—to customize flavors to your liking!

How to Serve Blueberry Cinnamon Rolls

Serving blueberry cinnamon rolls can transform a simple breakfast or dessert into an elegant affair. Here are some ideas to present this delightful dish beautifully:

Garnishes

  • Fresh blueberries: A handful of fresh blueberries on top adds a burst of color and reinforces that fruity flavor.
  • Mint leaves: A sprig of mint provides a refreshing contrast, both visually and taste-wise.

Side Dishes

  • Greek yogurt: A dollop of creamy Greek yogurt complements the sweetness of the rolls while adding protein for a balanced meal.
  • Fresh fruit salad: A vibrant mix of seasonal fruits brightens up your plate and offers a refreshing contrast to the rich cinnamon rolls.
  • Coffee or tea: Pairing these rolls with a warm beverage enhances the overall experience, making it perfect for brunch gatherings.
  • Scrambled eggs: For a heartier breakfast, serve with fluffy scrambled eggs seasoned with herbs—a delightful balance to the sweet rolls.

Make Ahead and Storage

This Blueberry Cinnamon Rolls recipe is perfect for meal prep, allowing you to enjoy delicious homemade treats even on your busiest days. Here’s how to store, freeze, and reheat your rolls for maximum enjoyment.

Storing Leftovers

  • Store cooled blueberry cinnamon rolls in an airtight container at room temperature for up to 2 days.
  • For longer storage, place them in the refrigerator, where they can stay fresh for up to a week.

Freezing

  • Allow the rolls to cool completely before freezing.
  • Wrap each roll tightly in plastic wrap and then place them in a freezer-safe bag or container.
  • They can be frozen for up to 3 months. To avoid freezer burn, try to remove as much air as possible.

Reheating

  • To reheat from frozen, let the rolls thaw in the refrigerator overnight or at room temperature for a few hours.
  • Warm them in a preheated oven at 350°F (175°C) for about 10-15 minutes until heated through.
  • Alternatively, use the microwave for about 20-30 seconds per roll, but be cautious not to overheat.

FAQs

Here are some common questions you might have about making Blueberry Cinnamon Rolls.

Can I use fresh blueberries instead of frozen for Blueberry Cinnamon Rolls?

Yes! Fresh blueberries can be used instead of frozen. Just adjust the filling slightly if needed by reducing the amount of water or sugar since fresh berries may release more juice.

How do I make my Blueberry Cinnamon Rolls fluffier?

To achieve fluffier rolls, ensure your yeast is fresh and allow enough time for the dough to rise properly. Also, don’t skip the Tangzhong step; it adds moisture which leads to softer rolls.

Can I make these Blueberry Cinnamon Rolls ahead of time?

Absolutely! You can prepare and shape the rolls ahead of time, then refrigerate them overnight before baking. This allows them to rise slowly and develop flavor without sacrificing freshness.

Final Thoughts

I truly hope you find joy in making these Blueberry Cinnamon Rolls! They offer a delightful combination of flavors that will warm your heart and brighten your mornings. Whether it’s for a special occasion or just a cozy weekend treat, I invite you to give this recipe a try—your taste buds will thank you!

Print

Blueberry Cinnamon Rolls

Print Recipe

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

Indulge in the delightful warmth of homemade Blueberry Cinnamon Rolls, a perfect blend of fluffy dough, sweet blueberry filling, and creamy frosting. These rolls promise to brighten any breakfast or snack time with their inviting aroma and comforting flavors. Easy to prepare, they are ideal for family gatherings or a cozy brunch at home. The fruity blueberry filling adds a unique twist to traditional cinnamon rolls, making them a favorite among both kids and adults. With simple ingredients and straightforward steps, you can enjoy these delightful treats fresh from your oven in no time!

  • Author: Mennana
  • Prep Time: 30 minutes
  • Cook Time: 25 minutes
  • Total Time: 55 minutes
  • Yield: Approximately 12 servings 1x
  • Category: Breakfast/Dessert
  • Method: Baking
  • Cuisine: American

Ingredients


Scale

  • 2 1/2 cups frozen wild blueberries
  • 3 tablespoons brown sugar
  • 1/2 cup dark brown sugar
  • 4 tablespoons unsalted butter
  • 3/4 teaspoon ground cinnamon
  • 3 1/2 cups all-purpose flour
  • 2 teaspoons instant yeast
  • 1 large egg
  • 4 tablespoons cream cheese
  • 3/4 cup water
  • 1/4 cup all-purpose flour (for rolling)
  • 1/3 cup granulated sugar
  • 3/4 teaspoon fine sea salt
  • 1/2 cup whole milk
  • 1 teaspoon vanilla extract
  • 1 tablespoon + 1 teaspoon cornstarch
  • 1–2 tablespoons reserved blueberry filling
  • 2 1/2 tablespoons heavy cream

Instructions

  1. Prepare the filling by cooking frozen blueberries with brown sugar, lemon juice, and water until thickened with cornstarch.
  2. In a mixing bowl, combine dark brown sugar, room temperature butter, cinnamon, flour, yeast, and other wet ingredients to form a dough.
  3. Knead until smooth and let rise until doubled in size (about 1 hour).
  4. Roll out the dough into a rectangle, spread the blueberry filling evenly, roll tightly, and slice into pieces.
  5. Allow sliced rolls to rise again (30 minutes) before baking at 350°F (175°C) for about 25 minutes until golden.
  6. Make frosting by blending softened butter and cream cheese with powdered sugar; drizzle over warm rolls.

Nutrition

  • Serving Size: 1 roll (80g)
  • Calories: 290
  • Sugar: 12g
  • Sodium: 150mg
  • Fat: 9g
  • Saturated Fat: 4g
  • Unsaturated Fat: 5g
  • Trans Fat: 0g
  • Carbohydrates: 45g
  • Fiber: 2g
  • Protein: 6g
  • Cholesterol: 20mg

Did you make this recipe?

Share a photo and tag us — we can’t wait to see what you’ve made!

window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.sweetfamilytable.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”5721ee2834″,”postId”:1800};
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 );
});

« Previous Post
BBQ Chicken Coleslaw Wraps
Next Post »
Marinated Tomatoes: A Delicious Recipe for Flavorful Summer Salads

If you enjoyed this…

Easy Keto Fruit Pizza

Easy Keto Fruit Pizza

Street Corn Smash Burger Tacos

Street Corn Smash Burger Tacos

Delicious Baked Honey BBQ Popcorn Chicken Recipe

Delicious Baked Honey BBQ Popcorn Chicken Recipe

Primary Sidebar

Browse by Diet

HealthyBudgetKetoQuickVeganCheat Meal
Steak Avocado Corn Bowl: A Delicious and Nutritious Recipe for Any Meal

Steak Avocado Corn Bowl: A Delicious and Nutritious Recipe for Any Meal

Steak Bites and Shell Pasta in Garlic Butter Alfredo Sauce

Steak Bites and Shell Pasta in Garlic Butter Alfredo Sauce

Sizzling Bacon Cheeseburger Queso Dip

Sizzling Bacon Cheeseburger Queso Dip

  • About
  • Contact
  • Disclaimer
  • Homepage
  • PRIVACY POLICY
  • Recipe Index
  • TERMS AND CONDITIONS

© 2026 Sweet Family Table · All Rights Reserved · Created with love by Lalla Mennana · About · Privacy Policy · Terms & Conditions · Disclaimer · Affiliate Disclosure · Contact