/* 方塊 常駐核心樣式（全站共用，2026-10-06 從 shelf.css 搬出）。層次：.ifd-cube 管位置／進場（--bx 左右偏移）＞ .ifd-cube__b 管跳／呼吸／壓扁／飄起落地（軸在腳底中央）＞ svg 管「以腳底的角為軸」傾倒（--roll、--pvx）與以腳底為軸後仰（--pitch）＞ svg 內 .ifd-cube-liq 把液體反向轉回世界水平（--lx 跟著身體位移）；.eye 管瞄（--ex／--ey）與眨 */
.ifd-cube{position:fixed;right:14px;bottom:calc(10px + env(safe-area-inset-bottom,0px));width:64px;height:64px;z-index:99970;pointer-events:none;transform:translateY(120%) scale(1.25,.6);transform-origin:50% 100%;will-change:transform,opacity}
.ifd-cube svg{width:100%;height:100%;display:block;overflow:hidden!important}   /* overflow:hidden＝保險：snippet 33 的液體波浪若裁切失效也不准畫到方塊外（整張 svg 轉的時候裁切框跟著轉，不會切到身體） */
.ifd-cube.is-in{transform:translateY(0) scale(1,1);transition:transform .18s cubic-bezier(.3,1.6,.5,1)}
@keyframes ifd-cube-idle{0%,100%{transform:translateY(0) rotate(0)}20%{transform:translateY(0) rotate(-7deg)}45%{transform:translateY(0) rotate(7deg)}70%{transform:translateY(-9px) scale(.96,1.05)}85%{transform:translateY(0) scale(1.06,.94)}}
.ifd-cube.is-idle{animation:ifd-cube-idle 1.1s ease-in-out infinite}
@keyframes ifd-cube-jump{0%{transform:translateY(0) scale(1.1,.85)}45%{transform:translateY(-34px) scale(.94,1.08)}85%{transform:translateY(0) scale(1.2,.72)}100%{transform:translateY(0) scale(1,1)}}
.ifd-cube.is-jump{animation:ifd-cube-jump .19s cubic-bezier(.3,.1,.4,1) both}
.ifd-cube.is-out{transition:opacity .32s ease .1s,transform .32s ease .1s;opacity:0;transform:translateY(40%) scale(1,1);animation:none}
/* 方塊 常駐（2026-10-05）：外層管左右位置（--bx）與進場，內層 __b 管跳／呼吸，svg 管傾倒／後仰，眼睛各自瞄（--ex／--ey）與眨（is-blink） */
.ifd-cube.is-live{animation:none;transform:translateX(var(--bx,0px));transition:transform .36s cubic-bezier(.3,1.35,.5,1)}
.ifd-cube__b{width:100%;height:100%;transform-origin:50% 100%;transition:transform .22s cubic-bezier(.2,.8,.3,1);filter:drop-shadow(0 6px 10px rgba(0,0,0,.45))}
/* 真實物理（Han 2026-10-06）：傾斜／倒下以腳底的「角」為軸（--pvx＝左下 11.7%／右下 88.3%），像真的方塊放在地上踮角平衡，不是以身體中心轉；後仰以腳底為軸（rotateX）。
   整張 svg 一起轉＝裁切框跟著身體走；液體內容（.ifd-cube-liq）反向轉同一個軸、再跟著身體平移（--lx）＝水面永遠水平（Han 2026-10-05「像真的水跟地心引力一樣」）。
   只有 svg 收點擊：躺到旁邊去的時候要戳得到它、而它原本站的那格不能擋到底下的按鈕 */
.ifd-cube.is-live svg{pointer-events:auto;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;user-select:none;-webkit-user-select:none;transform:perspective(240px) rotateX(var(--pitch,0deg)) rotate(var(--roll,0deg));transform-origin:var(--pvx,50%) 88.3%;transition:transform var(--rt,.45s) var(--re,ease)}
.ifd-cube.is-live .ifd-cube-liq{transform:rotate(calc(var(--roll,0deg) * -1)) translate(var(--lx,0px),0);transform-box:view-box;transform-origin:var(--pvx,50%) 88.3%;transition:transform var(--rt,.45s) var(--re,ease)}
/* 滾動慣性：快速往下捲＝飄起拉長；快速往上捲＝壓扁延伸；停下各自落地／彈起 */
/* Han 2026-10-06：飄起要很 smooth 地慢慢升到三倍高（-48px），停下「咻蹦」快速落地；壓扁後自然彈一倍高（-16px）再落下 */
.ifd-cube__b.is-float{transform:translateY(-48px) scale(.92,1.12);transition:transform .75s cubic-bezier(.15,.6,.25,1)}
.ifd-cube__b.is-press{transform:translateY(3px) scale(1.16,.84);transition:transform .22s ease-out}
@keyframes ifd-cube-land{0%{transform:translateY(-48px) scale(.92,1.12);animation-timing-function:cubic-bezier(.6,0,.95,.45)}38%{transform:translateY(0) scale(1.26,.72);animation-timing-function:ease-out}56%{transform:translateY(-7px) scale(.92,1.1)}72%{transform:translateY(0) scale(1.12,.88)}86%{transform:translateY(-2px) scale(.97,1.04)}100%{transform:none}}
.ifd-cube__b.is-land{animation:ifd-cube-land .64s both}
@keyframes ifd-cube-pop{0%{transform:translateY(3px) scale(1.16,.84);animation-timing-function:cubic-bezier(.2,.7,.4,1)}40%{transform:translateY(-16px) scale(.95,1.07);animation-timing-function:cubic-bezier(.55,0,.9,.5)}72%{transform:translateY(0) scale(1.12,.88);animation-timing-function:ease-out}86%{transform:translateY(-2px) scale(.98,1.03)}100%{transform:none}}
.ifd-cube__b.is-pop{animation:ifd-cube-pop .6s both}
/* 眼睛：開燈階段就關掉主題的眨眼動畫，接常駐時眼睛才不會跳一下；--ex 左右瞄、--ey 上下瞄 */
.ifd-cube .eye{animation:none!important;transform-box:fill-box;transform-origin:50% 50%;transform:translate(var(--ex,0px),var(--ey,0px));transition:transform .22s ease}
.ifd-cube.is-live.is-blink .eye{transform:translate(var(--ex,0px),var(--ey,0px)) scaleY(.08);transition-duration:.07s}
.ifd-cube.is-live .is-happy .eye{transform:translate(var(--ex,0px),var(--ey,0px)) translateY(-5px) scaleY(.38)}
.ifd-cube.is-live .is-stretch .eye{transform:translate(var(--ex,0px),var(--ey,0px)) scaleY(.3);transition-duration:.4s}
/* 睡覺：眼皮先沉（drowsy）→ 閉成一條線（asleep）；睡眼惺忪（groggy）半開；嚇到（wide）瞪大 1.5 倍抖 3 秒 */
.ifd-cube.is-live.is-drowsy .eye{transform:translate(var(--ex,0px),var(--ey,0px)) scaleY(.45);transition-duration:1.2s}
.ifd-cube.is-live.is-asleep .eye{transform:translate(var(--ex,0px),var(--ey,0px)) scaleY(.1);transition-duration:.5s}
.ifd-cube.is-live.is-groggy .eye{transform:translate(var(--ex,0px),var(--ey,0px)) scaleY(.5);transition-duration:.9s}
.ifd-cube.is-live.is-wide .eye{animation:ifd-cube-wide .12s linear infinite!important}
@keyframes ifd-cube-wide{0%{transform:translate(var(--ex,0px),var(--ey,0px)) scale(1.5) translate(.5px,-.4px)}25%{transform:translate(var(--ex,0px),var(--ey,0px)) scale(1.45) translate(-.5px,.3px)}50%{transform:translate(var(--ex,0px),var(--ey,0px)) scale(1.53) translate(.3px,.5px)}75%{transform:translate(var(--ex,0px),var(--ey,0px)) scale(1.47) translate(-.4px,-.5px)}100%{transform:translate(var(--ex,0px),var(--ey,0px)) scale(1.5) translate(.5px,-.4px)}}
@keyframes ifd-cube-breathe{0%,100%{transform:scale(1,1)}50%{transform:scale(1.03,.97)}}
.ifd-cube__b.is-breathe{animation:ifd-cube-breathe 3.4s ease-in-out infinite}
/* 睡覺的呼吸：從上往下壓著、胸口慢慢起伏（腳底釘住，3D Lab「Nap」） */
@keyframes ifd-cube-sleep{0%,100%{transform:scale(1.01,.96)}50%{transform:scale(1.035,.915)}}
.ifd-cube__b.is-sleep{animation:ifd-cube-sleep 3.6s ease-in-out infinite}
@keyframes ifd-cube-hop{0%{transform:scale(1.08,.88)}40%{transform:translateY(-20px) scale(.95,1.06)}80%{transform:translateY(0) scale(1.12,.84)}100%{transform:none}}
.ifd-cube__b.is-hop{animation:ifd-cube-hop .36s cubic-bezier(.3,.1,.4,1) both}
/* 開心跳（Han 2026-10-05）：用閒置跳步的速率感慢慢升到兩倍高（-44px），落下快一點，落地壓扁＋腳底火花 */
@keyframes ifd-cube-happy{0%{transform:scale(1.1,.85);animation-timing-function:ease-out}14%{transform:translateY(0) scale(.94,1.1);animation-timing-function:cubic-bezier(.2,.7,.4,1)}52%{transform:translateY(-44px) scale(.97,1.03);animation-timing-function:cubic-bezier(.6,0,.9,.4)}72%{transform:translateY(0) scale(1.24,.72);animation-timing-function:ease-out}84%{transform:translateY(-6px) scale(.96,1.06)}93%{transform:translateY(0) scale(1.05,.95)}100%{transform:none}}
.ifd-cube__b.is-happy{animation:ifd-cube-happy .9s both}
/* 撞牆（往右跳到畫面邊緣）：衝過去 → 壓扁貼牆 → 果凍彈回 → 落地晃兩下 */
@keyframes ifd-cube-bonk{0%{transform:scale(1.06,.9)}28%{transform:translate(8px,-18px) scale(.94,1.08)}40%{transform:translate(14px,-8px) scale(.68,1.26)}56%{transform:translate(-4px,-16px) scale(1.16,.86)}74%{transform:translate(0,0) scale(1.2,.78)}86%{transform:translateY(-5px) scale(.95,1.06)}100%{transform:none}}
.ifd-cube__b.is-bonk{animation:ifd-cube-bonk .95s cubic-bezier(.3,.2,.4,1) both}
.ifd-cube.is-live .is-bonk .eye{transform:translate(var(--ex,0px),var(--ey,0px)) scale(1.18)}
/* 伸懶腰：腳釘住往上拉長、放開像果凍彈兩下才停（3D Lab「Stretch」） */
@keyframes ifd-cube-stretch{0%{transform:scale(1,1)}35%{transform:scale(.93,1.2)}58%{transform:scale(.93,1.2)}68%{transform:scale(1.1,.84)}78%{transform:scale(.96,1.1)}87%{transform:scale(1.04,.94)}94%{transform:scale(.99,1.02)}100%{transform:none}}
.ifd-cube__b.is-stretch{animation:ifd-cube-stretch 1.5s ease-in-out both}
/* 咚：倒下／站起／放下腳角時壓一下 */
@keyframes ifd-cube-thud{0%{transform:scale(1,1)}40%{transform:scale(1.07,.9)}100%{transform:none}}
.ifd-cube__b.is-thud{animation:ifd-cube-thud .3s ease-out both}
/* 驚跳：被嚇到原地彈一下（身體後仰另外由 --pitch 做） */
@keyframes ifd-cube-jolt{0%{transform:scale(1.06,.9)}35%{transform:translateY(-14px) scale(.94,1.08)}70%{transform:translateY(0) scale(1.12,.86)}85%{transform:translateY(-3px) scale(.97,1.03)}100%{transform:none}}
.ifd-cube__b.is-jolt{animation:ifd-cube-jolt .5s cubic-bezier(.3,.1,.4,1) both}
/* 嚇醒後肚子裡的水狂暴 3 秒：整缸左右甩＋波浪氣泡加速（3D「內容物狂暴」；站著時才會發生，所以軸心就是腳底） */
@keyframes ifd-cube-wild{0%{transform:translate(0,0) rotate(0)}20%{transform:translate(2px,-3px) rotate(3deg)}40%{transform:translate(-2px,2px) rotate(-3deg)}60%{transform:translate(3px,1px) rotate(2.5deg)}80%{transform:translate(-3px,-2px) rotate(-2.5deg)}100%{transform:translate(0,0) rotate(0)}}
.ifd-cube.is-live.is-wild .ifd-cube-liq{animation:ifd-cube-wild .26s linear 11}
.ifd-cube.is-live.is-wild .ifd-w1{animation-duration:.7s!important}.ifd-cube.is-live.is-wild .ifd-w2{animation-duration:1s!important}.ifd-cube.is-live.is-wild .ifd-bub{animation-duration:.9s!important}
/* ✦ 用恐龍 logo 的亮黃、放大（Han 2026-10-05）；♥ 維持糖果粉；! 紅字白邊；z 灰字飄向右上 */
.ifd-cube__p{position:absolute;left:50%;bottom:72%;margin-left:-12px;font-size:24px;line-height:1;font-style:normal;color:var(--ifd-sun,#fff200);text-shadow:0 0 8px rgba(255,242,0,.55),0 2px 6px rgba(0,0,0,.5);pointer-events:none;animation:ifd-cube-p 1.1s ease-out both}
.ifd-cube__p--h{color:var(--ifd-candy,#ff7fa8);text-shadow:0 0 8px rgba(255,127,168,.5),0 2px 6px rgba(0,0,0,.5)}
.ifd-cube__p--x{color:#ff3d3d;font-size:30px;font-weight:900;-webkit-text-stroke:1.5px #fff;text-shadow:0 2px 6px rgba(0,0,0,.45);animation-duration:.9s}
.ifd-cube__p--z{color:#aab8c8;font-size:15px;font-weight:800;text-shadow:0 1px 3px rgba(0,0,0,.4);animation:ifd-cube-z 2.3s ease-out both}
@keyframes ifd-cube-p{0%{opacity:0;transform:translate(var(--px,0px),6px) scale(.6)}20%{opacity:1}100%{opacity:0;transform:translate(calc(var(--px,0px) * 1.6),-52px) scale(1.2)}}
@keyframes ifd-cube-z{0%{opacity:0;transform:translate(6px,4px) scale(.6)}15%{opacity:.9}100%{opacity:0;transform:translate(26px,-44px) scale(1.3)}}
/* 落地火花：腳底往左右兩側噴小黃點，弧線散開後消散；dust＝灰塵小點（倒下、放下腳角） */
.ifd-cube__sk{position:absolute;left:50%;bottom:2px;margin-left:-4px;border-radius:50%;background:var(--ifd-sun,#fff200);box-shadow:0 0 8px var(--ifd-sun,#fff200),0 0 2px #fff;pointer-events:none;animation:ifd-cube-sk 1s ease-out both}
.ifd-cube__sk--h{background:var(--ifd-candy,#ff7fa8);box-shadow:0 0 8px var(--ifd-candy,#ff7fa8),0 0 2px #fff}
.ifd-cube__sk--d{background:#d8dde4;box-shadow:0 0 3px rgba(0,0,0,.3)}
@keyframes ifd-cube-sk{0%{opacity:1;transform:translate(0,0) scale(.7)}35%{opacity:1;transform:translate(calc(var(--sx,20px) * .7),var(--sy,-12px)) scale(1.1)}75%{opacity:.8}100%{opacity:0;transform:translate(var(--sx,20px),calc(var(--sy,-12px) * -.5 + 8px)) scale(.4)}}
body:has(.ifd-shelf.has-gprompt) .ifd-cube{opacity:0;pointer-events:none;transition:opacity .2s}
/* Blocksy「回到最上層」箭頭本來在右下角（bottom 25px）會被方塊整顆蓋住（Han 2026-10-06）：頁面有方塊時把箭頭抬到方塊頭頂上方 20px（方塊頂＝10+64）；用主題自己的變數，Customizer 其他設定照舊 */
body:has(.ifd-cube) .ct-back-to-top{--back-top-bottom-offset:calc(94px + env(safe-area-inset-bottom,0px))}
@media (prefers-reduced-motion:reduce){.ifd-cube{display:none}}
