한국통합치유협회 KELA 웰니스 스위트
13가지 디지털 웰니스 도구로 몸과 마음의 균형을 찾아보세요
🤔 KELA 웰니스 스위트란?
한국통합치유협회(KELA)가 제공하는 디지털 웰니스 플랫폼입니다. 전통 한의학과 현대 디지털 기술을 결합하여 누구나 쉽게 일상에서 건강을 관리할 수 있도록 돕습니다.
의료 보조
스트레스, 불안 완화
직장 웰니스
업무 효율성 향상
교육 지원
집중력 향상
시니어 케어
건강한 노후
글로벌 웰니스
전 세계 사용자
모바일 헬스
언제 어디서나
호흡과 움직임
호흡 버블
4-7-8 호흡법
스트레칭 핑
2분 데스크 웰니스
추적과 습관
기분 픽셀
한 해를 픽셀로 기록
중급
습관 점
미니멀 습관 트래커
물방울
수분 섭취 알림
🫧 호흡 버블
숨을 들이쉬세요...
🎨 기분 픽셀
오늘 기분을 선택하세요
😔
😕
😐
🙂
😄
💧 물방울
목표: 하루 8잔
⚫ 습관 점
아침 운동
명상
독서
🎵 집중 음악
25:00
🌏 웰니스 여행을 계획하고 계신가요?
전 세계 힐링 여행지의 최고 상품을 찾아보세요
${step.text}
`;
document.body.appendChild(tooltip);
// Position tooltip
const rect = element.getBoundingClientRect();
tooltip.style.position = 'fixed';
if (step.position === 'bottom') {
tooltip.style.top = rect.bottom + 10 + 'px';
tooltip.style.left = rect.left + 'px';
} else if (step.position === 'left') {
tooltip.style.top = rect.top + 'px';
tooltip.style.right = (window.innerWidth - rect.left) + 10 + 'px';
}
// Auto-remove after 5 seconds
setTimeout(() => {
if (tooltip.parentNode) {
tooltip.remove();
}
}, 5000);
},
endTour() {
document.querySelectorAll('.tour-highlight').forEach(el => {
el.classList.remove('tour-highlight');
});
document.querySelectorAll('.tour-tooltip').forEach(el => {
el.remove();
});
this.unlockAchievement('tutorial_master', '튜토리얼 마스터', '가이드 투어를 완료했습니다');
},
unlockAchievement(id, title, desc) {
if (!this.achievements.includes(id)) {
this.achievements.push(id);
localStorage.setItem('kela_achievements', JSON.stringify(this.achievements));
this.showAchievementToast(title, desc);
}
},
showAchievementToast(title, desc) {
const toast = document.getElementById('achievementToast');
document.getElementById('achievementTitle').textContent = title;
document.getElementById('achievementDesc').textContent = desc;
toast.classList.add('show');
setTimeout(() => {
toast.classList.remove('show');
}, 3000);
},
loadSavedState() {
const savedDifficulty = localStorage.getItem('kela_difficulty');
if (savedDifficulty) {
this.currentDifficulty = savedDifficulty;
setDifficulty(savedDifficulty, false);
}
}
};
function openModule(moduleId) {
document.getElementById('homeView').style.display = 'none';
const modules = document.querySelectorAll('.module-view');
modules.forEach(m => m.classList.remove('active'));
document.getElementById(moduleId).classList.add('active');
// Track usage
trackEvent('module_opened', { module: moduleId });
// Initialize module-specific features
if (moduleId === 'moodpixel') {
initMoodGrid();
} else if (moduleId === 'waterdrop') {
initWater();
}
}
function closeModule() {
document.getElementById('homeView').style.display = 'block';
const modules = document.querySelectorAll('.module-view');
modules.forEach(m => m.classList.remove('active'));
}
// ========== DIFFICULTY SYSTEM ==========
function setDifficulty(level, save = true) {
// Update buttons
document.querySelectorAll('.difficulty-btn').forEach(btn => {
btn.classList.remove('active');
});
event?.target?.classList.add('active');
// Show/hide content based on difficulty
if (level === 'beginner') {
document.getElementById('relaxationCategory').style.display = 'none';
document.getElementById('traditionalCategory').style.display = 'none';
} else if (level === 'intermediate') {
document.getElementById('relaxationCategory').style.display = 'block';
document.getElementById('traditionalCategory').style.display = 'none';
} else if (level === 'expert') {
document.getElementById('relaxationCategory').style.display = 'block';
document.getElementById('traditionalCategory').style.display = 'block';
}
// Save preference
if (save) {
localStorage.setItem('kela_difficulty', level);
OnboardingManager.currentDifficulty = level;
// Show notification
showNotification(`난이도가 ${level}로 변경되었습니다`);
}
}
// ========== BREATH BUBBLE ==========
let breathingInterval;
let breathingPhase = 0;
function startBreathing() {
const phases = [
{ text: '숨을 들이쉬세요...', duration: 4000 },
{ text: '숨을 멈추세요...', duration: 7000 },
{ text: '숨을 내쉬세요...', duration: 8000 }
];
function nextPhase() {
document.getElementById('breathText').textContent = phases[breathingPhase].text;
breathingPhase = (breathingPhase + 1) % phases.length;
}
stopBreathing();
nextPhase();
let totalDuration = phases.reduce((sum, p) => sum + p.duration, 0);
breathingInterval = setInterval(nextPhase, totalDuration / phases.length);
// Track and achievement
setTimeout(() => {
OnboardingManager.unlockAchievement('first_breath', '첫 호흡', '첫 호흡 세션을 완료했습니다');
showOTA();
}, totalDuration);
}
function stopBreathing() {
if (breathingInterval) {
clearInterval(breathingInterval);
breathingInterval = null;
}
}
// ========== MOOD PIXEL ==========
let currentMood = 3;
function setMood(mood) {
currentMood = mood;
const today = new Date().getDate() - 1;
const pixels = document.querySelectorAll('.mood-pixel');
if (pixels[today]) {
const colors = ['#8B0000', '#FF4500', '#FFD700', '#90EE90', '#00FF00'];
pixels[today].style.background = colors[mood - 1];
// Save to localStorage
let moodData = JSON.parse(localStorage.getItem('kela_mood_data') || '{}');
moodData[new Date().toISOString().split('T')[0]] = mood;
localStorage.setItem('kela_mood_data', JSON.stringify(moodData));
showNotification('기분이 기록되었습니다');
}
}
function initMoodGrid() {
const grid = document.getElementById('moodGrid');
if (grid && !grid.hasChildNodes()) {
for (let i = 0; i < 365; i++) {
const pixel = document.createElement('div');
pixel.className = 'mood-pixel';
grid.appendChild(pixel);
}
// Load saved mood data
const moodData = JSON.parse(localStorage.getItem('kela_mood_data') || '{}');
const colors = ['#8B0000', '#FF4500', '#FFD700', '#90EE90', '#00FF00'];
Object.entries(moodData).forEach(([date, mood]) => {
const dayOfYear = Math.floor((new Date(date) - new Date(new Date().getFullYear(), 0, 0)) / 86400000);
if (grid.children[dayOfYear]) {
grid.children[dayOfYear].style.background = colors[mood - 1];
}
});
}
}
// ========== WATER DROP ==========
function initWater() {
const container = document.getElementById('waterContainer');
if (container && !container.hasChildNodes()) {
for (let i = 0; i < 8; i++) {
const glass = document.createElement('div');
glass.className = 'water-glass';
glass.onclick = function() {
this.classList.toggle('filled');
updateWaterCount();
};
container.appendChild(glass);
}
// Load saved water data
const waterData = JSON.parse(localStorage.getItem('kela_water_today') || '0');
for (let i = 0; i < waterData; i++) {
if (container.children[i]) {
container.children[i].classList.add('filled');
}
}
}
}
function updateWaterCount() {
const filled = document.querySelectorAll('.water-glass.filled').length;
localStorage.setItem('kela_water_today', filled);
if (filled === 8) {
OnboardingManager.unlockAchievement('hydration_hero', '수분 충족', '하루 물 섭취 목표를 달성했습니다');
}
}
// ========== HABIT DOTS ==========
function toggleDot(dot) {
dot.classList.toggle('done');
// Save habit data
const habits = {};
document.querySelectorAll('.habit-item').forEach((item, index) => {
const name = item.querySelector('.habit-name').textContent;
const dots = Array.from(item.querySelectorAll('.habit-dot')).map(d => d.classList.contains('done'));
habits[name] = dots;
});
localStorage.setItem('kela_habits', JSON.stringify(habits));
// Check for streak
const allDone = Array.from(document.querySelectorAll('.habit-dot')).every(d => d.classList.contains('done'));
if (allDone) {
OnboardingManager.unlockAchievement('habit_master', '습관 마스터', '모든 습관을 완료했습니다');
}
}
// ========== POMODORO TIMER ==========
let pomodoroTime = 25 * 60;
let pomodoroInterval;
function startPomodoro() {
if (!pomodoroInterval) {
pomodoroInterval = setInterval(() => {
pomodoroTime--;
updatePomodoroDisplay();
if (pomodoroTime <= 0) {
clearInterval(pomodoroInterval);
pomodoroInterval = null;
showNotification('휴식 시간입니다!');
OnboardingManager.unlockAchievement('focus_master', '집중 마스터', '포모도로 세션을 완료했습니다');
}
}, 1000);
}
}
function pausePomodoro() {
if (pomodoroInterval) {
clearInterval(pomodoroInterval);
pomodoroInterval = null;
}
}
function resetPomodoro() {
pausePomodoro();
pomodoroTime = 25 * 60;
updatePomodoroDisplay();
}
function updatePomodoroDisplay() {
const minutes = Math.floor(pomodoroTime / 60);
const seconds = pomodoroTime % 60;
const display = document.getElementById('pomodoroTimer');
if (display) {
display.textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`;
}
}
// ========== OTA FUNCTIONS ==========
function showOTA() {
const otaContainer = document.getElementById('otaContainer');
if (otaContainer && !otaContainer.classList.contains('show')) {
otaContainer.classList.add('show');
trackEvent('ota_shown', { trigger: 'module_completion' });
}
}
// ========== AI ASSISTANT ==========
function selectAI(aiType) {
switch(aiType) {
case 'chatgpt':
const context = `KELA Wellness Suite에 대해 도움이 필요합니다. 13가지 웰니스 도구를 제공하는 건강 플랫폼입니다.`;
window.open(`https://chat.openai.com/?q=${encodeURIComponent(context)}`, '_blank');
closeWiaAiModal();
break;
case 'claude':
const claudeContext = `KELA Wellness Suite 사용법을 알려주세요. 한국통합치유협회의 디지털 웰니스 플랫폼입니다.`;
window.open(`https://claude.ai/chat?q=${encodeURIComponent(claudeContext)}`, '_blank');
closeWiaAiModal();
break;
case 'gemini':
showGeminiChat();
break;
}
trackEvent('ai_selected', { type: aiType });
}
function showGeminiChat() {
document.getElementById('aiSelector').style.display = 'none';
document.getElementById('geminiChat').style.display = 'flex';
document.getElementById('aiModalTitle').textContent = '✨ Gemini AI 도우미';
// Add initial message
if (!document.getElementById('chatMessages').hasChildNodes()) {
addMessage('assistant', 'KELA 웰니스에 대해 무엇이든 물어보세요!');
}
}
function addMessage(type, content) {
const chatMessages = document.getElementById('chatMessages');
const messageDiv = document.createElement('div');
messageDiv.className = `message ${type}`;
messageDiv.textContent = content;
chatMessages.appendChild(messageDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
}
async function sendToGemini() {
const input = document.getElementById('geminiInput');
const message = input.value.trim();
if (!message) return;
addMessage('user', message);
input.value = '';
// Simulate API response (replace with actual Gemini API call)
setTimeout(() => {
addMessage('assistant', `${message}에 대한 답변입니다. KELA 웰니스 도구를 사용해보세요.`);
}, 1000);
}
// ========== UTILITY FUNCTIONS ==========
function showNotification(message, type = 'success') {
const toast = document.getElementById('toast');
toast.textContent = message;
toast.className = `toast show ${type}`;
setTimeout(() => {
toast.classList.remove('show');
}, 3000);
}
function skipWelcome() {
document.getElementById('welcomeModal').classList.remove('show');
localStorage.setItem('kela_visited', 'true');
}
function startTour() {
OnboardingManager.startTour();
}
function trackEvent(eventName, data = {}) {
// Analytics tracking
console.log('Track Event:', eventName, data);
// Save to localStorage for offline analytics
const events = JSON.parse(localStorage.getItem('kela_events') || '[]');
events.push({
event: eventName,
data: data,
timestamp: new Date().toISOString()
});
localStorage.setItem('kela_events', JSON.stringify(events));
}
// ========== INITIALIZATION ==========
document.addEventListener('DOMContentLoaded', function() {
// Load saved language
const savedLang = localStorage.getItem('kela_language') || 'ko';
document.getElementById('languageSelector').value = savedLang;
currentLanguage = savedLang;
updateTranslations();
// Initialize onboarding
OnboardingManager.init();
// ESC key to close modals
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
closeWiaAiModal();
document.getElementById('welcomeModal').classList.remove('show');
}
});
document.getElementById('welcomeModal').addEventListener('click', function(e) {
if (e.target === this) {
skipWelcome();
}
});
// Enter key for Gemini chat
document.getElementById('geminiInput')?.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
sendToGemini();
}
});
// Reset water count daily
const lastWaterReset = localStorage.getItem('kela_water_reset');
const today = new Date().toDateString();
if (lastWaterReset !== today) {
localStorage.setItem('kela_water_today', '0');
localStorage.setItem('kela_water_reset', today);
}
// Track page view
trackEvent('page_view', {
tool: TOOL_CONFIG.name,
category: TOOL_CONFIG.category,
language: currentLanguage
});
});
📰 The Korean Today × Your City 📰
1,558 Cities Worldwide | Start your journey as a global journalist in your city
Become a Bureau Chief