🇹🇭

Thailand 2026

May 3 – 8, 2026 • 5 nights Abraham • Lumiere • Dorcas

Ask me to wire this up properly — I can produce a Firebase-ready version with auth, presence (who's online), and conflict resolution.

📝 Shared group notes

Use this scratchpad for group decisions — who's booking what hotel, who's got the cash, dinner reservations, etc. Save locally, copy to share.

`; } function bindCollabHandlers() { const exportBox = document.getElementById('exportBox'); if (exportBox) exportBox.value = JSON.stringify({ traveller: state.currentTraveller, itinerary: state.itinerary, generatedAt: new Date().toISOString() }, null, 2); const notes = document.getElementById('sharedNotes'); if (notes) notes.value = localStorage.getItem('thai-trip-notes') || ''; } function saveSharedNotes() { const v = document.getElementById('sharedNotes').value; localStorage.setItem('thai-trip-notes', v); toast('Notes saved ✓'); } function copyNotes() { const v = document.getElementById('sharedNotes').value; if (navigator.clipboard) { navigator.clipboard.writeText(v).then(() => toast('Notes copied ✓')); } else { prompt('Copy:', v); } } // ========== EXPORT / IMPORT ========== function exportJSON() { const payload = JSON.stringify({ traveller: state.currentTraveller, itinerary: state.itinerary, generatedAt: new Date().toISOString() }, null, 2); if (navigator.clipboard) { navigator.clipboard.writeText(payload).then(() => toast('Copied to clipboard ✓'), () => prompt('Copy this JSON:', payload)); } else { prompt('Copy this JSON:', payload); } } function openImport() { const txt = prompt('Paste itinerary JSON:'); if (!txt) return; try { const p = JSON.parse(txt); if (p.itinerary) { state.itinerary = p.itinerary; saveState(); render(); toast('Imported ✓'); } else alert('No itinerary key found in JSON.'); } catch (e) { alert('Invalid JSON: ' + e.message); } } function importFromBox() { const el = document.getElementById('importBox'); if (!el) return; try { const p = JSON.parse(el.value); if (p.itinerary) { state.itinerary = p.itinerary; saveState(); render(); toast('Imported ✓'); } else alert('No itinerary key found.'); } catch (e) { alert('Invalid JSON: ' + e.message); } } // ========== INIT ========== loadState(); render();