Welcome to SgAutoMahjong

Singapore's leading provider of automatic mahjong tables

Whether you’re buying, renting, or seeking repair services, our automatic mahjong tables are crafted for premium quality and an unmatched playing experience

SgAutoMahjong

Where Every Game Becomes an Experience

Whether you’re buying, renting, or seeking repair services, our automatic mahjong tables are built for premium quality and deliver an unmatched gaming experience

Designed for Memorable Moments

Our automatic mahjong tables, crafted with the finest quality inside and out, enhance the joy of each game and amplify the excitement of every gathering. Every feature, from automatic shuffling to high-quality design, adds comfort and ease, letting you focus on the mahjong experience rather than the setup. Make every game memorable with a table designed for the ultimate mahjong enjoyment.

Quality that Complements the Experience

Our commitment to quality goes deep. Each automatic mahjong table is crafted for durability, smooth functionality, and effortless gameplay, allowing players to dive into the game with ease. Every feature is designed to enhance the joy of mahjong, making the table an integral part of the experience—not just the setting.

Service that Supports Your Journey

At SgAutoMahjong, our dedication to customer satisfaction goes far beyond the purchase. With personalized support and flexible automatic mahjong table rental options, we make every part of your journey seamless and enjoyable. It’s not just about playing mahjong – it’s about elevating the entire mahjong experience with quality and care.

More Than Just a Table

We ensure every game becomes an unforgettable experience. Discover how a thoughtfully crafted automatic mahjong table can elevate your gameplay. Let us be a part of your journey in creating lasting memories with every mahjong match.

The Rotator 2.0

Our Flagship Mahjong Table

Experience the best in automatic mahjong with The Rotator 2.0. Sleek, quiet, and effortless – this table is built for players who want it all. Watch the video to see why it’s Singapore’s top choice.

Discover What We Can Do For You

Your Satisfaction, Our Pride

Hear from our happy customers and see why SgAutoMahjong is Singapore’s favorite for Automatic Mahjong Tables.

Our Corporate Partners

/* ============================================================ SGAUTOMAHJONG — HEADER JAVASCRIPT Paste into Elementor > Site Settings > Custom JS or enqueue via wp_enqueue_script in functions.php. No dependencies. Runs after DOM ready. ============================================================ */(function () { 'use strict';/* ── Helpers ──────────────────────────────────────────────── */function $(sel, ctx) { return (ctx || document).querySelector(sel); }function $$(sel, ctx) { return Array.from((ctx || document).querySelectorAll(sel)); }/* ── 1. Sticky header shrink on scroll ───────────────────── */var header = $('#site-header');if (header) { window.addEventListener('scroll', function () { header.classList.toggle('is-scrolled', window.scrollY > 40); }, { passive: true }); }/* ── 2. Mobile menu (hamburger ↔ overlay) ────────────────── */var navToggle = $('#nav-toggle'); var mobileMenu = $('#mobile-menu');function openMenu() { if (!navToggle || !mobileMenu) return; mobileMenu.classList.add('is-open'); mobileMenu.setAttribute('aria-hidden', 'false'); navToggle.setAttribute('aria-expanded', 'true'); document.body.style.overflow = 'hidden'; }function closeMenu() { if (!navToggle || !mobileMenu) return; mobileMenu.classList.remove('is-open'); mobileMenu.setAttribute('aria-hidden', 'true'); navToggle.setAttribute('aria-expanded', 'false'); document.body.style.overflow = '';// Also collapse any open sub-menus $$('.mobile-menu__sub.is-open', mobileMenu).forEach(function (sub) { sub.classList.remove('is-open'); }); $$('.mobile-menu__toggle[aria-expanded="true"]', mobileMenu).forEach(function (btn) { btn.setAttribute('aria-expanded', 'false'); }); }if (navToggle) { navToggle.addEventListener('click', function () { var isOpen = mobileMenu && mobileMenu.classList.contains('is-open'); isOpen ? closeMenu() : openMenu(); }); }// Close when clicking a close-trigger link $$('.js-menu-close').forEach(function (link) { link.addEventListener('click', closeMenu); });// Close on Escape key document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && mobileMenu && mobileMenu.classList.contains('is-open')) { closeMenu(); if (navToggle) navToggle.focus(); } });// Trap focus inside overlay when open (accessibility) if (mobileMenu) { mobileMenu.addEventListener('keydown', function (e) { if (e.key !== 'Tab') return; var focusable = $$('a, button, [tabindex]:not([tabindex="-1"])', mobileMenu) .filter(function (el) { return !el.disabled; }); if (!focusable.length) return; var first = focusable[0]; var last = focusable[focusable.length - 1]; if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } }); }/* ── 3. Mobile accordion (sub-menus) ────────────────────── */$$('.mobile-menu__toggle').forEach(function (toggle) { toggle.addEventListener('click', function () { var targetId = toggle.getAttribute('data-target'); var subMenu = targetId ? document.getElementById(targetId) : null; if (!subMenu) return;var isOpen = subMenu.classList.contains('is-open');// Collapse all sub-menus first (only one open at a time) $$('.mobile-menu__sub').forEach(function (s) { s.classList.remove('is-open'); }); $$('.mobile-menu__toggle').forEach(function (t) { t.setAttribute('aria-expanded', 'false'); });// Open the clicked one if it was closed if (!isOpen) { subMenu.classList.add('is-open'); toggle.setAttribute('aria-expanded', 'true'); } }); });/* ── 4. Floating action buttons — tap-to-expand on mobile ── */var fabs = $$('.fab');fabs.forEach(function (fab) { fab.addEventListener('click', function (e) { // On touch devices: first tap expands, second tap follows link if (!window.matchMedia('(hover: hover)').matches) { if (!fab.classList.contains('is-expanded')) { e.preventDefault(); fabs.forEach(function (f) { f.classList.remove('is-expanded'); }); fab.classList.add('is-expanded'); } // If already expanded, allow the default link action } }); });// Collapse FABs when tapping elsewhere document.addEventListener('click', function (e) { if (!e.target.closest('.fab')) { fabs.forEach(function (f) { f.classList.remove('is-expanded'); }); } });/* ── 5. Dynamic cart count (WooCommerce) ─────────────────── */ // WooCommerce fires 'wc_fragments_refreshed' when cart updates. // This keeps the header badge in sync without a page reload.function updateCartCount() { var countEl = $('.header-cart__count'); if (!countEl) return; var wcCount = document.querySelector('.woocommerce-cart-form') || document.querySelector('.cart-count'); // Fallback: read from WC session via a data attribute if your theme sets it var stored = document.body.getAttribute('data-cart-count'); if (stored !== null) { countEl.textContent = stored; countEl.style.display = stored === '0' ? 'none' : ''; } }document.addEventListener('wc_fragments_refreshed', updateCartCount); updateCartCount();})();