콘텐츠로 건너뛰기

오늘 타로카드 운세보기

오늘의 카드

하루 1회 고정(브라우저 저장). 날짜가 바뀌면 자동 갱신됩니다.

아직 오늘의 카드가 정해지지 않았어요. 카드 78장에서 선택을 눌러주세요.
🔮 AI 타로로 오늘 운세 한 장 정리
  • 연애 · 금전 · 직장 · 학업까지 한 번에 체크
  • 회원가입·설치 없이 10초 만에 결과 확인
  • 매일 새롭게 뽑는 나만의 데일리 카드
지금 무료로 카드 뽑기
🔮 AI 타로로 오늘 운세 한 장 정리
  • 연애 · 금전 · 직장 · 학업까지 한 번에 체크
  • 회원가입·설치 없이 10초 만에 결과 확인
  • 매일 새롭게 뽑는 나만의 데일리 카드
지금 무료로 카드 뽑기

${title}

${headline}
${tip}
오늘의 포인트
    ${li(actions.slice(0,3).map(x=>x.replace(/^오늘 /,'')))}
오늘의 할 일
    ${li(actions)}
피하면 좋아요
    ${li(avoid)}
작은 루틴: ${routine}
스스로에게 해볼 질문: ${q}
오늘의 한마디: ${saying}
행운 요소 · 색: ${lucky.color} · 숫자: ${lucky.num} · 시간대: ${lucky.time}
${today} · 오늘의 카드
`; } function majorReading(name, up){ const core = M[name] || {up:["좋은 흐름","집중","작은 성과"], dn:["속도 조절","정리","점검"]}; const points = up ? core.up : core.dn; const actionsUp = ["오늘 꼭 하나만 끝내기","작게 시작하고 바로 체크","필요한 도움 한 번 요청"]; const actionsDn = ["속도를 살짝 늦추기","먼저 정리부터 하기","확실한 것 1가지만 선택"]; const avoidUp = ["한 번에 너무 많은 일","쓸데없는 완벽주의"]; const avoidDn = ["즉흥적 결정","과거에 매달리기"]; const routine = up ? "딥워크 20분 2회" : "5분 호흡 후 핵심 1가지"; const saying = up ? "나는 오늘 필요한 것에 집중해 작게라도 전진한다." : "나는 오늘 천천히 점검하며 딱 하나를 제대로 한다."; return compose(name, up, oneLine(points,up), pick(up?actionsUp:actionsDn,3), pick(up?avoidUp:avoidDn,2), routine, pick(["오늘 나에게 가장 중요한 한 가지는?","지금 바로 시작할 수 있는 가장 작은 행동은?","내가 놓치고 있는 신호는 무엇일까?"],1)[0], saying, luck()); } function minorReading(name, up){ const [suit, rank] = name.split(' '); const s = SUIT[suit] || {pos:["에너지"],neg:["주의"]}; const r = RANK[rank] || {pos:["전개"],neg:["점검"]}; const points = up ? [...s.pos, ...r.pos] : [...s.neg, ...r.neg]; const actionsBySuit = { "완드": ["작게라도 바로 해보기","산책으로 기동성 올리기","핵심 시간대에 중요한 일 먼저","할 일 1개에 에너지 몰아주기"], "컵": ["감정 라벨링 3번 하기","중요한 사람 1명에게 안부","물 충분히 마시기","나에게 친절한 말 1문장"], "소드": ["메모로 생각 정리","의사결정 기준 3줄 쓰기","말보단 경청 60%","할 말은 짧고 선명하게"], "펜타클": ["지출 기록 3줄","책상·이메일 10분 정리","단백질/수면 신경쓰기","작은 체크리스트 1장"] }[suit]; const avoidBySuit = { "완드": ["무계획한 돌진","한 번에 다 바꾸기"], "컵": ["감정에 즉각 반응","밀당·시험하기"], "소드": ["지나친 분석","날카로운 말"], "펜타클": ["충동 소비","실패 두려워 미루기"] }[suit]; const routineByRank = { "에이스":"새 루틴 1개 시작","2":"우선순위 2가지로 줄이기","3":"협업 1건 다음 단계 적기","4":"포모도로 25분 × 2", "5":"방해요인 1개 제거","6":"회복 타임 10분","7":"중간점검 체크리스트","8":"집중 40분 1회","9":"작은 보상 준비", "10":"완료·정리 타임 15분","시종":"메모 습관 시작","기사":"짧은 운동/이동 10분","여왕":"소중한 사람에게 메시지","왕":"내일 계획 3줄" }[rank] || "오늘 할 일 1개만 제대로"; const saying = {"완드":"오늘 나는 에너지를 올바른 곳에 쓴다.","컵":"오늘 나는 마음을 따뜻하게 돌본다.","소드":"오늘 나는 선명하게 생각하고 말한다.","펜타클":"오늘 나는 현실을 단단히 다진다."}[suit]; return compose(name, up, oneLine(points,up), pick(actionsBySuit,3), pick(avoidBySuit,2), routineByRank, pick(["오늘 나에게 가장 중요한 한 가지는?","지금 바로 시작할 수 있는 가장 작은 행동은?","내가 놓치고 있는 신호는 무엇일까?"],1)[0], saying, luck()); } function render(obj){ const html = MAJOR.includes(obj.name) ? majorReading(obj.name, obj.up) : minorReading(obj.name, obj.up); RES.innerHTML = html; } // ---------- 덱/패널 ---------- let deck = []; function shuffle(a){ for(let i=a.length-1;i>0;i--){ const j=Math.floor(Math.random()*(i+1)); [a[i],a[j]]=[a[j],a[i]]; } return a; } function openPanel(){ // 이미 선택된 날이면 확인 후 종료 const saved = load(); if(saved && !confirm("오늘 카드는 이미 정해져 있어요. 다시 선택하시겠어요? (기존 내용이 덮어씌워집니다)")) return; PANEL.hidden = false; // 78장을 섞어 그리드에 깔기 deck = shuffle([...FULL]); GRID.innerHTML = ""; deck.forEach((_, idx)=>{ const d = document.createElement('div'); d.className = 'card'; // 뒷면만 보임 d.title = '카드 선택'; d.onclick = ()=> choose(idx); GRID.appendChild(d); }); } function closePanel(){ PANEL.hidden = true; } function choose(index){ const name = deck[index]; const up = Math.random() >= 0.48; // true = 바르게, false = 거꾸로 const obj = { date: today, name, up }; save(obj); render(obj); closePanel(); } // ---------- 초기화 ---------- function init(){ const saved = load(); if(saved){ render(saved); } } // ---------- 이벤트 ---------- $("pick-open").onclick = openPanel; $("pick-close").onclick = closePanel; $("draw-random").onclick = ()=>{ const saved = load(); if(saved && !confirm("오늘 카드는 이미 정해져 있어요. 다시 뽑을까요?")) return; // 랜덤: 덱에서 임의 하나 const name = FULL[Math.floor(Math.random()*FULL.length)]; const up = Math.random() >= 0.48; const obj = { date: today, name, up }; save(obj); render(obj); }; $("reset-day").onclick = ()=>{ localStorage.removeItem(KEY); GRID.innerHTML=""; PANEL.hidden=true; RES.textContent="오늘 기록이 초기화되었습니다. 다시 선택해 주세요."; }; $("copy-text").onclick = ()=>{ navigator.clipboard.writeText(RES.innerText.trim()).then(()=>alert("복사됨!")); }; $("hide-name").onchange = ()=>{ const s = load(); if(s) render(s); }; init(); })();