<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>忽冷忽熱、已讀不回?他到底在想什麼,顏色會告訴妳|一心一憶</title>
<meta name="description" content="他今天為什麼這麼冷淡?與其每天猜測他的心思,不如透過色彩測驗,直接看穿他沒說出口的情緒。">
<meta property="og:title" content="忽冷忽熱、已讀不回?他到底在想什麼,顏色會告訴妳">
<meta property="og:description" content="讀懂他,也放過妳自己。用色彩測驗看穿他沒說出口的情緒。">
<meta property="og:url" content="https://oncian.com">
<meta property="og:type" content="website">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+TC:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
  :root{
    --ink:#2B1D24;
    --paper:#FBF6F0;
    --wine:#7A2E3A;
    --gold:#C9A66B;
    --sand:#E8D9C5;
    --red:#B5453A;
    --gray:#8B8378;
    --yellow:#C99A34;
    --blue:#5B7C99;
  }

  *{ box-sizing:border-box; }

  html,body{ margin:0; background:var(--paper); color:var(--ink); font-family:'Noto Serif TC', sans-serif; }

  body{ position:relative; display:flex; justify-content:center; overflow-x:hidden; }

  .grain{
    position:fixed; inset:0; pointer-events:none; opacity:.5; mix-blend-mode:multiply; z-index:1;
    background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='matrix' values='0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 0.03 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  }

  .light{ position:fixed; pointer-events:none; border-radius:50%; filter:blur(90px); z-index:0; }
  .light-1{ top:-140px; right:-100px; width:420px; height:420px; background:radial-gradient(circle, rgba(201,166,107,.55), transparent 70%); }
  .light-2{ top:38%; left:-160px; width:380px; height:380px; background:radial-gradient(circle, rgba(122,46,58,.28), transparent 70%); }
  .light-3{ bottom:-120px; right:10%; width:360px; height:360px; background:radial-gradient(circle, rgba(91,124,153,.22), transparent 70%); }

  main{ position:relative; z-index:2; }

  main{ width:100%; max-width:720px; padding:70px 24px 60px; }

  .hero{ text-align:center; margin-bottom:64px; animation:rise .9s ease both; }

  .eyebrow{ margin:0 0 16px; font-size:12px; letter-spacing:.3em; color:var(--wine); font-weight:500; }

  h1{ margin:0 0 16px; font-family:'Noto Serif TC', serif; font-weight:600; font-size:clamp(28px,5.5vw,42px); line-height:1.45; }

  .sub{ margin:0; font-size:14px; line-height:1.8; color:rgba(43,29,36,.6); }

  .sub-emphasis{ margin:16px 0 0; font-size:16px; font-weight:600; color:var(--wine); }

  .section-title{ font-family:'Noto Serif TC', serif; font-size:clamp(20px,3.4vw,24px); font-weight:600; text-align:center; margin:0 0 6px; }

  .section-sub{ text-align:center; font-size:13px; color:rgba(43,29,36,.55); margin:0 0 36px; }

  .reading{ margin-bottom:80px; animation:rise 1s ease both; animation-delay:.1s; }

  .card-grid{ display:grid; grid-template-columns:1fr 1fr; gap:18px; margin-top:32px; }

  .card-flip{ height:216px; perspective:1300px; }

  .card-flip.c-red{ --accent:var(--red); }
  .card-flip.c-gray{ --accent:var(--gray); }
  .card-flip.c-yellow{ --accent:var(--yellow); }
  .card-flip.c-blue{ --accent:var(--blue); }

  .card-inner{
    position:relative; width:100%; height:100%; cursor:pointer;
    transition:transform .65s cubic-bezier(.4,.2,.2,1); transform-style:preserve-3d;
  }

  .card-flip.flipped .card-inner{ transform:rotateY(180deg); }

  .card-face{
    position:absolute; inset:0; backface-visibility:hidden; border-radius:16px;
    padding:24px 22px; border-left:3px solid var(--accent); background:#fff8f0;
    box-shadow:0 14px 30px -22px rgba(43,29,36,.35), inset 0 1px 0 rgba(255,255,255,.7);
    display:flex; flex-direction:column; transition:box-shadow .3s ease;
  }

  .card-flip:hover .card-face{
    box-shadow:0 18px 36px -20px color-mix(in srgb, var(--accent) 35%, rgba(43,29,36,.3)), inset 0 1px 0 rgba(255,255,255,.8);
  }

  .swatch{ box-shadow:0 0 0 5px color-mix(in srgb, var(--accent) 16%, transparent); }

  .card-front{ justify-content:space-between; }

  .card .head{ display:flex; align-items:center; gap:9px; margin-bottom:14px; }

  .swatch{ width:13px; height:13px; border-radius:50%; background:var(--accent); flex:none; }

  .card .name{ font-family:'Noto Serif TC', serif; font-weight:600; font-size:15px; }

  .card .scenario{ margin:0; font-size:14px; line-height:1.7; font-weight:500; }

  .flip-hint{ margin:0; font-size:11px; letter-spacing:.06em; color:var(--gold); }

  .card-back{ transform:rotateY(180deg); justify-content:center; }

  .card .insight{ margin:0; font-size:12.5px; line-height:1.85; color:rgba(43,29,36,.62); }

  .quiz{ animation:rise 1.1s ease both; animation-delay:.2s; }

  .progress{ display:flex; justify-content:center; gap:11px; margin:0 0 34px; }

  .dot{ width:9px; height:9px; border-radius:50%; border:1.5px solid rgba(43,29,36,.22); transition:background .35s ease, border-color .35s ease, transform .3s ease; }

  .dot.active{ border-color:var(--wine); transform:scale(1.4); }

  .quiz-card{
    max-width:460px; margin:0 auto; background:#fff8f0; border:1px solid var(--sand);
    border-radius:18px; padding:36px 30px;
    box-shadow:0 20px 44px -28px rgba(43,29,36,.4), 0 0 60px -20px rgba(201,166,107,.35), inset 0 1px 0 rgba(255,255,255,.7);
  }

  .q-count{ margin:0 0 14px; font-size:11px; letter-spacing:.2em; color:var(--gold); text-align:center; font-weight:500; }

  .q-text{ margin:0 0 26px; font-family:'Noto Serif TC', serif; font-size:clamp(17px,3.6vw,20px); line-height:1.7; text-align:center; font-weight:500; }

  .options{ display:flex; flex-direction:column; gap:11px; }

  .option-btn{
    width:100%; text-align:left; padding:14px 18px; border-radius:11px;
    border:1px solid rgba(43,29,36,.14); background:transparent; font-family:'Noto Serif TC', sans-serif;
    font-size:13.5px; line-height:1.6; color:var(--ink); cursor:pointer;
    transition:background .2s ease, border-color .2s ease, transform .15s ease;
  }

  .option-btn:hover{ background:rgba(201,166,107,.14); border-color:var(--gold); box-shadow:0 0 22px -10px rgba(201,166,107,.6); }

  .option-btn.selected{ background:rgba(122,46,58,.1); border-color:var(--wine); transform:translateX(3px); }

  .option-btn:focus-visible{ outline:2px solid var(--gold); outline-offset:3px; }

  .option-btn:disabled{ cursor:default; }

  .result{ max-width:460px; margin:0 auto; text-align:center; border-radius:18px; padding:48px 30px;
    border:1px solid var(--sand); background:
      radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--accent) 26%, transparent), transparent 72%), #fff8f0;
    box-shadow:0 20px 44px -28px rgba(43,29,36,.4), 0 0 70px -18px color-mix(in srgb, var(--accent) 45%, transparent);
    animation:rise .7s ease both;
  }

  .result-eyebrow{ margin:0 0 10px; font-size:12px; letter-spacing:.28em; color:rgba(43,29,36,.5); }

  .result-color{ margin:0 0 20px; font-family:'Noto Serif TC', serif; font-size:clamp(30px,6vw,42px); color:var(--accent); font-weight:700; }

  .result-desc{ margin:0 0 28px; font-size:14px; line-height:1.85; color:rgba(43,29,36,.72); }

  .trail{ display:flex; justify-content:center; gap:8px; margin-bottom:30px; }

  .trail span{ width:10px; height:10px; border-radius:50%; display:inline-block; }

  .retry-btn{
    appearance:none; border:1px solid var(--wine); background:transparent; color:var(--wine);
    font-family:'Noto Serif TC', sans-serif; font-size:13px; letter-spacing:.08em;
    padding:12px 30px; border-radius:999px; cursor:pointer; transition:background .2s ease, color .2s ease;
  }

  .retry-btn:hover{ background:var(--wine); color:var(--paper); box-shadow:0 0 26px -8px rgba(122,46,58,.6); }

  .subscribe{
    max-width:460px; margin:90px auto 0; text-align:center; border-radius:18px; padding:44px 32px;
    border:1px solid var(--sand); background:
      radial-gradient(circle at 50% 0%, rgba(201,166,107,.22), transparent 72%), #fff8f0;
    box-shadow:0 20px 44px -28px rgba(43,29,36,.4), 0 0 60px -20px rgba(201,166,107,.35), inset 0 1px 0 rgba(255,255,255,.7);
  }

  .subscribe .section-title{ margin-bottom:10px; }

  .subscribe .section-sub{ margin-bottom:28px; }

  .sub-form{ display:flex; gap:10px; flex-wrap:wrap; justify-content:center; }

  .sub-form input{
    flex:1; min-width:200px; padding:13px 16px; border-radius:999px;
    border:1px solid rgba(43,29,36,.18); background:var(--paper); color:var(--ink);
    font-family:'Noto Serif TC', serif; font-size:13.5px; outline:none;
    transition:border-color .2s ease, box-shadow .2s ease;
  }

  .sub-form input:focus{ border-color:var(--gold); box-shadow:0 0 0 4px rgba(201,166,107,.18); }

  .sub-btn{
    appearance:none; border:none; cursor:pointer; background:var(--wine); color:var(--paper);
    font-family:'Noto Serif TC', serif; font-size:13.5px; letter-spacing:.06em;
    padding:13px 28px; border-radius:999px; transition:background .2s ease, box-shadow .2s ease, transform .2s ease;
  }

  .sub-btn:hover{ background:var(--wine-deep,#5c222c); transform:translateY(-1px); box-shadow:0 12px 26px -12px rgba(122,46,58,.6); }

  .sub-note{ margin:16px 0 0; font-size:11.5px; color:rgba(43,29,36,.5); }

  footer{ margin-top:70px; text-align:center; font-size:11px; letter-spacing:.18em; color:rgba(43,29,36,.4); }

  @keyframes rise{ from{ opacity:0; transform:translateY(14px); } to{ opacity:1; transform:translateY(0); } }

  @media (prefers-reduced-motion: reduce){ *{ animation:none !important; transition:none !important; } }

  @media (max-width:560px){
    .card-grid{ grid-template-columns:1fr; }
    .card-flip{ height:190px; }
    main{ padding:54px 18px 40px; }
  }
</style>
</head>
<body>
<div class="grain"></div>
<div class="light light-1"></div>
<div class="light light-2"></div>
<div class="light light-3"></div>
<main>

  <header class="hero">
    <p class="eyebrow">情感篇</p>
    <h1>忽冷忽熱、已讀不回?<br>他到底在想什麼,顏色會告訴妳</h1>
    <p class="sub">他今天為什麼這麼冷淡?這句話到底有沒有別的意思?<br>與其每天猜測他的心思、把自己搞得很累,不如透過色彩測驗,直接看穿他沒說出口的情緒。</p>
    <p class="sub-emphasis">讀懂他,也放過妳自己。</p>
  </header>

  <section class="reading">
    <h2 class="section-title">先讀懂他</h2>
    <p class="section-sub">要怎麼知道他在想什麼?</p>

    <div class="card-grid">
      <div class="card-flip c-red" tabindex="0" role="button" aria-label="翻面看紅色情境解讀">
        <div class="card-inner">
          <div class="card-face card-front">
            <div>
              <div class="head"><span class="swatch"></span><span class="name">紅色情境</span></div>
              <p class="scenario">他突然密集傳訊息、想馬上見到你</p>
            </div>
            <p class="flip-hint">點擊翻面看解讀</p>
          </div>
          <div class="card-face card-back">
            <p class="insight">紅色的本質是熱烈,情緒會隨事件起伏——他不是突然變黏人,而是此刻有某種強烈的感受正在燃燒。這時候他要的不是道理,是被回應的速度感。</p>
          </div>
        </div>
      </div>
      <div class="card-flip c-gray" tabindex="0" role="button" aria-label="翻面看灰色情境解讀">
        <div class="card-inner">
          <div class="card-face card-front">
            <div>
              <div class="head"><span class="swatch"></span><span class="name">灰色情境</span></div>
              <p class="scenario">你問他怎麼了,他只回「沒事」</p>
            </div>
            <p class="flip-hint">點擊翻面看解讀</p>
          </div>
          <div class="card-face card-back">
            <p class="insight">灰色偏理性,較不擅長處理情感面。他不是不在乎,而是還沒把感受翻譯成語言,給他一點時間整理,比催促更有用。</p>
          </div>
        </div>
      </div>
      <div class="card-flip c-yellow" tabindex="0" role="button" aria-label="翻面看黃色情境解讀">
        <div class="card-inner">
          <div class="card-face card-front">
            <div>
              <div class="head"><span class="swatch"></span><span class="name">黃色情境</span></div>
              <p class="scenario">他像小孩一樣直接說「我今天很開心/不開心」</p>
            </div>
            <p class="flip-hint">點擊翻面看解讀</p>
          </div>
          <div class="card-face card-back">
            <p class="insight">黃色是最不修飾的顏色,情緒和情感是直接表達的。他說的就是他想的,不用過度解讀。</p>
          </div>
        </div>
      </div>
      <div class="card-flip c-blue" tabindex="0" role="button" aria-label="翻面看藍色情境解讀">
        <div class="card-inner">
          <div class="card-face card-front">
            <div>
              <div class="head"><span class="swatch"></span><span class="name">藍色情境</span></div>
              <p class="scenario">他看起來很穩定,但你總覺得摸不透他的心</p>
            </div>
            <p class="flip-hint">點擊翻面看解讀</p>
          </div>
          <div class="card-face card-back">
            <p class="insight">藍色是平行線的關係——習慣保持距離感,情緒不輕易外露。這不代表冷漠,而是他習慣的親密方式比較安靜、比較有邊界。</p>
          </div>
        </div>
      </div>
    </div>
  </section>

  <section class="quiz" id="quizSection">
    <h2 class="section-title">再讀懂自己</h2>
    <p class="section-sub">六個情境,最直覺的答案就是最貼近你的顏色</p>

    <div class="progress" id="progress"></div>

    <div class="quiz-card" id="quizCard">
      <p class="q-count" id="qCount">1 / 6</p>
      <p class="q-text" id="qText"></p>
      <div class="options" id="options"></div>
    </div>

    <div class="result" id="result" hidden>
      <p class="result-eyebrow">你是</p>
      <h3 class="result-color" id="resultColor"></h3>
      <p class="result-desc" id="resultDesc"></p>
      <div class="trail" id="trail"></div>
      <button class="retry-btn" id="retryBtn">重新測一次</button>
    </div>
  </section>

  <section class="subscribe">
    <h2 class="section-title">收到更多情感篇</h2>
    <p class="section-sub">留下 Email,下一篇顏色解讀先讓你看</p>
    <form class="sub-form" id="subForm">
      <input type="email" id="subEmail" placeholder="你的 Email" required>
      <button type="submit" class="sub-btn">訂閱</button>
    </form>
    <p class="sub-note" id="subNote">不定期發送,隨時可以取消訂閱</p>
  </section>

  <footer>一心一憶 · Oncian Studio</footer>
</main>

<script>
  const colorMeta = {
    red:    { name:'紅', hex:'#B5453A', desc:'愛得熱烈,情緒也跟著起伏,容易受傷也容易感動。' },
    gray:   { name:'灰', hex:'#8B8378', desc:'理性內斂,感受需要時間醞釀才說得出口。' },
    yellow: { name:'黃', hex:'#C99A34', desc:'坦率得像個孩子,喜怒都藏不住,攤在陽光下。' },
    blue:   { name:'藍', hex:'#5B7C99', desc:'習慣保持一點距離,親密的方式安靜而有分寸。' }
  };

  const questions = [
    { text:'跟另一半吵架後,你通常會——', options:[
      { label:'A', text:'馬上想找他把話說開,一刻都靜不下來', color:'red' },
      { label:'B', text:'先自己一個人冷靜,理清楚再說', color:'gray' },
      { label:'C', text:'直接說出當下的委屈或生氣,藏不住', color:'yellow' },
      { label:'D', text:'表面照常過日子,情緒留給自己消化', color:'blue' }
    ]},
    { text:'收到一份意外的驚喜禮物,你的反應是——', options:[
      { label:'A', text:'立刻衝過去抱住對方,情緒整個上來', color:'red' },
      { label:'B', text:'心裡開心,但表情可能還是很淡定', color:'gray' },
      { label:'C', text:'開心得直接叫出來,藏不住笑容', color:'yellow' },
      { label:'D', text:'心裡溫暖了一下,但不會有太大反應', color:'blue' }
    ]},
    { text:'對方最近突然變得比較安靜,你會——', options:[
      { label:'A', text:'忍不住一直追問「你怎麼了」', color:'red' },
      { label:'B', text:'覺得他大概需要空間,先不打擾', color:'gray' },
      { label:'C', text:'直接問清楚,不喜歡猜來猜去', color:'yellow' },
      { label:'D', text:'觀察一陣子,等他自己開口', color:'blue' }
    ]},
    { text:'你形容自己在感情裡的狀態,比較像——', options:[
      { label:'A', text:'忽冷忽熱,情緒會隨對方反應起伏', color:'red' },
      { label:'B', text:'穩定但不太外露,理性大於感性', color:'gray' },
      { label:'C', text:'有什麼說什麼,情緒都寫在臉上', color:'yellow' },
      { label:'D', text:'保持一定的距離感,習慣自己消化', color:'blue' }
    ]},
    { text:'朋友問你「最近感情如何」,你通常——', options:[
      { label:'A', text:'一股腦把最近的心情全部說出來', color:'red' },
      { label:'B', text:'簡單帶過,不太想深聊細節', color:'gray' },
      { label:'C', text:'很直接地分享開心或不開心', color:'yellow' },
      { label:'D', text:'回答得體面,但心裡想的不一定全說', color:'blue' }
    ]},
    { text:'你最害怕在感情裡變成——', options:[
      { label:'A', text:'情緒被對方牽著走,失去自己', color:'red' },
      { label:'B', text:'被說「太冷漠」、不懂表達', color:'gray' },
      { label:'C', text:'被說「太直接」、不夠成熟', color:'yellow' },
      { label:'D', text:'被說「太有距離感」、難以親近', color:'blue' }
    ]}
  ];

  const progressEl = document.getElementById('progress');
  const qCountEl = document.getElementById('qCount');
  const qTextEl = document.getElementById('qText');
  const optionsEl = document.getElementById('options');
  const quizCardEl = document.getElementById('quizCard');
  const resultEl = document.getElementById('result');
  const resultColorEl = document.getElementById('resultColor');
  const resultDescEl = document.getElementById('resultDesc');
  const trailEl = document.getElementById('trail');
  const retryBtn = document.getElementById('retryBtn');

  let index = 0;
  let answers = [];
  let locked = false;

  function buildDots(){
    progressEl.innerHTML = '';
    questions.forEach((_, i) => {
      const d = document.createElement('div');
      d.className = 'dot';
      d.dataset.index = i;
      progressEl.appendChild(d);
    });
  }

  function refreshDots(){
    const dots = progressEl.querySelectorAll('.dot');
    dots.forEach((d, i) => {
      d.classList.toggle('active', i === index);
      if(answers[i]){
        d.style.background = colorMeta[answers[i]].hex;
        d.style.borderColor = colorMeta[answers[i]].hex;
      } else {
        d.style.background = 'transparent';
        d.style.borderColor = 'rgba(43,29,36,.22)';
      }
    });
  }

  function renderQuestion(){
    locked = false;
    const q = questions[index];
    qCountEl.textContent = (index + 1) + ' / ' + questions.length;
    qTextEl.textContent = q.text;
    optionsEl.innerHTML = '';
    q.options.forEach(opt => {
      const btn = document.createElement('button');
      btn.className = 'option-btn';
      btn.textContent = opt.label + '. ' + opt.text;
      btn.addEventListener('click', () => selectOption(btn, opt.color));
      optionsEl.appendChild(btn);
    });
    refreshDots();
  }

  function selectOption(btn, color){
    if(locked) return;
    locked = true;
    btn.classList.add('selected');
    optionsEl.querySelectorAll('.option-btn').forEach(b => b.disabled = true);
    answers[index] = color;
    refreshDots();

    window.setTimeout(() => {
      if(index < questions.length - 1){
        index += 1;
        renderQuestion();
      } else {
        showResult();
      }
    }, 420);
  }

  function showResult(){
    const counts = { red:0, gray:0, yellow:0, blue:0 };
    answers.forEach(c => counts[c]++);
    let winner = answers[answers.length - 1];
    let max = -1;
    Object.keys(counts).forEach(c => {
      if(counts[c] > max){ max = counts[c]; winner = c; }
    });

    const meta = colorMeta[winner];
    resultEl.style.setProperty('--accent', meta.hex);
    resultColorEl.textContent = meta.name + '色的人';
    resultDescEl.textContent = meta.desc;

    trailEl.innerHTML = '';
    answers.forEach(c => {
      const s = document.createElement('span');
      s.style.background = colorMeta[c].hex;
      trailEl.appendChild(s);
    });

    quizCardEl.hidden = true;
    resultEl.hidden = false;
  }

  retryBtn.addEventListener('click', () => {
    index = 0;
    answers = [];
    resultEl.hidden = true;
    quizCardEl.hidden = false;
    renderQuestion();
  });

  buildDots();
  renderQuestion();

  const subForm = document.getElementById('subForm');
  const subNote = document.getElementById('subNote');
  subForm.addEventListener('submit', (e) => {
    e.preventDefault();
    subNote.textContent = '謝謝訂閱,期待與你分享更多 🤍';
    subForm.reset();
  });

  document.querySelectorAll('.card-flip').forEach(card => {
    const toggle = () => card.classList.toggle('flipped');
    card.addEventListener('click', toggle);
    card.addEventListener('keydown', (e) => {
      if(e.key === 'Enter' || e.key === ' '){
        e.preventDefault();
        toggle();
      }
    });
  });
</script>
</body>
</html>