Skip to content
WhatsApp
{ const baseSide = $data.placement; // 'top' | 'bottom' | ... const { x, y, placement: placed, middlewareData } = await computePosition(reference, floating, { placement: baseSide, // start/end will be chosen automatically strategy: 'fixed', middleware: [ offset(8), flip({ fallbackPlacements: ['top','bottom','right','left'] }), shift({ padding: 8 }), arrowEl ? arrowMw({ element: arrowEl, padding: 6 }) : null, ].filter(Boolean), });$data._placed = placed; Object.assign(floating.style, { left: x + 'px', top: y + 'px' });// Arrow positioning if (arrowEl && middlewareData.arrow) { const { x: ax = null, y: ay = null } = middlewareData.arrow; const side = placed.split('-')[0];// Reset all sides first Object.assign(arrowEl.style, { left: '', top: '', right: '', bottom: '' });if (ax != null) arrowEl.style.left = ax + 'px'; if (ay != null) arrowEl.style.top = ay + 'px';// Pull arrow out on the opposite side const OFFSET = 5; // px if (side === 'top') arrowEl.style.bottom = (-OFFSET) + 'px'; if (side === 'bottom') arrowEl.style.top = (-OFFSET) + 'px'; if (side === 'left') arrowEl.style.right = (-OFFSET) + 'px'; if (side === 'right') arrowEl.style.left = (-OFFSET) + 'px'; } };// Start/stop reactive autoUpdate $watch('open', (o) => { if (o) { $nextTick(() => { cleanup = autoUpdate(reference, floating, update, { ancestorScroll: true, ancestorResize: true, elementResize: true, }); update(); }); } else { cleanup && cleanup(); cleanup = null; } });// React to prop changes $watch('placement', () => { if (open) requestAnimationFrame(update) });// Recompute on content changes you already react to (optional hooks) // Example: $watch some Alpine data here if content size changes while open " >
Whatsapp
Instagram
{ const baseSide = $data.placement; // 'top' | 'bottom' | ... const { x, y, placement: placed, middlewareData } = await computePosition(reference, floating, { placement: baseSide, // start/end will be chosen automatically strategy: 'fixed', middleware: [ offset(8), flip({ fallbackPlacements: ['top','bottom','right','left'] }), shift({ padding: 8 }), arrowEl ? arrowMw({ element: arrowEl, padding: 6 }) : null, ].filter(Boolean), });$data._placed = placed; Object.assign(floating.style, { left: x + 'px', top: y + 'px' });// Arrow positioning if (arrowEl && middlewareData.arrow) { const { x: ax = null, y: ay = null } = middlewareData.arrow; const side = placed.split('-')[0];// Reset all sides first Object.assign(arrowEl.style, { left: '', top: '', right: '', bottom: '' });if (ax != null) arrowEl.style.left = ax + 'px'; if (ay != null) arrowEl.style.top = ay + 'px';// Pull arrow out on the opposite side const OFFSET = 5; // px if (side === 'top') arrowEl.style.bottom = (-OFFSET) + 'px'; if (side === 'bottom') arrowEl.style.top = (-OFFSET) + 'px'; if (side === 'left') arrowEl.style.right = (-OFFSET) + 'px'; if (side === 'right') arrowEl.style.left = (-OFFSET) + 'px'; } };// Start/stop reactive autoUpdate $watch('open', (o) => { if (o) { $nextTick(() => { cleanup = autoUpdate(reference, floating, update, { ancestorScroll: true, ancestorResize: true, elementResize: true, }); update(); }); } else { cleanup && cleanup(); cleanup = null; } });// React to prop changes $watch('placement', () => { if (open) requestAnimationFrame(update) });// Recompute on content changes you already react to (optional hooks) // Example: $watch some Alpine data here if content size changes while open " >
Instagram
LinkedIn
{ const baseSide = $data.placement; // 'top' | 'bottom' | ... const { x, y, placement: placed, middlewareData } = await computePosition(reference, floating, { placement: baseSide, // start/end will be chosen automatically strategy: 'fixed', middleware: [ offset(8), flip({ fallbackPlacements: ['top','bottom','right','left'] }), shift({ padding: 8 }), arrowEl ? arrowMw({ element: arrowEl, padding: 6 }) : null, ].filter(Boolean), });$data._placed = placed; Object.assign(floating.style, { left: x + 'px', top: y + 'px' });// Arrow positioning if (arrowEl && middlewareData.arrow) { const { x: ax = null, y: ay = null } = middlewareData.arrow; const side = placed.split('-')[0];// Reset all sides first Object.assign(arrowEl.style, { left: '', top: '', right: '', bottom: '' });if (ax != null) arrowEl.style.left = ax + 'px'; if (ay != null) arrowEl.style.top = ay + 'px';// Pull arrow out on the opposite side const OFFSET = 5; // px if (side === 'top') arrowEl.style.bottom = (-OFFSET) + 'px'; if (side === 'bottom') arrowEl.style.top = (-OFFSET) + 'px'; if (side === 'left') arrowEl.style.right = (-OFFSET) + 'px'; if (side === 'right') arrowEl.style.left = (-OFFSET) + 'px'; } };// Start/stop reactive autoUpdate $watch('open', (o) => { if (o) { $nextTick(() => { cleanup = autoUpdate(reference, floating, update, { ancestorScroll: true, ancestorResize: true, elementResize: true, }); update(); }); } else { cleanup && cleanup(); cleanup = null; } });// React to prop changes $watch('placement', () => { if (open) requestAnimationFrame(update) });// Recompute on content changes you already react to (optional hooks) // Example: $watch some Alpine data here if content size changes while open " >
Linkedin
Trustpilot
Trustpilot
{ const baseSide = $data.placement; // 'top' | 'bottom' | ... const { x, y, placement: placed, middlewareData } = await computePosition(reference, floating, { placement: baseSide, // start/end will be chosen automatically strategy: 'fixed', middleware: [ offset(8), flip({ fallbackPlacements: ['top','bottom','right','left'] }), shift({ padding: 8 }), arrowEl ? arrowMw({ element: arrowEl, padding: 6 }) : null, ].filter(Boolean), });$data._placed = placed; Object.assign(floating.style, { left: x + 'px', top: y + 'px' });// Arrow positioning if (arrowEl && middlewareData.arrow) { const { x: ax = null, y: ay = null } = middlewareData.arrow; const side = placed.split('-')[0];// Reset all sides first Object.assign(arrowEl.style, { left: '', top: '', right: '', bottom: '' });if (ax != null) arrowEl.style.left = ax + 'px'; if (ay != null) arrowEl.style.top = ay + 'px';// Pull arrow out on the opposite side const OFFSET = 5; // px if (side === 'top') arrowEl.style.bottom = (-OFFSET) + 'px'; if (side === 'bottom') arrowEl.style.top = (-OFFSET) + 'px'; if (side === 'left') arrowEl.style.right = (-OFFSET) + 'px'; if (side === 'right') arrowEl.style.left = (-OFFSET) + 'px'; } };// Start/stop reactive autoUpdate $watch('open', (o) => { if (o) { $nextTick(() => { cleanup = autoUpdate(reference, floating, update, { ancestorScroll: true, ancestorResize: true, elementResize: true, }); update(); }); } else { cleanup && cleanup(); cleanup = null; } });// React to prop changes $watch('placement', () => { if (open) requestAnimationFrame(update) });// Recompute on content changes you already react to (optional hooks) // Example: $watch some Alpine data here if content size changes while open " >
Trust pilot
Login
Register
Help
Menu
Home
Cakes
All Cakes
Delicious cakes for every taste and occasion.
Classic
Elegant, timeless cakes crafted to bring delight.
Theme
Creative designs for any celebration.
Photo
Your favorite photo, made edible.
Animal
Cute, wild, and totally adorable creations.
Food & Drink
Tasty, vibrant, and joyfully irresistible flavours.
Gaming
Level up your party with epic designs.
Music
Sweet treats that hit every note.
Number
Celebrate milestones in delicious style.
Religious
Graceful, meaningful, and beautifully spiritual moments.
Sports
Game-day cakes for true fans.
TV & Movies
Big-screen favorites baked to life.
Cupcakes
Allergens & Lifestyle
Dairy Free
Creamy flavor, dairy-free delight.
Gluten Free
Naturally gluten-free goodness.
Vegan
Purely plant-based and delicious.
Other Treats
Cupcake Towers
Baked and stacked to perfection.
Cookies
Crispy, chewy, and baked with love.
Doughnuts
Soft, sweet rings of happiness.
Mini Cakes
Cakes small in size, big on flavor.
Brownies
Sweets
Colorful treats to brighten any day.
Corporate
Contact Us
Menu
Search
Cart
0
🚚 Delivery across the UK! Monday to Saturday.
Category:
Uncategorized
Sorry, no results were found.
Search for:
Search
Need some help? Email us at
hello@joyofcake.com