/* assets/css/physics/fluid-dynamics/boundary-layer-formation-along-a-flat-plate-explained.css — 本页专属样式（en/zh 共用） */
/* ============ 平板边界层形成 · Boundary layer along a flat plate ============
   源图：svgs/done/physics-05-boundary-layer-formation-along-a-flat-plate-explained.html。
   本图专属类统一 bl-* 前缀；共享类（.part/.body/.body2/.body3/.accent/.tag/.tag-sm/
   .is-running/@keyframes）沿用。零件区分色与动画用 body[data-topic="boundary-layer"] 作用域限定。 */

/* 主题蓝体系：零件描边 / 小字对比度 */
body[data-topic="boundary-layer"] .part .body{fill:#c2d1e4;stroke:#2563eb;stroke-width:1.6}
body[data-topic="boundary-layer"] .part .body2{fill:#dde7f4;stroke:#60a5fa;stroke-width:1.2}
body[data-topic="boundary-layer"] .part .body3{fill:#aab9cd;stroke:none}
body[data-topic="boundary-layer"] .part .accent{fill:none;stroke:#2563eb;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
body[data-topic="boundary-layer"] .tag-sm{fill:#5b6472}

/* 高亮态（换色 + 描边加粗 + 发光） */
body[data-topic="boundary-layer"] .part.is-active .body{fill:#9dc3f5;stroke:#1d4ed8;stroke-width:2.2}
body[data-topic="boundary-layer"] .part.is-active .body2{fill:#c4daf8;stroke:#3b82f6;stroke-width:1.4}
body[data-topic="boundary-layer"] .part.is-active .body3{fill:#1d4ed8}
body[data-topic="boundary-layer"] .part.is-active .accent{stroke:#1d4ed8}
body[data-topic="boundary-layer"] .part.is-active{filter:drop-shadow(0 0 12px rgba(29,78,216,.5))}

/* 各部件区分色（均在中灰蓝值域内，禁近白） */
body[data-topic="boundary-layer"] .part[data-id="part-flat-plate"]:not(.is-active) .body{fill:#b9c9de}
body[data-topic="boundary-layer"] .part[data-id="part-leading-edge"]:not(.is-active) .body{fill:#c6d3e5}
body[data-topic="boundary-layer"] .part[data-id="part-laminar-region"]:not(.is-active) .body{fill:#d5e1f1}
body[data-topic="boundary-layer"] .part[data-id="part-turbulent-region"]:not(.is-active) .body{fill:#c2d1e4}
body[data-topic="boundary-layer"] .part[data-id="part-laminar-sublayer"]:not(.is-active) .body{fill:#dde7f4}
body[data-topic="boundary-layer"] .part[data-id="part-velocity-profile"]:not(.is-active) .body{fill:#b9c9de}
body[data-topic="boundary-layer"] .part[data-id="part-transition"]:not(.is-active) .body{fill:#c2d1e4}

/* ===== 边界层边缘（δ 曲线，虚线沿程流动） ===== */
.bl-edge{fill:none;stroke:#1d4ed8;stroke-width:2.6;stroke-linecap:round;
  stroke-dasharray:12 8;animation:bl-flow-fast 3.2s linear infinite;animation-play-state:paused}
.is-running .bl-edge{animation-play-state:running}

/* ===== 自由来流箭头（自左向右匀速流动） ===== */
.bl-stream{fill:none;stroke:#2563eb;stroke-width:3.2;stroke-linecap:round;
  stroke-dasharray:20 15;animation:bl-flow 1.6s linear infinite;animation-play-state:paused}
.is-running .bl-stream{animation-play-state:running}

/* ===== 层流段流线（平滑有序） ===== */
.bl-lam{fill:none;stroke:#3b82f6;stroke-width:2.4;stroke-linecap:round;
  stroke-dasharray:20 15;animation:bl-flow 2.4s linear infinite;animation-play-state:paused}
.is-running .bl-lam{animation-play-state:running}

/* ===== 湍流段流线（波纹，快而不规则） ===== */
.bl-turb{fill:none;stroke:#2563eb;stroke-width:2.4;stroke-linecap:round;
  stroke-dasharray:12 8;animation:bl-flow-fast .8s linear infinite;animation-play-state:paused}
.is-running .bl-turb{animation-play-state:running}

/* ===== 湍流涡旋 ===== */
.bl-eddy{fill:none;stroke:#2563eb;stroke-width:2.2;stroke-linecap:round;opacity:.85;
  transform-box:fill-box;transform-origin:50% 50%;
  animation:bl-eddy 2.6s linear infinite;animation-play-state:paused}
.is-running .bl-eddy{animation-play-state:running}
.bl-eddy.rev{animation-direction:reverse;animation-duration:3.2s}

/* ===== 速度剖面轴线 ===== */
.bl-axis{stroke:#9aa6b8;stroke-width:1.4;stroke-dasharray:4 4}

/* ===== 速度剖面（由薄到厚：沿程缩放生长） ===== */
.bl-profile{transform-box:fill-box;transform-origin:left center;
  animation:bl-grow 3.4s ease-in-out infinite;animation-play-state:paused}
.is-running .bl-profile{animation-play-state:running}
.bl-profile.d1{animation-delay:0s}
.bl-profile.d2{animation-delay:.35s}
.bl-profile.d3{animation-delay:.7s}
.bl-profile.d4{animation-delay:1.05s}

/* ===== 转捩点脉冲 ===== */
.bl-pulse{transform-box:fill-box;transform-origin:50% 50%;
  animation:bl-pulse 1.8s ease-in-out infinite;animation-play-state:paused}
.is-running .bl-pulse{animation-play-state:running}

/* ============ 关键帧 ============ */
@keyframes bl-flow{to{stroke-dashoffset:-70}}
@keyframes bl-flow-fast{to{stroke-dashoffset:-60}}
@keyframes bl-eddy{to{transform:rotate(360deg)}}
@keyframes bl-grow{0%,15%{transform:scaleX(.55)}55%,100%{transform:scaleX(1)}}
@keyframes bl-pulse{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.35)}}

/* ===== 无障碍：减弱动效 ===== */
@media (prefers-reduced-motion:reduce){
  body[data-topic="boundary-layer"] .bl-stream,
  body[data-topic="boundary-layer"] .bl-lam,
  body[data-topic="boundary-layer"] .bl-turb,
  body[data-topic="boundary-layer"] .bl-eddy,
  body[data-topic="boundary-layer"] .bl-edge,
  body[data-topic="boundary-layer"] .bl-profile,
  body[data-topic="boundary-layer"] .bl-pulse{animation:none}
}