Ayr Town Hall

Ayr Town Hall

Stone bridge over river with Town hall spire in the distance.
Date
Date
View As:
View mode selection
Jai-ving Home for Christmas Starring Jai McDowall
22 and 23 December 2025
7.30pm
19.50 - £39.50

Jai-ving Home for Christmas

Jai-ving Home for Christmas
A festive promotional poster with a green and gold Christmas-themed background featuring pine branches, ornaments, and stars. The poster displays circular portraits of five people: Marc Jennings, Susie McCabe, Des Clarke, Jeremy Levif, Dean Park, and Ali Wright. Text indicates that Marc Jennings, Susie McCabe, and Des Clarke are comedians, Dean Park is a Scottish comedy legend, Jeremy Levif provides live music as a finalist from The Voice, and Ali Wright hosts from NOW Ayrshire Radio.
Friday 5 December 2025
8pm
18 – £26

The Scottish Comedians – Christmas Night Oot

The Scottish Comedians – Christmas Night Oot
Historic Lewis pipe organ.
Every Monday, April - November
12 noon
6 admission

The Organist Entertains

The Organist Entertains
Ayr Film Society Logo
Every Thursday from September
Doors open 6.45pm, screenings at 7.15pm
80 Full Price (Concessions and other season passes available)

Ayr Film Society

Ayr Film Society
A picture of the orchestra of Join Gordon Cree and his orchestra. Showing a erson with a very smiley face.
Thursday 18 December 2025
7.30pm
3 to £30

Christmas Classics with the Gordon Cree Orchestra – Ayr Town Hall

Christmas Classics with the Gordon Cree Orchestra – Ayr Town Hall
An ornate crystal chandelier with multiple arms, each holding a candle-shaped light bulb. The chandelier is decorated with hanging crystal prisms and beads that reflect light, creating a sparkling effect. The dark background enhances the chandelier's brilliance.
Monday 5 January 2026
3 to £30
3 to £30

New Year Gala – With The Scottish Chamber Orchestra

New Year Gala – With The Scottish Chamber Orchestra
The image is a side-by-side portrait of two people. On the left is a man with light skin, short brown hair, and blue eyes, wearing a white collared shirt and a dark jacket, looking directly at the camera with a serious expression. The background is blurred greenery. On the right is a woman with light skin, light blonde curly hair, and blue eyes, smiling slightly. She is wearing a green floral top and a delicate necklace. The background is softly blurred in warm tones.
Wednesday 4 February 2026
7.30pm
25 – £40

A Gala Evening of Opera

A Gala Evening of Opera
Event image for “An Evening with Big Dunc in Ayr.” The event takes place on Friday, 14th November 2025 at Ayr Town Hall. The poster features a large close-up of a man’s face in the background and three smaller photos showing him in football kits for Newcastle, Everton, and Rangers. Presented by Spotlight Events.
Friday 14 November 2025
7pm
£35 - £55

An Evening with Duncan Ferguson

An Evening with Duncan Ferguson

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(); });