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

Family Table Ideas

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

Family Table Ideas

  • Home
  • Recipe Index
  • Budget
  • Cheat Meal
  • Healthy
  • Keto
  • Quick
  • Vegan
  • About
  • Contact
Healthy / Dessert / Blueberry Cinnamon Rolls

Blueberry Cinnamon Rolls

April 15, 2026 by JenniferHayes

Jump to Recipe·Print Recipe

If you’re looking for a delightful twist on a classic breakfast treat, these Blueberry Cinnamon Rolls will quickly become your favorite! Imagine pulling warm, gooey rolls from the oven, filled with sweet blueberry jam and topped with luscious cream cheese frosting. They’re perfect for lazy Sunday mornings, family gatherings, or even a special occasion when you want to impress your loved ones. Trust me, once you try these, you’ll never want to go back to plain cinnamon rolls!

Blueberry Cinnamon Rolls image 2

What makes this recipe truly special is the combination of flavors and textures—soft yeast dough enveloping a fruity filling that bursts with flavor in every bite. Plus, they’re surprisingly easy to make!

Blueberry Cinnamon Rolls image 3
Blueberry Cinnamon Rolls image 4

Why You’ll Love This Recipe

  • Deliciously unique: The blueberry jam adds a fresh twist to traditional cinnamon rolls, making them stand out at any brunch.
  • Perfect for sharing: With 12 servings, there’s plenty to go around for family and friends!
  • Make-ahead friendly: You can prepare the dough in advance and bake them fresh when you’re ready.
  • Fun baking project: Get everyone involved in the kitchen—these rolls are as fun to make as they are to eat!

Ingredients You’ll Need

These Blueberry Cinnamon Rolls are made with simple, wholesome ingredients that you might already have in your pantry. Let’s gather what we need for this delicious 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 Frosting

  • 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

Variations

This recipe is wonderfully flexible! Here are some fun ideas to switch things up:

  • Add some zest: Incorporate lemon or orange zest into the dough for an extra burst of flavor.
  • Go nutty: Sprinkle chopped walnuts or pecans into the filling for added crunch.
  • Switch up the fruit: Try using raspberries or strawberries instead of blueberries for a different fruity delight.
  • Make it vegan: Substitute dairy ingredients with plant-based options like almond milk and dairy-free cream cheese.

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 small saucepan over medium heat. Stir gently until the mixture bubbles and thickens—this will create a deliciously sweet jam that will be nestled inside our rolls. Allow it to cool slightly while you prepare the dough.

Step 2: Mix the Dough

In a large mixing bowl, combine warm water with dark brown sugar and instant yeast. Let it sit until bubbly—this step ensures your rolls will rise beautifully. In another bowl, mix together flour, granulated sugar, cinnamon, and salt before adding in melted butter, milk, egg, tangzhong, and vanilla extract. Gradually combine everything until you form a soft dough.

Step 3: Knead and Rise

Transfer your dough onto a lightly floured surface and knead it gently for about 5-7 minutes until it’s smooth and elastic. Place it in a greased bowl and cover it with a damp cloth. Let it rise in a warm spot until doubled in size—this usually takes about an hour.

Step 4: Roll Out and Fill

Once your dough has risen perfectly, punch it down gently to release air. Roll it out into a rectangle shape on a floured surface. Spread an even layer of softened butter over the dough followed by your cooled blueberry filling. Roll it up tightly from one end to the other before slicing it into equal portions.

Step 5: Second Rise

Arrange your sliced rolls in a greased baking dish and cover again with a cloth. Let them rise until puffed up—this second rise is key for fluffy rolls! Preheat your oven while you wait so it’s nice and hot when they’re ready.

Step 6: Bake Your Rolls

Bake in your preheated oven until golden brown on top—usually about 25 minutes. The aroma wafting through your kitchen will be irresistible!

Step 7: Make the Cream Cheese Frosting

While your rolls cool slightly on a wire rack, whip up your frosting by mixing softened butter with cream cheese until smooth. Gradually add powdered sugar along with heavy cream and reserved blueberry filling until creamy.

Step 8: Frost and Serve!

Generously drizzle or spread your blueberry cream cheese frosting over the warm rolls before serving. Enjoy these heavenly Blueberry Cinnamon Rolls fresh out of the oven—they’re sure to be loved by all!

Pro Tips for Making Blueberry Cinnamon Rolls

Making blueberry cinnamon rolls can be a delightful experience, and these tips will ensure they turn out perfectly every time!

  • Use frozen blueberries – They hold their shape better during baking, preventing excess moisture from making your rolls soggy.
  • Don’t rush the dough rising – Allowing the dough to rise properly results in fluffy, soft rolls that are light and airy.
  • Room temperature ingredients – Ensure your milk, egg, and cream cheese are at room temperature to promote even mixing and better texture.
  • Adjust the sweetness – Feel free to taste and adjust the blueberry filling or frosting sweetness to match your personal preference.
  • Store leftovers correctly – Keep any leftover rolls in an airtight container at room temperature for up to two days for the best flavor and freshness.

How to Serve Blueberry Cinnamon Rolls

Presenting your blueberry cinnamon rolls beautifully can enhance the enjoyment of this delectable treat! Here are some ideas:

Garnishes

  • Powdered sugar dusting – A light sprinkle adds an elegant touch and a hint of sweetness.
  • Fresh blueberries – Scatter a few on top for a pop of color and added fruitiness.

Side Dishes

  • Fresh fruit salad – A refreshing mix of seasonal fruits complements the sweetness of the rolls while adding a healthy balance.
  • Greek yogurt with honey – Creamy yogurt drizzled with honey provides a tangy contrast that pairs wonderfully with the sweet rolls.
  • Coffee or tea – A warm beverage enhances the cozy atmosphere, making it perfect for brunch or breakfast gatherings.

Make Ahead and Storage

This Blueberry Cinnamon Rolls recipe is perfect for meal prep, allowing you to enjoy these delicious treats any time with minimal effort.

Storing Leftovers

  • Store leftover rolls in an airtight container at room temperature for up to 2 days.
  • For longer freshness, refrigerate them for up to a week.
  • Ensure they are completely cooled before sealing to prevent moisture buildup.

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.
  • They can be frozen for up to 3 months.

Reheating

  • To reheat from frozen, let them thaw in the refrigerator overnight.
  • Warm in a preheated oven at 350°F (175°C) for about 10-15 minutes or until heated through.
  • You can also microwave individual rolls for about 20-30 seconds for a quick reheat.

FAQs

Here are some common questions about Blueberry Cinnamon Rolls that might help you!

Can I use fresh blueberries instead of frozen?

Absolutely! Fresh blueberries work well too. Just make sure to adjust the amount of sugar if needed since fresh berries may be sweeter.

What makes these Blueberry Cinnamon Rolls different from regular cinnamon rolls?

The addition of blueberry filling and blueberry cream cheese frosting adds a delightful fruity twist that elevates the classic cinnamon roll experience.

How long can I keep Blueberry Cinnamon Rolls in the fridge?

You can store your Blueberry Cinnamon Rolls in the refrigerator for up to a week when properly sealed in an airtight container.

Can I make these rolls vegan?

Yes, you can substitute ingredients like butter with vegan alternatives and use non-dairy milk. Just make sure your cream cheese is also dairy-free!

Final Thoughts

I hope you enjoy making these delightful Blueberry Cinnamon Rolls as much as I do! They’re not only beautiful but also bursting with flavor that everyone will love. Whether for breakfast or dessert, they’re sure to bring smiles all around. Give this recipe a try, and savor every bite of your homemade goodness!

Print

Blueberry Cinnamon Rolls

Print Recipe

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

If you’re searching for a delightful twist on a classic breakfast favorite, these Blueberry Cinnamon Rolls are just what you need! Imagine warm, gooey rolls filled with sweet blueberry jam and topped with creamy frosting—perfect for lazy mornings or special gatherings. Each bite reveals a soft, pillowy dough enveloping a burst of fruity flavor, making these rolls irresistibly unique. Plus, they’re surprisingly easy to whip up, inviting everyone to join in the fun of baking. Whether it’s a cozy brunch or a festive occasion, these Blueberry Cinnamon Rolls will impress your loved ones and leave them craving more!

  • Author: JenniferHayes
  • Prep Time: 60 minutes
  • Cook Time: 25 minutes
  • Total Time: 1 hour 25 minutes
  • Yield: 12 servings 1x
  • Category: Breakfast
  • 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 by simmering blueberries, brown sugar, lemon juice, water, and cornstarch until thickened. Allow to cool.
  2. In a mixing bowl, combine warm water with dark brown sugar and instant yeast until bubbly.
  3. Mix flour, granulated sugar, cinnamon, salt; add melted butter, milk, egg, tangzhong (if using), and vanilla extract. Combine to form dough.
  4. Knead the dough for 5-7 minutes until smooth. Let rise in a greased bowl until doubled in size (about an hour).
  5. Roll out the dough into a rectangle; spread softened butter and cooled blueberry filling evenly. Roll tightly and slice into portions.
  6. Arrange in a greased baking dish and let rise again until puffed up (30-45 minutes). Preheat oven during this time.
  7. Bake at 350°F (175°C) for 25 minutes until golden brown.
  8. Create the frosting by mixing softened butter and cream cheese; gradually incorporate powdered sugar and heavy cream.

Nutrition

  • Serving Size: 1 roll (90g)
  • Calories: 294
  • Sugar: 12g
  • Sodium: 170mg
  • Fat: 9g
  • Saturated Fat: 4g
  • Unsaturated Fat: 5g
  • Trans Fat: 0g
  • Carbohydrates: 47g
  • Fiber: 2g
  • Protein: 4g
  • 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.familytableideas.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”7454cd143e”,”postId”:1707};
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
Peanut Butter Banana Cinnamon Rolls
Next Post »
Gordon Ramsay Chicken Tikka Masala

If you enjoyed this…

High Protein Crockpot Marry Me Chicken

High Protein Crockpot Marry Me Chicken

Turkey Pinwheels for Easy Pool Food

Turkey Pinwheels for Easy Pool Food

Pumpkin French Toast Casserole

Pumpkin French Toast Casserole

Reader Interactions

Leave a Comment Cancel reply

Helpful comments include feedback on the post or changes you made.

Recipe rating 5 Stars 4 Stars 3 Stars 2 Stars 1 Star

Primary Sidebar

Browse by Diet

HealthyBudgetKetoQuickVeganCheat Meal
  • About
  • Contact
  • Disclaimer
  • Homepage
  • Privacy Policy
  • Recipe Index
  • Terms and Conditions

© 2026 Family Table Ideas · All Rights Reserved · Created with heart by Jennifer Hayes · About · Privacy Policy · Terms & Conditions · Disclaimer · Affiliate Disclosure · Contact

Powered by
►
Necessary cookies enable essential site features like secure log-ins and consent preference adjustments. They do not store personal data.
None
►
Functional cookies support features like content sharing on social media, collecting feedback, and enabling third-party tools.
None
►
Analytical cookies track visitor interactions, providing insights on metrics like visitor count, bounce rate, and traffic sources.
None
►
Advertisement cookies deliver personalized ads based on your previous visits and analyze the effectiveness of ad campaigns.
None
►
Unclassified cookies are cookies that we are in the process of classifying, together with the providers of individual cookies.
None
Powered by