/* 全局吊灯组件 v3（2D 页）：SVG 灯体 + 双层光锥 + 尘埃微粒 + 点亮/余烬曲线 + 拉绳次级摆动。
   结构由 js/lamp.js 注入；rig 以吊点为轴旋转，光效随摆动一起转。 */

.dw-lamp {
  position: fixed;
  inset: 0 auto auto 0;
  z-index: 56;               /* 压内容(≤2)，让出 HUD/rail(≥50→60) 与光标(997+) */
  pointer-events: none;
  width: 0;
  height: 0;
}

/* 收起/拉下动画层（竖向）；摆动在内层 rig */
.dw-lamp__drop {
  position: fixed;
  top: -4px;
  left: 0;
  width: 0;
  height: 0;
  transform: translate3d(0, var(--dw-drop, 0px), 0);
  transition: transform 0.72s cubic-bezier(0.3, 1.35, 0.45, 1);
}

.dw-lamp__rig {
  position: absolute;
  top: 0;
  left: 0;
  width: 0;
  height: 0;
  transform-origin: 0 0;
  will-change: transform;
}

/* 天花板吸座：拉丝小圆台 */
.dw-lamp__cap {
  position: absolute;
  top: 0;
  left: -9px;
  width: 18px;
  height: 6px;
  border-radius: 0 0 8px 8px;
  background: linear-gradient(#332e25, #1b1812);
  box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.05);
}

/* 吊绳：细编织纹 */
.dw-lamp__cord {
  position: absolute;
  top: 0;
  left: -1px;
  width: 2px;
  height: var(--dw-cord, 108px);
  background:
    repeating-linear-gradient(
      176deg,
      #3e3930 0 3px,
      #2a2620 3px 6px
    );
  box-shadow: 1px 0 0 rgba(0, 0, 0, 0.35);
}

.dw-lamp__fix {
  position: absolute;
  top: var(--dw-cord, 108px);
  left: 0;
  width: 0;
  height: 0;
  pointer-events: auto;
  cursor: grab;
}
.dw-lamp__fix:active { cursor: grabbing; }
.dw-lamp__fix:focus-visible { outline: none; }
.dw-lamp__fix:focus-visible .dw-lamp__shade {
  filter: drop-shadow(0 0 3px rgba(255, 42, 42, 0.8));
}

/* 灯体 SVG：穹顶曲线 + 铜圈罩口 + 接线收口 */
.dw-lamp__shade {
  position: absolute;
  top: -2px;
  left: -62px;
  width: 124px;
  height: 62px;
  display: block;
  filter: drop-shadow(0 5px 10px rgba(0, 0, 0, 0.45));
  transition: filter 0.3s ease;
}

/* 灯泡 */
.dw-lamp__bulb {
  position: absolute;
  top: 44px;
  left: -8px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: #37322a;
  box-shadow: inset 0 -2px 3px rgba(0, 0, 0, 0.4);
  /* 关灯：余烬——玻璃壳先暗、辉光拖后腿慢慢熄 */
  transition: background 0.9s ease 0.05s, box-shadow 0.7s ease;
}

/* 拉绳（开关灯）：JS 会附加次级摆动 rotate */
.dw-lamp__pull {
  position: absolute;
  top: 46px;
  left: 40px;
  width: 14px;
  height: 60px;
  pointer-events: auto;
  cursor: pointer;
  transform-origin: 7px 0;
}
.dw-lamp__pull::before {
  content: '';
  position: absolute;
  top: 0;
  left: 6px;
  width: 1.5px;
  height: 44px;
  background: linear-gradient(#4a443a, #211d15);
  transition: height 0.16s ease;
}
.dw-lamp__pull i {
  position: absolute;
  top: 44px;
  left: 2.5px;
  width: 8px;
  height: 10px;
  border-radius: 4px / 5px;
  background: linear-gradient(160deg, #7d7059 20%, #4e4536 80%);
  box-shadow: inset 0 -1px 2px rgba(0, 0, 0, 0.5);
  transition: background 0.3s ease, transform 0.16s ease;
}
/* 点按拉绳：绳被拽长、坠子下坠再弹回 */
.dw-lamp__pull.is-tug::before { height: 51px; }
.dw-lamp__pull.is-tug i { transform: translateY(7px); }

/* ── 光 ── */

/* 柔散层：宽锥（切边梯形 + 线性衰减，束感明确）——定稿参数，不再调整 */
.dw-lamp__beam {
  position: absolute;
  top: calc(var(--dw-cord, 108px) + 46px);
  left: -230px;
  width: 460px;
  height: var(--dw-beam-h, 56vh);
  clip-path: polygon(36% 0, 64% 0, 100% 100%, 0 100%);
  background: linear-gradient(
    to bottom,
    rgba(255, 192, 112, 0.13) 0%,
    rgba(255, 184, 100, 0.06) 46%,
    rgba(255, 176, 92, 0) 88%
  );
  mix-blend-mode: screen;
  filter: blur(16px);
  opacity: 0;
  transition: opacity 0.4s ease;
}

/* 亮芯层：窄锥，靠近灯口更暖 */
.dw-lamp__beam--core {
  position: absolute;
  top: calc(var(--dw-cord, 108px) + 46px);
  left: -230px;
  width: 460px;
  height: calc(var(--dw-beam-h, 56vh) * 0.86);
  clip-path: polygon(44% 0, 56% 0, 86% 100%, 14% 100%);
  background: linear-gradient(
    to bottom,
    rgba(255, 206, 130, 0.20) 0%,
    rgba(255, 190, 108, 0.08) 52%,
    rgba(255, 180, 96, 0) 90%
  );
  mix-blend-mode: screen;
  filter: blur(9px);
  opacity: 0;
  transition: opacity 0.4s ease;
}

/* 光池 */
.dw-lamp__pool {
  position: absolute;
  top: var(--dw-pool-t, 62vh);
  left: -300px;
  width: 600px;
  height: 230px;
  border-radius: 50%;
  background: radial-gradient(
    closest-side,
    rgba(255, 190, 108, 0.14) 0%,
    rgba(255, 182, 98, 0.055) 55%,
    rgba(255, 176, 92, 0) 100%
  );
  mix-blend-mode: screen;
  filter: blur(10px);
  opacity: 0;
  transition: opacity 0.4s ease;
}

/* 尘埃微粒：只在光锥里、开灯时缓慢漂浮 */
.dw-lamp__motes {
  position: absolute;
  top: calc(var(--dw-cord, 108px) + 46px);
  left: -230px;
  width: 460px;
  height: calc(var(--dw-beam-h, 56vh) * 0.9);
  clip-path: polygon(38% 0, 62% 0, 96% 100%, 4% 100%);
  opacity: 0;
  transition: opacity 0.8s ease 0.2s;
  mix-blend-mode: screen;
}
.dw-lamp__motes i {
  position: absolute;
  width: 3px;
  height: 3px;
  border-radius: 50%;
  background: rgba(255, 214, 150, 0.55);
  filter: blur(1px);
  animation: dwMote 13s linear infinite;
  animation-play-state: paused;
}
.dw-lamp__motes i:nth-child(1) { left: 44%; top: 12%; animation-duration: 12s; animation-delay: -2s; }
.dw-lamp__motes i:nth-child(2) { left: 52%; top: 34%; animation-duration: 16s; animation-delay: -7s; width: 2px; height: 2px; }
.dw-lamp__motes i:nth-child(3) { left: 38%; top: 55%; animation-duration: 14s; animation-delay: -4s; width: 2px; height: 2px; }
.dw-lamp__motes i:nth-child(4) { left: 58%; top: 68%; animation-duration: 18s; animation-delay: -11s; }
.dw-lamp__motes i:nth-child(5) { left: 47%; top: 82%; animation-duration: 15s; animation-delay: -9s; width: 2px; height: 2px; }
@keyframes dwMote {
  0%   { transform: translate3d(0, 0, 0); opacity: 0; }
  12%  { opacity: 0.9; }
  50%  { transform: translate3d(14px, 26px, 0); opacity: 0.5; }
  82%  { opacity: 0.85; }
  100% { transform: translate3d(-8px, 54px, 0); opacity: 0; }
}

/* ── 开灯态 ── */
.dw-lamp.is-on .dw-lamp__bulb {
  background: #ffe2a6;
  box-shadow:
    0 0 8px 2px rgba(255, 205, 130, 0.7),
    0 0 24px 10px rgba(255, 178, 92, 0.34),
    0 0 60px 26px rgba(255, 160, 70, 0.14);
  transition: background 0.25s ease, box-shadow 0.3s ease;
}
.dw-lamp.is-on .dw-lamp__shade .dw-rim-lit { opacity: 0.9; }
.dw-lamp.is-on .dw-lamp__beam { opacity: 1; }
.dw-lamp.is-on .dw-lamp__beam--core { opacity: 1; }
.dw-lamp.is-on .dw-lamp__pool { opacity: 1; }
.dw-lamp.is-on .dw-lamp__motes { opacity: 1; }
.dw-lamp.is-on .dw-lamp__motes i { animation-play-state: running; }
.dw-lamp.is-on .dw-lamp__pull i {
  background: linear-gradient(160deg, #d8b578 20%, #8a6f42 80%);
}

/* 罩口铜圈的亮态（SVG 内元素） */
.dw-lamp__shade .dw-rim-lit {
  opacity: 0;
  transition: opacity 0.45s ease;
}

/* 钨丝点亮：闪两下再稳住 */
.dw-lamp.is-ignite .dw-lamp__beam,
.dw-lamp.is-ignite .dw-lamp__beam--core,
.dw-lamp.is-ignite .dw-lamp__pool {
  animation: dwIgnite 0.55s ease-out;
}
.dw-lamp.is-ignite .dw-lamp__bulb {
  animation: dwIgniteBulb 0.55s ease-out;
}
@keyframes dwIgnite {
  0%   { opacity: 0; }
  16%  { opacity: 0.7; }
  30%  { opacity: 0.18; }
  46%  { opacity: 0.88; }
  60%  { opacity: 0.72; }
  100% { opacity: 1; }
}
@keyframes dwIgniteBulb {
  0%   { filter: brightness(0.25); }
  16%  { filter: brightness(0.95); }
  30%  { filter: brightness(0.35); }
  46%  { filter: brightness(1.05); }
  100% { filter: brightness(1); }
}

/* ── 收起态：灯升出视口，光效收干净 ── */
.dw-lamp.is-away .dw-lamp__beam,
.dw-lamp.is-away .dw-lamp__beam--core,
.dw-lamp.is-away .dw-lamp__pool,
.dw-lamp.is-away .dw-lamp__motes { opacity: 0; }
.dw-lamp.is-away .dw-lamp__bulb {
  background: #37322a;
  box-shadow: inset 0 -2px 3px rgba(0, 0, 0, 0.4);
}
.dw-lamp.is-away .dw-lamp__fix,
.dw-lamp.is-away .dw-lamp__pull { pointer-events: none; }

/* ── 右上角开关（语言切换下方，同一套视觉语言） ── */
.dw-lamp-switch {
  position: fixed;
  right: var(--hud-pad);
  top: 106px;
  z-index: 60;
  width: 30px;
  height: 26px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(255, 255, 255, 0.55);
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  cursor: pointer;
  transition: all 0.25s;
  padding: 0;
}
.dw-lamp-switch svg { display: block; width: 14px; height: 14px; }
.dw-lamp-switch .ray { opacity: 0; transition: opacity 0.3s; }
.dw-lamp-switch:hover {
  border-color: var(--accent, #ff2a2a);
  color: var(--accent, #ff2a2a);
}
.dw-lamp-switch:active { transform: translateY(1px); }
.dw-lamp-switch.is-active {
  border-color: rgba(255, 190, 110, 0.85);
  color: #ffca7d;
}
.dw-lamp-switch.is-active .ray { opacity: 1; }

@media (max-width: 860px), (hover: none) {
  .dw-lamp, .dw-lamp-switch { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .dw-lamp__drop { transition: none; }
  .dw-lamp__beam, .dw-lamp__beam--core, .dw-lamp__pool,
  .dw-lamp__bulb, .dw-lamp__motes { transition: none; animation: none !important; }
  .dw-lamp__motes i { animation: none !important; }
}
