Restaurants

Restaurant table set with wine glass.
Restaurants
View As:
View mode selection
Dunure
Dunure
An image of the inside of a cafe with plated food on the counter.

The Harbourside Coffee & Kitchen

The Harbourside is a warm and welcoming café in Dunure, Ayrshire, offering stunning harbour views. We serve freshly made breakfast,...
The Harbourside Coffee & Kitchen
Kirkmichael
Kirkmichael
An image of the front of the Kirkmichael Arms. Restaurant/Pub.

The Kirkmichael Arms

A MICHELIN Guide-listed Gastro Pub, The Kirkmichael Arms resides in the shadow of the ‘Ayrshire Alps’ is the setting for...
The Kirkmichael Arms
Ayr
Ayr
the_abbortsford2

Abbotsford Hotel

Under the new ownership in 2023 of Brian Daly, a native of Ayrshire, and Tina Daly from the U.S., the...
Abbotsford Hotel
Troon
Troon
A picture of a boat in the harbour with pictures of Troon in the background at the heading The Harbour Bar.

The Harbour Bar

The Harbour Bar is a traditional nautical-themed bar, where we offer a warm and inviting atmosphere for you and your...
The Harbour Bar
Troon
Troon
The outside of The Anchorage.

The Anchorage Hotel

The Anchorage Hotel is one of the best value hotels in Troon with a traditional Scottish bar and restaurant. It’s the perfect place...
The Anchorage Hotel
Troon
Troon
A picture of the outside of the Poppy Room.

The Poppy Room

The Poppy Room is an attractive, popular coffee shop open from 8am until late for The Open. Serving breakfast, lunch,...
The Poppy Room
Ayr
Ayr
An image of a homemade pizza placed on a table. There is a menu in the background that says 'Pizzaioli' on it.

Pizzaioli Ltd

Established in 2022, Pizzaioli are an Authentic Italian Pizzeria based at 37 Sangate, in the heart of Ayr. Our newly...
Pizzaioli Ltd
Troon
Troon
Image of the outside of Troon Links Clubhouse, Troon.

Troon Links Clubhouse Café/Bar

Ideally situated opposite Troon train station, the Clubhouse café/bar at Troon Links is one of the town’s hidden treasures. Catering...
Troon Links Clubhouse Café/Bar
Ayr
Ayr
Image of Belleisle Clubhouse with trees surrounding.

Belleisle Golf Course Café/Bar

Belleisle Golf Course Café/BarIf you’re for a breakfast roll before your round of golf or a meal and a drink...
Belleisle Golf Course Café/Bar
Ayr
Ayr
Hot plates inside Mr Basrai’s World Cuisines

Mr Basrai’s World Cuisines

Mr Basrai’s World Cuisines serves up a delectable buffet that has a wide array of global cuisines all under one...
Mr Basrai’s World Cuisines

Join our newsletter

Get the latest Destination South Ayrshire news and events delivered straight to your inbox…

Sign up for our newsletter

Get the latest Destination South Ayrshire news and events delivered straight to your inbox.

Copyright © 2025 Destination South Ayrshire. Provided by South Ayrshire Council.

Sign up for our newsletter

Get the latest Destination South Ayrshire news and events delivered straight to your inbox…

document.addEventListener('DOMContentLoaded', () => { // Robust selectors for 2025 Elementor (covers Pro, Hello, Astra) const toggle = document.querySelector('.elementor-menu-toggle, .elementor-nav-menu--toggle button, [aria-expanded][role="button"]'); const menu = document.querySelector('.elementor-nav-menu--dropdown, .elementor-nav-menu__container, nav[role="navigation"]'); if (!toggle || !menu) { console.error('ZoomFix: Elements not found. Inspect hamburger/menu HTML.'); return; } console.log('ZoomFix: Found toggle and menu. Testing at 400% zoom...'); let focusables = []; let firstItem, lastItem; let isOpen = false; let tabCountAtEnd = 0; // Detects repeated Tabs to auto-close const MAX_TABS_BEFORE_CLOSE = 2; // Closes after 2 Tabs on last item const updateFocusables = () => { focusables = Array.from(menu.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])')); firstItem = focusables[0]; lastItem = focusables[focusables.length - 1]; console.log('ZoomFix: Updated focusables:', focusables.length); }; // Monitor for menu open/close (handles Elementor's mutations at zoom) const observer = new MutationObserver((mutations) => { const expanded = toggle.getAttribute('aria-expanded') === 'true' || toggle.classList.contains('elementor-active'); if (expanded !== isOpen) { isOpen = expanded; console.log('ZoomFix: Menu state:', isOpen ? 'OPEN' : 'CLOSED'); if (isOpen) { updateFocusables(); setTimeout(() => firstItem?.focus(), 100); // Delay for zoom reflow startFocusPolling(); // Start zoom-safe polling } else { stopFocusPolling(); toggle.focus(); } } }); observer.observe(toggle, { attributes: true, subtree: true }); // Zoom-proof focus trap: Global Tab listener const handleTab = (e) => { if (!isOpen || !focusables.length) return; updateFocusables(); // Re-scan for zoom/DOM changes if (document.activeElement === lastItem && e.key === 'Tab' && !e.shiftKey) { e.preventDefault(); tabCountAtEnd++; console.log('ZoomFix: Tab at end (#', tabCountAtEnd, ')'); if (tabCountAtEnd >= MAX_TABS_BEFORE_CLOSE) { console.log('ZoomFix: Auto-closing after repeated Tabs'); closeMenu(); tabCountAtEnd = 0; } else { firstItem.focus(); // Trap: Loop to start } } else if (document.activeElement === firstItem && e.key === 'Tab' && e.shiftKey) { e.preventDefault(); lastItem.focus(); // Trap: Loop to end } }; // Polling for zoom event loss (runs only when open) let pollInterval; const startFocusPolling = () => { pollInterval = setInterval(() => { if (isOpen && document.activeElement && !menu.contains(document.activeElement)) { console.log('ZoomFix: Focus escaped during zoom—trapping back'); firstItem?.focus(); } }, 50); // 50ms check survives zoom reflow }; const stopFocusPolling = () => clearInterval(pollInterval); const closeMenu = () => { console.log('ZoomFix: Forcing close'); toggle.click(); // Elementor's native close tabCountAtEnd = 0; }; // Attach listeners document.addEventListener('keydown', handleTab); document.addEventListener('keyup', (e) => { if (e.key === 'Escape' && isOpen) closeMenu(); }); // Fallback: Click outside document.addEventListener('click', (e) => { if (isOpen && !menu.contains(e.target) && !toggle.contains(e.target)) closeMenu(); }); // Initial scan updateFocusables(); });