Luxury stays in Tremblant

Warm, family-ready comfort • managed locally

Check-in
Check-out
Guests
1

Our top properties

FOR A STAY THAT TRULY CARES ABOUT YOU

At Tremblant Prestige, everything we do is built around one priority: the guest experience.

We are deeply involved in every stay, from the first inquiry to the moment you check out. This is not a hands-off operation. We are local, available, and personally accountable for the quality of each experience we provide.

What truly sets us apart is our level of preparation and control. Our properties are not simply cleaned and turned over. Each check-in is personally inspected by our full-time team, whose role is dedicated specifically to quality control. Their job is to ensure that cleanliness, comfort, and presentation meet the highest standards every single time. This level of oversight is rare in vacation rentals, and it makes a noticeable difference.

Our guests consistently tell us that they travel extensively and that the experience we provide stands out compared to rentals around the world. That feedback is reflected in our nearly five-star reviews, year after year. Not because we aim to impress, but because we focus on doing everything properly and consistently.

From spotless spaces and thoughtful amenities to clear communication and responsive support, every detail is handled with care, even when it requires more time, effort, or cost. We believe that excellence is built in the small things, and we never cut corners.

If you are looking for more than just a place to stay, if you value trust, reliability, and a team that genuinely cares about your comfort, you will feel the difference with Tremblant Prestige.

BOOK NOW

/** * Tremblant Prestige Chat Bubble Widget * Integrates with Cloudflare Worker chatbot for Hostaway properties */ (function() { 'use strict'; // Configuration const CONFIG = { workerUrl: 'https://yellow-block-fd19.david-8fc.workers.dev', // Your deployed worker URL sessionId: generateSessionId(), theme: { primaryColor: '#1a365d', // Dark blue secondaryColor: '#e53e3e', // Red accent backgroundColor: '#ffffff', textColor: '#2d3748' } }; // Generate unique session ID function generateSessionId() { return 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); } // Inject CSS styles function injectStyles() { const styles = ` /* Chat Bubble Styles */ .tp-chat-bubble { position: fixed; bottom: 20px; right: 20px; width: 60px; height: 60px; background: ${CONFIG.theme.primaryColor}; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); transition: all 0.3s ease; z-index: 9999; } .tp-chat-bubble:hover { transform: scale(1.1); box-shadow: 0 6px 20px rgba(0,0,0,0.2); } .tp-chat-bubble.open { background: ${CONFIG.theme.secondaryColor}; } .tp-chat-icon { width: 28px; height: 28px; fill: white; } /* Chat Window Styles */ .tp-chat-window { position: fixed; bottom: 90px; right: 20px; width: 350px; height: 500px; background: ${CONFIG.theme.backgroundColor}; border-radius: 12px; box-shadow: 0 8px 32px rgba(0,0,0,0.2); display: none; flex-direction: column; z-index: 9998; overflow: hidden; } .tp-chat-window.show { display: flex; } .tp-chat-header { background: ${CONFIG.theme.primaryColor}; color: white; padding: 16px; font-weight: 600; display: flex; justify-content: space-between; align-items: center; } .tp-chat-close { background: none; border: none; color: white; font-size: 20px; cursor: pointer; padding: 0; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; } .tp-chat-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; } .tp-message { max-width: 80%; padding: 12px 16px; border-radius: 18px; font-size: 14px; line-height: 1.4; } .tp-message.user { align-self: flex-end; background: ${CONFIG.theme.primaryColor}; color: white; } .tp-message.bot { align-self: flex-start; background: #f7fafc; color: ${CONFIG.theme.textColor}; border: 1px solid #e2e8f0; } .tp-message.typing { align-self: flex-start; background: #f7fafc; color: ${CONFIG.theme.textColor}; border: 1px solid #e2e8f0; font-style: italic; } .tp-chat-input-area { border-top: 1px solid #e2e8f0; padding: 16px; background: white; } .tp-chat-input-container { display: flex; gap: 8px; } .tp-chat-input { flex: 1; padding: 12px 16px; border: 1px solid #e2e8f0; border-radius: 24px; outline: none; font-size: 14px; } .tp-chat-input:focus { border-color: ${CONFIG.theme.primaryColor}; } .tp-chat-send { width: 44px; height: 44px; background: ${CONFIG.theme.primaryColor}; border: none; border-radius: 50%; color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease; } .tp-chat-send:hover { background: ${CONFIG.theme.secondaryColor}; } .tp-chat-send:disabled { background: #cbd5e0; cursor: not-allowed; } .tp-urgency-indicator { position: absolute; top: -8px; right: -8px; width: 20px; height: 20px; background: ${CONFIG.theme.secondaryColor}; border-radius: 50%; display: none; align-items: center; justify-content: center; font-size: 10px; font-weight: bold; color: white; } .tp-urgency-indicator.show { display: flex; } /* Mobile responsiveness */ @media (max-width: 480px) { .tp-chat-window { width: calc(100vw - 40px); height: calc(100vh - 140px); bottom: 90px; right: 20px; } .tp-chat-bubble { bottom: 20px; right: 20px; } } /* Loading animation */ .tp-loading-dots { display: inline-block; } .tp-loading-dots::after { content: '...'; animation: tp-loading 1.5s infinite; } @keyframes tp-loading { 0%, 20% { content: '.'; } 40% { content: '..'; } 60%, 100% { content: '...'; } } `; const styleSheet = document.createElement('style'); styleSheet.textContent = styles; document.head.appendChild(styleSheet); } // Create chat UI elements function createChatUI() { // Chat bubble const bubble = document.createElement('div'); bubble.className = 'tp-chat-bubble'; bubble.innerHTML = `
!
`; // Chat window const chatWindow = document.createElement('div'); chatWindow.className = 'tp-chat-window'; chatWindow.innerHTML = `
Tremblant Prestige
Hi! I'm here to help you find the perfect luxury vacation rental in Mont-Tremblant. When are you planning to visit?
`; document.body.appendChild(bubble); document.body.appendChild(chatWindow); return { bubble, chatWindow }; } // Chat functionality class ChatWidget { constructor(bubble, chatWindow) { this.bubble = bubble; this.chatWindow = chatWindow; this.messagesContainer = chatWindow.querySelector('.tp-chat-messages'); this.input = chatWindow.querySelector('.tp-chat-input'); this.sendButton = chatWindow.querySelector('.tp-chat-send'); this.closeButton = chatWindow.querySelector('.tp-chat-close'); this.urgencyIndicator = bubble.querySelector('.tp-urgency-indicator'); this.isOpen = false; this.isTyping = false; this.init(); } init() { // Event listeners this.bubble.addEventListener('click', () => this.toggle()); this.closeButton.addEventListener('click', () => this.close()); this.sendButton.addEventListener('click', () => this.sendMessage()); this.input.addEventListener('keypress', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); this.sendMessage(); } }); // Auto-focus input when opened this.chatWindow.addEventListener('transitionend', () => { if (this.isOpen) { this.input.focus(); } }); } toggle() { this.isOpen = !this.isOpen; this.chatWindow.classList.toggle('show', this.isOpen); this.bubble.classList.toggle('open', this.isOpen); if (this.isOpen) { this.input.focus(); this.hideUrgencyIndicator(); } } close() { this.isOpen = false; this.chatWindow.classList.remove('show'); this.bubble.classList.remove('open'); } async sendMessage() { const message = this.input.value.trim(); if (!message || this.isTyping) return; // Prevent double-sending by disabling input temporarily this.input.disabled = true; this.sendButton.disabled = true; // Add user message this.addMessage(message, 'user'); this.input.value = ''; // Show typing indicator this.showTyping(); // Show typing indicator this.showTyping(); try { const response = await this.callChatAPI(message); // Hide typing, add bot response this.hideTyping(); this.addMessage(response.answer, 'bot'); // Re-enable input this.input.disabled = false; this.sendButton.disabled = false; // Handle urgency if (response.urgency_level === 'high') { this.showUrgencyIndicator(); } // Handle booking links if (response.link) { this.addBookingLink(response); } } catch (error) { this.hideTyping(); this.addMessage('Sorry, I\'m having trouble connecting. Please try again.', 'bot'); console.error('Chat API error:', error); // Re-enable input on error this.input.disabled = false; this.sendButton.disabled = false; } } async callChatAPI(message) { const response = await fetch(`${CONFIG.workerUrl}/chat`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ message: message, session_id: CONFIG.sessionId }) }); if (!response.ok) { throw new Error(`HTTP ${response.status}`); } return await response.json(); } addMessage(text, type) { const messageDiv = document.createElement('div'); messageDiv.className = `tp-message ${type}`; messageDiv.textContent = text; this.messagesContainer.appendChild(messageDiv); this.scrollToBottom(); } addBookingLink(response) { const linkDiv = document.createElement('div'); linkDiv.className = 'tp-message bot'; linkDiv.innerHTML = `
${response.answer}
View ${response.count || ''} Available Properties `; this.messagesContainer.appendChild(linkDiv); this.scrollToBottom(); } showTyping() { this.isTyping = true; this.sendButton.disabled = true; const typingDiv = document.createElement('div'); typingDiv.className = 'tp-message typing'; typingDiv.innerHTML = 'Typing'; this.messagesContainer.appendChild(typingDiv); this.scrollToBottom(); } hideTyping() { this.isTyping = false; this.sendButton.disabled = false; const typingMessages = this.messagesContainer.querySelectorAll('.tp-message.typing'); typingMessages.forEach(msg => msg.remove()); } showUrgencyIndicator() { this.urgencyIndicator.classList.add('show'); } hideUrgencyIndicator() { this.urgencyIndicator.classList.remove('show'); } scrollToBottom() { setTimeout(() => { this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight; }, 100); } } // Initialize when DOM is ready function init() { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initWidget); } else { initWidget(); } } function initWidget() { // Don't initialize if already exists if (document.querySelector('.tp-chat-bubble')) { return; } injectStyles(); const { bubble, chatWindow } = createChatUI(); new ChatWidget(bubble, chatWindow); } // Start initialization init(); })();