/* ============================================================
   BOSBM Holdings — Visual & Motion Library (visuals.css)
   曜石鉑金 × 靛紫 | www.bosbm.ai
   共用視覺/動態庫：內嵌 SVG 插圖 + CSS/JS 動態
   - 只用 CIS 變數（cis.css :root），不引入新色、不用外部圖片/CDN
   - 所有裝飾層 aria-hidden、pointer-events:none，不影響 a11y
   - 動態節制（transform/opacity）；prefers-reduced-motion 全關
   依賴：assets/cis.css（須先載入）
   ============================================================ */

/* ============================================================
   1. 動態 HERO 背景層（疊在 .hero-bg 之上）
   用法：在 .hero 內、.hero-bg 之後加一個 aria-hidden 裝飾層
   <div class="viz-aurora" aria-hidden="true"></div>
   ============================================================ */
.viz-aurora{
  position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;
}
.viz-aurora::before,
.viz-aurora::after{
  content:"";position:absolute;inset:-25%;
  background:
    radial-gradient(40% 38% at 22% 26%,rgba(99,102,241,.22),transparent 60%),
    radial-gradient(42% 40% at 78% 22%,rgba(139,92,246,.20),transparent 62%),
    radial-gradient(50% 46% at 60% 88%,rgba(99,102,241,.12),transparent 64%);
  filter:blur(8px);
  will-change:transform,opacity;
}
.viz-aurora::before{animation:viz-aurora-drift 26s ease-in-out infinite alternate;}
.viz-aurora::after{
  background:
    conic-gradient(from 200deg at 30% 40%,rgba(139,92,246,.16),transparent 40%,rgba(99,102,241,.14) 70%,transparent);
  opacity:.55;mix-blend-mode:screen;
  animation:viz-aurora-spin 60s linear infinite;
}
@keyframes viz-aurora-drift{
  0%  {transform:translate3d(-3%,-2%,0) scale(1);   opacity:.9;}
  50% {transform:translate3d(4%,3%,0)  scale(1.08); opacity:1;}
  100%{transform:translate3d(-2%,4%,0) scale(1.04); opacity:.85;}
}
@keyframes viz-aurora-spin{
  from{transform:rotate(0deg);}
  to  {transform:rotate(360deg);}
}

/* 細網格 + 掃描線微動。用法 <div class="viz-grid" aria-hidden="true"></div> */
.viz-grid{
  position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;
}
.viz-grid::before{
  content:"";position:absolute;inset:0;
  background-image:
    linear-gradient(rgba(199,205,214,.045) 1px,transparent 1px),
    linear-gradient(90deg,rgba(199,205,214,.045) 1px,transparent 1px);
  background-size:54px 54px;
  mask-image:radial-gradient(circle at 50% 38%,#000,transparent 78%);
  -webkit-mask-image:radial-gradient(circle at 50% 38%,#000,transparent 78%);
}
.viz-grid::after{
  content:"";position:absolute;left:0;right:0;height:160px;top:-160px;
  background:linear-gradient(to bottom,transparent,rgba(139,92,246,.10),transparent);
  animation:viz-scan 9s linear infinite;
  will-change:transform;
}
@keyframes viz-scan{
  0%  {transform:translateY(0);}
  100%{transform:translateY(calc(100vh + 320px));}
}

/* 漂浮幾何粒子/環。用法：
   <div class="viz-orbit" aria-hidden="true">
     <span class="viz-orbit-ring"></span>
     <i class="viz-dot"></i> ... (任意數量 .viz-dot / .viz-ring)
   </div>
   JS（visuals.js）會隨機定位/微速度，純 CSS fallback 也會漂浮 */
.viz-orbit{
  position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;
}
.viz-orbit .viz-dot,
.viz-orbit .viz-ring{
  position:absolute;display:block;border-radius:50%;
  will-change:transform;
  animation:viz-float 16s ease-in-out infinite;
}
.viz-orbit .viz-dot{
  width:8px;height:8px;
  background:var(--violet);
  box-shadow:0 0 12px rgba(139,92,246,.55);
  opacity:.55;
}
.viz-orbit .viz-ring{
  width:120px;height:120px;background:transparent;
  border:1px solid var(--line-strong);
  opacity:.4;
}
.viz-orbit > *:nth-child(2){left:12%;top:22%;animation-duration:18s;}
.viz-orbit > *:nth-child(3){left:80%;top:30%;animation-duration:22s;animation-delay:-4s;}
.viz-orbit > *:nth-child(4){left:64%;top:72%;animation-duration:20s;animation-delay:-8s;}
.viz-orbit > *:nth-child(5){left:28%;top:78%;animation-duration:24s;animation-delay:-2s;}
.viz-orbit > *:nth-child(6){left:46%;top:16%;animation-duration:19s;animation-delay:-6s;}
.viz-orbit > *:nth-child(7){left:90%;top:62%;animation-duration:26s;animation-delay:-10s;}
@keyframes viz-float{
  0%  {transform:translate3d(0,0,0);}
  25% {transform:translate3d(14px,-20px,0);}
  50% {transform:translate3d(-10px,-34px,0);}
  75% {transform:translate3d(-18px,-12px,0);}
  100%{transform:translate3d(0,0,0);}
}

/* ============================================================
   2. SVG 插圖容器
   .illus       — 純容器（置中、可控寬高），放 inline <svg>
   .illus-card  — surface 漸層 + 漸層描邊框（與 .card.feature 同語彙）
   <figure class="illus-card" aria-hidden="true"><svg class="illus" ...></svg></figure>
   ============================================================ */
.illus{
  display:block;width:100%;height:auto;color:var(--violet);
}
.illus-card{
  position:relative;
  background:linear-gradient(160deg,var(--surface-2),var(--surface));
  border:1px solid var(--line-strong);
  border-radius:var(--r-lg);
  padding:clamp(20px,3vw,36px);
  overflow:hidden;
}
.illus-card::before{
  content:"";position:absolute;inset:0;border-radius:var(--r-lg);padding:1px;
  background:var(--grad);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  opacity:.45;pointer-events:none;
}
.illus-card::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(420px 240px at 70% -10%,rgba(139,92,246,.16),transparent 70%);
}
.illus-card > *{position:relative;z-index:1}

/* ============================================================
   3. SVG 圖示（統一 stroke=currentColor）
   <svg class="svg-icon" ...>  → 顏色用 var(--violet)；hover 微動
   .svg-icon.grad-fill  → 用漸層填色（需 svg 內 <defs> 引用 #vizGrad）
   .svg-icon-lg / .svg-icon-sm  尺寸變體
   ============================================================ */
.svg-icon{
  width:28px;height:28px;color:var(--violet);
  stroke:currentColor;fill:none;
  stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;
  transition:transform .25s ease,color .25s ease,filter .25s ease;
}
.svg-icon-sm{width:20px;height:20px;stroke-width:1.8}
.svg-icon-lg{width:44px;height:44px}
.card:hover .svg-icon,
.illus-card:hover .svg-icon,
a:hover > .svg-icon{
  transform:translateY(-2px) scale(1.05);
  filter:drop-shadow(0 0 8px rgba(139,92,246,.5));
}
.svg-icon.grad-stroke{stroke:url(#vizGrad)}
.svg-icon.grad-fill{fill:url(#vizGrad);stroke:none}

/* 圖示底座（與 .card .card-icon 同語彙，可獨立使用） */
.icon-chip{
  width:52px;height:52px;border-radius:var(--r-md);
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--indigo-soft);border:1px solid var(--line-strong);
  color:var(--violet);flex-shrink:0;
}

/* ============================================================
   4. 數字統計動畫 .countup
   數值由 visuals.js 注入 textContent；此處只控視覺
   <span class="countup grad" data-countup="98" data-suffix="%">0</span>
   ============================================================ */
.countup{
  font-variant-numeric:tabular-nums;
  font-weight:800;line-height:1;
  display:inline-block;
}
.countup.is-running{opacity:.92}

/* ============================================================
   5. 迷你 sparkline .spark（inline svg）
   <svg class="spark" viewBox="0 0 100 32" preserveAspectRatio="none" aria-hidden="true">
     <polyline class="spark-line" points="0,28 ..." />
     <polygon  class="spark-fill" points="0,32 ... 100,32" />
   </svg>
   .spark-line 進場時用 visuals.js 觸發 .draw（dash 動畫）
   ============================================================ */
.spark{width:100%;height:auto;display:block;overflow:visible}
.spark-line{
  fill:none;stroke:url(#vizGrad);stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
.spark-fill{fill:url(#vizGradSoft);opacity:.5}
.spark-line.draw{
  stroke-dasharray:var(--spark-len,400);
  stroke-dashoffset:var(--spark-len,400);
  animation:viz-draw 1.4s cubic-bezier(.2,.7,.2,1) forwards;
}
@keyframes viz-draw{to{stroke-dashoffset:0;}}

/* ============================================================
   6. 流程箭頭/連線 dash 動畫 .flow-anim
   給 SVG <path class="flow-path"> / <line class="flow-path">；
   進場觸發 .draw 畫線，並有持續流動的 .flow-stream
   ============================================================ */
.flow-anim .flow-path{
  fill:none;stroke:var(--line-strong);stroke-width:1.5;
}
.flow-anim .flow-path.draw{
  stroke:url(#vizGrad);
  stroke-dasharray:var(--flow-len,300);
  stroke-dashoffset:var(--flow-len,300);
  animation:viz-draw 1.1s cubic-bezier(.2,.7,.2,1) forwards;
}
.flow-anim .flow-stream{
  fill:none;stroke:var(--violet);stroke-width:2;stroke-linecap:round;
  stroke-dasharray:4 14;opacity:.8;
  animation:viz-stream 1.4s linear infinite;
}
@keyframes viz-stream{to{stroke-dashoffset:-36;}}

/* 流程節點（圓點脈衝） */
.flow-node{fill:var(--surface);stroke:url(#vizGrad);stroke-width:1.5}
.flow-node.pulse{animation:viz-pulse 2.4s ease-in-out infinite}
@keyframes viz-pulse{
  0%,100%{opacity:.7}
  50%    {opacity:1;filter:drop-shadow(0 0 5px rgba(139,92,246,.6))}
}

/* ============================================================
   7. 進場增強 .reveal-viz（與 cis.css .reveal 並存、互不干擾）
   visuals.js 用獨立 observer 加 .in；可疊 .from-l / .from-r / .zoom
   ============================================================ */
.reveal-viz{
  opacity:0;transform:translateY(28px);
  transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1);
  will-change:opacity,transform;
}
.reveal-viz.from-l{transform:translateX(-32px)}
.reveal-viz.from-r{transform:translateX(32px)}
.reveal-viz.zoom{transform:scale(.94)}
.reveal-viz.in{opacity:1;transform:none}
.reveal-viz.vd1{transition-delay:.08s}
.reveal-viz.vd2{transition-delay:.16s}
.reveal-viz.vd3{transition-delay:.24s}
.reveal-viz.vd4{transition-delay:.32s}
.reveal-viz.vd5{transition-delay:.40s}

/* 輕量懸浮升起（裝飾卡片懸停光暈） */
.lift{transition:transform .25s ease,box-shadow .25s ease}
.lift:hover{transform:translateY(-4px);box-shadow:var(--shadow-glow)}

/* 旋轉的合規/治理徽記環（裝飾用） */
.viz-spin-slow{animation:viz-aurora-spin 40s linear infinite;transform-origin:center}

/* ============================================================
   8. prefers-reduced-motion：全部動畫關閉
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .viz-aurora::before,.viz-aurora::after,
  .viz-grid::after,
  .viz-orbit .viz-dot,.viz-orbit .viz-ring,
  .spark-line.draw,.flow-anim .flow-path.draw,
  .flow-anim .flow-stream,.flow-node.pulse,
  .viz-spin-slow{
    animation:none !important;
  }
  .spark-line.draw,.flow-anim .flow-path.draw{
    stroke-dashoffset:0 !important;
  }
  .reveal-viz{opacity:1 !important;transform:none !important;transition:none !important}
  .countup.is-running{opacity:1}
}
