/* hezi day/night transition effects — auto-generated from 39 demos (balanced-brace parse) */
/* ===== FX 01 扫描故障 (overlay) ===== */
.hezi-fx-01{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:repeating-linear-gradient(0deg,transparent 0 2px,var(--overlay) 2px 4px);mix-blend-mode:overlay;transform:translateY(-20%)}
.hezi-fx-01.run{animation:hezi_01_scanG var(--fx-dur,.6s) var(--fx-ease,linear) forwards}
@keyframes hezi_01_scanG{0%{opacity:0;transform:translateY(-20%)}40%{opacity:.75}60%{opacity:.75}100%{opacity:0;transform:translateY(20%)}}
@keyframes hezi_01_jit{0%{transform:translate(0)}20%{transform:translate(-6px,2px)}40%{transform:translate(6px,-2px)}60%{transform:translate(-3px,1px)}80%{transform:translate(3px,-1px)}100%{transform:translate(0)}}

/* ===== FX 02 频闪 (overlay) ===== */
.hezi-fx-02{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:var(--overlay);mix-blend-mode:overlay}
.hezi-fx-02.run{animation:hezi_02_strobe var(--fx-dur,.7s) var(--fx-ease,steps(1)) forwards}
@keyframes hezi_02_strobe{0%{opacity:0}10%{opacity:.95}20%{opacity:0}30%{opacity:.95}40%{opacity:0}50%{opacity:.95}60%{opacity:0}70%{opacity:.95}80%{opacity:0}100%{opacity:0}}

/* ===== FX 03 液态金属 (overlay) ===== */
.hezi-fx-03{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.75) 45%,var(--overlay) 50%,rgba(255,255,255,.75) 55%,transparent 70%);mix-blend-mode:screen;transform:translateX(-100%)}
.hezi-fx-03.run{animation:hezi_03_liquid var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_03_liquid{0%{opacity:0;transform:translateX(-100%)}40%{opacity:.95}60%{opacity:.95}100%{opacity:0;transform:translateX(100%)}}

/* ===== FX 04 光束扫描 (overlay) ===== */
.hezi-fx-04{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(0deg,transparent,var(--overlay) 50%,transparent);mix-blend-mode:screen;transform:translateY(-100%)}
.hezi-fx-04.run{animation:hezi_04_beamScan var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_04_beamScan{0%{opacity:0;transform:translateY(-100%)}40%{opacity:.9}60%{opacity:.9}100%{opacity:0;transform:translateY(100%)}}

/* ===== FX 05 条形码 (overlay) ===== */
.hezi-fx-05{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:repeating-linear-gradient(90deg,var(--overlay) 0 3px,transparent 3px 6px,var(--overlay) 6px 9px,transparent 9px 14px,var(--overlay) 14px 17px,transparent 17px 20px);mix-blend-mode:multiply;transform:translateX(-100%)}
.hezi-fx-05.run{animation:hezi_05_barcode var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_05_barcode{0%{opacity:0;transform:translateX(-100%)}40%{opacity:.9}60%{opacity:.9}100%{opacity:0;transform:translateX(100%)}}

/* ===== FX 06 快门百叶 (overlay) ===== */
.hezi-fx-06{position:fixed;inset:0;z-index:99990;pointer-events:none;display:flex}
.hezi-fx-06 i{flex:1;background:var(--overlay);opacity:0;transform:scaleX(0);transform-origin:center}
.hezi-fx-06.run i{animation:hezi_06_shutter var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_06_shutter{0%{opacity:0;transform:scaleX(0)}40%{opacity:.92;transform:scaleX(1)}60%{opacity:.92;transform:scaleX(1)}100%{opacity:0;transform:scaleX(0)}}

/* ===== FX 07 霓虹网格 (overlay) ===== */
.hezi-fx-07{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:repeating-linear-gradient(0deg,transparent 0 38px,var(--overlay) 38px 40px),repeating-linear-gradient(90deg,transparent 0 38px,var(--overlay) 38px 40px);mix-blend-mode:screen;transform:scale(1.2)}
.hezi-fx-07.run{animation:hezi_07_neon var(--fx-dur,.9s) var(--fx-ease,ease) forwards}
@keyframes hezi_07_neon{0%{opacity:0;transform:scale(1.2)}40%{opacity:.85}60%{opacity:.85}100%{opacity:0;transform:scale(1)}}

/* ===== FX 08 书页折叠 (panel) ===== */
body.hezi-fx-08{min-height:100vh;background:var(--bg);transition:background .45s ease}
html.hezi-fx-08{perspective:1500px}
body.hezi-fx-08{min-height:100vh;background:var(--bg);transition:background .45s;transform-style:preserve-3d}
body.hezi-fx-08{animation:hezi_08_foldB var(--fx-dur,.85s) var(--fx-ease,ease) forwards}
@keyframes hezi_08_foldB{0%{transform:scaleX(1) rotateY(0)}50%{transform:scaleX(.04) rotateY(12deg)}100%{transform:scaleX(1) rotateY(0)}}

/* ===== FX 09 卷角 (overlay) ===== */
.hezi-fx-09{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(135deg,transparent 58%,var(--overlay) 58%,var(--overlay) 100%);clip-path:polygon(100% 100%,100% 58%,58% 100%);transform:scale(0);transform-origin:bottom right}
.hezi-fx-09.run{animation:hezi_09_curl var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_09_curl{0%{opacity:0;transform:scale(0)}40%{opacity:.95}60%{opacity:.95}100%{opacity:0;transform:scale(2.6)}}

/* ===== FX 10 分裂揭示 (panel) ===== */
body.hezi-fx-10{min-height:100vh;background:var(--bg);transition:background .45s ease}
body.hezi-fx-10{min-height:100vh;background:var(--bg);transition:background .45s}
body.hezi-fx-10{animation:hezi_10_splR var(--fx-dur,.95s) var(--fx-ease,cubic-bezier(.6,0,.2,1)) forwards}
@keyframes hezi_10_splR{0%{clip-path:inset(0 0 0 0);transform:translateY(0)}45%{clip-path:inset(0 0 50% 0);transform:translateY(-26%)}55%{clip-path:inset(50% 0 0 0);transform:translateY(26%)}100%{clip-path:inset(0 0 0 0);transform:translateY(0)}}

/* ===== FX 11 切片下落 (overlay) ===== */
.hezi-fx-11{position:fixed;inset:0;z-index:99990;pointer-events:none;display:flex;flex-direction:column}
.hezi-fx-11 i{flex:1;background:var(--overlay);opacity:0;transform:translateY(-100%)}
.hezi-fx-11.run i{animation:hezi_11_sliceDrop var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_11_sliceDrop{0%{opacity:0;transform:translateY(-100%)}40%{opacity:.92;transform:translateY(0)}60%{opacity:.92;transform:translateY(0)}100%{opacity:0;transform:translateY(100%)}}

/* ===== FX 12 蜂窝网格 (overlay) ===== */
.hezi-fx-12{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background-color:var(--overlay);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='60'%3E%3Cpath d='M0 0 L60 0 L0 60 Z' fill='%23000'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='60' height='60'%3E%3Cpath d='M0 0 L60 0 L0 60 Z' fill='%23000'/%3E%3C/svg%3E");-webkit-mask-size:54px 54px;mask-size:54px 54px;transform:scale(1.4)}
.hezi-fx-12.run{animation:hezi_12_hexg var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_12_hexg{0%{opacity:0;transform:scale(1.4)}40%{opacity:.92;transform:scale(1)}60%{opacity:.92}100%{opacity:0;transform:scale(1.3)}}

/* ===== FX 13 棋盘翻转 (overlay) ===== */
.hezi-fx-13{position:fixed;inset:0;z-index:99990;pointer-events:none;display:grid;grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(8,1fr);perspective:900px}
.hezi-fx-13 i{background:var(--overlay);opacity:0;transform:rotateY(90deg);transform-origin:center}
.hezi-fx-13.run i{animation:hezi_13_chk var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_13_chk{0%{opacity:0;transform:rotateY(90deg)}40%{opacity:.92;transform:rotateY(0)}60%{opacity:.92;transform:rotateY(0)}100%{opacity:0;transform:rotateY(90deg)}}

/* ===== FX 14 折叠网格 (overlay) ===== */
.hezi-fx-14{position:fixed;inset:0;z-index:99990;pointer-events:none;display:grid;grid-template-columns:repeat(6,1fr);grid-template-rows:repeat(6,1fr)}
.hezi-fx-14 i{background:var(--overlay);opacity:0;transform:scaleY(0)}
.hezi-fx-14.run i{animation:hezi_14_foldg var(--fx-dur,1.1s) var(--fx-ease,ease) forwards}
@keyframes hezi_14_foldg{0%{opacity:0;transform:scaleY(0)}40%{opacity:.92;transform:scaleY(1)}60%{opacity:.92;transform:scaleY(1)}100%{opacity:0;transform:scaleY(0)}}

/* ===== FX 15 折纸 (overlay) ===== */
.hezi-fx-15{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:var(--overlay);clip-path:polygon(0 0,50% 0,50% 50%,0 50%);transform:scale(0);transform-origin:top left}
.hezi-fx-15.run{animation:hezi_15_origami var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_15_origami{0%{opacity:0;clip-path:polygon(0 0,50% 0,50% 50%,0 50%);transform:scale(0)}40%{opacity:.95;clip-path:polygon(0 0,100% 0,100% 50%,0 50%);transform:scale(1)}60%{opacity:.95;clip-path:polygon(0 0,100% 0,100% 100%,0 100%);transform:scale(1)}100%{opacity:0;clip-path:polygon(0 0,100% 0,100% 100%,0 100%);transform:scale(1.3)}}

/* ===== FX 16 折条交替 (overlay) ===== */
.hezi-fx-16{position:fixed;inset:0;z-index:99990;pointer-events:none;display:flex;flex-direction:column}
.hezi-fx-16 i{flex:1;background:var(--overlay);opacity:0;transform:scaleY(0)}
.hezi-fx-16.run i{animation:hezi_16_foldStrip var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_16_foldStrip{0%{opacity:0;transform:scaleY(0)}40%{opacity:.92;transform:scaleY(1)}60%{opacity:.92;transform:scaleY(1)}100%{opacity:0;transform:scaleY(0)}}

/* ===== FX 17 手风琴折叠 (overlay) ===== */
.hezi-fx-17{position:fixed;inset:0;z-index:99990;pointer-events:none;display:flex;perspective:900px}
.hezi-fx-17 i{flex:1;background:var(--overlay);opacity:0;transform:rotateY(90deg);transform-origin:left}
.hezi-fx-17.run i{animation:hezi_17_acc var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_17_acc{0%{opacity:0;transform:rotateY(90deg)}40%{opacity:.92;transform:rotateY(0)}60%{opacity:.92;transform:rotateY(0)}100%{opacity:0;transform:rotateY(-90deg)}}

/* ===== FX 18 3d-翻转 (panel) ===== */
body.hezi-fx-18{min-height:100vh;background:var(--bg);transition:background .45s ease}
html.hezi-fx-18{perspective:1400px}
body.hezi-fx-18{min-height:100vh;background:var(--bg);transition:background .45s;transform-style:preserve-3d}
body.hezi-fx-18{animation:hezi_18_flip3d var(--fx-dur,.85s) var(--fx-ease,cubic-bezier(.6,0,.3,1)) forwards}
@keyframes hezi_18_flip3d{0%{transform:rotateY(0) scaleX(1)}50%{transform:rotateY(90deg) scaleX(.8)}100%{transform:rotateY(0) scaleX(1)}}

/* ===== FX 19 门轴翻转 (panel) ===== */
body.hezi-fx-19{min-height:100vh;background:var(--bg);transition:background .45s ease}
html.hezi-fx-19{perspective:1700px}
body.hezi-fx-19{min-height:100vh;background:var(--bg);transition:background .45s;transform-style:preserve-3d;transform-origin:left center}
body.hezi-fx-19{animation:hezi_19_doorS var(--fx-dur,.9s) var(--fx-ease,ease) forwards}
@keyframes hezi_19_doorS{0%{transform:rotateY(0)}50%{transform:rotateY(88deg)}100%{transform:rotateY(0)}}

/* ===== FX 20 缩放淡入 (panel) ===== */
body.hezi-fx-20{min-height:100vh;background:var(--bg);transition:background .45s ease}
html.hezi-fx-20{perspective:1200px}
body.hezi-fx-20{min-height:100vh;background:var(--bg);transition:background .45s}
body.hezi-fx-20{animation:hezi_20_xfade var(--fx-dur,.95s) var(--fx-ease,ease) forwards}
@keyframes hezi_20_xfade{0%{transform:scale(1);opacity:1;filter:blur(0)}45%{transform:scale(1.18);opacity:.12;filter:blur(7px)}55%{transform:scale(1.18);opacity:.12;filter:blur(7px)}100%{transform:scale(1);opacity:1;filter:blur(0)}}

/* ===== FX 21 模糊揭示 (panel) ===== */
body.hezi-fx-21{min-height:100vh;background:var(--bg);transition:background .45s ease}
body.hezi-fx-21{min-height:100vh;background:var(--bg);transition:background .45s}
body.hezi-fx-21{animation:hezi_21_blurv var(--fx-dur,.95s) var(--fx-ease,ease) forwards}
@keyframes hezi_21_blurv{0%{filter:blur(0) brightness(1)}40%{filter:blur(16px) brightness(.6)}60%{filter:blur(16px) brightness(.6)}100%{filter:blur(0) brightness(1)}}

/* ===== FX 22 变焦模糊 (panel) ===== */
body.hezi-fx-22{min-height:100vh;background:var(--bg);transition:background .45s ease}
body.hezi-fx-22{min-height:100vh;background:var(--bg);transition:background .45s}
body.hezi-fx-22{animation:hezi_22_zblur var(--fx-dur,.95s) var(--fx-ease,ease) forwards}
@keyframes hezi_22_zblur{0%{transform:scale(1);filter:blur(0)}45%{transform:scale(1.32);filter:blur(13px)}55%{transform:scale(1.32);filter:blur(13px)}100%{transform:scale(1);filter:blur(0)}}

/* ===== FX 23 漩涡吸入 (panel) ===== */
body.hezi-fx-23{min-height:100vh;background:var(--bg);transition:background .45s ease}
body.hezi-fx-23{min-height:100vh;background:var(--bg);transition:background .45s;transform-origin:center center}
body.hezi-fx-23{animation:hezi_23_vortex var(--fx-dur,.95s) var(--fx-ease,ease) forwards}
@keyframes hezi_23_vortex{0%{transform:rotate(0) scale(1)}45%{transform:rotate(180deg) scale(.08)}55%{transform:rotate(180deg) scale(.08)}100%{transform:rotate(360deg) scale(1)}}

/* ===== FX 24 脉冲缩放 (overlay) ===== */
.hezi-fx-24{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:var(--overlay);mix-blend-mode:overlay}
.hezi-fx-24.run{animation:hezi_24_pulseO var(--fx-dur,.85s) var(--fx-ease,ease) forwards}
@keyframes hezi_24_pulseS{0%{transform:scale(1)}30%{transform:scale(.9)}55%{transform:scale(1.1)}100%{transform:scale(1)}}
@keyframes hezi_24_pulseO{0%{opacity:0}30%{opacity:.5}55%{opacity:.5}100%{opacity:0}}

/* ===== FX 25 圆形硬擦除 (overlay) ===== */
.hezi-fx-25{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:.96;background:radial-gradient(circle at var(--x,50%) var(--y,50%),var(--overlay) 0%,var(--overlay) 99%);clip-path:circle(0% at var(--x,50%) var(--y,50%))}
.hezi-fx-25.run{animation:hezi_25_circWipe var(--fx-dur,.9s) var(--fx-ease,ease) forwards}
@keyframes hezi_25_circWipe{0%{clip-path:circle(0% at var(--x,50%) var(--y,50%))}100%{clip-path:circle(150% at var(--x,50%) var(--y,50%))}}

/* ===== FX 26 故障位移
   原版 HTML（day-night/26-故障位移.html）：
     body.gl .stage → clip-path:inset 切片 + transform:translate 抖动
     .overlay → 红/青色条不透明度闪（mix-blend-mode:screen）
   当前实现：body.hezi-fx-26 触发切片位移；.hezi-fx-26 overlay 触发色条闪。
   ⚠️ 若重跑 _gen_fx.py 需重新套用 body+overlay 双轨结构。 */
body.hezi-fx-26{animation:hezi_26_glDisp var(--fx-dur,.6s) var(--fx-ease,steps(3)) forwards}
.hezi-fx-26{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(90deg,rgba(255,0,80,.5),transparent 50%,transparent 50%,rgba(0,200,255,.5));mix-blend-mode:screen}
.hezi-fx-26.run{animation:hezi_26_glOv var(--fx-dur,.6s) var(--fx-ease,steps(2)) forwards}
@keyframes hezi_26_glOv{0%{opacity:0}30%{opacity:.9}60%{opacity:.9}100%{opacity:0}}
@keyframes hezi_26_glDisp{0%{clip-path:inset(0 0 0 0);transform:translate(0)}20%{clip-path:inset(8% 0 62% 0);transform:translate(-10px,0)}40%{clip-path:inset(52% 0 18% 0);transform:translate(10px,0)}60%{clip-path:inset(28% 0 42% 0);transform:translate(-7px,0)}80%{clip-path:inset(0 0 0 0);transform:translate(5px,0)}100%{clip-path:inset(0 0 0 0);transform:translate(0)}}

/* ===== FX 27 玻璃折射
   原版 HTML（day-night/27-玻璃折射.html）：
     body.glass .stage → filter:url(#glass) (feTurbulence+feDisplacementMap 真折射) + scale(1.04) translateX(±2%)
     .overlay → 白色高光带不透明度闪（mix-blend-mode:screen）
   SVG 滤镜由 hezi-theme-smoke-fx.js init 时注入到页面 <svg id="hezi-glass-27-svg">，
   因此 body.hezi-fx-27 的 filter:url(#hezi-glass-27) 在任何页面（前端/admin 预览 iframe）都可用。
   ⚠️ 若重跑 _gen_fx.py 需重新套用 body+overlay 双轨结构 + JS SVG 注入。 */
body.hezi-fx-27{filter:url(#hezi-glass-27);animation:hezi_27_glassA var(--fx-dur,.9s) var(--fx-ease,ease) forwards}
.hezi-fx-27{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(120deg,transparent,rgba(255,255,255,.5),transparent);mix-blend-mode:screen}
.hezi-fx-27.run{animation:hezi_27_glassO var(--fx-dur,.9s) var(--fx-ease,ease) forwards}
@keyframes hezi_27_glassO{0%{opacity:0}40%{opacity:.6}60%{opacity:.6}100%{opacity:0}}
@keyframes hezi_27_glassA{0%{transform:scale(1)}45%{transform:scale(1.04) translateX(2%)}55%{transform:scale(1.04) translateX(-2%)}100%{transform:scale(1)}}

/* ===== FX 28 棱锥揭示 (overlay) ===== */
.hezi-fx-28{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:.96;background:var(--overlay);clip-path:polygon(50% 50%,50% 50%,50% 50%,50% 50%,50% 50%)}
.hezi-fx-28.run{animation:hezi_28_pyramid var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_28_pyramid{0%{clip-path:polygon(50% 50%,50% 50%,50% 50%,50% 50%,50% 50%)}50%{clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%,50% 0)}100%{clip-path:polygon(50% -70%,170% 50%,50% 170%,-70% 50%,50% -70%)}}

/* ===== FX 29 声波 (overlay) ===== */
.hezi-fx-29{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:repeating-radial-gradient(circle at 50% 50%,var(--overlay) 0,var(--overlay) 3px,transparent 3px,transparent 16px);transform:scale(.4)}
.hezi-fx-29.run{animation:hezi_29_sound var(--fx-dur,1s) var(--fx-ease,ease) forwards}
@keyframes hezi_29_sound{0%{opacity:0;transform:scale(.4)}40%{opacity:.9}60%{opacity:.9}100%{opacity:0;transform:scale(2.4)}}

/* ===== FX 30 半调网点 (overlay) ===== */
.hezi-fx-30{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:radial-gradient(circle,var(--overlay) 2.5px,transparent 3px);background-size:12px 12px;transform:scale(.6)}
.hezi-fx-30.run{animation:hezi_30_halftone var(--fx-dur,.9s) var(--fx-ease,ease) forwards}
@keyframes hezi_30_halftone{0%{opacity:0;transform:scale(.6)}40%{opacity:.95;transform:scale(1)}60%{opacity:.95;transform:scale(1)}100%{opacity:0;transform:scale(1.5)}}

/* ===== FX 31 噪点溶解 (overlay) ===== */
.hezi-fx-31{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"),var(--overlay);background-size:220px 220px,cover}
.hezi-fx-31.run{animation:hezi_31_noise var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_31_noise{0%{opacity:0}40%{opacity:.9}60%{opacity:.9}100%{opacity:0}}

/* ===== FX 32 碎片裂开 (canvas) ===== */
.hezi-fx-32{position:fixed;inset:0;z-index:99990;pointer-events:none}

/* ===== FX 33 晶体 (canvas) ===== */
.hezi-fx-33{position:fixed;inset:0;z-index:99990;pointer-events:none}

/* ===== FX 34 云雾飘移 (overlay) ===== */
.hezi-fx-34{position:fixed;inset:-20%;z-index:99990;pointer-events:none;opacity:0;background:radial-gradient(circle at 20% 70%,var(--overlay) 0%,transparent 40%),radial-gradient(circle at 80% 30%,var(--overlay) 0%,transparent 40%);filter:blur(50px);transform:translate(-15%,10%)}
.hezi-fx-34.run{animation:hezi_34_cloudDrift var(--fx-dur,1.2s) var(--fx-ease,ease) forwards}
@keyframes hezi_34_cloudDrift{0%{opacity:0;transform:translate(-15%,10%)}40%{opacity:.9}60%{opacity:.9}100%{opacity:0;transform:translate(15%,-10%)}}

/* ===== FX 35 极光漫染 (overlay) ===== */
.hezi-fx-35{position:fixed;inset:-30%;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(120deg,rgba(79,209,255,.75),rgba(167,139,250,.75),rgba(52,211,153,.75),rgba(240,171,252,.75));filter:blur(50px);mix-blend-mode:screen;transform:translateY(30%) rotate(-4deg)}
.hezi-fx-35.run{animation:hezi_35_aurora var(--fx-dur,1.1s) var(--fx-ease,ease) forwards}
@keyframes hezi_35_aurora{0%{opacity:0;transform:translateY(30%) rotate(-4deg)}40%{opacity:.95}60%{opacity:.95}100%{opacity:0;transform:translateY(-30%) rotate(4deg)}}

/* ===== FX 36 色彩过场 (overlay) ===== */
.hezi-fx-36{position:fixed;inset:0;z-index:99990;pointer-events:none;opacity:0;background:var(--overlay)}
.hezi-fx-36.run{animation:hezi_36_fadeColor var(--fx-dur,.8s) var(--fx-ease,ease) forwards}
@keyframes hezi_36_fadeColor{0%{opacity:0}40%{opacity:.96}60%{opacity:.96}100%{opacity:0}}

/* ===== FX 37 浓雾 (overlay) ===== */
.hezi-fx-37{position:fixed;inset:-20%;z-index:99990;pointer-events:none;opacity:0;background:radial-gradient(circle at 30% 60%,#fff 0%,transparent 45%),radial-gradient(circle at 70% 40%,#fff 0%,transparent 45%),radial-gradient(circle at 50% 75%,#dcdcdc 0%,transparent 50%);filter:blur(38px);mix-blend-mode:screen;transform:translate(-20%,10%)}
.hezi-fx-37.run{animation:hezi_37_fogbank var(--fx-dur,1.2s) var(--fx-ease,ease) forwards}
@keyframes hezi_37_fogbank{0%{opacity:0;transform:translate(-20%,10%)}40%{opacity:.92}60%{opacity:.92}100%{opacity:0;transform:translate(20%,-10%)}}

/* ===== FX 38 色彩流动 (overlay) ===== */
.hezi-fx-38{position:fixed;inset:-30%;z-index:99990;pointer-events:none;opacity:0;background:linear-gradient(90deg,rgba(255,120,80,.7),rgba(120,160,255,.7),rgba(120,255,200,.7),rgba(255,120,220,.7),rgba(255,200,120,.7));background-size:300% 100%;filter:blur(40px);mix-blend-mode:screen;transform:translateY(20%)}
.hezi-fx-38.run{animation:hezi_38_flow var(--fx-dur,1.2s) var(--fx-ease,ease) forwards}
@keyframes hezi_38_flow{0%{opacity:0;background-position:0% 0;transform:translateY(20%)}40%{opacity:.95}60%{opacity:.95}100%{opacity:0;background-position:100% 0;transform:translateY(-20%)}}

/* ===== FX 39 星云 (overlay) ===== */
.hezi-fx-39{position:fixed;inset:-30%;z-index:99990;pointer-events:none;opacity:0;background:radial-gradient(circle at 30% 40%,rgba(140,90,255,.7),transparent 40%),radial-gradient(circle at 70% 60%,rgba(80,140,255,.7),transparent 45%),radial-gradient(circle at 50% 50%,rgba(255,120,200,.6),transparent 40%);filter:blur(45px);mix-blend-mode:screen;transform:translate(10%,-10%) rotate(0)}
.hezi-fx-39.run{animation:hezi_39_nebula var(--fx-dur,1.2s) var(--fx-ease,ease) forwards}
@keyframes hezi_39_nebula{0%{opacity:0;transform:translate(10%,-10%) rotate(0) scale(.8)}40%{opacity:.95}60%{opacity:.95}100%{opacity:0;transform:translate(-10%,10%) rotate(40deg) scale(1.2)}}