Welcome to Slotify! Setting up your free scheduling software is quick and easy. Follow the steps below to start organizing your schedule like a pro.

Step 1: Watch Our Quick Start Video

`); } } class ChatWindow extends BaseElement { chatBody; constructor() { super(); this.chatBody = new ChatBody(); this.chatBody.attachTo(this.element); applyStyles(this.element, this.commonStyles()); } commonStyles() { return { opacity: 0, display: 'none', position: 'fixed', bottom: '84px', right: '20px', zIndex: 100000, overflow: 'hidden', background: '#fff', borderRadius: '16px', pointerEvents: 'all', transform: 'scale(0)', flexDirection: 'column', minHeight: 'calc(100% - 104px)', transformOrigin: 'right bottom', boxShadow: 'rgba(0, 0, 0, 0.16) 0px 5px 40px', transition: 'width 200ms, height 200ms, max-height 200ms, transform 300ms cubic-bezier(0, 1.2, 1, 1), opacity 83ms ease-out', fontFamily: 'system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"', }; } showChatWindow() { this.element.style.opacity = '0'; this.element.style.display = 'flex'; setTimeout(() => { this.element.style.opacity = '1'; this.element.style.transform = 'none'; }, 300); return this; } hideChatWindow() { this.element.style.opacity = '0'; this.element.style.display = 'none'; setTimeout(() => { this.element.style.transform = 'scale(0)'; }, 10); return this; } toggleVisibility() { if (this.element.style.display === 'flex') { this.hideChatWindow(); } else if (this.element.style.display === 'none') { this.showChatWindow(); } } } let chatIcon = null; let chatWindow = null; function SlotifyWidget(config) { ConfigManager$1.setConfig(config); if (!chatWindow) { chatWindow = new ChatWindow(); chatWindow.attachTo(document.body); } if (!chatIcon) { chatIcon = new ChatIcon(() => chatWindow.toggleVisibility()); chatIcon.attachTo(document.body); } } if (typeof window !== 'undefined') { window.slotifyWidget = SlotifyWidget; } /* eslint-disable no-undef */ (function () { let debounceTimeout; const searchEle = document.getElementById('search'); const resultsContainer = document.getElementById('search-results'); const debounce = (func, delay) => { return function (...args) { clearTimeout(debounceTimeout); debounceTimeout = setTimeout(() => func(...args), delay); }; }; const performSearch = (url, query) => { resultsContainer.classList.remove('is-active'); fetch(url + '?search=' + query) .then((response) => response.text()) .then((html) => { if (resultsContainer) { resultsContainer.innerHTML = html; resultsContainer.classList.add('is-active'); } }) .catch((error) => console.log(error)); }; searchEle && searchEle.addEventListener( 'input', debounce((e) => { const query = e.target.value; const url = e.target.getAttribute('data-url'); resultsContainer.classList.remove('is-active'); if (query.trim()) { performSearch(url, query); } else { resultsContainer.innerHTML = ''; } }, 300) ); document .querySelector('.navbar-burger') ?.addEventListener('click', function (e) { e.preventDefault(); document.querySelector('.navbar-menu').classList.toggle('active'); }); document.querySelectorAll('.code-tab-contents pre').forEach((preElem) => { if (preElem.id === 'json') HighlightJS.registerLanguage('json', json); else if (preElem.id === 'php') HighlightJS.registerLanguage('php', php); else if (preElem.id === 'http') HighlightJS.registerLanguage('http', http); else HighlightJS.registerLanguage('javascript', javascript); HighlightJS.highlightElement(preElem); }); document.querySelectorAll('.code-tabs li').forEach((liEle) => liEle.addEventListener('click', function (e) { e.target .closest('.code-wrapper') .querySelector('.code-tab-contents') .querySelectorAll('pre') .forEach((pre) => { pre.classList.remove('active'); if (pre.id === e.target.id) { pre.classList.add('active'); } }); e.target .closest('.code-wrapper') .querySelector('.code-tabs') .querySelectorAll('li') .forEach((li) => { li.classList.remove('active'); if (li.id === e.target.id) { li.classList.add('active'); } }); e.target.classList.add('active'); e.preventDefault(); }) ); document.querySelectorAll('.pricing-tabs a.tab-item')?.forEach((tab) => { tab.addEventListener('click', function (e) { e.preventDefault(); document .querySelectorAll('.pricing-tabs > a.tab-item') .forEach((p) => p.classList.remove('is-active')); this.classList.add('is-active'); document .querySelectorAll('.pricing-container') .forEach((p) => p.classList.remove('is-active')); const targetPlan = this.getAttribute('data-tab'); const planTab = document.getElementById(targetPlan); if (planTab) { planTab.classList.add('is-active'); } }); }); function initializeLoadMore() { const loadMoreButton = document.querySelector('.loadMore a'); if (loadMoreButton) { loadMoreButton.addEventListener('click', function (event) { event.preventDefault(); loadMoreButton.textContent = 'Loading...'; loadMoreButton.style.pointerEvents = 'none'; fetch(loadMoreButton.getAttribute('href'), { method: 'POST', headers: { 'Content-Type': 'application/json' } }) .then((response) => response.text()) .then((data) => { const currentDataTarget = loadMoreButton.closest( '.' + loadMoreButton.getAttribute('data-target') ); if (currentDataTarget) { loadMoreButton.closest('.loadMore').remove(); currentDataTarget.insertAdjacentHTML('beforeend', data); initializeLoadMore(); } }) .catch((error) => console.error('Error:', error)); }); } } initializeLoadMore(); // Initialize Slotify Widget window.addEventListener('DOMContentLoaded', () => { const slotifyContainer = document.querySelector('.slotify-widget-container'); if (slotifyContainer) { const bookingUrl = slotifyContainer.getAttribute('data-booking-url'); if (bookingUrl) { SlotifyWidget({ bookingUrl: bookingUrl, }); } } }); })(); }));