// Additional rich visuals per section (non-compass, relevant to AR control)

// 1) Value card hero icons (large, animated) — each tied to its value
const ValueIcon = {
  // 01 · 24/7 control — shield with rotating ring + tick
  Shield247: () => (
    <svg viewBox="0 0 80 80" width="72" height="72" aria-hidden="true" className="text-primary">
      <g style={{transformOrigin:"40px 40px", animation:"spinSlow 22s linear infinite"}}>
        <circle cx="40" cy="40" r="34" fill="none" stroke="currentColor" strokeOpacity=".2" strokeDasharray="2 4" />
      </g>
      <path d="M40 14 24 20v14c0 10 7 18 16 20 9-2 16-10 16-20V20L40 14z"
        fill="currentColor" fillOpacity=".08" stroke="currentColor" strokeWidth="1.6"/>
      <path d="M30 40l7 7 13-14" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" fill="none"
        strokeDasharray="40" strokeDashoffset="40" style={{animation:"drawStroke 1.4s ease .3s forwards"}} />
      <text x="40" y="68" textAnchor="middle" fontFamily="Geist, Inter, sans-serif" fontSize="9" fontWeight="600" fill="currentColor" opacity=".7">24/7</text>
    </svg>
  ),
  // 02 · Morning digest — envelope with sun
  Digest: () => (
    <svg viewBox="0 0 80 80" width="72" height="72" aria-hidden="true" className="text-primary">
      <circle cx="58" cy="22" r="8" fill="currentColor" fillOpacity=".15">
        <animate attributeName="r" values="7;9;7" dur="3s" repeatCount="indefinite"/>
      </circle>
      <g stroke="currentColor" strokeOpacity=".5" strokeWidth="1.4" strokeLinecap="round">
        <line x1="58" y1="8"  x2="58" y2="12"/>
        <line x1="70" y1="22" x2="74" y2="22"/>
        <line x1="48" y1="12" x2="51" y2="15"/>
      </g>
      <rect x="12" y="30" width="48" height="34" rx="3" fill="none" stroke="currentColor" strokeWidth="1.6"/>
      <path d="M12 32l24 16 24-16" fill="none" stroke="currentColor" strokeWidth="1.6"/>
      <rect x="20" y="42" width="32" height="2" fill="currentColor" opacity=".35"/>
      <rect x="20" y="48" width="22" height="2" fill="currentColor" opacity=".35"/>
    </svg>
  ),
  // 03 · Team 2-3x efficiency — bar chart with ascending bars
  TeamChart: () => (
    <svg viewBox="0 0 80 80" width="72" height="72" aria-hidden="true" className="text-primary">
      <line x1="10" y1="64" x2="70" y2="64" stroke="currentColor" strokeOpacity=".35" strokeWidth="1.4"/>
      {[
        [18, 48, 14], [34, 36, 26], [50, 22, 40], [64, 14, 48]
      ].map(([x,y,h],i)=>(
        <rect key={i} x={x} y="64" width="8" height="0" rx="1.5" fill="currentColor" fillOpacity=".7">
          <animate attributeName="height" from="0" to={h} dur="1s" begin={`${i*0.15}s`} fill="freeze"/>
          <animate attributeName="y" from="64" to={y} dur="1s" begin={`${i*0.15}s`} fill="freeze"/>
        </rect>
      ))}
      <path d="M14 56 L30 42 L46 28 L64 16" fill="none" stroke="currentColor" strokeWidth="1.8"
        strokeDasharray="120" strokeDashoffset="120" style={{animation:"drawStroke 1.4s ease .6s forwards"}}/>
      <circle cx="64" cy="16" r="3" fill="currentColor">
        <animate attributeName="opacity" values="0;1" dur=".3s" begin="1.8s" fill="freeze"/>
        <animate attributeName="r" values="3;5;3" dur="2s" begin="2s" repeatCount="indefinite"/>
      </circle>
    </svg>
  ),
  // 04 · Not hostage to employee — dossier card with badge
  Dossier: () => (
    <svg viewBox="0 0 80 80" width="72" height="72" aria-hidden="true" className="text-primary">
      <rect x="20" y="14" width="42" height="52" rx="3" fill="currentColor" fillOpacity=".06" stroke="currentColor" strokeWidth="1.6"/>
      <rect x="14" y="20" width="42" height="52" rx="3" fill="none" stroke="currentColor" strokeWidth="1.6" strokeOpacity=".4"/>
      <circle cx="28" cy="34" r="5" stroke="currentColor" strokeWidth="1.5" fill="none"/>
      <path d="M20 46c2-4 14-4 16 0" stroke="currentColor" strokeWidth="1.5" fill="none"/>
      <rect x="38" y="30" width="18" height="2" fill="currentColor" opacity=".5"/>
      <rect x="38" y="35" width="12" height="2" fill="currentColor" opacity=".5"/>
      <rect x="20" y="54" width="30" height="2" fill="currentColor" opacity=".35"/>
      <rect x="20" y="60" width="22" height="2" fill="currentColor" opacity=".35"/>
      <circle cx="56" cy="58" r="8" fill="currentColor">
        <animate attributeName="r" values="8;9;8" dur="2s" repeatCount="indefinite"/>
      </circle>
      <path d="M52 58l3 3 5-6" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" fill="none"/>
    </svg>
  ),
  // 05 · Calendar 2-8 weeks
  Calendar28: () => (
    <svg viewBox="0 0 80 80" width="72" height="72" aria-hidden="true" className="text-primary">
      <rect x="12" y="18" width="56" height="50" rx="3" fill="none" stroke="currentColor" strokeWidth="1.6"/>
      <line x1="12" y1="30" x2="68" y2="30" stroke="currentColor" strokeWidth="1.6"/>
      <line x1="22" y1="12" x2="22" y2="22" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"/>
      <line x1="58" y1="12" x2="58" y2="22" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"/>
      {Array.from({length:14}).map((_,i)=>{
        const col = i%7, row = Math.floor(i/7);
        const x = 18+col*7, y = 38+row*9;
        const hot = i<2 || i===13;
        return <rect key={i} x={x} y={y} width="5" height="5" rx="1"
          fill={hot?"currentColor":"none"} stroke="currentColor" strokeOpacity=".4" strokeWidth="1">
          {hot && <animate attributeName="opacity" values=".3;1;.3" dur="2s" begin={`${i*0.1}s`} repeatCount="indefinite"/>}
        </rect>;
      })}
      <text x="40" y="72" textAnchor="middle" fontFamily="Geist, Inter, sans-serif" fontSize="8" fontWeight="600" fill="currentColor" opacity=".7">2–8 НЕДЕЛЬ</text>
    </svg>
  ),
};

// 2) Pain card symptom visuals — editorial scenes filling the card top band
const PainIcon = {
  // 1 · Control tied to you: CEO figure yanked by a red tether toward a pile of files
  //     while 3 empty desks with "?" sit idle.
  TiedControl: () => (
    <svg viewBox="0 0 360 140" width="92%" height="100%" aria-hidden="true" className="text-foreground">
      <defs>
        <linearGradient id="tc-pile" x1="0" x2="0" y1="0" y2="1">
          <stop offset="0" stopColor="currentColor" stopOpacity=".25"/>
          <stop offset="1" stopColor="currentColor" stopOpacity=".05"/>
        </linearGradient>
      </defs>

      {/* LEFT: CEO figure, leaning under tension */}
      <g transform="translate(24 20)" style={{transformOrigin:"30px 60px", animation:"leanPull 2.4s ease-in-out infinite"}}>
        {/* desk */}
        <rect x="-4" y="86" width="68" height="4" rx="1" fill="currentColor" opacity=".2"/>
        {/* chair back */}
        <rect x="10" y="42" width="32" height="48" rx="3" fill="currentColor" fillOpacity=".08" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".35"/>
        {/* head */}
        <circle cx="26" cy="34" r="9" fill="currentColor" fillOpacity=".9"/>
        {/* body */}
        <path d="M10 70 Q 26 50 42 70 L 42 86 L 10 86 Z" fill="currentColor" fillOpacity=".85"/>
        {/* laptop */}
        <rect x="6" y="74" width="30" height="10" rx="1" fill="rgb(var(--card))" stroke="currentColor" strokeOpacity=".4" strokeWidth="1"/>
        {/* tether anchor on shoulder */}
        <circle cx="40" cy="58" r="2.2" fill="rgb(244 63 94)"/>
      </g>

      {/* TETHER: pulsing red rope from shoulder to pile */}
      <path d="M 90 78 Q 160 60 230 82"
        stroke="rgb(244 63 94)" strokeWidth="2.2" fill="none" strokeLinecap="round" strokeDasharray="4 3">
        <animate attributeName="stroke-dashoffset" from="0" to="-14" dur="1.2s" repeatCount="indefinite"/>
      </path>
      {/* red sparks along tether */}
      <circle r="2.2" fill="rgb(244 63 94)">
        <animateMotion dur="1.8s" repeatCount="indefinite" path="M 90 78 Q 160 60 230 82"/>
      </circle>

      {/* CENTER: pile of files shaking */}
      <g transform="translate(204 50)" style={{transformOrigin:"28px 40px", animation:"shake 1.2s ease-in-out infinite"}}>
        <rect x="0" y="32" width="56" height="38" rx="2" fill="url(#tc-pile)" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".4"/>
        <rect x="6" y="18" width="48" height="34" rx="2" fill="url(#tc-pile)" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".5"/>
        <rect x="10" y="4"  width="44" height="30" rx="2" fill="rgb(var(--card))" stroke="currentColor" strokeWidth="1.3" strokeOpacity=".7"/>
        <rect x="16" y="10" width="28" height="2" fill="currentColor" opacity=".5"/>
        <rect x="16" y="15" width="20" height="2" fill="currentColor" opacity=".5"/>
        <rect x="16" y="20" width="24" height="2" fill="currentColor" opacity=".5"/>
        {/* urgent red stamp */}
        <circle cx="46" cy="14" r="6" fill="none" stroke="rgb(244 63 94)" strokeWidth="1.4" opacity=".9"/>
        <text x="46" y="16" textAnchor="middle" fontFamily="Geist, Inter" fontSize="6" fontWeight="700" fill="rgb(244 63 94)">СРОЧ</text>
      </g>

      {/* RIGHT: three empty desks with "?" fading in/out */}
      {[
        {x: 282, d: 0},
        {x: 312, d: 0.4},
        {x: 282, d: 0.2, y: 30},
      ].slice(0,3).map((d,i)=>{
        const x = 278 + (i%2)*32;
        const y = 22 + Math.floor(i/2)*48;
        return (
          <g key={i} transform={`translate(${x} ${y})`} opacity=".55">
            <rect x="0" y="20" width="26" height="14" rx="1.5" fill="none" stroke="currentColor" strokeWidth="1" strokeDasharray="2 2"/>
            <circle cx="13" cy="8" r="4" fill="none" stroke="currentColor" strokeWidth="1" strokeDasharray="2 2"/>
            <text x="13" y="30" textAnchor="middle" fontFamily="Geist, Inter" fontSize="10" fontWeight="700" fill="currentColor" opacity=".6">
              ?
              <animate attributeName="opacity" values=".2;.9;.2" dur="2.2s" begin={`${d.d}s`} repeatCount="indefinite"/>
            </text>
          </g>
        );
      })}

      {/* caption */}
      <text x="180" y="130" textAnchor="middle" fontFamily="Geist, Inter" fontSize="9" fontWeight="500" fill="currentColor" opacity=".45" letterSpacing=".08em">
        отдел ждёт → вы единственная точка отказа
      </text>
    </svg>
  ),

  // 2 · Postfactum — calm DSO line, then a cliff drop with alert ping + too-late calendar badge
  Postfactum: () => (
    <svg viewBox="0 0 360 140" width="92%" height="100%" aria-hidden="true" className="text-foreground">
      <defs>
        <linearGradient id="pf-area" x1="0" x2="0" y1="0" y2="1">
          <stop offset="0" stopColor="rgb(244 63 94)" stopOpacity=".35"/>
          <stop offset="1" stopColor="rgb(244 63 94)" stopOpacity="0"/>
        </linearGradient>
      </defs>
      {/* grid + axis */}
      <g stroke="currentColor" strokeOpacity=".15">
        <line x1="20" y1="20" x2="20" y2="110"/>
        <line x1="20" y1="110" x2="340" y2="110"/>
        {[0,1,2,3].map(i=>(
          <line key={i} x1="20" y1={30+i*22} x2="340" y2={30+i*22} strokeDasharray="2 3"/>
        ))}
      </g>
      {/* month labels */}
      <g fontFamily="Geist, Inter" fontSize="8" fill="currentColor" opacity=".4">
        {["ЯНВ","ФЕВ","МАР","АПР","МАЙ","ИЮН","ИЮЛ","АВГ"].map((m,i)=>(
          <text key={m} x={30+i*40} y="122">{m}</text>
        ))}
      </g>

      {/* calm part of line */}
      <path d="M 24 80 L 60 78 L 100 76 L 140 78 L 180 74 L 220 72 L 260 70"
        fill="none" stroke="currentColor" strokeWidth="1.8" opacity=".55"
        strokeDasharray="260" strokeDashoffset="260" style={{animation:"drawStroke 1.6s ease forwards"}}/>

      {/* area under calm */}
      <path d="M 24 80 L 60 78 L 100 76 L 140 78 L 180 74 L 220 72 L 260 70 L 260 110 L 24 110 Z"
        fill="currentColor" opacity=".06"/>

      {/* cliff drop in red */}
      <path d="M 260 70 L 280 44 L 300 32 L 320 22"
        fill="none" stroke="rgb(244 63 94)" strokeWidth="2.4" strokeLinecap="round"
        strokeDasharray="80" strokeDashoffset="80"
        style={{animation:"drawStroke 1.2s ease 1.2s forwards"}}/>
      <path d="M 260 70 L 280 44 L 300 32 L 320 22 L 320 110 L 260 110 Z"
        fill="url(#pf-area)" opacity="0" style={{animation:"fadeIn 0.6s ease 2.2s forwards"}}/>

      {/* explosion ping at catastrophe */}
      <g opacity="0" style={{animation:"fadeIn 0.3s ease 2.4s forwards"}}>
        <circle cx="320" cy="22" r="4" fill="rgb(244 63 94)">
          <animate attributeName="r" values="3;6;3" dur="1.4s" repeatCount="indefinite"/>
        </circle>
        <circle cx="320" cy="22" r="4" fill="none" stroke="rgb(244 63 94)" strokeWidth="1.2">
          <animate attributeName="r" values="4;18;4" dur="1.6s" repeatCount="indefinite"/>
          <animate attributeName="opacity" values="1;0;1" dur="1.6s" repeatCount="indefinite"/>
        </circle>
      </g>

      {/* too-late banner */}
      <g opacity="0" style={{animation:"fadeIn 0.5s ease 2.8s forwards"}} transform="translate(240 86)">
        <rect width="96" height="20" rx="3" fill="rgb(244 63 94)" fillOpacity=".1" stroke="rgb(244 63 94)" strokeOpacity=".6" strokeWidth="1"/>
        <text x="48" y="13" textAnchor="middle" fontFamily="Geist, Inter" fontSize="9" fontWeight="600" fill="rgb(244 63 94)">УЗНАЛИ ПОЗДНО</text>
      </g>

      {/* KPI label top-left */}
      <g fontFamily="Geist, Inter" fill="currentColor" opacity=".6">
        <text x="26" y="30" fontSize="8" fontWeight="600" letterSpacing=".14em">СРОК ОПЛАТЫ, ДНЕЙ</text>
      </g>

      {/* scanning cursor sweeping across (the CFO's gaze) */}
      <line x1="180" y1="18" x2="180" y2="110" stroke="currentColor" strokeWidth="1" strokeDasharray="2 3" opacity=".5">
        <animate attributeName="x1" values="24;320;24" dur="6s" repeatCount="indefinite"/>
        <animate attributeName="x2" values="24;320;24" dur="6s" repeatCount="indefinite"/>
      </line>
    </svg>
  ),

  // 3 · History gone — open door, papers flying OUT of folder into WhatsApp/Outlook/speech bubbles, empty folder left
  HistoryGone: () => (
    <svg viewBox="0 0 360 140" width="92%" height="100%" aria-hidden="true" className="text-foreground">
      {/* LEFT: opened dossier folder (empty) */}
      <g transform="translate(20 26)">
        {/* folder back */}
        <path d="M0 8 L 28 8 L 34 0 L 96 0 L 96 86 L 0 86 Z" fill="currentColor" fillOpacity=".06" stroke="currentColor" strokeWidth="1.3" strokeOpacity=".5"/>
        {/* folder front (open, tilted) */}
        <path d="M0 18 L 96 18 L 106 76 L 10 76 Z" fill="currentColor" fillOpacity=".12" stroke="currentColor" strokeWidth="1.3" strokeOpacity=".7"/>
        {/* ghost of content */}
        <g opacity=".25">
          <rect x="14" y="30" width="60" height="2" fill="currentColor"/>
          <rect x="14" y="36" width="46" height="2" fill="currentColor"/>
          <rect x="14" y="42" width="52" height="2" fill="currentColor"/>
        </g>
        {/* name tag */}
        <rect x="14" y="-4" width="48" height="12" rx="1" fill="rgb(var(--card))" stroke="currentColor" strokeWidth="1" strokeOpacity=".4"/>
        <text x="38" y="5" textAnchor="middle" fontFamily="Geist, Inter" fontSize="7" fontWeight="600" fill="currentColor" opacity=".6">ДОСЬЕ</text>
        <text x="50" y="58" textAnchor="middle" fontFamily="Geist, Inter" fontSize="10" fontWeight="600" fill="currentColor" opacity=".35">—пусто—</text>
      </g>

      {/* ARROWS + PAPERS FLYING to 3 destinations */}
      <g>
        {/* Paper 1 → WhatsApp */}
        <g opacity=".75">
          <path d="M 130 50 Q 200 20 270 30" stroke="currentColor" strokeWidth="1.2" strokeDasharray="2 3" fill="none" opacity=".4"/>
          <g>
            <rect x="-8" y="-10" width="16" height="20" rx="1.5" fill="rgb(var(--card))" stroke="currentColor" strokeWidth="1"/>
            <line x1="-5" y1="-5" x2="5" y2="-5" stroke="currentColor" strokeWidth="1" opacity=".5"/>
            <line x1="-5" y1="-1" x2="5" y2="-1" stroke="currentColor" strokeWidth="1" opacity=".5"/>
            <line x1="-5" y1="3"  x2="2" y2="3" stroke="currentColor" strokeWidth="1" opacity=".5"/>
            <animateMotion dur="3s" begin="0s" repeatCount="indefinite" keyPoints="0;1" keyTimes="0;1"
              path="M 130 50 Q 200 20 270 30"/>
            <animate attributeName="opacity" values="1;1;0" keyTimes="0;.8;1" dur="3s" repeatCount="indefinite"/>
          </g>
        </g>

        {/* Paper 2 → Outlook */}
        <g opacity=".75">
          <path d="M 130 70 Q 210 70 280 72" stroke="currentColor" strokeWidth="1.2" strokeDasharray="2 3" fill="none" opacity=".4"/>
          <g>
            <rect x="-8" y="-10" width="16" height="20" rx="1.5" fill="rgb(var(--card))" stroke="currentColor" strokeWidth="1"/>
            <line x1="-5" y1="-5" x2="5" y2="-5" stroke="currentColor" strokeWidth="1" opacity=".5"/>
            <line x1="-5" y1="-1" x2="5" y2="-1" stroke="currentColor" strokeWidth="1" opacity=".5"/>
            <animateMotion dur="3.2s" begin="0.6s" repeatCount="indefinite" path="M 130 70 Q 210 70 280 72"/>
            <animate attributeName="opacity" values="1;1;0" keyTimes="0;.8;1" dur="3.2s" begin="0.6s" repeatCount="indefinite"/>
          </g>
        </g>

        {/* Paper 3 → head (memory) */}
        <g opacity=".75">
          <path d="M 130 90 Q 210 120 280 110" stroke="currentColor" strokeWidth="1.2" strokeDasharray="2 3" fill="none" opacity=".4"/>
          <g>
            <rect x="-8" y="-10" width="16" height="20" rx="1.5" fill="rgb(var(--card))" stroke="currentColor" strokeWidth="1"/>
            <line x1="-5" y1="-5" x2="5" y2="-5" stroke="currentColor" strokeWidth="1" opacity=".5"/>
            <animateMotion dur="2.8s" begin="1.2s" repeatCount="indefinite" path="M 130 90 Q 210 120 280 110"/>
            <animate attributeName="opacity" values="1;1;0" keyTimes="0;.8;1" dur="2.8s" begin="1.2s" repeatCount="indefinite"/>
          </g>
        </g>
      </g>

      {/* RIGHT: 3 destinations — chat bubble, mail, head silhouette */}
      <g transform="translate(260 18)">
        {/* WhatsApp bubble */}
        <g transform="translate(0 4)">
          <path d="M0 8 a8 8 0 1 1 16 0 v10 l-6-4 a8 8 0 0 1 -10 -6z" fill="currentColor" fillOpacity=".12" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".6"/>
          <text x="8" y="10" textAnchor="middle" fontFamily="Geist, Inter" fontSize="6" fontWeight="600" fill="currentColor" opacity=".7">WA</text>
        </g>
        {/* Outlook envelope */}
        <g transform="translate(0 42)">
          <rect width="20" height="14" rx="2" fill="currentColor" fillOpacity=".12" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".6"/>
          <path d="M0 0 L 10 9 L 20 0" fill="none" stroke="currentColor" strokeWidth="1.1" strokeOpacity=".7"/>
        </g>
        {/* Head with brain — leaves */}
        <g transform="translate(0 82)">
          <circle cx="10" cy="10" r="9" fill="currentColor" fillOpacity=".12" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".6"/>
          <path d="M5 8c0-3 3-4 5-2 2-2 5-1 5 2 0 1-1 3-5 5-4-2-5-4-5-5z" fill="currentColor" opacity=".4"/>
          {/* "leaves" with person */}
          <g opacity=".75" style={{animation:"slideRight 3s ease-in-out infinite"}}>
            <path d="M24 10 L 36 10 M32 6 L 36 10 L 32 14" stroke="rgb(244 63 94)" strokeWidth="1.4" fill="none" strokeLinecap="round"/>
          </g>
        </g>
      </g>

      {/* EXIT sign */}
      <g transform="translate(152 108)">
        <rect width="56" height="16" rx="2" fill="rgb(244 63 94)" fillOpacity=".12" stroke="rgb(244 63 94)" strokeOpacity=".7" strokeWidth="1"/>
        <path d="M6 8 L 14 8 M11 5 L 14 8 L 11 11" stroke="rgb(244 63 94)" strokeWidth="1.2" fill="none"/>
        <text x="34" y="11" textAnchor="middle" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="rgb(244 63 94)" letterSpacing=".1em">ВЫХОД</text>
      </g>
    </svg>
  ),

  // 4 · Team chaos — 3 employees, 2 clients: one client tangled by 3 threads, another with broken thread + "silence"
  TeamChaos: () => (
    <svg viewBox="0 0 360 140" width="92%" height="100%" aria-hidden="true" className="text-foreground">
      {/* LEFT column: 3 employees */}
      {[
        {y: 20, color: "rgb(var(--primary))", name: "Аня"},
        {y: 60, color: "rgb(16 185 129)",       name: "Иван"},
        {y: 100,color: "rgb(99 102 241)",       name: "Олег"},
      ].map((e,i)=>(
        <g key={i} transform={`translate(28 ${e.y})`}>
          <circle cx="10" cy="10" r="8" fill={e.color} fillOpacity=".2" stroke={e.color} strokeWidth="1.6"/>
          <circle cx="10" cy="8" r="3" fill={e.color}/>
          <path d="M3 18 Q 10 13 17 18" fill={e.color} fillOpacity=".55"/>
          <text x="24" y="13" fontFamily="Geist, Inter" fontSize="10" fontWeight="600" fill="currentColor" opacity=".75">{e.name}</text>
        </g>
      ))}

      {/* RIGHT column: 2 client boxes */}
      {/* Client A — tangled by all 3 */}
      <g transform="translate(240 30)">
        <rect width="96" height="28" rx="4" fill="rgb(var(--card))" stroke="rgb(244 63 94)" strokeWidth="1.5" strokeOpacity=".8"/>
        <text x="12" y="12" fontFamily="Geist, Inter" fontSize="9" fontWeight="700" fill="currentColor">Клиент А</text>
        <text x="12" y="22" fontFamily="Geist, Inter" fontSize="8" fill="rgb(244 63 94)" opacity=".85">висит у троих</text>
        {/* burst behind */}
        <circle cx="48" cy="14" r="26" fill="none" stroke="rgb(244 63 94)" strokeOpacity=".35" strokeWidth="1">
          <animate attributeName="r" values="22;30;22" dur="2s" repeatCount="indefinite"/>
          <animate attributeName="opacity" values=".4;.05;.4" dur="2s" repeatCount="indefinite"/>
        </circle>
      </g>

      {/* Client B — silence */}
      <g transform="translate(240 90)">
        <rect width="96" height="28" rx="4" fill="rgb(var(--card))" stroke="currentColor" strokeWidth="1.2" strokeOpacity=".4" strokeDasharray="3 2"/>
        <text x="12" y="12" fontFamily="Geist, Inter" fontSize="9" fontWeight="700" fill="currentColor" opacity=".7">Клиент Б</text>
        <text x="12" y="22" fontFamily="Geist, Inter" fontSize="8" fill="currentColor" opacity=".5">
          тишина неделю
          <animate attributeName="opacity" values=".2;.9;.2" dur="1.8s" repeatCount="indefinite"/>
        </text>
      </g>

      {/* Tangle to Client A — 3 threads converging */}
      <path d="M 54 30 Q 140 20 246 40" stroke="rgb(var(--primary))" strokeWidth="1.6" fill="none" opacity=".8"/>
      <path d="M 54 70 Q 140 50 246 44" stroke="rgb(16 185 129)"   strokeWidth="1.6" fill="none" opacity=".8"/>
      <path d="M 54 110 Q 140 60 246 48" stroke="rgb(99 102 241)"  strokeWidth="1.6" fill="none" opacity=".8"/>
      {/* knot at Client A */}
      <g transform="translate(232 42)">
        <circle r="6" fill="rgb(244 63 94)" opacity=".85"/>
        <circle r="6" fill="none" stroke="rgb(244 63 94)" strokeWidth="1">
          <animate attributeName="r" values="6;12;6" dur="1.4s" repeatCount="indefinite"/>
          <animate attributeName="opacity" values=".7;0;.7" dur="1.4s" repeatCount="indefinite"/>
        </circle>
      </g>
      {/* Travelling dots on the 3 threads to show activity */}
      <circle r="1.8" fill="rgb(var(--primary))">
        <animateMotion dur="1.6s" repeatCount="indefinite" path="M 54 30 Q 140 20 246 40"/>
      </circle>
      <circle r="1.8" fill="rgb(16 185 129)">
        <animateMotion dur="2s" begin=".3s" repeatCount="indefinite" path="M 54 70 Q 140 50 246 44"/>
      </circle>
      <circle r="1.8" fill="rgb(99 102 241)">
        <animateMotion dur="2.4s" begin=".6s" repeatCount="indefinite" path="M 54 110 Q 140 60 246 48"/>
      </circle>

      {/* Broken thread to Client B — starts from Иван, snaps mid-way */}
      <path d="M 54 70 Q 120 90 160 100" stroke="rgb(16 185 129)" strokeWidth="1.5" fill="none" opacity=".55" strokeDasharray="2 3"/>
      {/* snap marks */}
      <g transform="translate(160 100)" opacity=".85">
        <line x1="-4" y1="-4" x2="4" y2="4" stroke="rgb(244 63 94)" strokeWidth="1.5"/>
        <line x1="-4" y1="4" x2="4" y2="-4" stroke="rgb(244 63 94)" strokeWidth="1.5"/>
      </g>
      {/* disconnected stub to Client B */}
      <path d="M 190 104 L 246 104" stroke="currentColor" strokeWidth="1" strokeDasharray="2 2" opacity=".3"/>
    </svg>
  ),
};

// 3) Feature section-level big number mark
const FeatureMark = ({ n }) => (
  <div className="relative inline-flex items-center">
    <svg width="72" height="72" viewBox="0 0 72 72" aria-hidden="true" className="text-primary">
      <circle cx="36" cy="36" r="32" fill="none" stroke="currentColor" strokeOpacity=".2" strokeDasharray="3 4"/>
      <circle cx="36" cy="36" r="26" fill="none" stroke="currentColor" strokeOpacity=".35"/>
    </svg>
    <span className="absolute inset-0 grid place-items-center font-display text-[22px] font-semibold tabular tracking-tight text-primary">
      {n}
    </span>
  </div>
);

// 4) Security perimeter diagram — architectural: 3 concentric zones, live packet flow with labels, firewall, cert badge
const PerimeterDiagram = () => {
  // Zones: outer = internet (untrusted), middle = your perimeter, inner = Compass + 1C
  const W = 900, H = 460;
  const cx = W/2, cy = H/2;

  // External integration clusters (grouped, on the left side — "internet")
  const external = [
    {g:"ЕДО",     color:"rgb(var(--primary))", y: 60,  items:[
      {l:"Диадок",     logo:"D"},
      {l:"СБИС",       logo:"С"},
      {l:"1С-ЭДО",     logo:"1"},
    ]},
    {g:"Банки",   color:"rgb(16 185 129)",     y: 180, items:[
      {l:"СберБизнес", logo:"С"},
      {l:"Т-Банк",     logo:"Т"},
      {l:"ВТБ",        logo:"В"},
    ]},
    {g:"Реестры", color:"rgb(99 102 241)",     y: 300, items:[
      {l:"ЕФРСБ",      logo:"Е"},
      {l:"kad.arbitr", logo:"K"},
      {l:"ФССП",       logo:"Ф"},
    ]},
  ];

  // Live packets: each packet is a named request with a direction and a TTL path
  const packets = [
    {group:0, label:"накладные", dir:"in",  dur:4.0, delay:0.0,  tls:true},
    {group:1, label:"выписка",   dir:"in",  dur:4.4, delay:0.6,  tls:true},
    {group:2, label:"проверка",  dir:"out", dur:4.8, delay:1.2,  tls:true},
    {group:0, label:"претензия", dir:"out", dur:5.2, delay:1.8,  tls:true},
    {group:1, label:"1С · read", dir:"loop",dur:3.4, delay:0.3,  tls:false},
    {group:2, label:"ЕФРСБ ✓",   dir:"in",  dur:4.2, delay:2.4,  tls:true},
  ];

  return (
    <div className="relative">
      <svg viewBox={`0 0 ${W} ${H}`} className="w-full h-auto text-foreground block" aria-hidden="true">
        <defs>
          <linearGradient id="prm-zone" x1="0" x2="1" y1="0" y2="1">
            <stop offset="0" stopColor="rgb(var(--primary))" stopOpacity=".10"/>
            <stop offset="1" stopColor="rgb(var(--primary))" stopOpacity=".03"/>
          </linearGradient>
          <linearGradient id="prm-core" x1="0" x2="1" y1="0" y2="1">
            <stop offset="0" stopColor="rgb(var(--primary))" stopOpacity=".18"/>
            <stop offset="1" stopColor="rgb(var(--primary))" stopOpacity=".06"/>
          </linearGradient>
          <pattern id="prm-hatch" width="8" height="8" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
            <line x1="0" y1="0" x2="0" y2="8" stroke="currentColor" strokeOpacity=".15" strokeWidth="1"/>
          </pattern>
          <filter id="prm-soft" x="-20%" y="-20%" width="140%" height="140%">
            <feGaussianBlur stdDeviation="1.2"/>
          </filter>
        </defs>

        {/* OUTER ZONE: Internet (untrusted) — hatched bg left strip */}
        <g>
          <rect x="0" y="0" width="320" height={H} fill="url(#prm-hatch)"/>
          <text x="16" y="24" fontFamily="Geist, Inter" fontSize="10" fontWeight="700"
            fill="currentColor" opacity=".5" letterSpacing=".2em">ИНТЕРНЕТ · UNTRUSTED</text>
        </g>

        {/* PERIMETER FRAME */}
        <g>
          <rect x="320" y="20" width={W-340} height={H-40} rx="18"
            fill="url(#prm-zone)" stroke="rgb(var(--primary))" strokeOpacity=".5"
            strokeDasharray="8 4" strokeWidth="1.4"/>
          <g transform="translate(336 12)">
            <rect width="196" height="20" rx="10" fill="rgb(var(--card))" stroke="rgb(var(--primary))" strokeOpacity=".6"/>
            <circle cx="12" cy="10" r="3" fill="rgb(16 185 129)">
              <animate attributeName="opacity" values="1;.3;1" dur="1.4s" repeatCount="indefinite"/>
            </circle>
            <text x="24" y="14" fontFamily="Geist, Inter" fontSize="10" fontWeight="700" fill="currentColor" letterSpacing=".14em">ВАШ ПЕРИМЕТР · ON-PREM</text>
          </g>

          {/* corner crosshairs */}
          {[[320,20],[W-20,20],[320,H-20],[W-20,H-20]].map(([x,y],i)=>(
            <g key={i}>
              <line x1={x-6} y1={y} x2={x+6} y2={y} stroke="rgb(var(--primary))" strokeWidth="1.2"/>
              <line x1={x} y1={y-6} x2={x} y2={y+6} stroke="rgb(var(--primary))" strokeWidth="1.2"/>
            </g>
          ))}
        </g>

        {/* FIREWALL WALL at x=320 */}
        <g>
          {/* brick pattern */}
          {Array.from({length:14}).map((_,i)=>{
            const y = 30 + i*30;
            return <g key={i}>
              <rect x="312" y={y} width="16" height="12" rx="1" fill="rgb(var(--primary))" fillOpacity={(i%2)?".25":".35"} stroke="rgb(var(--primary))" strokeOpacity=".6" strokeWidth="1"/>
              <rect x="312" y={y+12} width="16" height="12" rx="1" fill="rgb(var(--primary))" fillOpacity={(i%2)?".35":".25"} stroke="rgb(var(--primary))" strokeOpacity=".6" strokeWidth="1"/>
            </g>;
          })}
          <text x="320" y={H-6} textAnchor="middle" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="rgb(var(--primary))" letterSpacing=".16em">FIREWALL</text>
        </g>

        {/* EXTERNAL SYSTEMS (left, internet zone) */}
        {external.map((grp,gi)=>(
          <g key={gi} transform={`translate(30 ${grp.y})`}>
            <text x="0" y="-2" fontFamily="Geist, Inter" fontSize="9" fontWeight="700"
              fill="currentColor" opacity=".55" letterSpacing=".18em">{grp.g.toUpperCase()}</text>
            {grp.items.map((it,i)=>(
              <g key={i} transform={`translate(0 ${i*30 + 6})`}>
                <rect width="260" height="24" rx="4" fill="rgb(var(--card))" stroke="currentColor" strokeOpacity=".25" strokeWidth="1"/>
                <circle cx="16" cy="12" r="8" fill={grp.color} fillOpacity=".18" stroke={grp.color} strokeWidth="1.2"/>
                <text x="16" y="15" textAnchor="middle" fontFamily="Geist, Inter" fontSize="10" fontWeight="700" fill={grp.color}>{it.logo}</text>
                <text x="32" y="15" fontFamily="Geist, Inter" fontSize="11" fontWeight="500" fill="currentColor" opacity=".85">{it.l}</text>
                {/* rightside endpoint dot */}
                <circle cx="254" cy="12" r="2.5" fill={grp.color}>
                  <animate attributeName="opacity" values=".4;1;.4" dur="2s" begin={`${gi*0.3 + i*0.15}s`} repeatCount="indefinite"/>
                </circle>
                {/* port label */}
                <text x="250" y="-2" textAnchor="end" fontFamily="Geist, Inter" fontSize="7" fontWeight="600" fill={grp.color} opacity=".7" letterSpacing=".1em">:443 TLS</text>
              </g>
            ))}
          </g>
        ))}

        {/* INNER CORE: 1С + Compas on right */}
        <g transform="translate(560 150)">
          {/* rack */}
          <rect x="0" y="0" width="280" height="160" rx="10" fill="url(#prm-core)" stroke="rgb(var(--primary))" strokeWidth="1.4" strokeOpacity=".7"/>
          <text x="14" y="16" fontFamily="Geist, Inter" fontSize="9" fontWeight="700" fill="rgb(var(--primary))" letterSpacing=".18em">ВАШ СЕРВЕР · READ-ONLY</text>

          {/* 1С block */}
          <g transform="translate(16 30)">
            <rect width="120" height="52" rx="6" fill="rgb(var(--card))" stroke="currentColor" strokeOpacity=".35"/>
            <rect x="0" y="0" width="120" height="14" rx="6" fill="rgb(var(--primary))" fillOpacity=".12"/>
            <circle cx="8" cy="7" r="2" fill="rgb(16 185 129)"><animate attributeName="opacity" values="1;.3;1" dur="1.4s" repeatCount="indefinite"/></circle>
            <circle cx="14" cy="7" r="2" fill="currentColor" opacity=".3"/>
            <text x="22" y="10" fontFamily="Geist, Inter" fontSize="9" fontWeight="700" fill="currentColor" opacity=".75">1С · УТ 11.5</text>
            <rect x="10" y="22" width="80" height="4" rx="1" fill="currentColor" opacity=".2"/>
            <rect x="10" y="30" width="100" height="4" rx="1" fill="currentColor" opacity=".2"/>
            <rect x="10" y="38" width="60" height="4" rx="1" fill="currentColor" opacity=".2"/>
          </g>

          {/* Arrow 1C → Compas */}
          <g transform="translate(136 54)">
            <path d="M0 0 L 20 0 M 14 -4 L 20 0 L 14 4" stroke="rgb(var(--primary))" strokeWidth="1.6" fill="none"/>
            <text x="10" y="-6" textAnchor="middle" fontFamily="Geist, Inter" fontSize="7" fontWeight="600" fill="rgb(var(--primary))" letterSpacing=".1em">READ ONLY</text>
          </g>

          {/* Compass block */}
          <g transform="translate(156 30)">
            <rect width="110" height="52" rx="6" fill="rgb(var(--primary))" fillOpacity=".14" stroke="rgb(var(--primary))" strokeOpacity=".9" strokeWidth="1.4"/>
            <circle cx="14" cy="14" r="6" fill="none" stroke="rgb(var(--primary))" strokeWidth="1.4"/>
            <path d="M14 8 L14 20 M8 14 L20 14" stroke="rgb(var(--primary))" strokeWidth="1"/>
            <circle cx="14" cy="14" r="1.5" fill="rgb(var(--primary))"/>
            <text x="26" y="12" fontFamily="Geist, Inter" fontSize="10" fontWeight="700" fill="rgb(var(--primary))">Компас</text>
            <text x="26" y="22" fontFamily="Geist, Inter" fontSize="8" fill="currentColor" opacity=".6">движок правил</text>
            <rect x="8" y="30" width="94" height="4" rx="1" fill="rgb(var(--primary))" opacity=".45"/>
            <rect x="8" y="38" width="72" height="4" rx="1" fill="rgb(var(--primary))" opacity=".3"/>
          </g>

          {/* status bar at bottom of rack */}
          <g transform="translate(16 100)">
            <text x="0" y="10" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="currentColor" opacity=".55" letterSpacing=".16em">БЕЗОПАСНОСТЬ</text>
            <g transform="translate(0 18)">
              {[
                {l:"TLS 1.3",       ok:true},
                {l:"Шифр. покоя",   ok:true},
                {l:"152-ФЗ",        ok:true},
                {l:"Аудит-лог",     ok:true},
                {l:"SSO · AD",      ok:true},
              ].map((c,i)=>(
                <g key={i} transform={`translate(${i*52} 0)`}>
                  <rect width="48" height="20" rx="3" fill="rgb(var(--card))" stroke="rgb(16 185 129)" strokeOpacity=".4"/>
                  <circle cx="6" cy="10" r="2.2" fill="rgb(16 185 129)">
                    <animate attributeName="opacity" values="1;.3;1" dur="1.6s" begin={`${i*0.2}s`} repeatCount="indefinite"/>
                  </circle>
                  <text x="12" y="13" fontFamily="Geist, Inter" fontSize="7.5" fontWeight="600" fill="currentColor" opacity=".85">{c.l}</text>
                </g>
              ))}
            </g>
          </g>
        </g>

        {/* CORE LABEL on top */}
        <g transform="translate(620 130)">
          <text x="0" y="0" fontFamily="Geist, Inter" fontSize="9" fontWeight="700" fill="currentColor" opacity=".55" letterSpacing=".18em">ЯДРО · READ ONLY · 1С НЕ МОДИФИЦИРУЕТСЯ</text>
        </g>

        {/* BUS — horizontal routing spine from firewall to rack */}
        <line x1="332" y1={cy} x2="560" y2={cy} stroke="rgb(var(--primary))" strokeOpacity=".4" strokeWidth="1.4" strokeDasharray="3 4"/>

        {/* PATHS & PACKETS */}
        {packets.map((p,i)=>{
          // compute endpoint y based on group
          const grp = external[p.group];
          const startY = grp.y + 6 + 12 + (i%3)*0; // first item
          // Path: external (x=290, y=startY+12) -> firewall (320, cy) -> rack (560, cy) -> target
          const sx = 290, sy = grp.y + 12 + 0;
          const fw1 = 326, fwy = cy;
          const rackX = 560, rackY = cy;
          const tX = 600;
          const tY = 180 + (i%2===0 ? 50 : 72);
          const pathIn = `M ${sx} ${sy} C 300 ${sy} 308 ${fwy} ${fw1} ${fwy} L ${rackX} ${rackY} C ${rackX+10} ${rackY} ${rackX+20} ${tY} ${tX} ${tY}`;
          const pathOut = `M ${tX} ${tY} C ${rackX+20} ${tY} ${rackX+10} ${rackY} ${rackX} ${rackY} L ${fw1} ${fwy} C 308 ${fwy} 300 ${sy} ${sx} ${sy}`;
          const path = p.dir === "out" ? pathOut : pathIn;

          return (
            <g key={i}>
              {/* ghost path */}
              <path d={pathIn} stroke={grp.color} strokeOpacity=".12" strokeWidth="1" fill="none"/>
              {/* moving packet */}
              <g>
                <g style={{filter:"url(#prm-soft)"}}>
                  <rect x="-26" y="-9" width="52" height="18" rx="3" fill={grp.color} fillOpacity=".95"/>
                </g>
                <rect x="-26" y="-9" width="52" height="18" rx="3" fill={grp.color}/>
                <text x="0" y="3" textAnchor="middle" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="white" letterSpacing=".04em">{p.label}</text>
                {p.tls && <circle cx="-19" cy="0" r="1.8" fill="white"/>}
                <animateMotion dur={`${p.dur}s`} begin={`${p.delay}s`} repeatCount="indefinite" path={path}
                  keyTimes="0;.4;.5;1" keyPoints="0;.48;.52;1" calcMode="linear"/>
                <animate attributeName="opacity" values="0;1;1;0" keyTimes="0;.08;.92;1" dur={`${p.dur}s`} begin={`${p.delay}s`} repeatCount="indefinite"/>
              </g>
              {/* firewall check stamp */}
              <g opacity="0">
                <animate attributeName="opacity" values="0;1;0" keyTimes="0;.05;.25" dur={`${p.dur}s`} begin={`${p.delay + p.dur*0.42}s`} repeatCount="indefinite"/>
                <rect x="306" y={fwy - 28} width="30" height="14" rx="2" fill="rgb(16 185 129)"/>
                <text x="321" y={fwy - 18} textAnchor="middle" fontFamily="Geist, Inter" fontSize="7" fontWeight="700" fill="white">TLS✓</text>
              </g>
            </g>
          );
        })}

        {/* Cert badge — top-right */}
        <g transform={`translate(${W-120} 34)`}>
          <g style={{transformOrigin:"0 0", animation:"bounceSlow 5s ease-in-out infinite"}}>
            <polygon points="0,-14 12,-7 12,7 0,14 -12,7 -12,-7" fill="rgb(var(--card))" stroke="rgb(var(--primary))" strokeWidth="1.6"/>
            <polygon points="0,-10 9,-5 9,5 0,10 -9,5 -9,-5" fill="rgb(var(--primary))" fillOpacity=".15"/>
            <path d="M-5 1 L-1 5 L6 -3" stroke="rgb(var(--primary))" strokeWidth="1.6" fill="none" strokeLinecap="round" strokeLinejoin="round"/>
          </g>
          <text x="20" y="-2" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="currentColor" opacity=".7" letterSpacing=".1em">152-ФЗ</text>
          <text x="20" y="10" fontFamily="Geist, Inter" fontSize="8" fontWeight="500" fill="currentColor" opacity=".5">соответствие</text>
        </g>

        {/* "blocked" attempt — dropped packet on firewall to show defense */}
        <g>
          <g opacity="0">
            <animate attributeName="opacity" values="0;1;1;0" keyTimes="0;.1;.5;.6" dur="7s" begin="3s" repeatCount="indefinite"/>
            <rect x="146" y={H-70} width="56" height="18" rx="3" fill="rgb(244 63 94)" fillOpacity=".9"/>
            <text x="174" y={H-58} textAnchor="middle" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="white">unknown</text>
          </g>
          <g opacity="0">
            <animate attributeName="opacity" values="0;1;0" keyTimes="0;.1;.4" dur="7s" begin="3.6s" repeatCount="indefinite"/>
            <g transform={`translate(310 ${H-70})`}>
              <line x1="0" y1="0" x2="12" y2="12" stroke="rgb(244 63 94)" strokeWidth="2"/>
              <line x1="0" y1="12" x2="12" y2="0" stroke="rgb(244 63 94)" strokeWidth="2"/>
            </g>
            <text x="280" y={H-78} textAnchor="middle" fontFamily="Geist, Inter" fontSize="8" fontWeight="700" fill="rgb(244 63 94)" letterSpacing=".08em">BLOCKED</text>
          </g>
        </g>

        {/* live traffic KPI — top strip */}
        <g transform="translate(560 50)">
          <rect width="280" height="34" rx="6" fill="rgb(var(--card))" stroke="currentColor" strokeOpacity=".2"/>
          {[
            {l:"RPS",       v:"12,4"},
            {l:"P99",       v:"184мс"},
            {l:"TLS OK",    v:"100%"},
            {l:"BLOCKED",   v:"3"},
          ].map((k,i)=>(
            <g key={i} transform={`translate(${i*70} 0)`}>
              <text x="12" y="12" fontFamily="Geist, Inter" fontSize="7" fontWeight="700" fill="currentColor" opacity=".5" letterSpacing=".14em">{k.l}</text>
              <text x="12" y="26" fontFamily="Geist, Inter" fontSize="12" fontWeight="600" fill="currentColor" className="tabular">{k.v}</text>
              {i<3 && <line x1="64" y1="8" x2="64" y2="26" stroke="currentColor" strokeOpacity=".15"/>}
            </g>
          ))}
        </g>

      </svg>
    </div>
  );
};

// 5) Week progress bar visual for rollout
const WeekProgress = ({ weeks, highlight=[], color="primary" }) => {
  const cls = color==="emerald" ? "bg-emerald-500" : "bg-primary";
  return (
    <div className="flex items-center gap-1">
      {Array.from({length: weeks}).map((_,i)=>{
        const hot = highlight.includes(i+1);
        return (
          <div key={i} className="flex-1 flex flex-col items-center gap-1">
            <div className={`h-2 w-full rounded-sm ${hot?cls:"bg-muted"}`}>
              {hot && <div className={`h-full w-full rounded-sm ${cls} opacity-60`} style={{animation:`glow 2.4s ease-in-out ${i*0.2}s infinite`}}/>}
            </div>
            <span className="text-[9px] tabular text-muted-foreground">Н{i+1}</span>
          </div>
        );
      })}
    </div>
  );
};

// 6) ROI ribbon — decorative numeric ribbon shown inside result card
const RoiRibbon = () => (
  <svg viewBox="0 0 200 40" className="absolute -top-4 -right-4 w-40 opacity-40" aria-hidden="true">
    <defs>
      <linearGradient id="roi-r" x1="0" x2="1">
        <stop offset="0" stopColor="rgb(16 185 129)" stopOpacity="0"/>
        <stop offset=".5" stopColor="rgb(16 185 129)" stopOpacity=".6"/>
        <stop offset="1" stopColor="rgb(16 185 129)" stopOpacity="0"/>
      </linearGradient>
    </defs>
    <path d="M0 20 Q 50 0 100 20 T 200 20" fill="none" stroke="url(#roi-r)" strokeWidth="2">
      <animate attributeName="d" values="M0 20 Q 50 0 100 20 T 200 20;M0 20 Q 50 40 100 20 T 200 20;M0 20 Q 50 0 100 20 T 200 20" dur="5s" repeatCount="indefinite"/>
    </path>
  </svg>
);

Object.assign(window, { ValueIcon, PainIcon, FeatureMark, PerimeterDiagram, WeekProgress, RoiRibbon });
