/*!
 * 作者: 陈涛 (Alan Chen) <1315333@qq.com>
 * 02 幕「中国的一天」样式（design-v2.md §二十四.2 契约）。
 *
 * 纪律（改这个文件前先读）：
 *  ① **每一条选择器都以 .act02 开头**。这一幕的 DOM 与另外五幕并排住在同一个
 *     .stage 里，少写一次作用域就是别人的元素被我改掉。
 *  ② **没有 position:fixed**（§二十四.2）；舞台自己是 sticky，里面再 fixed 会脱出舞台。
 *  ③ **没有 backdrop-filter**（§十五.2 全页只留顶栏与手机壳两处，都不在这一幕）。
 *     玻璃卡带用预烘半透明白 + 2% 噪声（--noise，页面已备），逐帧零成本。
 *  ④ 色只用页面 :root 那十条。样机里的 --sky/--jade/--morning 在正片里分别叫
 *     --glow/--teal/--sky —— 同一个色两个名字，写错不会报错只会「看起来也挺好看」。
 *  ⑤ 逐帧只会被改到的属性：transform / opacity / filter / stroke-dashoffset。
 *     宽高与 left/top 只由 act02.js 的 build() 写一次。
 */

/* ── 幕根：铺满舞台，自己不接指针（可交互的元素单独放开）。
      z-index 不写 —— 由页面的 #layers 决定这一幕在哪一层（§层序 = DOM 序）。 ── */
.act02{position:absolute;inset:0;pointer-events:none;
  font-family:var(--sans);font-weight:300;color:var(--body)}
.act02 .a02-layer{position:absolute;inset:0}
.act02 img{display:block;width:100%;height:100%;object-fit:cover}
.act02 .a02-pic,.act02 .a02-pic picture{display:block;width:100%;height:100%}

/* 亮背景上文字的保命光晕：不压黑，改成把字周围提亮（§十二.2.1「照片上绝不压黑」） */
.act02{--a02-lift:0 1px 2px rgba(255,255,255,.95),0 0 18px rgba(255,255,255,.85),0 0 46px rgba(255,255,255,.6)}

/* ══ 背景栈 ══════════════════════════════════════════════════════
   contain:paint 按 §十五.2；**不写 will-change** —— 满幅照片提层是显存杀手，
   而 opacity/transform 动画浏览器本来就会临时提层（页面 .shot-bg 同一条注释）。 */
.act02 .a02-bg{contain:paint}
.act02 .a02-plate{position:absolute;inset:0;opacity:0}
.act02 .a02-c2{position:absolute;inset:0}
.act02 .a02-band{position:absolute;inset:0}
.act02 .a02-band img{object-position:41% 61%}     /* = C2 的 focus，太阳落点算式与它一致 */
/* 三段裁切：天空 / 城市 / 水面。中间两段上下各留一段渐隐，接缝看不出来 */
.act02 .a02-b-sky{clip-path:inset(0 0 52% 0)}
.act02 .a02-b-city{clip-path:inset(44% 0 30% 0);
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 16%,#000 84%,transparent 100%);
          mask-image:linear-gradient(180deg,transparent 0,#000 16%,#000 84%,transparent 100%)}
.act02 .a02-b-water{clip-path:inset(66% 0 0 0);
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 13%,#000 100%);
          mask-image:linear-gradient(180deg,transparent 0,#000 13%,#000 100%)}

.act02 .a02-mist{position:absolute;left:-30%;width:160%;height:36%;opacity:0;
  background-repeat:no-repeat;background-size:100% 100%;mix-blend-mode:screen;pointer-events:none}
.act02 #a02-mist1{top:43%;background-image:url(../assets/clouds/wisp-2.png)}
.act02 #a02-mist2{top:56%;background-image:url(../assets/clouds/wisp-4.png)}

/* 体积光：以太阳为心的锥束，只旋转。盒子由 JS 放到太阳落点上 */
.act02 #a02-rays{position:absolute;width:1400px;height:1400px;margin:-700px 0 0 -700px;opacity:0;
  mix-blend-mode:screen;pointer-events:none;
  background:repeating-conic-gradient(from 0deg,
    rgba(255,232,196,.30) 0deg 2.6deg, rgba(255,232,196,0) 2.6deg 13deg);
  -webkit-mask-image:radial-gradient(circle,rgba(0,0,0,.5) 3%,rgba(0,0,0,.42) 22%,transparent 58%);
          mask-image:radial-gradient(circle,rgba(0,0,0,.5) 3%,rgba(0,0,0,.42) 22%,transparent 58%)}

.act02 .a02-veil{position:absolute;inset:0;pointer-events:none;opacity:0}
/* 晨昏纱：01 幕交过来时画面还是黎明前，随「这一天真的开始了」抬走 */
.act02 #a02-dawn{opacity:1;
  background:linear-gradient(180deg,rgba(15,31,61,.60),rgba(15,31,61,.34) 55%,rgba(15,31,61,.50))}
.act02 #a02-cool{background:linear-gradient(180deg,rgba(234,243,255,.42),rgba(29,78,216,.14))}
.act02 #a02-calm{background:linear-gradient(180deg,rgba(251,248,243,.6),rgba(234,243,255,.42))}
/* 底部提亮：底下那条线与卡带要能看清，靠「提亮」而不是压黑 */
.act02 #a02-floor{background:linear-gradient(0deg,rgba(255,255,255,.72),rgba(255,255,255,.34) 16%,transparent 34%)}
.act02 #a02-wash{background:linear-gradient(90deg,rgba(255,255,255,.9),rgba(255,255,255,.56) 23%,rgba(255,255,255,.14) 40%,transparent 50%)}
.act02 #a02-flash{background:radial-gradient(120% 100% at 50% 46%,#fff,rgba(255,251,244,.88) 55%,rgba(251,248,243,.7))}
.act02 #a02-vig{opacity:1;
  background:radial-gradient(122% 92% at 50% 44%,transparent 48%,rgba(15,31,61,.18))}

/* ══ 时刻节点 ════════════════════════════════════════════════════ */
.act02 .a02-node{position:absolute;width:15px;height:15px;margin:-7.5px 0 0 -7.5px;border-radius:50%;
  background:#fff;border:2.5px solid var(--glow);opacity:0;
  box-shadow:0 2px 10px rgba(15,31,61,.18)}
.act02 .a02-node.done{border-color:var(--teal)}
.act02 .a02-ring{position:absolute;width:15px;height:15px;margin:-7.5px 0 0 -7.5px;border-radius:50%;
  border:1.5px solid var(--glow);opacity:0;pointer-events:none}
.act02 .a02-tlabel{position:absolute;opacity:0;white-space:nowrap;transform-origin:0 50%}
.act02 .a02-tlabel b{display:block;font-family:var(--serif);font-weight:400;
  font-size:31px;letter-spacing:.01em;color:var(--ink);line-height:1;text-shadow:var(--a02-lift)}
.act02 .a02-tlabel span{display:block;margin-top:4px;font-size:10.5px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--body);text-shadow:var(--a02-lift)}

/* ══ 四枚缩略图（混乱 → 磁吸到时刻点 → 收进玻璃卡带）══════════════ */
.act02 #a02-chips{pointer-events:none}
.act02 .a02-chip{position:absolute;left:0;top:0;width:132px;height:86px;margin:-43px 0 0 -66px;
  perspective:820px;opacity:0;pointer-events:auto}
.act02 .a02-flip{position:relative;width:100%;height:100%;transform-style:preserve-3d}
.act02 .a02-face{position:absolute;inset:0;border-radius:12px;overflow:hidden;
  backface-visibility:hidden;-webkit-backface-visibility:hidden;
  border:1px solid rgba(255,255,255,.7);box-shadow:0 12px 30px rgba(15,31,61,.26)}
.act02 .a02-back{transform:rotateY(180deg);display:grid;place-items:center;
  background:linear-gradient(155deg,rgba(243,248,254,.94),rgba(214,230,250,.94))}
.act02 .a02-back::after{content:"";position:absolute;inset:6px;border-radius:8px;
  border:1px dashed rgba(15,31,61,.16)}
.act02 .a02-back i{position:relative;font-style:normal;font-size:13px;letter-spacing:.18em;
  color:rgba(15,31,61,.4)}
/* 第四枚是「报告」，不是照片：一张迷你报告 */
.act02 .a02-minirep{background:#fff;padding:13px 12px}
.act02 .a02-minirep s{display:block;text-decoration:none;height:8px;width:56%;border-radius:4px;
  background:rgba(15,31,61,.32);margin-bottom:9px}
.act02 .a02-minirep u{display:block;text-decoration:none;height:6px;border-radius:3px;margin-bottom:7px;
  background:rgba(15,31,61,.13)}
.act02 .a02-minirep u.ok{background:color-mix(in srgb,var(--teal) 50%,transparent);width:62%}
.act02 .a02-glow{position:absolute;inset:-18px;border-radius:22px;opacity:0;pointer-events:none;
  background:radial-gradient(circle,color-mix(in srgb,var(--glow) 55%,transparent),transparent 70%)}

/* 玻璃卡带：§十五.2 的「预烘半透明白 + 2% 噪声」，不是 backdrop-filter */
.act02 #a02-strip{position:absolute;left:0;top:0;opacity:0;padding:13px;border-radius:22px;
  background:var(--glass);border:1px solid var(--glass-line);box-shadow:var(--glass-shadow)}
.act02 #a02-strip::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background-image:var(--noise);opacity:.5;mix-blend-mode:multiply}
.act02 .a02-slots{display:flex;gap:12px;align-items:flex-start}
.act02 .a02-slot{flex:none}
.act02 .a02-hole{display:block;width:132px;height:86px;border-radius:12px;text-decoration:none;
  background:rgba(15,31,61,.05);border:1px dashed rgba(15,31,61,.12)}
/* 时刻长在槽下面：缩略图落进槽里，它说的就是这一格是哪一刻 */
.act02 .a02-slot i{display:block;margin-top:9px;font-style:normal;
  font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--body);white-space:nowrap}
.act02 #a02-strip .a02-cap{margin:2px 3px 11px;font-size:10.5px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--muted)}

/* ══ 揭示卡 ══════════════════════════════════════════════════════ */
.act02 .a02-shot{position:absolute;left:0;top:0;opacity:0;border-radius:24px;overflow:hidden;
  background:var(--sky-veil);border:1px solid rgba(255,255,255,.75);
  box-shadow:0 40px 110px rgba(15,31,61,.3);contain:paint}
.act02 .a02-frame{position:absolute;inset:0;overflow:hidden}
.act02 .a02-edge{position:absolute;inset:0;z-index:4;pointer-events:none;border-radius:24px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.7),inset 0 0 0 1px rgba(15,31,61,.05)}
/* 09:00 叶片快门 */
.act02 .a02-blade{position:absolute;left:0;width:100%;height:50.6%;z-index:3;
  background:linear-gradient(180deg,var(--ivory-lift),var(--sky-02))}
.act02 .a02-blade.t{top:0;box-shadow:0 2px 0 rgba(255,255,255,.9),0 10px 26px rgba(15,31,61,.14)}
.act02 .a02-blade.b{bottom:0;box-shadow:0 -2px 0 rgba(255,255,255,.9),0 -10px 26px rgba(15,31,61,.14)}
.act02 .a02-seam{position:absolute;left:0;width:100%;height:1.6px;background:var(--glow);
  box-shadow:0 0 16px 4px color-mix(in srgb,var(--glow) 75%,transparent)}
.act02 .a02-blade.t .a02-seam{bottom:0}
.act02 .a02-blade.b .a02-seam{top:0}
/* 10:00 圆形光圈：圆窗放大、画面反向缩小 → 世界固定、窗口打开（纯 transform） */
.act02 .a02-iris{position:absolute;inset:0;display:grid;place-items:center;z-index:3;overflow:hidden}
.act02 .a02-aperture{width:152%;aspect-ratio:1/1;border-radius:50%;overflow:hidden;transform:scale(.02);
  box-shadow:0 0 0 2px color-mix(in srgb,var(--glow) 60%,transparent),
             0 0 70px 12px color-mix(in srgb,var(--glow) 30%,transparent)}
.act02 .a02-inner{position:absolute;inset:0}
.act02 .a02-irisbg{position:absolute;inset:0;z-index:2;
  background:linear-gradient(160deg,var(--sky-veil),color-mix(in srgb,var(--sky) 60%,var(--muted)))}

/* ══ 左文字列 ════════════════════════════════════════════════════ */
.act02 .a02-col{pointer-events:none}
.act02 #a02-kicker{position:absolute;left:0;top:0;opacity:0;font-size:11.5px;letter-spacing:.3em;
  text-transform:uppercase;color:var(--ink);text-shadow:var(--a02-lift)}
.act02 #a02-kicker s{text-decoration:none;color:var(--coral)}
.act02 .a02-cap-blk{position:absolute;left:0;top:0;opacity:0}
.act02 .a02-cap-blk b{display:block;font-family:var(--serif);font-weight:400;
  font-size:44px;line-height:1.08;color:var(--ink);text-shadow:var(--a02-lift)}
.act02 .a02-cap-blk p{margin:14px 0 0;font-size:15px;line-height:1.55;color:var(--body);
  text-shadow:var(--a02-lift);max-width:24ch}
.act02 .a02-cap-blk em{display:block;margin-top:14px;font-style:normal;font-size:10.5px;
  letter-spacing:.22em;text-transform:uppercase;color:var(--teal);text-shadow:var(--a02-lift)}
.act02 #a02-headline{position:absolute;left:0;top:0;opacity:0}
.act02 #a02-headline b{display:block;font-family:var(--serif);font-weight:400;
  font-size:68px;line-height:1.0;color:var(--ink);text-shadow:var(--a02-lift)}
.act02 #a02-headline em{display:block;font-family:var(--serif);font-style:italic;
  font-size:68px;line-height:1.06;color:var(--brand);text-shadow:var(--a02-lift)}
.act02 #a02-headline p{margin:18px 0 0;font-size:14.5px;line-height:1.6;color:var(--body);
  text-shadow:var(--a02-lift);max-width:32ch}

/* ══ 报告卡 ══════════════════════════════════════════════════════ */
.act02 #a02-report{position:absolute;left:0;top:0;opacity:0;width:430px;padding:26px 26px 22px;
  border-radius:20px;background:rgba(255,255,255,.94);border:1px solid var(--glass-line);
  box-shadow:0 34px 80px rgba(15,31,61,.2);transform-style:preserve-3d;overflow:hidden}
.act02 .a02-rh{display:flex;justify-content:space-between;align-items:baseline;opacity:0}
.act02 .a02-rh b{font-family:var(--serif);font-weight:400;font-size:22px;color:var(--ink)}
.act02 .a02-rh em{font-style:normal;font-size:10px;letter-spacing:.18em;color:var(--muted)}
.act02 .a02-rule{height:1px;background:var(--glass-line);margin:14px 0 16px;
  transform-origin:0 50%;transform:scaleX(0)}
.act02 .a02-row{display:flex;align-items:center;gap:12px;margin-bottom:11px;opacity:0}
.act02 .a02-row i{font-style:normal;font-size:9.5px;letter-spacing:.16em;color:var(--muted);
  width:80px;flex:none}
.act02 .a02-row u{text-decoration:none;height:9px;border-radius:5px;flex:1;
  background:linear-gradient(90deg,rgba(15,31,61,.14),rgba(15,31,61,.07))}
.act02 .a02-row.ok u{background:linear-gradient(90deg,
  color-mix(in srgb,var(--teal) 42%,transparent),color-mix(in srgb,var(--teal) 14%,transparent))}
.act02 .a02-spark{display:block;margin:14px 0 16px;width:100%}
.act02 .a02-spark path{fill:none;stroke:var(--brand);stroke-width:2;stroke-linecap:round}
.act02 .a02-okchip{display:inline-flex;align-items:center;gap:8px;padding:7px 13px;border-radius:999px;
  background:color-mix(in srgb,var(--teal) 12%,transparent);color:var(--teal);
  font-size:10.5px;letter-spacing:.16em;opacity:0}
.act02 .a02-okchip s{text-decoration:none;width:15px;height:15px;border-radius:50%;
  background:var(--teal);color:#fff;display:grid;place-items:center;font-size:9px}
.act02 .a02-sweep{position:absolute;top:-20%;left:0;width:34%;height:140%;pointer-events:none;
  transform:translateX(-140%) skewX(-14deg);opacity:0;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.9),transparent)}

/* ══ 搬进共享手机②屏内的两块。位置由 .app 的既有内边距决定，这里只管排版。
      **它们是 02 幕的内容，不是第二台手机**（§二十四.2「不许自建手机」）。
      这两块会被 mount() 搬出 .act02 子树（进 shared.phone.screen），所以它们自己
      带一个 .act02 类 —— 作用域规则「每条选择器都含 .act02」照样成立，而不是
      在这儿开一个不带作用域的口子。 ══ */
.act02.a02-pslot{position:absolute;inset:0;padding:44px 14px 16px;opacity:0;pointer-events:none}
.act02#a02-ptoday .a02-pt{font-family:var(--serif);font-size:17px;color:var(--ink);line-height:1.1}
.act02#a02-ptoday .a02-pd{font-size:8.5px;letter-spacing:.16em;color:var(--muted);margin-top:4px}
.act02#a02-ptoday .a02-pl{display:flex;align-items:center;gap:7px;margin-top:13px;
  font-size:10.5px;color:var(--muted);font-family:var(--sans)}
.act02#a02-ptoday .a02-pl.done{color:var(--body)}
.act02#a02-ptoday .a02-pl s{text-decoration:none;width:15px;height:15px;border-radius:50%;flex:none;
  background:rgba(15,31,61,.07);color:var(--muted);display:grid;place-items:center;font-size:8px}
.act02#a02-ptoday .a02-pl.done s{background:color-mix(in srgb,var(--teal) 16%,transparent);color:var(--teal)}
.act02#a02-pflash{padding:0;background:radial-gradient(120% 90% at 50% 40%,#fff,rgba(255,255,255,.92))}

/* ══ 桌面 / 手机互斥的两套（.is-mobile 由 act02.js 在 mount 时按 isMobile 打上）══
   媒体查询是**同一条规则的第一帧版本**：mount 之前 class 还没上身，lazy 图片
   可能已经开始排队。两条一起，桌面那份在手机上一次都不会被下载。 */
.act02.is-mobile .a02-dskonly,
.act02:not(.is-mobile) .a02-mobonly{display:none}
@media (max-width:900px){ .act02 .a02-dskonly{display:none} }
@media (min-width:901px){ .act02 .a02-mobonly{display:none} }

/* ══ 手机端（§十六 竖向三槽 / §二十 一主一次一辅）══════════════════
   顶槽 title：顶栏之下到 26vh；中槽 media：26–70vh；底槽 text：70–92vh。
   这一幕的三槽分配：主句在顶槽、满幅照片＋手机②在中槽、说明一行在底槽。
   卡带、竖轨、缩略图、时刻标签在手机端**整块不出现**：§二十.4「同一屏最多一张卡」，
   这一屏的那一张是手机②；四个时刻已经轮流当过主句，再摆一次就是同一件事说两遍。 */
.act02.is-mobile #a02-mtitle{position:absolute;left:6vw;width:88vw;margin:0;opacity:0;
  font-family:var(--serif);font-weight:400;font-size:44px;line-height:1.05;
  letter-spacing:-.01em;color:var(--paper);text-shadow:0 1px 26px rgba(15,31,61,.5)}
.act02.is-mobile #a02-mcap{position:absolute;left:6vw;width:88vw;margin:0;opacity:0;
  font-size:17px;line-height:1.5;color:var(--paper);text-shadow:0 1px 18px rgba(15,31,61,.6)}
/* 手机上主句压在满幅照片上：顶槽一段暗色 scrim（§二十.1），文字用 --paper。
   桌面那条白渐变（#a02-wash）在手机上换成上下两段暗底，不然亮照片上白字读不出来。 */
.act02.is-mobile #a02-wash{background:linear-gradient(180deg,
  rgba(15,31,61,.52),rgba(15,31,61,.26) 26%,rgba(15,31,61,0) 46%,
  rgba(15,31,61,0) 62%,rgba(15,31,61,.30) 82%,rgba(15,31,61,.50))}
.act02.is-mobile #a02-rays{width:820px;height:820px;margin:-410px 0 0 -410px}
.act02.is-mobile #a02-report{width:min(268px,72vw);padding:18px 18px 15px}
.act02.is-mobile .a02-rh b{font-size:17px}
.act02.is-mobile .a02-row i{width:62px;font-size:8.5px}
.act02.is-mobile .a02-row u{height:8px}
.act02.is-mobile .a02-okchip{font-size:9px;padding:6px 10px}
@media (max-width:900px){
  .act02#a02-ptoday{padding:34px 11px 10px}
  .act02#a02-ptoday .a02-pt{font-size:14px}
  .act02#a02-ptoday .a02-pd{font-size:7.5px}
  .act02#a02-ptoday .a02-pl{margin-top:9px;font-size:9px}
  .act02#a02-ptoday .a02-pl s{width:13px;height:13px;font-size:7px}
}

/* ══ 退化流：prefers-reduced-motion / 无 GSAP → 静态可读（§十五.1.8）══
   一套 DOM 两种读法：动效模式下三处位置绝对定位、只换内容；静态模式下它们
   回到正常文档流，一个时刻就是一段「时刻 + 句子 + 画面」。不写两份内容。 */
.act02.is-static{position:relative;inset:auto;pointer-events:auto;
  max-width:1000px;margin:0 auto;padding:56px 22px 64px}
.act02.is-static .a02-bg,.act02.is-static #a02-marks,.act02.is-static #a02-chips,
.act02.is-static #a02-strip,.act02.is-static .a02-blade,.act02.is-static .a02-irisbg,
.act02.is-static .a02-sweep,.act02.is-static #a02-rays{display:none}
.act02.is-static .a02-layer,.act02.is-static .a02-col{position:static;inset:auto}
.act02.is-static #a02-kicker,.act02.is-static .a02-cap-blk,.act02.is-static #a02-headline,
.act02.is-static .a02-tlabel,.act02.is-static #a02-mtitle,.act02.is-static #a02-mcap{
  position:static;opacity:1;width:auto;transform:none;text-shadow:none}
.act02.is-static #a02-labels{display:flex;flex-wrap:wrap;gap:18px;margin:0 0 18px}
.act02.is-static .a02-tlabel{white-space:nowrap}
.act02.is-static #a02-kicker{margin-bottom:24px}
.act02.is-static .a02-cap-blk{margin:0 0 26px}
.act02.is-static .a02-cap-blk b{font-size:30px}
.act02.is-static .a02-shot{position:static;opacity:1;width:auto;height:auto;
  aspect-ratio:16/9;transform:none;margin:0 0 26px;box-shadow:var(--glass-shadow)}
.act02.is-static .a02-frame,.act02.is-static .a02-iris{position:relative;inset:auto;height:100%;display:block}
.act02.is-static .a02-aperture{width:100%;height:100%;aspect-ratio:auto;border-radius:0;
  transform:none;box-shadow:none}
.act02.is-static .a02-inner{position:relative;inset:auto;height:100%}
/* 报告卡的行、分隔线、核验章在动效里是从 0 长出来的，静态流要给它们复原 */
.act02.is-static #a02-report{position:static;opacity:1;transform:none;margin:0 0 8px;
  width:min(430px,100%)}
.act02.is-static .a02-rh,.act02.is-static .a02-row,.act02.is-static .a02-okchip{opacity:1;transform:none}
.act02.is-static .a02-rule{transform:scaleX(1)}
.act02.is-static .a02-spark path{stroke-dasharray:none;stroke-dashoffset:0}
.act02.is-static #a02-headline{margin-top:14px}
.act02.is-static #a02-mtitle,.act02.is-static #a02-mcap{color:var(--ink)}
