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

Simple Daily Eats

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

Simple Daily Eats

  • 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 twist on a classic favorite, these Blueberry Cinnamon Rolls are just what you need! Bursting with juicy blueberries and topped with a creamy frosting, they make for a perfect breakfast treat or dessert that everyone will adore. Whether it’s a cozy weekend brunch or a delightful dessert to share at family gatherings, these rolls will surely become a cherished recipe in your home.

Blueberry Cinnamon Rolls image 2

There’s something so comforting about the smell of cinnamon and fresh blueberries wafting through your kitchen. These rolls are fluffy, sweet, and oh-so-satisfying, making them a hit across multiple occasions. Plus, they’re fun to make, so gather the family and enjoy some quality time together while baking!

Blueberry Cinnamon Rolls image 3
Blueberry Cinnamon Rolls image 4

Why You’ll Love This Recipe

  • Easy to Make: With straightforward steps, you’ll have these delicious rolls rising in no time.
  • Family-Friendly: Everyone loves the combination of cinnamon and blueberries; it’s sure to please even the pickiest eaters!
  • Perfect for Meal Prep: Make them ahead of time and warm them up when you’re ready for a sweet treat.
  • Bursting with Flavor: The blueberry filling paired with cream cheese frosting creates an irresistible flavor explosion.
  • Versatile Treat: Enjoy them for breakfast or as an indulgent dessert – the choice is yours!

Ingredients You’ll Need

Gathering simple, wholesome ingredients is part of the fun! These items come together beautifully to create your scrumptious Blueberry Cinnamon Rolls:

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! Feel free to get creative with variations that suit your taste preferences or dietary needs.

  • Add Nuts: Sprinkle in some chopped walnuts or pecans for extra texture.
  • Make it Vegan: Substitute non-dairy milk and use a flax egg instead of a regular egg.
  • Flavored Cream Cheese Frosting: Mix in some lemon zest or vanilla extract into the frosting for an added zing.
  • Change Up the Berries: Try raspberries or strawberries if blueberries aren’t your thing!

How to Make Blueberry Cinnamon Rolls

Step 1: Prepare the Blueberry Filling

Start by combining the frozen wild blueberries, brown sugar, lemon juice, water, and cornstarch in a saucepan over medium heat. Stir gently until everything is well mixed and starts to thicken. This step creates a luscious filling that will ooze out when you roll up your dough. Let it cool while you prepare the dough.

Step 2: Make the Dough

In another bowl, mix together dark brown sugar, unsalted butter, ground cinnamon, water, all-purpose flour, granulated sugar, yeast, sea salt, whole milk, egg, tangzhong, and vanilla extract. Knead until you have a soft dough that’s slightly sticky but manageable. This dough is essential because its softness will yield fluffy rolls.

Step 3: Let It Rise

Cover your dough with a clean kitchen towel and let it rise in a warm place until it doubles in size—usually about an hour. This process allows air bubbles to form in the dough; this is what makes your cinnamon rolls so light and airy!

Step 4: Roll Out and Fill

Once risen, punch down your dough gently to release air bubbles. Roll it out on a floured surface into a rectangle shape. Spread softened butter over the top before adding your cooled blueberry filling evenly across it. Rolling tightly from one end to another will create those beautiful layers that everyone loves.

Step 5: Cut and Arrange

Cut your rolled dough into equal pieces and place them into a greased baking dish. Make sure there’s some space between each roll as they will expand during baking! Cover again to let them rise for another 30 minutes.

Step 6: Bake Them Up!

Preheat your oven to 375°F (190°C). Bake the rolls for about 25 minutes until golden brown on top. The aroma filling your kitchen will be irresistible!

Step 7: Frosting Delight

While they are baking, whip up your cream cheese frosting by mixing softened butter and cream cheese until smooth. Gradually add powdered sugar and heavy cream until you reach your desired consistency. Once the rolls are out of the oven and slightly cooled, spread this heavenly frosting over them.

Enjoy every gooey bite of these amazing Blueberry Cinnamon Rolls!

Pro Tips for Making Blueberry Cinnamon Rolls

Creating the perfect blueberry cinnamon rolls can be a delightful adventure, and these tips will help you achieve delicious results!

  • Use frozen blueberries – They hold their shape better during baking compared to fresh ones, ensuring your rolls remain moist and flavorful.
  • Check dough temperature – Make sure your dough is warm but not hot when rising, as this provides the best environment for yeast activation.
  • Don’t skip the tangzhong – This special technique adds moisture to your rolls, resulting in an irresistibly soft texture that lasts longer.
  • Let the rolls cool slightly before frosting – This prevents the cream cheese frosting from melting off, allowing it to beautifully coat each roll instead.
  • Experiment with fillings – Feel free to add nuts or other fruits like raspberries for a fun twist on the classic recipe.

How to Serve Blueberry Cinnamon Rolls

These blueberry cinnamon rolls make for a stunning centerpiece at any breakfast or brunch gathering. Here are some ideas on how to present and enjoy them:

Garnishes

  • Fresh blueberries – Sprinkle some on top of the frosted rolls for a burst of color and flavor.
  • Lemon zest – A light sprinkle of lemon zest adds a refreshing aroma that complements the blueberry sweetness.

Side Dishes

  • Fresh fruit salad – A mix of seasonal berries, melons, and citrus creates a vibrant and refreshing side that balances the richness of the rolls.
  • Yogurt parfaits – Layer yogurt with granola and more fresh fruit for a healthy yet indulgent addition to your meal.
  • Scrambled eggs – Lightly seasoned scrambled eggs provide protein, making your breakfast more filling while complementing the sweetness of the rolls.
  • Coffee or tea – A warm beverage pairs perfectly with these sweet treats, enhancing their flavors and making for a cozy experience.

Make Ahead and Storage

This Blueberry Cinnamon Rolls recipe is perfect for meal prep, allowing you to enjoy delicious treats anytime without the fuss of starting from scratch each time.

Storing Leftovers

  • Store leftover rolls in an airtight container at room temperature for up to 2 days.
  • If you want to keep them longer, refrigerate 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.

Reheating

  • To reheat, place rolls in a preheated oven at 350°F (175°C) for about 10-15 minutes until warmed through.
  • Alternatively, microwave individual rolls on high for 15-20 seconds.

FAQs

Can I make Blueberry Cinnamon Rolls with fresh blueberries?

Yes! Fresh blueberries can be used instead of frozen. Just reduce the amount of sugar slightly, as fresh blueberries are typically sweeter.

How do I store my Blueberry Cinnamon Rolls?

You can store your Blueberry Cinnamon Rolls in an airtight container at room temperature for up to 2 days or refrigerate them for a week. For longer storage, freeze them!

What can I use instead of cornstarch in the filling?

If you don’t have cornstarch, you can use all-purpose flour as a thickener in the blueberry filling. Just make sure to adjust the quantity accordingly.

How long do these Blueberry Cinnamon Rolls take to make?

The total time for making Blueberry Cinnamon Rolls is approximately 230 minutes, including both prep and baking time.

Final Thoughts

These Blueberry Cinnamon Rolls are not just a breakfast treat; they’re a warm hug on a plate! With their fluffy texture and sweet blueberry filling, they are sure to brighten your day. I hope you enjoy making this delightful recipe as much as I do. Don’t hesitate to share your creations and spread the joy of baking!

Print

Blueberry Cinnamon Rolls

Print Recipe

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

Blueberry Cinnamon Rolls are a delightful twist on a classic favorite, perfect for breakfast or dessert. These fluffy rolls are bursting with juicy blueberries and topped with a creamy frosting, making them a hit at any gathering. The comforting aroma of cinnamon combined with fresh blueberries fills your kitchen, creating a warm and inviting atmosphere. Easy to prepare and family-friendly, these rolls are sure to please even the pickiest eaters. Whether you’re enjoying them on a cozy weekend brunch or sharing with loved ones, this recipe is destined to become a cherished staple in your home.

  • Author: Sarah Mitchell
  • Prep Time: 30 minutes
  • Cook Time: 25 minutes
  • Total Time: 55 minutes
  • Yield: Makes approximately 12 servings 1x
  • Category: Dessert
  • Method: Baking
  • Cuisine: American

Ingredients


Scale

  • 2 1/2 cups frozen wild blueberries
  • 3 tablespoons brown sugar (packed)
  • 2 teaspoons lemon juice
  • 2 tablespoons water
  • 1 tablespoon + 1 teaspoon cornstarch
  • 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
  • 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
  • 4 tablespoons unsalted butter (softened)
  • 2 ounces cream cheese (room temperature)
  • 1 cup powdered sugar
  • 1–2 tablespoons reserved blueberry filling
  • 2 1/2 tablespoons heavy cream

Instructions

  1. Prepare the Blueberry Filling: In a saucepan over medium heat, mix frozen blueberries, brown sugar, lemon juice, water, and cornstarch. Stir until thickened, then cool.
  2. Make the Dough: Combine dark brown sugar, butter, cinnamon, water, all-purpose flour, granulated sugar, yeast, salt, whole milk, egg, tangzhong, and vanilla in a bowl. Knead until soft and slightly sticky.
  3. Let It Rise: Cover the dough and let it rise in a warm place for about 1 hour until doubled in size.
  4. Roll Out and Fill: Punch down the dough and roll it into a rectangle. Spread softened butter and cooled blueberry filling evenly across the dough before rolling tightly.
  5. Cut and Arrange: Slice rolled dough into pieces and place them in a greased baking dish. Allow to rise for another 30 minutes.
  6. Bake: Preheat oven to 375°F (190°C) and bake for 25 minutes until golden brown.
  7. Frosting: Mix softened butter and cream cheese until smooth; gradually add powdered sugar and heavy cream. Frost rolls once they're slightly cooled.

Nutrition

  • Serving Size: 1 roll (85g)
  • Calories: 305
  • Sugar: 14g
  • Sodium: 210mg
  • Fat: 9g
  • Saturated Fat: 5g
  • Unsaturated Fat: 4g
  • Trans Fat: 0g
  • Carbohydrates: 53g
  • Fiber: 2g
  • Protein: 4g
  • Cholesterol: 33mg

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.simpledailyeats.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”5334468469″,”postId”:1812};
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
Baklava Muffins: The Perfect Fusion of Classic Greek Pastry and Modern Convenience
Next Post »
Mediterranean Quesadillas with Spinach Feta Mozzarella and Red Onion

If you enjoyed this…

Korean Chicken Tacos Recipe

Korean Chicken Tacos Recipe

Strawberry Watermelon Salad with Honey-Lime Vinaigrette

Strawberry Watermelon Salad with Honey-Lime Vinaigrette

Gordon Ramsay Philly Cheesesteak Sloppy Joes (Ava-Style)

Gordon Ramsay Philly Cheesesteak Sloppy Joes (Ava-Style)

Primary Sidebar

Browse by Diet

HealthyBudgetKetoQuickVeganCheat Meal
Chili-Lime Quinoa Black Bean Salad with Corn

Chili-Lime Quinoa Black Bean Salad with Corn

Garlic Butter Beef Bites with Potatoes

Garlic Butter Beef Bites with Potatoes

Mediterranean Bean Salad

Mediterranean Bean Salad

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

© 2026 Simple Daily Eats · All Rights Reserved · Created with heart by Sarah Mitchell · About · Privacy Policy · Terms & Conditions · Disclaimer · Affiliate Disclosure · Contact