`;
}
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();
})();