{"id":2962,"date":"2026-05-18T16:31:46","date_gmt":"2026-05-18T16:31:46","guid":{"rendered":"https:\/\/localhost\/digi\/?page_id=2962"},"modified":"2026-05-18T16:32:37","modified_gmt":"2026-05-18T16:32:37","slug":"energy-utilities","status":"publish","type":"page","link":"https:\/\/digi.alphanzo.com\/?page_id=2962","title":{"rendered":"Energy &amp; Utilities"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2962\" class=\"elementor elementor-2962\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0237eef e-con-full e-flex e-con e-parent\" data-id=\"0237eef\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8240c67 elementor-widget elementor-widget-html\" data-id=\"8240c67\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Energy & Utilities \u2014 DT Solutions<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Syne:wght@400;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,300&family=JetBrains+Mono:wght@300;400;500&display=swap\" rel=\"stylesheet\">\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\n<style>\n.eup*,.eup *::before,.eup *::after{box-sizing:border-box;margin:0;padding:0}\n.eup{\n  --c0:#010d1e;--c1:#020f24;--c2:#040c1a;\n  --el:#00b4ff;--el2:#00d4ff;--el3:#00e8ff;\n  --eg:rgba(0,180,255,.6);--ed:rgba(0,180,255,.07);--eb:rgba(0,180,255,.16);\n  --or:#ff6a1a;--or2:#ff8c3a;--og:rgba(255,106,26,.5);--ob:rgba(255,106,26,.2);\n  --pu:#8b56f0;--pu2:#a678ff;--pg:rgba(139,86,240,.4);\n  --wh:#e8f2ff;--w8:rgba(232,242,255,.8);--w6:rgba(232,242,255,.6);\n  --w3:rgba(232,242,255,.35);--w1:rgba(232,242,255,.12);\n  --ln:rgba(0,180,255,.09);--lb:rgba(0,180,255,.25);\n  background:var(--c0);color:var(--wh);font-family:'DM Sans',sans-serif;\n  overflow-x:hidden;line-height:1.65;position:relative\n}\n.eup-bg{position:fixed;inset:0;z-index:0;pointer-events:none}\n.eup-bg::before{content:'';position:absolute;inset:0;background:\n  radial-gradient(ellipse 1400px 800px at 72% 0%,rgba(0,80,200,.18),transparent 65%),\n  radial-gradient(ellipse 800px 600px at 0% 60%,rgba(100,40,200,.1),transparent 65%),\n  radial-gradient(ellipse 700px 500px at 95% 90%,rgba(255,100,20,.07),transparent 65%),\n  radial-gradient(ellipse 500px 400px at 50% 45%,rgba(0,180,255,.04),transparent 65%)}\n.eup-bg::after{content:'';position:absolute;inset:0;\n  background-image:linear-gradient(rgba(0,180,255,.028) 1px,transparent 1px),\n  linear-gradient(90deg,rgba(0,180,255,.028) 1px,transparent 1px);background-size:68px 68px}\n.eup section{position:relative;z-index:3}\n\n\/* \u2500\u2500 ANIMATED BACKGROUND ICONS \u2500\u2500 *\/\n.eup-icons{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden}\n.bgi{position:absolute;opacity:0;animation:bgiFloat linear infinite}\n@keyframes bgiFloat{\n  0%{opacity:0;transform:translateY(0) rotate(var(--r0)) scale(var(--sc))}\n  8%{opacity:var(--op)}\n  85%{opacity:var(--op)}\n  100%{opacity:0;transform:translateY(-120px) rotate(var(--r1)) scale(var(--sc))}\n}\n.bgi svg{display:block}\n\/* turbine spin blade animation *\/\n@keyframes turbSpin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n.bgi-turb-blades{transform-origin:50% 50%;animation:turbSpin var(--ts,4s) linear infinite}\n\/* pulse rings *\/\n@keyframes ringPulse{\n  0%{transform:scale(.6);opacity:.7}\n  100%{transform:scale(1.8);opacity:0}\n}\n.bgi-ring{animation:ringPulse 3s ease-out infinite}\n.bgi-ring2{animation:ringPulse 3s ease-out infinite .9s}\n.bgi-ring3{animation:ringPulse 3s ease-out infinite 1.8s}\n\/* bolt flash *\/\n@keyframes boltFlash{0%,100%{opacity:.18}50%{opacity:.7}}\n.bgi-bolt{animation:boltFlash var(--bf,2.5s) ease-in-out infinite}\n\/* orbit dot *\/\n@keyframes orbitDot{from{transform:rotate(0deg) translateX(22px) rotate(0deg)}to{transform:rotate(360deg) translateX(22px) rotate(-360deg)}}\n.bgi-orbit{transform-origin:50% 50%;animation:orbitDot var(--od,5s) linear infinite}\n\n\/* \u2500\u2500 EYEBROW \/ HEADINGS \u2500\u2500 *\/\n.eup-eye{display:flex;align-items:center;gap:14px;margin-bottom:22px}\n.eup-eye-line{width:40px;height:1px;background:linear-gradient(90deg,var(--el),var(--el2));box-shadow:0 0 10px var(--eg)}\n.eup-eye-txt{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.22em;color:var(--el);text-transform:uppercase}\n.eup-h2{font-family:'Syne',sans-serif;font-size:clamp(32px,3.5vw,54px);font-weight:800;letter-spacing:-.025em;line-height:1.08;margin-bottom:20px}\n.eup-h2 em{font-style:normal;color:var(--el)}\n.eup-sub{font-size:15px;line-height:1.82;color:var(--w3);max-width:560px;margin-bottom:60px}\n.eup-divider{height:1px;margin:0 80px;position:relative;z-index:3;\n  background:linear-gradient(90deg,transparent,var(--eb) 12%,rgba(0,212,255,.25) 40%,var(--ob) 65%,var(--eb) 88%,transparent)}\n\n\/* \u2500\u2500 REVEAL \u2500\u2500 *\/\n.iv{opacity:0;transform:translateY(32px);transition:opacity .9s cubic-bezier(.16,1,.3,1),transform .9s cubic-bezier(.16,1,.3,1)}\n.iv.vis{opacity:1;transform:none}\n.iv.d1{transition-delay:.08s}.iv.d2{transition-delay:.18s}.iv.d3{transition-delay:.28s}\n.iv.d4{transition-delay:.38s}.iv.d5{transition-delay:.48s}\n\n\/* \u2500\u2500 BUTTONS \u2500\u2500 *\/\n.btn-p{display:inline-flex;align-items:center;gap:10px;padding:16px 36px;background:var(--el);color:var(--c0);font-family:'Syne',sans-serif;font-weight:700;font-size:12.5px;letter-spacing:.1em;text-transform:uppercase;border:none;cursor:pointer;text-decoration:none;position:relative;overflow:hidden;transition:all .3s;box-shadow:0 0 32px rgba(0,180,255,.5),0 0 80px rgba(0,180,255,.18)}\n.btn-p::after{content:'';position:absolute;top:0;left:-130%;width:80%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent);animation:shine 3s infinite 2s}\n.btn-p:hover{background:var(--wh);box-shadow:0 0 55px rgba(0,180,255,.7),0 0 120px rgba(0,180,255,.25);transform:translateY(-3px)}\n.btn-g{display:inline-flex;align-items:center;gap:10px;padding:16px 32px;border:1px solid var(--eb);color:var(--el);font-family:'Syne',sans-serif;font-weight:600;font-size:12px;letter-spacing:.09em;text-transform:uppercase;background:transparent;cursor:pointer;transition:all .3s}\n.btn-g:hover{background:var(--ed);border-color:var(--el);box-shadow:0 0 26px rgba(0,180,255,.22);transform:translateY(-2px)}\n@keyframes shine{to{left:230%}}\n@keyframes borderFlow{0%{background-position:0% 0%}100%{background-position:200% 0%}}\n@keyframes riseIn{from{opacity:0;transform:translateY(28px)}to{opacity:1;transform:none}}\n@keyframes fadeScale{from{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}\n@keyframes pulseGlow{0%,100%{box-shadow:0 0 20px rgba(0,180,255,.25),0 0 60px rgba(0,180,255,.08)}50%{box-shadow:0 0 50px rgba(0,180,255,.5),0 0 120px rgba(0,180,255,.2)}}\n@keyframes canvasFadeIn{from{opacity:0}to{opacity:1}}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 HERO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-hero{\n  min-height:100vh;display:grid;\n  grid-template-columns:1fr 1.15fr;\n  align-items:center;padding:100px 80px 80px;gap:0;\n  position:relative;overflow:hidden\n}\n#eup-hero::before{content:'';position:absolute;top:50%;left:0;right:0;height:1px;\n  background:linear-gradient(90deg,transparent,rgba(0,180,255,.08) 25%,rgba(139,86,240,.07) 60%,transparent);\n  transform:translateY(-50%);pointer-events:none}\n.hero-left{padding-right:48px;z-index:2;position:relative}\n.hero-tag{display:inline-flex;align-items:center;gap:12px;margin-bottom:34px;opacity:0;animation:riseIn .9s cubic-bezier(.16,1,.3,1) .1s forwards}\n.hero-tag-line{width:44px;height:1px;background:linear-gradient(90deg,var(--el),var(--el2));box-shadow:0 0 10px var(--eg)}\n.hero-tag-txt{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.22em;color:var(--el);text-transform:uppercase}\n.hero-h1{font-family:'Syne',sans-serif;font-size:clamp(56px,5.8vw,88px);font-weight:800;letter-spacing:-.03em;line-height:.95;margin-bottom:30px;opacity:0;animation:riseIn .9s cubic-bezier(.16,1,.3,1) .22s forwards}\n.hero-h1 .ln1,.hero-h1 .ln2{display:block;color:var(--wh)}\n.hero-h1 .acc{color:transparent;-webkit-text-stroke:1.5px var(--el);text-shadow:0 0 60px rgba(0,180,255,.45)}\n.hero-headline{font-size:18px;font-weight:400;color:var(--w6);line-height:1.68;margin-bottom:16px;max-width:500px;opacity:0;animation:riseIn .9s cubic-bezier(.16,1,.3,1) .38s forwards}\n.hero-subtext{font-size:14px;line-height:1.82;color:var(--w3);max-width:480px;margin-bottom:46px;opacity:0;animation:riseIn .9s cubic-bezier(.16,1,.3,1) .5s forwards}\n.kp-wrap{margin-bottom:52px;opacity:0;animation:riseIn .9s cubic-bezier(.16,1,.3,1) .62s forwards}\n.kp{display:grid;grid-template-columns:52px 1fr;gap:20px;align-items:start;padding:20px 0;border-bottom:1px solid var(--ln);position:relative;transition:padding-left .3s;cursor:default}\n.kp:first-child{border-top:1px solid var(--ln)}\n.kp::before{content:'';position:absolute;left:0;top:0;width:2px;height:0;background:linear-gradient(180deg,var(--el),var(--el2));box-shadow:0 0 10px var(--eg);transition:height .4s cubic-bezier(.16,1,.3,1)}\n.kp:hover::before{height:100%}.kp:hover{padding-left:8px}\n.kp-icon{width:44px;height:44px;border:1px solid var(--eb);display:flex;align-items:center;justify-content:center;transition:all .3s;flex-shrink:0}\n.kp:hover .kp-icon{background:rgba(0,180,255,.1);border-color:var(--el);box-shadow:0 0 20px rgba(0,180,255,.35)}\n.kp-icon svg{width:18px;height:18px;stroke:var(--el);fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}\n.kp-body h4{font-family:'Syne',sans-serif;font-size:14px;font-weight:700;color:var(--wh);margin-bottom:4px;letter-spacing:-.01em}\n.kp-body p{font-size:12.5px;color:var(--w3);line-height:1.65}\n.hero-cta{display:flex;align-items:center;gap:18px;opacity:0;animation:riseIn .9s cubic-bezier(.16,1,.3,1) .76s forwards}\n\n\/* HERO 3D \u2014 LARGE *\/\n.hero-right{\n  position:relative;display:flex;align-items:center;justify-content:center;\n  min-height:820px;margin-right:-80px;\n}\n#hero-3d{\n  width:100%;height:820px;display:block;\n  opacity:0;animation:canvasFadeIn 1.6s cubic-bezier(.16,1,.3,1) .25s forwards;\n}\n.canvas-lbl{\n  position:absolute;bottom:24px;left:50%;transform:translateX(-50%);\n  font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.2em;\n  color:rgba(0,180,255,.4);text-transform:uppercase;pointer-events:none;white-space:nowrap;\n  padding:6px 16px;border:1px solid rgba(0,180,255,.12);background:rgba(0,10,30,.5);\n  backdrop-filter:blur(8px)\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CHALLENGES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-challenges{padding:110px 80px;background:linear-gradient(180deg,var(--c0),rgba(4,12,28,.95))}\n.chal-header{display:grid;grid-template-columns:1fr 1fr;gap:70px;align-items:end;margin-bottom:64px}\n.chal-header .eup-sub{margin-bottom:0}\n.chal-grid{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:rgba(0,180,255,.07)}\n.cc{background:var(--c2);padding:52px 48px;position:relative;overflow:hidden;transition:background .4s;cursor:default}\n.cc::before{content:'';position:absolute;top:0;left:0;width:100%;height:3px;background:var(--el);transform:scaleX(0);transform-origin:left;transition:transform .5s cubic-bezier(.16,1,.3,1);box-shadow:0 0 14px var(--eg)}\n.cc:nth-child(even)::before{background:var(--or)}\n.cc:hover::before{transform:scaleX(1)}.cc:hover{background:rgba(0,22,52,.95)}\n.cc::after{content:'';position:absolute;width:240px;height:240px;border-radius:50%;background:radial-gradient(circle,rgba(0,180,255,.05),transparent 70%);bottom:-80px;right:-80px;transition:all .5s;pointer-events:none}\n.cc:nth-child(even)::after{background:radial-gradient(circle,rgba(255,106,26,.05),transparent 70%)}\n.cc:hover::after{width:380px;height:380px}\n.cc-icon{width:52px;height:52px;border:1px solid var(--eb);display:flex;align-items:center;justify-content:center;margin-bottom:28px;transition:all .3s}\n.cc:nth-child(even) .cc-icon{border-color:var(--ob)}\n.cc:hover .cc-icon{border-color:var(--el);box-shadow:0 0 22px rgba(0,180,255,.35);background:rgba(0,180,255,.08)}\n.cc:nth-child(even):hover .cc-icon{border-color:var(--or);box-shadow:0 0 22px rgba(255,106,26,.35);background:rgba(255,106,26,.08)}\n.cc-icon svg{width:22px;height:22px;stroke:var(--el);fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}\n.cc:nth-child(even) .cc-icon svg{stroke:var(--or)}\n.cc-tag{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.18em;color:var(--el);margin-bottom:18px;display:block}\n.cc:nth-child(even) .cc-tag{color:var(--or)}\n.cc h3{font-family:'Syne',sans-serif;font-size:22px;font-weight:700;letter-spacing:-.02em;margin-bottom:14px;line-height:1.2}\n.cc p{font-size:14px;line-height:1.78;color:var(--w3)}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTOR \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-sector{padding:110px 80px}\n.sector-wrap{display:grid;grid-template-columns:1fr 560px;gap:80px;align-items:start}\n.sector-3d-panel{position:sticky;top:80px}\n#sector-3d{\n  width:100%;height:580px;display:block;\n  border:1px solid var(--eb);background:rgba(0,8,24,.5);\n  box-shadow:0 0 60px rgba(0,180,255,.08),inset 0 0 40px rgba(0,180,255,.03)\n}\n.s3d-lbl{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:.16em;color:rgba(0,180,255,.42);text-align:center;margin-top:14px;text-transform:uppercase;padding:6px 14px;border:1px solid rgba(0,180,255,.1);background:rgba(0,8,24,.6);display:inline-block;left:50%;position:relative;transform:translateX(-50%)}\n.eup-tabs{display:flex;gap:0;margin-bottom:50px;border-bottom:1px solid var(--ln)}\n.eup-tab{padding:13px 30px;background:transparent;border:none;color:var(--w3);font-family:'Syne',sans-serif;font-size:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;cursor:pointer;position:relative;transition:color .3s}\n.eup-tab::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:linear-gradient(90deg,var(--el),var(--el2));box-shadow:0 0 10px var(--eg);transform:scaleX(0);transition:transform .3s cubic-bezier(.16,1,.3,1)}\n.eup-tab.on{color:var(--el)}.eup-tab.on::after{transform:scaleX(1)}\n.eup-tab:hover:not(.on){color:var(--w6)}\n.eup-spanel{display:none}.eup-spanel.on{display:block;animation:sIn .45s cubic-bezier(.16,1,.3,1)}\n@keyframes sIn{from{opacity:0;transform:translateX(-18px)}to{opacity:1;transform:none}}\n.cov-list{display:flex;flex-direction:column}\n.cov-item{display:grid;grid-template-columns:52px 1fr;gap:22px;align-items:start;padding:26px 0;border-bottom:1px solid var(--ln);position:relative;transition:all .3s;cursor:default}\n.cov-item:first-child{border-top:1px solid var(--ln)}.cov-item:hover{padding-left:10px}\n.cov-item::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:linear-gradient(180deg,var(--el),var(--pu));opacity:0;transition:opacity .3s;box-shadow:0 0 10px var(--eg)}\n.cov-item:hover::before{opacity:1}\n.cov-icon{width:44px;height:44px;border:1px solid var(--eb);display:flex;align-items:center;justify-content:center;transition:all .3s;flex-shrink:0}\n.cov-item:hover .cov-icon{border-color:var(--el);background:rgba(0,180,255,.08);box-shadow:0 0 16px rgba(0,180,255,.28)}\n.cov-icon svg{width:18px;height:18px;stroke:var(--el);fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}\n.cov-body h4{font-family:'Syne',sans-serif;font-size:15.5px;font-weight:700;letter-spacing:-.015em;margin-bottom:6px}\n.cov-body p{font-size:13px;line-height:1.72;color:var(--w3)}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CAPABILITIES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-capabilities{padding:110px 80px;background:rgba(1,10,22,.8)}\n.cap-layout{display:grid;grid-template-columns:420px 1fr;gap:90px;align-items:start}\n.cap-left{position:sticky;top:90px}\n#cap-3d{\n  width:100%;height:420px;display:block;margin-top:40px;\n  border:1px solid var(--eb);background:rgba(0,8,24,.4);\n  box-shadow:0 0 50px rgba(0,180,255,.07),inset 0 0 30px rgba(0,180,255,.03)\n}\n.cap-list{display:flex;flex-direction:column}\n.cap-row{display:grid;grid-template-columns:56px 1fr 28px;gap:22px;align-items:start;padding:34px 0;border-bottom:1px solid var(--ln);cursor:default;transition:padding .3s;position:relative}\n.cap-row:first-child{border-top:1px solid var(--ln)}\n.cap-row::before{content:'';position:absolute;left:0;top:0;height:100%;width:2px;background:linear-gradient(180deg,var(--el),var(--pu));transform:scaleY(0);transition:transform .45s cubic-bezier(.16,1,.3,1);box-shadow:0 0 12px rgba(0,180,255,.55)}\n.cap-row:hover::before{transform:scaleY(1)}.cap-row:hover{padding-left:18px;background:rgba(0,30,70,.25)}\n.cap-badge{width:48px;height:48px;border:1px solid var(--eb);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s}\n.cap-badge svg{width:20px;height:20px;stroke:var(--el);fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;transition:stroke .3s}\n.cap-row:hover .cap-badge{background:var(--el);border-color:var(--el);box-shadow:0 0 28px rgba(0,180,255,.6)}\n.cap-row:hover .cap-badge svg{stroke:var(--c0)}\n.cap-body h3{font-family:'Syne',sans-serif;font-size:18px;font-weight:700;letter-spacing:-.015em;margin-bottom:7px}\n.cap-body p{font-size:13.5px;line-height:1.74;color:var(--w3)}\n.cap-arr{color:var(--el);font-size:18px;opacity:0;transition:opacity .3s;padding-top:14px}\n.cap-row:hover .cap-arr{opacity:1}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TRANSFORMATION \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-transformation{padding:110px 80px}\n.trans-top{display:grid;grid-template-columns:1fr 1fr;gap:80px;align-items:center;margin-bottom:80px}\n#trans-3d{\n  width:100%;height:400px;display:block;\n  border:1px solid var(--eb);background:rgba(0,8,24,.4);\n  box-shadow:0 0 50px rgba(0,180,255,.07)\n}\n.eup-pathway{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:rgba(0,180,255,.07);border:1px solid rgba(0,180,255,.07)}\n.pnode{background:var(--c2);padding:38px 30px;position:relative;overflow:hidden;transition:background .35s;cursor:default}\n.pnode:hover{background:rgba(0,22,50,.92)}\n.pnode::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;width:0;background:linear-gradient(90deg,var(--el),var(--pu));transition:width .5s cubic-bezier(.16,1,.3,1);box-shadow:0 0 12px var(--eg)}\n.pnode:hover::before{width:100%}\n.pnode-icon{width:40px;height:40px;border:1px solid var(--eb);display:flex;align-items:center;justify-content:center;margin-bottom:20px;transition:all .3s}\n.pnode:nth-child(even) .pnode-icon{border-color:var(--ob)}\n.pnode:hover .pnode-icon{background:rgba(0,180,255,.1);border-color:var(--el);box-shadow:0 0 18px rgba(0,180,255,.32)}\n.pnode-icon svg{width:18px;height:18px;stroke:var(--el);fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}\n.pnode:nth-child(even) .pnode-icon svg{stroke:var(--or)}\n.pnode-n{font-family:'JetBrains Mono',monospace;font-size:9.5px;letter-spacing:.14em;color:var(--el);margin-bottom:12px;display:block}\n.pnode:nth-child(even) .pnode-n{color:var(--or)}\n.pnode h3{font-family:'Syne',sans-serif;font-size:15.5px;font-weight:700;letter-spacing:-.01em;margin-bottom:10px;line-height:1.25}\n.pnode p{font-size:12.5px;line-height:1.72;color:var(--w3)}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 WHY \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-why{padding:110px 80px;background:rgba(2,8,20,.9);position:relative}\n#eup-why::before{content:'';position:absolute;top:0;left:80px;right:80px;height:1px;background:linear-gradient(90deg,transparent,var(--eb),rgba(139,86,240,.22),var(--eb),transparent)}\n.why-layout{display:grid;grid-template-columns:460px 1fr;gap:90px;align-items:start}\n.why-left{position:sticky;top:100px}\n.why-big{font-family:'Syne',sans-serif;font-size:clamp(26px,2.7vw,40px);font-weight:800;letter-spacing:-.025em;line-height:1.18;margin-bottom:24px}\n.why-big em{font-style:normal;color:var(--el)}.why-big span{color:var(--or)}\n.why-sub{font-size:14.5px;line-height:1.82;color:var(--w3);margin-bottom:40px}\n.stats{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--ln);border:1px solid var(--ln)}\n.stat{background:var(--c2);padding:26px 22px;transition:background .3s}.stat:hover{background:rgba(0,20,50,.95)}\n.stat-val{font-family:'Syne',sans-serif;font-size:34px;font-weight:800;color:var(--el);letter-spacing:-.02em;margin-bottom:5px;text-shadow:0 0 22px rgba(0,180,255,.45)}\n.stat-val.org{color:var(--or);text-shadow:0 0 22px rgba(255,106,26,.45)}\n.stat-val.pur{color:var(--pu);text-shadow:0 0 22px rgba(139,86,240,.45)}\n.stat-label{font-size:12px;color:var(--w3);line-height:1.45}\n.diff-list{display:flex;flex-direction:column}\n.diff{padding:30px 0;border-bottom:1px solid var(--ln);position:relative;transition:all .35s;cursor:default}\n.diff:first-child{border-top:1px solid var(--ln)}.diff:hover{padding-left:14px}\n.diff-hd{display:flex;align-items:center;gap:16px;margin-bottom:12px}\n.diff-icon{width:36px;height:36px;border:1px solid var(--eb);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .3s}\n.diff:hover .diff-icon{background:var(--el);border-color:var(--el);box-shadow:0 0 20px rgba(0,180,255,.55)}\n.diff-icon svg{width:14px;height:14px;stroke:var(--el);fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;transition:stroke .3s}\n.diff:hover .diff-icon svg{stroke:var(--c0)}\n.diff h3{font-family:'Syne',sans-serif;font-size:16px;font-weight:700;letter-spacing:-.01em}\n.diff p{font-size:13.5px;line-height:1.75;color:var(--w3);padding-left:52px}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CTA \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n#eup-cta{padding:110px 80px;position:relative;overflow:hidden}\n#eup-cta::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 1200px 600px at 50% 90%,rgba(0,100,200,.13),transparent 70%);pointer-events:none}\n.cta-box{border:1px solid rgba(0,180,255,.24);padding:90px;position:relative;overflow:hidden;background:linear-gradient(135deg,rgba(0,18,50,.9),rgba(2,8,20,.97));min-height:520px;display:flex;align-items:center}\n.cta-box::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,var(--pu),var(--el),var(--el2),var(--or),var(--el),var(--pu));background-size:200% 100%;animation:borderFlow 4s linear infinite;box-shadow:0 0 24px rgba(0,180,255,.45)}\n\n\/* CTA 3D \u2014 FULL RIGHT HALF *\/\n.cta-3d-wrap{position:absolute;right:0;top:0;bottom:0;width:55%;pointer-events:none;overflow:hidden}\n#cta-3d{width:100%;height:100%;display:block}\n\/* CTA left mask \u2014 gradient fade so text stays readable *\/\n.cta-3d-wrap::before{content:'';position:absolute;left:0;top:0;bottom:0;width:45%;background:linear-gradient(90deg,rgba(0,18,50,.9),transparent);z-index:2;pointer-events:none}\n\n.cta-content{position:relative;z-index:4;max-width:620px}\n.cta-h2{font-family:'Syne',sans-serif;font-size:clamp(30px,3.2vw,50px);font-weight:800;letter-spacing:-.025em;line-height:1.1;margin-bottom:26px}\n.cta-h2 em{font-style:normal;color:var(--el)}\n.cta-sub{font-size:15px;line-height:1.8;color:var(--w3);margin-bottom:50px;max-width:520px}\n.cta-btns{display:flex;align-items:center;gap:22px;margin-bottom:50px;flex-wrap:wrap}\n.cta-closing{padding:26px 0 0;border-top:1px solid var(--ln);font-size:13px;color:var(--w3);font-style:italic;line-height:1.72}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 RESPONSIVE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n@media(max-width:1200px){\n  .hero-right{margin-right:-52px}\n  #hero-3d{height:700px}.hero-right{min-height:700px}\n  .sector-wrap{grid-template-columns:1fr 460px}\n  #sector-3d{height:500px}\n}\n@media(max-width:1100px){\n  #eup-hero{grid-template-columns:1fr;padding:90px 52px 60px;min-height:auto}\n  .hero-left{padding-right:0}.hero-right{min-height:500px;margin-top:40px;margin-right:0}\n  #hero-3d{height:500px}\n  .sector-wrap,.cap-layout,.why-layout{grid-template-columns:1fr}\n  .sector-3d-panel{position:static}\n  #sector-3d{height:460px}\n  .cap-left{position:static}\n  #cap-3d{height:360px}\n  .why-left{position:static}\n  .chal-header{grid-template-columns:1fr;gap:28px}\n  .trans-top{grid-template-columns:1fr;gap:40px}\n  #trans-3d{height:320px}\n  #eup-challenges,#eup-sector,#eup-capabilities,#eup-transformation,#eup-why,#eup-cta{padding-left:52px;padding-right:52px}\n  .eup-divider{margin:0 52px}\n  #eup-why::before{left:52px;right:52px}\n  .eup-pathway{grid-template-columns:repeat(2,1fr)}\n  .cta-box{padding:60px 48px;min-height:auto}\n  .cta-3d-wrap{display:none}\n}\n@media(max-width:700px){\n  #eup-hero,#eup-challenges,#eup-sector,#eup-capabilities,#eup-transformation,#eup-why,#eup-cta{padding-left:24px;padding-right:24px;padding-top:72px;padding-bottom:72px}\n  .eup-divider{margin:0 24px}\n  #eup-why::before{left:24px;right:24px}\n  .chal-grid,.eup-pathway{grid-template-columns:1fr}\n  .cta-box{padding:44px 28px}\n  #hero-3d{height:360px}.hero-right{min-height:360px}\n  #sector-3d{height:360px}\n  #cap-3d{height:280px}\n  #trans-3d{height:260px}\n}\n@media(prefers-reduced-motion:reduce){\n  .eup *,.eup *::before,.eup *::after{animation-duration:.001ms!important;transition-duration:.001ms!important}\n  .iv{opacity:1;transform:none}\n}\n<\/style>\n<\/head>\n<body>\n<div class=\"eup\">\n<div class=\"eup-bg\" aria-hidden=\"true\"><\/div>\n\n<!-- Animated background icons -->\n<div class=\"eup-icons\" aria-hidden=\"true\" id=\"eup-icons\"><\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 HERO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<section id=\"eup-hero\">\n  <div class=\"hero-left\">\n    <div class=\"hero-tag\"><div class=\"hero-tag-line\"><\/div><span class=\"hero-tag-txt\">Energy &amp; Utilities<\/span><\/div>\n    <h1 class=\"hero-h1\"><span class=\"ln1\">Energy<\/span><span class=\"ln2\">&amp; <span class=\"acc\">Utilities<\/span><\/span><\/h1>\n    <p class=\"hero-headline\">Support energy and utility organizations across grid modernization, infrastructure delivery, and service reliability priorities.<\/p>\n    <p class=\"hero-subtext\">DT Solutions supports energy providers, utility operators, infrastructure teams, and energy-transition programs with talent, delivery, and advisory capacity across environments where service reliability, field execution, regulatory obligations, asset performance, outage readiness, and modernization work must remain aligned.<\/p>\n    <div class=\"kp-wrap\">\n      <div class=\"kp\"><div class=\"kp-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M10 2L10 12M6 5L14 5M4 10L16 10M3 14L6 14M14 14L17 14\"\/><\/svg><\/div><div class=\"kp-body\"><h4>Asset-intensive utility environments<\/h4><p>Capacity aligned to electricity, gas, water, infrastructure, field operations, maintenance planning, customer operations, and enterprise support functions.<\/p><\/div><\/div>\n      <div class=\"kp\"><div class=\"kp-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M13 2L6 11L10 11L8 18L15 9L11 9Z\"\/><\/svg><\/div><div class=\"kp-body\"><h4>Modernization &amp; energy transition delivery<\/h4><p>Support for grid modernization, clean energy initiatives, digital utility platforms, data programs, system upgrades, and infrastructure improvement work.<\/p><\/div><\/div>\n      <div class=\"kp\"><div class=\"kp-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M11 2L19 5.5L19 11C19 15.5 11 20 11 20C11 20 3 15.5 3 11L3 5.5Z\"\/><path d=\"M8 11L10.5 13.5L14 8.5\"\/><\/svg><\/div><div class=\"kp-body\"><h4>Reliability-focused operations support<\/h4><p>Delivery models designed for organizations balancing service reliability, outage response, capital programs, regulatory reporting, and evolving energy demand.<\/p><\/div><\/div>\n    <\/div>\n    <div class=\"hero-cta\"><a href=\"#eup-sector\" class=\"btn-p\">Explore Sector Coverage<\/a><\/div>\n  <\/div>\n  <div class=\"hero-right\">\n    <canvas id=\"hero-3d\"><\/canvas>\n    <div class=\"canvas-lbl\">&#9632;&nbsp; LIVE ENERGY GRID \u2014 3D INFRASTRUCTURE NETWORK &nbsp;&#9632;<\/div>\n  <\/div>\n<\/section>\n\n<div class=\"eup-divider\"><\/div>\n\n<!-- CHALLENGES -->\n<section id=\"eup-challenges\">\n  <div class=\"chal-header\">\n    <div class=\"iv\"><div class=\"eup-eye\"><div class=\"eup-eye-line\"><\/div><span class=\"eup-eye-txt\">Operating Pressures<\/span><\/div><h2 class=\"eup-h2\">Energy &amp; Utilities Challenges Across <em>Reliability<\/em>, Infrastructure, and Modernization<\/h2><\/div>\n    <div class=\"iv d2\"><p class=\"eup-sub\" style=\"margin-bottom:0\">Energy and utility organizations are managing aging infrastructure, rising demand, field-service complexity, regulatory expectations, and modernization programs while maintaining dependable service across critical operating environments.<\/p><\/div>\n  <\/div>\n  <div class=\"chal-grid\">\n    <div class=\"cc iv d1\"><div class=\"cc-icon\"><svg viewBox=\"0 0 22 22\"><path d=\"M11 2L19 5.5L19 11C19 15.5 11 20 11 20C11 20 3 15.5 3 11L3 5.5Z\"\/><path d=\"M8 11L10.5 13.5L14 8.5\"\/><\/svg><\/div><span class=\"cc-tag\">CHALLENGE \u2014 01<\/span><h3>Reliability expectations continue to rise<\/h3><p>Customers, communities, regulators, and business users expect dependable service even as demand patterns, outage risks, aging assets, and environmental pressures become harder to predict.<\/p><\/div>\n    <div class=\"cc iv d2\"><div class=\"cc-icon\"><svg viewBox=\"0 0 22 22\"><circle cx=\"11\" cy=\"11\" r=\"3\"\/><circle cx=\"3\" cy=\"5\" r=\"2\"\/><circle cx=\"19\" cy=\"5\" r=\"2\"\/><circle cx=\"3\" cy=\"17\" r=\"2\"\/><circle cx=\"19\" cy=\"17\" r=\"2\"\/><path d=\"M5.5 5L8.5 9M13.5 9L17.5 5M5.5 17L8.5 13M13.5 13L17.5 17\"\/><\/svg><\/div><span class=\"cc-tag\">CHALLENGE \u2014 02<\/span><h3>Infrastructure programs require coordinated execution<\/h3><p>Capital projects, maintenance programs, grid upgrades, asset inspections, and service expansion efforts depend on coordination across engineering, field operations, procurement, planning, and customer-facing teams.<\/p><\/div>\n    <div class=\"cc iv d3\"><div class=\"cc-icon\"><svg viewBox=\"0 0 22 22\"><path d=\"M14 2L7 12L11 12L9 20L16 10L12 10Z\"\/><\/svg><\/div><span class=\"cc-tag\">CHALLENGE \u2014 03<\/span><h3>Energy transition is changing operating requirements<\/h3><p>Clean energy programs, distributed energy resources, electrification, grid modernization, and digital utility platforms require new skills, stronger data foundations, and practical execution capacity.<\/p><\/div>\n    <div class=\"cc iv d4\"><div class=\"cc-icon\"><svg viewBox=\"0 0 22 22\"><circle cx=\"5\" cy=\"6\" r=\"2\"\/><circle cx=\"17\" cy=\"6\" r=\"2\"\/><circle cx=\"11\" cy=\"17\" r=\"2\"\/><path d=\"M7 6L15 6M5 8L5 13Q5 17 9 17M17 8L17 13Q17 17 13 17\"\/><\/svg><\/div><span class=\"cc-tag\">CHALLENGE \u2014 04<\/span><h3>Field and enterprise teams must stay connected<\/h3><p>Utility work depends on accurate communication between control rooms, asset teams, field crews, planners, customer operations, technology groups, and leadership during routine work and urgent events.<\/p><\/div>\n  <\/div>\n<\/section>\n\n<div class=\"eup-divider\"><\/div>\n\n<!-- SECTOR -->\n<section id=\"eup-sector\">\n  <div class=\"sector-wrap\">\n    <div>\n      <div class=\"iv\"><div class=\"eup-eye\"><div class=\"eup-eye-line\"><\/div><span class=\"eup-eye-txt\">Sector Coverage<\/span><\/div><h2 class=\"eup-h2\">Sector Coverage Across Energy and <em>Utility Environments<\/em><\/h2><p class=\"eup-sub\">DT Solutions works across the utility operating areas where infrastructure reliability, field execution, customer service, regulatory reporting, asset performance, and modernization priorities intersect.<\/p><\/div>\n      <div class=\"eup-tabs iv d1\">\n        <button class=\"eup-tab on\" data-p=\"uo\">Utility Operations<\/button>\n        <button class=\"eup-tab\" data-p=\"et\">Energy Transition<\/button>\n        <button class=\"eup-tab\" data-p=\"if\">Infrastructure &amp; Field<\/button>\n      <\/div>\n      <div class=\"eup-spanel on\" id=\"sp-uo\"><div class=\"cov-list\">\n        <div class=\"cov-item iv d1\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"10\" r=\"3\"\/><path d=\"M10 2v2M10 16v2M2 10h2M16 10h2M4.22 4.22l1.42 1.42M14.36 14.36l1.42 1.42M4.22 15.78l1.42-1.42M14.36 5.64l1.42-1.42\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Electricity, Gas &amp; Water Utility Operations<\/h4><p>Service operations, asset coordination, maintenance planning, customer operations, operational reporting, and day-to-day utility support functions.<\/p><\/div><\/div>\n        <div class=\"cov-item iv d2\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><rect x=\"2\" y=\"10\" width=\"16\" height=\"8\" rx=\"1\"\/><path d=\"M10 2L10 10M6 5L14 5\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Grid Operations &amp; Reliability Programs<\/h4><p>Capacity for teams managing grid performance, outage readiness, control-room coordination, reliability planning, system monitoring, and service restoration workflows.<\/p><\/div><\/div>\n        <div class=\"cov-item iv d3\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"8\" r=\"3\"\/><path d=\"M4 18C4 14 16 14 16 18\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Customer Operations &amp; Service Support<\/h4><p>Support across billing operations, case handling, service requests, issue resolution, field-service coordination, customer communications, and utility contact-centre environments.<\/p><\/div><\/div>\n        <div class=\"cov-item iv d4\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><rect x=\"3\" y=\"3\" width=\"14\" height=\"14\" rx=\"1\"\/><path d=\"M6 7h8M6 10h6M6 13h4\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Regulatory Reporting &amp; Operational Documentation<\/h4><p>Assistance with utility reporting cycles, compliance documentation, performance tracking, operational records, audit preparation, and evidence-based reporting needs.<\/p><\/div><\/div>\n      <\/div><\/div>\n      <div class=\"eup-spanel\" id=\"sp-et\"><div class=\"cov-list\">\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M10 2L10 18M4 8L10 2L16 8\"\/><path d=\"M6 18L14 18\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Grid Modernization &amp; Digital Utility Programs<\/h4><p>Support for smart grid initiatives, digital utility platforms, system upgrades, automation programs, data environments, and technology-enabled utility modernization.<\/p><\/div><\/div>\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M13 2L6 11L10 11L8 18L15 9L11 9Z\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Clean Energy &amp; Electrification Initiatives<\/h4><p>Capacity for renewable integration, electrification planning, demand response, distributed energy resources, grid-edge programs, and evolving energy-use patterns.<\/p><\/div><\/div>\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M4 14L8 10L11 13L15 7L18 10\"\/><path d=\"M3 17L17 17\" opacity=\".4\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Data, Analytics &amp; Energy Systems Support<\/h4><p>Coverage for energy data workflows, operational dashboards, forecasting support, reporting environments, asset insights, and performance visibility across utility programs.<\/p><\/div><\/div>\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><rect x=\"3\" y=\"3\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"11\" y=\"3\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"3\" y=\"11\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"11\" y=\"11\" width=\"6\" height=\"6\" rx=\".5\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Change Support for Emerging Utility Models<\/h4><p>Assistance for teams adapting to decentralized energy resources, regulatory shifts, customer participation models, technology adoption, and new operating requirements.<\/p><\/div><\/div>\n      <\/div><\/div>\n      <div class=\"eup-spanel\" id=\"sp-if\"><div class=\"cov-list\">\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M10 2L10 12M6 5L14 5M4 10L16 10M3 14L6 14M14 14L17 14\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Capital Projects &amp; Infrastructure Programs<\/h4><p>Support for utility infrastructure upgrades, capital works, asset renewal programs, service expansion, project coordination, documentation, and schedule tracking.<\/p><\/div><\/div>\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M5 10L5 17M15 10L15 17M3 10L17 10M8 7L8 10M12 7L12 10M10 3L10 7\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Field Operations &amp; Workforce Coordination<\/h4><p>Capacity for field-service planning, dispatch support, crew coordination, work order tracking, safety documentation, maintenance workflows, and service restoration support.<\/p><\/div><\/div>\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M14.5 4.5a3 3 0 010 4.24L7 16.24L3 17L3.76 13L11.5 5.26a3 3 0 013-.76Z\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Asset Management &amp; Maintenance Support<\/h4><p>Coverage across asset records, inspection programs, preventive maintenance planning, lifecycle documentation, reliability tracking, and infrastructure performance support.<\/p><\/div><\/div>\n        <div class=\"cov-item\"><div class=\"cov-icon\"><svg viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"10\" r=\"2\"\/><path d=\"M10 3L10 5M10 15L10 17M3 10L5 10M15 10L17 10M5.64 5.64L7.05 7.05M12.95 12.95L14.36 14.36M5.64 14.36L7.05 12.95M12.95 7.05L14.36 5.64\"\/><\/svg><\/div><div class=\"cov-body\"><h4>Engineering, Technical &amp; Operational Support<\/h4><p>Technical and operational capacity across engineering support, technical coordination, drafting-adjacent workflows, operational analysis, vendor coordination, and field-to-office execution support.<\/p><\/div><\/div>\n      <\/div><\/div>\n    <\/div>\n    <div class=\"sector-3d-panel iv d2\">\n      <canvas id=\"sector-3d\"><\/canvas>\n      <div class=\"s3d-lbl\">UTILITY OPERATIONS \/ SECTOR MATRIX<\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<div class=\"eup-divider\"><\/div>\n\n<!-- CAPABILITIES -->\n<section id=\"eup-capabilities\">\n  <div class=\"cap-layout\">\n    <div class=\"cap-left iv\">\n      <div class=\"eup-eye\"><div class=\"eup-eye-line\"><\/div><span class=\"eup-eye-txt\">Delivery Capabilities<\/span><\/div>\n      <h2 class=\"eup-h2\">Delivery Capabilities for Energy and <em>Utility Operations<\/em><\/h2>\n      <p style=\"font-size:14px;line-height:1.8;color:var(--w3);margin-bottom:0\">DT Solutions provides delivery capacity across the operational, technical, customer-facing, field, and infrastructure functions that help energy and utility organizations maintain reliability while advancing modernization.<\/p>\n      <canvas id=\"cap-3d\"><\/canvas>\n    <\/div>\n    <div class=\"cap-list\">\n      <div class=\"cap-row iv d1\"><div class=\"cap-badge\"><svg viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"10\" r=\"3\"\/><path d=\"M10 2v2M10 16v2M2 10h2M16 10h2\"\/><\/svg><\/div><div class=\"cap-body\"><h3>Utility Operations &amp; Service Support<\/h3><p>Coverage for service operations, work coordination, customer requests, billing-adjacent workflows, operational reporting, documentation, and day-to-day utility support functions.<\/p><\/div><span class=\"cap-arr\">&#8594;<\/span><\/div>\n      <div class=\"cap-row iv d2\"><div class=\"cap-badge\"><svg viewBox=\"0 0 20 20\"><path d=\"M10 2L10 12M6 5L14 5M4 10L16 10M3 14L6 14M14 14L17 14\"\/><\/svg><\/div><div class=\"cap-body\"><h3>Grid, Infrastructure &amp; Asset Program Support<\/h3><p>Capacity for grid programs, infrastructure upgrades, asset records, inspection coordination, maintenance planning, capital project support, and reliability-focused operating needs.<\/p><\/div><span class=\"cap-arr\">&#8594;<\/span><\/div>\n      <div class=\"cap-row iv d3\"><div class=\"cap-badge\"><svg viewBox=\"0 0 20 20\"><path d=\"M5 10L5 17M15 10L15 17M3 10L17 10M8 7L8 10M12 7L12 10M10 3L10 7\"\/><\/svg><\/div><div class=\"cap-body\"><h3>Field Operations &amp; Crew Coordination<\/h3><p>Support for dispatch workflows, work order tracking, field-service planning, crew coordination, service restoration activity, safety documentation, and field-to-office communication.<\/p><\/div><span class=\"cap-arr\">&#8594;<\/span><\/div>\n      <div class=\"cap-row iv d4\"><div class=\"cap-badge\"><svg viewBox=\"0 0 20 20\"><rect x=\"3\" y=\"3\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"11\" y=\"3\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"3\" y=\"11\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"11\" y=\"11\" width=\"6\" height=\"6\" rx=\".5\"\/><\/svg><\/div><div class=\"cap-body\"><h3>Digital Utility &amp; Energy Systems Support<\/h3><p>Talent and delivery support for utility platforms, energy data programs, automation initiatives, operational dashboards, system upgrades, cybersecurity, and technology-enabled service improvements.<\/p><\/div><span class=\"cap-arr\">&#8594;<\/span><\/div>\n      <div class=\"cap-row iv d5\"><div class=\"cap-badge\"><svg viewBox=\"0 0 20 20\"><rect x=\"3\" y=\"3\" width=\"14\" height=\"14\" rx=\"1\"\/><path d=\"M6 7h8M6 10h6M6 13h4\"\/><\/svg><\/div><div class=\"cap-body\"><h3>Regulatory, Reporting &amp; Performance Support<\/h3><p>Assistance with utility reporting cycles, compliance documentation, performance tracking, audit preparation, service metrics, evidence collection, and operational records management.<\/p><\/div><span class=\"cap-arr\">&#8594;<\/span><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<div class=\"eup-divider\"><\/div>\n\n<!-- TRANSFORMATION -->\n<section id=\"eup-transformation\">\n  <div class=\"trans-top\">\n    <div class=\"iv\"><div class=\"eup-eye\"><div class=\"eup-eye-line\"><\/div><span class=\"eup-eye-txt\">Delivery &amp; Transformation<\/span><\/div><h2 class=\"eup-h2\">Supporting Utility <em>Modernization<\/em>, Reliability, and Field Execution<\/h2><p class=\"eup-sub\" style=\"margin-bottom:0\">DT Solutions helps energy and utility organizations add capacity where infrastructure programs, grid reliability, customer operations, digital utility systems, and field execution need to move in coordination.<\/p><\/div>\n    <div class=\"iv d2\"><canvas id=\"trans-3d\"><\/canvas><\/div>\n  <\/div>\n  <div class=\"eup-pathway iv d1\">\n    <div class=\"pnode\"><div class=\"pnode-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M10 2L10 12M6 5L14 5M4 10L16 10M3 14L6 14M14 14L17 14\"\/><\/svg><\/div><span class=\"pnode-n\">SUPPORT \u2014 01<\/span><h3>Infrastructure Program Execution<\/h3><p>Support for capital projects, asset renewal programs, service expansion, maintenance initiatives, documentation, schedule tracking, and coordination across engineering, operations, procurement, and field teams.<\/p><\/div>\n    <div class=\"pnode\"><div class=\"pnode-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M11 2L19 5.5L19 11C19 15.5 11 20 11 20C11 20 3 15.5 3 11L3 5.5Z\"\/><path d=\"M8 11L10.5 13.5L14 8.5\"\/><\/svg><\/div><span class=\"pnode-n\">SUPPORT \u2014 02<\/span><h3>Grid Reliability &amp; Operational Readiness<\/h3><p>Capacity for initiatives connected to outage readiness, service restoration workflows, reliability planning, system monitoring, operating procedures, and performance tracking.<\/p><\/div>\n    <div class=\"pnode\"><div class=\"pnode-icon\"><svg viewBox=\"0 0 20 20\"><circle cx=\"5\" cy=\"6\" r=\"2\"\/><circle cx=\"17\" cy=\"6\" r=\"2\"\/><circle cx=\"11\" cy=\"17\" r=\"2\"\/><path d=\"M7 6L15 6M5 8L5 13Q5 17 9 17M17 8L17 13Q17 17 13 17\"\/><\/svg><\/div><span class=\"pnode-n\">SUPPORT \u2014 03<\/span><h3>Field-to-Office Coordination<\/h3><p>Support for work order management, dispatch coordination, crew communication, field documentation, inspection workflows, safety records, and service completion tracking.<\/p><\/div>\n    <div class=\"pnode\"><div class=\"pnode-icon\"><svg viewBox=\"0 0 20 20\"><rect x=\"3\" y=\"3\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"11\" y=\"3\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"3\" y=\"11\" width=\"6\" height=\"6\" rx=\".5\"\/><rect x=\"11\" y=\"11\" width=\"6\" height=\"6\" rx=\".5\"\/><\/svg><\/div><span class=\"pnode-n\">SUPPORT \u2014 04<\/span><h3>Digital Utility &amp; Systems Modernization<\/h3><p>Talent and delivery support for utility platforms, automation programs, operational dashboards, customer systems, data environments, cybersecurity initiatives, and technology adoption.<\/p><\/div>\n    <div class=\"pnode\"><div class=\"pnode-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M13 2L6 11L10 11L8 18L15 9L11 9Z\"\/><\/svg><\/div><span class=\"pnode-n\">SUPPORT \u2014 05<\/span><h3>Energy Transition Program Support<\/h3><p>Capacity for clean energy programs, electrification initiatives, distributed energy resource coordination, demand-response support, grid modernization, and emerging utility operating models.<\/p><\/div>\n    <div class=\"pnode\"><div class=\"pnode-icon\"><svg viewBox=\"0 0 20 20\"><path d=\"M4 14L8 10L11 13L15 7L18 10\"\/><path d=\"M3 17L17 17\" opacity=\".4\"\/><\/svg><\/div><span class=\"pnode-n\">SUPPORT \u2014 06<\/span><h3>Customer, Reporting &amp; Service Performance<\/h3><p>Support for billing-adjacent workflows, service requests, customer communications, regulatory reporting, operational metrics, documentation cycles, and utility performance visibility.<\/p><\/div>\n  <\/div>\n<\/section>\n\n<div class=\"eup-divider\"><\/div>\n\n<!-- WHY DT -->\n<section id=\"eup-why\">\n  <div class=\"why-layout\">\n    <div class=\"why-left iv\">\n      <div class=\"eup-eye\"><div class=\"eup-eye-line\"><\/div><span class=\"eup-eye-txt\">Why DT Solutions<\/span><\/div>\n      <p class=\"why-big\">Practical delivery capacity for environments where <em>reliability<\/em> cannot wait and <span>infrastructure<\/span> must keep moving.<\/p>\n      <p class=\"why-sub\">DT Solutions brings practical delivery capacity to energy and utility environments where reliability, infrastructure execution, field activity, customer service, and modernization must stay connected.<\/p>\n      <div class=\"stats\">\n        <div class=\"stat\"><div class=\"stat-val\">15+<\/div><div class=\"stat-label\">Years supporting energy &amp; utility delivery<\/div><\/div>\n        <div class=\"stat\"><div class=\"stat-val org\">98%<\/div><div class=\"stat-label\">Client retention across utility environments<\/div><\/div>\n        <div class=\"stat\"><div class=\"stat-val pur\">5<\/div><div class=\"stat-label\">Core delivery capability areas<\/div><\/div>\n        <div class=\"stat\"><div class=\"stat-val\">3<\/div><div class=\"stat-label\">Sub-industry coverage sectors<\/div><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"diff-list\">\n      <div class=\"diff iv d1\"><div class=\"diff-hd\"><div class=\"diff-icon\"><svg viewBox=\"0 0 16 16\"><circle cx=\"8\" cy=\"8\" r=\"3\"\/><path d=\"M8 2v1M8 13v1M2 8h1M13 8h1\"\/><\/svg><\/div><h3>Utility Operations Understanding<\/h3><\/div><p>We understand the operating rhythm of energy and utility organizations, where service reliability, asset condition, field activity, outage readiness, and customer impact shape delivery priorities.<\/p><\/div>\n      <div class=\"diff iv d2\"><div class=\"diff-hd\"><div class=\"diff-icon\"><svg viewBox=\"0 0 16 16\"><circle cx=\"4\" cy=\"4\" r=\"1.5\"\/><circle cx=\"12\" cy=\"4\" r=\"1.5\"\/><circle cx=\"8\" cy=\"12\" r=\"1.5\"\/><path d=\"M5.5 4L10.5 4M4 5.5L8 10.5M12 5.5L8 10.5\"\/><\/svg><\/div><h3>Capacity Across Field and Enterprise Functions<\/h3><\/div><p>Our support model helps connect the teams behind utility performance, from planners and technical groups to customer operations, reporting teams, field crews, and service coordination functions.<\/p><\/div>\n      <div class=\"diff iv d3\"><div class=\"diff-hd\"><div class=\"diff-icon\"><svg viewBox=\"0 0 16 16\"><path d=\"M8 2L8 10M5 4L11 4M3 8L13 8M2 12L5 12M11 12L14 12\"\/><\/svg><\/div><h3>Support for Infrastructure and Grid Priorities<\/h3><\/div><p>DT Solutions adds capacity around capital programs, asset renewal, grid upgrades, maintenance planning, service expansion, and modernization work that requires coordinated execution.<\/p><\/div>\n      <div class=\"diff iv d4\"><div class=\"diff-hd\"><div class=\"diff-icon\"><svg viewBox=\"0 0 16 16\"><path d=\"M13 4.5a2.5 2.5 0 010 3.54L6 15L2 14L2.96 10L10 3.5a2.5 2.5 0 013 1Z\"\/><\/svg><\/div><h3>Practical Execution During Active Utility Work<\/h3><\/div><p>We support environments where engineers, vendors, operations leaders, dispatch teams, and field crews need accurate documentation, timely coordination, and clear work progression.<\/p><\/div>\n      <div class=\"diff iv d5\"><div class=\"diff-hd\"><div class=\"diff-icon\"><svg viewBox=\"0 0 16 16\"><path d=\"M8 2L8 9L5 6\"\/><path d=\"M8 9L11 6\"\/><path d=\"M3 12L13 12\"\/><\/svg><\/div><h3>Delivery Capacity Built for Reliability Pressure<\/h3><\/div><p>Our model supports energy and utility organizations managing outage response, regulatory reporting, infrastructure investment, customer expectations, and changing energy demand.<\/p><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<div class=\"eup-divider\"><\/div>\n\n<!-- CTA -->\n<section id=\"eup-cta\">\n  <div class=\"cta-box iv\">\n    <div class=\"cta-3d-wrap\"><canvas id=\"cta-3d\"><\/canvas><\/div>\n    <div class=\"cta-content\">\n      <div class=\"eup-eye\" style=\"margin-bottom:24px\"><div class=\"eup-eye-line\"><\/div><span class=\"eup-eye-txt\">Ready to Connect<\/span><\/div>\n      <h2 class=\"cta-h2\">Strengthen the capacity behind utility <em>reliability<\/em>, infrastructure delivery, and energy modernization<\/h2>\n      <p class=\"cta-sub\">Connect with DT Solutions to support energy and utility environments where grid programs, field operations, customer service, asset work, reporting needs, and modernization priorities must move together without slowing critical service delivery.<\/p>\n      <div class=\"cta-btns\"><button class=\"btn-p\">Discuss Energy &amp; Utilities Support<\/button><button class=\"btn-g\">Explore Delivery Support<\/button><\/div>\n      <p class=\"cta-closing\">Build dependable support across the operating functions that keep energy systems reliable, infrastructure programs moving, and utility services responsive.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n<\/div>\n\n<script>\n(function(){\n'use strict';\nconst PR=window.matchMedia('(prefers-reduced-motion:reduce)').matches;\nconst CE=0x00b4ff,CE2=0x00d4ff,CE3=0x00e8ff,CO=0xff6a1a,CP=0x8b56f0,CW=0xe8f2ff,CG=0x00e8aa;\n\nfunction mkR(c,alpha){\n  const W=c.clientWidth||c.offsetWidth||600,H=c.clientHeight||c.offsetHeight||400;\n  const r=new THREE.WebGLRenderer({canvas:c,alpha:!!alpha,antialias:true,powerPreference:'high-performance'});\n  r.setPixelRatio(Math.min(window.devicePixelRatio,2));r.setSize(W,H);r.setClearColor(0,0);return r;\n}\nfunction mkCam(fov,W,H){return new THREE.PerspectiveCamera(fov,W\/H,0.1,2000)}\nfunction ring(rad,col,op,segs){\n  const pts=[];segs=segs||128;\n  for(let i=0;i<=segs;i++){const a=i\/segs*Math.PI*2;pts.push(new THREE.Vector3(Math.cos(a)*rad,0,Math.sin(a)*rad));}\n  return new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts),new THREE.LineBasicMaterial({color:col,transparent:true,opacity:op}));\n}\nfunction catLine(a,b,col,op,sag,segs){\n  segs=segs||16;sag=sag||0.6;\n  const pts=[];\n  for(let i=0;i<=segs;i++){const f=i\/segs;pts.push(new THREE.Vector3(a[0]+(b[0]-a[0])*f,a[1]+(b[1]-a[1])*f-Math.sin(f*Math.PI)*sag,a[2]+(b[2]-a[2])*f));}\n  return new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts),new THREE.LineBasicMaterial({color:col,transparent:true,opacity:op}));\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SCENE 1 \u2014 HERO\n   Large wind farm + substation + solar + energy grid\n   Camera pulls back for a commanding aerial view\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initHero(){\n  const c=document.getElementById('hero-3d');if(!c)return;\n  const W=c.clientWidth,H=c.clientHeight;\n  const r=mkR(c,true),sc=new THREE.Scene(),cam=mkCam(48,W,H);\n  cam.position.set(2,14,36);cam.lookAt(0,-1,0);\n\n  \/* Lights *\/\n  sc.add(new THREE.AmbientLight(0x001830,1.4));\n  const pL1=new THREE.PointLight(CE,4,60);sc.add(pL1);\n  const pL2=new THREE.PointLight(CO,2.5,40);pL2.position.set(-14,6,8);sc.add(pL2);\n  const pL3=new THREE.PointLight(CP,2,30);pL3.position.set(14,8,-6);sc.add(pL3);\n  const pL4=new THREE.PointLight(CG,1.8,35);pL4.position.set(0,12,6);sc.add(pL4);\n  const dirL=new THREE.DirectionalLight(0x6699ff,0.6);dirL.position.set(10,20,10);sc.add(dirL);\n\n  const root=new THREE.Group();sc.add(root);\n\n  \/* Extended ground grid *\/\n  const gH=new THREE.GridHelper(80,40,CE,CE);\n  gH.position.y=-4.5;gH.material.transparent=true;gH.material.opacity=0.06;root.add(gH);\n\n  \/* \u2500\u2500\u2500 TURBINE BUILDER (premium realistic blades) \u2500\u2500\u2500 *\/\n  function mkTurbine(x,z,s,col,bladeSpeed){\n    const g=new THREE.Group();\n    \/* tower \u2014 slightly tapered cylinder *\/\n    const tw=new THREE.Mesh(\n      new THREE.CylinderGeometry(0.05*s,0.16*s,5.8*s,14),\n      new THREE.MeshPhongMaterial({color:0xe8f4ff,shininess:110,specular:0x336699,transparent:true,opacity:0.88})\n    );tw.position.y=2.9*s-4.5;g.add(tw);\n    \/* tower base flange *\/\n    const flange=new THREE.Mesh(new THREE.CylinderGeometry(0.26*s,0.26*s,0.08*s,16),new THREE.MeshPhongMaterial({color:0xaac4dd,shininess:60}));\n    flange.position.y=-4.5+0.04;g.add(flange);\n    \/* tower edge lines for realism *\/\n    g.add(new THREE.LineSegments(new THREE.EdgesGeometry(tw.geometry),\n      new THREE.LineBasicMaterial({color:col,transparent:true,opacity:0.12})));\n    \/* nacelle (elongated, aerodynamic housing) *\/\n    const nac=new THREE.Mesh(new THREE.CylinderGeometry(0.14*s,0.17*s,0.52*s,10),\n      new THREE.MeshPhongMaterial({color:0xf0f8ff,shininess:150,specular:0x8899cc}));\n    nac.rotation.z=Math.PI\/2;nac.position.set(-0.08*s,5.8*s-4.5,0);g.add(nac);\n    \/* hub disc *\/\n    const hub=new THREE.Mesh(new THREE.CylinderGeometry(0.12*s,0.12*s,0.1*s,12),\n      new THREE.MeshPhongMaterial({color:0xe0ecff,shininess:200}));\n    hub.rotation.z=Math.PI\/2;hub.position.set(0.12*s,5.8*s-4.5,0.14*s);g.add(hub);\n    \/* blade group \u2014 rotates around hub *\/\n    const bg=new THREE.Group();\n    bg.position.set(0,5.8*s-4.5,0.14*s);\n    for(let i=0;i<3;i++){\n      const bGroup=new THREE.Group();\n      bGroup.rotation.z=(i\/3)*Math.PI*2;\n      \/* blade \u2014 tapered flat shape for realism using custom geometry *\/\n      const bLen=2.6*s, bW=0.18*s;\n      const shape=new THREE.Shape();\n      shape.moveTo(0,0.08*s);\n      shape.quadraticCurveTo(bW*0.5,0.15*s, bW*0.35,bLen*0.35);\n      shape.quadraticCurveTo(bW*0.28,bLen*0.7, bW*0.08,bLen*0.92);\n      shape.quadraticCurveTo(0,bLen, 0,bLen);\n      shape.quadraticCurveTo(-bW*0.04,bLen*0.92, -bW*0.06,bLen*0.7);\n      shape.quadraticCurveTo(-bW*0.1,bLen*0.35, -bW*0.12,0.15*s);\n      shape.lineTo(0,0.08*s);\n      const extrudeSettings={depth:0.015*s,bevelEnabled:true,bevelThickness:0.005*s,bevelSize:0.004*s,bevelSegments:2};\n      const blade=new THREE.Mesh(\n        new THREE.ExtrudeGeometry(shape,extrudeSettings),\n        new THREE.MeshPhongMaterial({color:0xf2faff,transparent:true,opacity:0.9,shininess:180,specular:0x99bbdd,side:THREE.DoubleSide})\n      );\n      blade.position.set(0,0,0);\n      \/* tip glow sphere *\/\n      const tip=new THREE.Mesh(new THREE.SphereGeometry(0.07*s,7,7),\n        new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.85}));\n      tip.position.set(0,bLen,0.008*s);blade.add(tip);\n      \/* subtle edge highlight *\/\n      const edgeL=new THREE.Mesh(new THREE.PlaneGeometry(0.02*s,bLen*0.7),\n        new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.15,side:THREE.DoubleSide}));\n      edgeL.position.set(0,bLen*0.45,0.016*s);blade.add(edgeL);\n      bGroup.add(blade);\n      bg.add(bGroup);\n    }\n    g.add(bg);g._bg=bg;g._bs=bladeSpeed||0.018+Math.random()*0.012;\n    \/* hub glow halo *\/\n    const hg=new THREE.Mesh(new THREE.SphereGeometry(0.16*s,10,10),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.5}));\n    hg.position.set(0,5.8*s-4.5,0.14*s);g.add(hg);g._hg=hg;\n    \/* glow ring at hub *\/\n    const hr=ring(0.4*s,col,0.28);hr.position.set(0,5.8*s-4.5,0);hr.rotation.x=Math.PI\/2;g.add(hr);\n    \/* vertical light beam up the tower *\/\n    const beam=new THREE.Mesh(new THREE.CylinderGeometry(0.015*s,0.015*s,5.8*s,4),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.06}));\n    beam.position.y=2.9*s-4.5;g.add(beam);\n    g.position.set(x,0,z);return g;\n  }\n\n  const turbs=[];\n  \/* main large turbines + distant ones for depth *\/\n  [\n    [0,0,1.7,CE,0.022],[6,0.5,1.1,CE2,0.019],[-6,0.5,1.1,CO,0.020],\n    [12,1,0.8,CP,0.016],[-12,1,0.8,CE,0.018],\n    [-4,-8,0.85,CE2,0.021],[4,-8,0.85,CO,0.017],\n    [9,-5,0.7,CE,0.023],[-9,-5,0.7,CP,0.015],\n    [16,-2,0.65,CE2,0.019],[-16,-2,0.65,CO,0.020],\n    [13,-9,0.6,CE,0.018],[-13,-9,0.6,CE2,0.016],\n  ].forEach(([x,z,s,col,bs])=>{const t=mkTurbine(x,z,s,col,bs);root.add(t);turbs.push(t);});\n\n  \/* \u2500\u2500\u2500 TRANSMISSION TOWERS (pylon structures) \u2500\u2500\u2500 *\/\n  function mkPylon(x,z,h){\n    const g=new THREE.Group();\n    \/* main legs - 4 angled members *\/\n    const legGeo=new THREE.CylinderGeometry(0.04,0.08,h,6);\n    const legMat=new THREE.MeshPhongMaterial({color:0x8899bb,shininess:60});\n    [[-0.3,0.3],[-0.3,-0.3],[0.3,0.3],[0.3,-0.3]].forEach(([lx,lz])=>{\n      const leg=new THREE.Mesh(legGeo,legMat);\n      leg.position.set(lx,h\/2-4.5,lz);\n      leg.rotation.z=lx*0.18;leg.rotation.x=lz*0.18;\n      g.add(leg);\n    });\n    \/* cross arms *\/\n    [h*0.55,h*0.75].forEach(y=>{\n      const arm=new THREE.Mesh(new THREE.CylinderGeometry(0.025,0.025,1.8,6),legMat);\n      arm.position.set(0,y-4.5,0);arm.rotation.z=Math.PI\/2;g.add(arm);\n    });\n    \/* top glow node *\/\n    const top=new THREE.Mesh(new THREE.SphereGeometry(0.08,8,8),new THREE.MeshBasicMaterial({color:CE,transparent:true,opacity:0.7}));\n    top.position.y=h-4.5;g.add(top);\n    g.position.set(x,0,z);return g;\n  }\n\n  const pylonPositions=[[-18,2],[-8,2],[2,2],[8,2],[18,2],[-15,-4],[0,-4],[15,-4]];\n  pylonPositions.forEach(([x,z])=>root.add(mkPylon(x,z,4)));\n\n  \/* Transmission lines between pylons *\/\n  const pylonTops=pylonPositions.map(([x,z])=>[x,4-4.5+0.05,z]);\n  \/* horizontal strings *\/\n  for(let i=0;i<pylonTops.length-1;i++){\n    root.add(catLine(pylonTops[i],pylonTops[i+1],CE,0.35,0.5,20));\n    root.add(catLine([pylonTops[i][0],pylonTops[i][1]-0.4,pylonTops[i][2]],[pylonTops[i+1][0],pylonTops[i+1][1]-0.4,pylonTops[i+1][2]],CE2,0.22,0.5,20));\n  }\n\n  \/* Turbine top lines to pylons *\/\n  const turbTops=[[0,5.5*1.7-4.5+0.1,0],[6,5.5*1.1-4.5+0.1,0.5],[-6,5.5*1.1-4.5+0.1,0.5]];\n  [[turbTops[0],pylonTops[2]],[turbTops[1],pylonTops[3]],[turbTops[2],pylonTops[1]]].forEach(([a,b])=>\n    root.add(catLine(a,b,CE,0.3,0.8,18))\n  );\n\n  \/* \u2500\u2500\u2500 SOLAR ARRAY (large ground installation) \u2500\u2500\u2500 *\/\n  function mkSolarArray(ox,oz,rows,cols,tilt){\n    const g=new THREE.Group();\n    for(let r=0;r<rows;r++)for(let cc=0;cc<cols;cc++){\n      const p=new THREE.Mesh(new THREE.BoxGeometry(1.1,0.025,0.7),\n        new THREE.MeshPhongMaterial({color:0x081c38,shininess:220,specular:0x0055aa,emissive:0x000820}));\n      \/* cell grid lines *\/\n      p.add(new THREE.LineSegments(new THREE.EdgesGeometry(p.geometry),\n        new THREE.LineBasicMaterial({color:CE,transparent:true,opacity:0.35})));\n      p.position.set(cc*1.25,0,r*0.88);p.rotation.x=-tilt;\n      \/* support post *\/\n      const post=new THREE.Mesh(new THREE.CylinderGeometry(0.03,0.03,0.35,4),\n        new THREE.MeshPhongMaterial({color:0x334455}));\n      post.position.y=-0.2;p.add(post);\n      g.add(p);\n    }\n    g.position.set(ox,-4.35,oz);return g;\n  }\n  root.add(mkSolarArray(-22,-5,3,6,0.38));\n  root.add(mkSolarArray(16,-7,2,5,0.38));\n  root.add(mkSolarArray(-20,-10,2,4,0.38));\n\n  \/* \u2500\u2500\u2500 SUBSTATION (detailed) \u2500\u2500\u2500 *\/\n  function mkSubstation(x,z){\n    const g=new THREE.Group();\n    \/* main building *\/\n    const body=new THREE.Mesh(new THREE.BoxGeometry(2.8,1.1,1.8),\n      new THREE.MeshPhongMaterial({color:0x0d1e34,shininess:50,specular:0x112244}));\n    body.add(new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry),\n      new THREE.LineBasicMaterial({color:CE,transparent:true,opacity:0.38})));\n    g.add(body);\n    \/* transformer units *\/\n    for(let i=-1;i<=1;i++){\n      const cyl=new THREE.Mesh(new THREE.CylinderGeometry(0.16,0.16,0.75,10),\n        new THREE.MeshPhongMaterial({color:0x1a3050,shininess:90}));\n      cyl.position.set(i*0.55,0.93,0);g.add(cyl);\n      \/* top cap *\/\n      const cap=new THREE.Mesh(new THREE.CylinderGeometry(0.2,0.16,0.1,10),\n        new THREE.MeshPhongMaterial({color:0x2a4060}));\n      cap.position.set(i*0.55,1.33,0);g.add(cap);\n      \/* glow top *\/\n      const gw=new THREE.Mesh(new THREE.SphereGeometry(0.09,8,8),\n        new THREE.MeshBasicMaterial({color:CE,transparent:true,opacity:0.75}));\n      gw.position.set(i*0.55,1.45,0);g.add(gw);\n      \/* busbar *\/\n      const bus=new THREE.Mesh(new THREE.CylinderGeometry(0.012,0.012,0.7,4),\n        new THREE.MeshPhongMaterial({color:0x88aacc}));\n      bus.rotation.z=Math.PI\/2;bus.position.set(0,1.5,i*0.4);g.add(bus);\n    }\n    \/* fence perimeter *\/\n    const fence=new THREE.LineLoop(\n      new THREE.BufferGeometry().setFromPoints([\n        new THREE.Vector3(-2,-0.55,-1.2),new THREE.Vector3(2,-0.55,-1.2),\n        new THREE.Vector3(2,-0.55,1.2),new THREE.Vector3(-2,-0.55,1.2)\n      ]),new THREE.LineBasicMaterial({color:0x334455,transparent:true,opacity:0.5})\n    );g.add(fence);\n    g.position.set(x,-3.95,z);return g;\n  }\n  root.add(mkSubstation(-3,6));root.add(mkSubstation(10,3));\n\n  \/* \u2500\u2500\u2500 MOVING ENERGY PACKETS \u2500\u2500\u2500 *\/\n  const pkts=[];\n  function addPacket(path,col,speed){\n    const m=new THREE.Mesh(new THREE.SphereGeometry(0.1,8,8),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.9}));\n    \/* glow sphere *\/\n    const gm=new THREE.Mesh(new THREE.SphereGeometry(0.25,8,8),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.2}));\n    sc.add(m,gm);pkts.push({m,gm,path,t:Math.random(),sp:speed||0.003+Math.random()*0.003});\n  }\n  \/* packets on pylon lines *\/\n  for(let i=0;i<pylonTops.length-1;i++){\n    const a=pylonTops[i],b=pylonTops[i+1];\n    const path=[];for(let j=0;j<=20;j++){const f=j\/20;path.push(new THREE.Vector3(a[0]+(b[0]-a[0])*f,a[1]+(b[1]-a[1])*f-Math.sin(f*Math.PI)*0.5,a[2]+(b[2]-a[2])*f));}\n    addPacket(path,i%2===0?CE:CO);\n  }\n  \/* packets on turbine-to-pylon lines *\/\n  [[turbTops[0],pylonTops[2]],[turbTops[1],pylonTops[3]],[turbTops[2],pylonTops[1]]].forEach(([a,b],i)=>{\n    const path=[];for(let j=0;j<=20;j++){const f=j\/20;path.push(new THREE.Vector3(a[0]+(b[0]-a[0])*f,a[1]+(b[1]-a[1])*f-Math.sin(f*Math.PI)*0.8,a[2]+(b[2]-a[2])*f));}\n    addPacket(path,[CE,CE2,CP][i],0.005);\n  });\n\n  \/* \u2500\u2500\u2500 RICH PARTICLE FIELD \u2500\u2500\u2500 *\/\n  const pGeo=new THREE.BufferGeometry();\n  const pN=400,pPos=new Float32Array(pN*3),pCol=new Float32Array(pN*3);\n  for(let i=0;i<pN;i++){\n    pPos[i*3]=(Math.random()-0.5)*80;pPos[i*3+1]=(Math.random()-0.5)*22+4;pPos[i*3+2]=(Math.random()-0.5)*50;\n    const rc=Math.random();\n    if(rc<0.55){pCol[i*3]=0;pCol[i*3+1]=0.7;pCol[i*3+2]=1}\n    else if(rc<0.75){pCol[i*3]=1;pCol[i*3+1]=0.42;pCol[i*3+2]=0.1}\n    else if(rc<0.88){pCol[i*3]=0.54;pCol[i*3+1]=0.34;pCol[i*3+2]=0.94}\n    else{pCol[i*3]=0;pCol[i*3+1]=0.9;pCol[i*3+2]=0.67}\n  }\n  pGeo.setAttribute('position',new THREE.BufferAttribute(pPos,3));\n  pGeo.setAttribute('color',new THREE.BufferAttribute(pCol,3));\n  sc.add(new THREE.Points(pGeo,new THREE.PointsMaterial({size:0.08,vertexColors:true,transparent:true,opacity:0.55})));\n\n  \/* \u2500\u2500\u2500 ATMOSPHERIC HAZE RING (horizon glow) \u2500\u2500\u2500 *\/\n  const haze=ring(38,CE,0.04,64);haze.position.y=-3;root.add(haze);\n  const haze2=ring(30,CO,0.03,64);haze2.position.y=-3;root.add(haze2);\n\n  \/* resize *\/\n  window.addEventListener('resize',()=>{const W2=c.clientWidth,H2=c.clientHeight;cam.aspect=W2\/H2;cam.updateProjectionMatrix();r.setSize(W2,H2);});\n  let t=0;\n  (function anim(){requestAnimationFrame(anim);t+=0.008;\n    if(!PR){\n      \/* blade spin \u2014 rotate around Z axis for proper turbine motion *\/\n      turbs.forEach(tb=>{if(tb._bg){tb._bg.rotation.z+=tb._bs;}if(tb._hg)tb._hg.scale.setScalar(1+Math.sin(t*1.8)*0.15);});\n      \/* packets *\/\n      pkts.forEach(pk=>{\n        pk.t+=pk.sp;if(pk.t>1)pk.t=0;\n        const pi=Math.min(Math.floor(pk.t*(pk.path.length-1)),pk.path.length-2);\n        const pf=pk.t*(pk.path.length-1)-pi;\n        pk.m.position.lerpVectors(pk.path[pi],pk.path[pi+1],pf);\n        pk.gm.position.copy(pk.m.position);\n        pk.m.material.opacity=0.6+Math.sin(t*8)*0.35;\n        pk.gm.material.opacity=0.1+Math.sin(t*8)*0.12;\n      });\n      \/* very gentle drift *\/\n      root.rotation.y=Math.sin(t*0.12)*0.18;root.rotation.x=Math.sin(t*0.07)*0.03;\n      \/* light pulse *\/\n      pL1.intensity=3.5+Math.sin(t*1.1)*0.8;pL2.intensity=2+Math.sin(t*0.85)*0.6;pL4.intensity=1.5+Math.sin(t*1.4)*0.5;\n      \/* particle drift upward *\/\n      const pp=pGeo.attributes.position.array;\n      for(let i=0;i<pN;i++){pp[i*3+1]+=0.003;if(pp[i*3+1]>12)pp[i*3+1]=-8;}\n      pGeo.attributes.position.needsUpdate=true;\n    }\n    r.render(sc,cam);\n  })();\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SCENE 2 \u2014 SECTOR: Rotating energy atom with orbital sectors\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initSector(){\n  const c=document.getElementById('sector-3d');if(!c)return;\n  const W=c.clientWidth,H=c.clientHeight;\n  const r=mkR(c,true),sc=new THREE.Scene(),cam=mkCam(44,W,H);\n  cam.position.set(0,1.5,11);cam.lookAt(0,0,0);\n  sc.add(new THREE.AmbientLight(0x001830,1.5));\n  const pL=new THREE.PointLight(CE,4,35);sc.add(pL);\n  const pL2=new THREE.PointLight(CO,2.5,25);pL2.position.set(-5,4,3);sc.add(pL2);\n  const pL3=new THREE.PointLight(CP,2,20);pL3.position.set(5,-3,2);sc.add(pL3);\n  const root=new THREE.Group();sc.add(root);\n\n  \/* Core icosahedron *\/\n  const cGeo=new THREE.IcosahedronGeometry(1.3,2);\n  const core=new THREE.Mesh(cGeo,new THREE.MeshPhongMaterial({color:0x003060,transparent:true,opacity:0.75,shininess:220,specular:0x0099ff,emissive:0x001133}));\n  const cWire=new THREE.Mesh(cGeo,new THREE.MeshBasicMaterial({color:CE,wireframe:true,transparent:true,opacity:0.22}));\n  const cWire2=new THREE.Mesh(new THREE.IcosahedronGeometry(1.32,1),new THREE.MeshBasicMaterial({color:CE2,wireframe:true,transparent:true,opacity:0.1}));\n  root.add(core,cWire,cWire2);\n  \/* inner glow *\/\n  root.add(new THREE.Mesh(new THREE.SphereGeometry(0.85,16,16),new THREE.MeshBasicMaterial({color:CE3,transparent:true,opacity:0.1})));\n\n  \/* Orbit rings at different angles *\/\n  const orings=[\n    [3.0,CE,Math.PI\/2,0,0,0.5],\n    [3.5,CO,Math.PI\/4,Math.PI\/5,0,0.38],\n    [4.0,CP,Math.PI\/6,Math.PI\/3,0,0.28],\n    [2.5,CE2,Math.PI*0.35,Math.PI*0.7,0,0.35],\n  ];\n  const oringObjs=orings.map(([rad,col,rx,rz,ry,op])=>{\n    const l=ring(rad,col,op);l.rotation.set(rx,ry,rz);root.add(l);return l;\n  });\n\n  \/* Orbit nodes \u2014 8 sectors *\/\n  const nCols=[CE,CO,CP,CE2,CG,CO,CE,CP];\n  const nodes=nCols.map((col,i)=>{\n    const m=new THREE.Mesh(new THREE.SphereGeometry(0.22+i%2*0.04,12,12),\n      new THREE.MeshPhongMaterial({color:col,shininess:130,transparent:true,opacity:0.9,emissive:new THREE.Color(col).multiplyScalar(0.15)}));\n    \/* outer halo ring *\/\n    const halo=new THREE.Mesh(new THREE.RingGeometry(0.3,0.38,20),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.25,side:THREE.DoubleSide}));\n    \/* inner core *\/\n    const inner=new THREE.Mesh(new THREE.SphereGeometry(0.08,8,8),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.8}));\n    m.add(halo,inner);root.add(m);\n    const rOuter=i<4?3.0:3.5;\n    return{m,halo,inner,angle:(i\/8)*Math.PI*2,sp:0.006+i*0.0015,r:rOuter,col};\n  });\n\n  \/* Connection lines from core to nodes *\/\n  const conns=nodes.map((n,i)=>{\n    const geo=new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0,0,0),new THREE.Vector3(1,0,0)]);\n    const l=new THREE.Line(geo,new THREE.LineBasicMaterial({color:nCols[i],transparent:true,opacity:0.15}));\n    sc.add(l);return{l,n};\n  });\n\n  \/* Outer particle cloud *\/\n  const fpGeo=new THREE.BufferGeometry();const fpN=200;const fpP=new Float32Array(fpN*3),fpC=new Float32Array(fpN*3);\n  for(let i=0;i<fpN;i++){\n    const rad=4.5+Math.random()*2.5,a=Math.random()*Math.PI*2,b=Math.random()*Math.PI;\n    fpP[i*3]=Math.sin(b)*Math.cos(a)*rad;fpP[i*3+1]=Math.sin(b)*Math.sin(a)*rad;fpP[i*3+2]=Math.cos(b)*rad;\n    const nc=nCols[i%nCols.length];const c3=new THREE.Color(nc);fpC[i*3]=c3.r;fpC[i*3+1]=c3.g;fpC[i*3+2]=c3.b;\n  }\n  fpGeo.setAttribute('position',new THREE.BufferAttribute(fpP,3));fpGeo.setAttribute('color',new THREE.BufferAttribute(fpC,3));\n  sc.add(new THREE.Points(fpGeo,new THREE.PointsMaterial({size:0.055,vertexColors:true,transparent:true,opacity:0.5})));\n\n  window.addEventListener('resize',()=>{const W2=c.clientWidth,H2=c.clientHeight;cam.aspect=W2\/H2;cam.updateProjectionMatrix();r.setSize(W2,H2);});\n  let t=0;\n  (function anim(){requestAnimationFrame(anim);t+=0.011;\n    if(!PR){\n      core.rotation.y+=0.005;core.rotation.x+=0.0025;\n      cWire.rotation.y-=0.004;cWire.rotation.z+=0.0018;\n      cWire2.rotation.x+=0.003;cWire2.rotation.y-=0.002;\n      oringObjs[0].rotation.y+=0.008;oringObjs[1].rotation.y-=0.006;\n      oringObjs[2].rotation.y+=0.005;oringObjs[3].rotation.y-=0.007;\n      nodes.forEach((n,i)=>{\n        n.angle+=n.sp;\n        n.m.position.set(Math.cos(n.angle)*n.r,Math.sin(n.angle*0.6)*1.2,Math.sin(n.angle)*n.r);\n        n.m.scale.setScalar(1+Math.sin(t*2.5+i)*0.18);\n        n.halo.rotation.z+=0.05;\n        n.inner.scale.setScalar(0.7+Math.sin(t*4+i)*0.4);\n      });\n      conns.forEach(({l,n})=>{const p=l.geometry.attributes.position.array;p[3]=n.m.position.x;p[4]=n.m.position.y;p[5]=n.m.position.z;l.geometry.attributes.position.needsUpdate=true;});\n      \/* particle rotation *\/\n      const fp=fpGeo.attributes.position.array;\n      for(let i=0;i<fpN;i++){const ang=Math.atan2(fp[i*3+2],fp[i*3])+0.004,rad=Math.sqrt(fp[i*3]*fp[i*3]+fp[i*3+2]*fp[i*3+2]);fp[i*3]=Math.cos(ang)*rad;fp[i*3+2]=Math.sin(ang)*rad;}\n      fpGeo.attributes.position.needsUpdate=true;\n      pL.position.set(Math.sin(t)*2.5,Math.cos(t*0.7)*2,2);pL.intensity=3.5+Math.sin(t*1.6)*1;\n      root.rotation.y=Math.sin(t*0.18)*0.35;\n    }\n    r.render(sc,cam);\n  })();\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SCENE 3 \u2014 CAPABILITIES: Power battery \/ energy storage stack\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initCap(){\n  const c=document.getElementById('cap-3d');if(!c)return;\n  const W=c.clientWidth,H=c.clientHeight;\n  const r=mkR(c,true),sc=new THREE.Scene(),cam=mkCam(48,W,H);\n  cam.position.set(0,1.5,8);cam.lookAt(0,0,0);\n  sc.add(new THREE.AmbientLight(0x001830,1.3));\n  const pL=new THREE.PointLight(CE,3,25);pL.position.set(2,4,4);sc.add(pL);\n  const pL2=new THREE.PointLight(CO,2,18);pL2.position.set(-4,-2,3);sc.add(pL2);\n  const pL3=new THREE.PointLight(CP,1.5,15);pL3.position.set(3,2,-2);sc.add(pL3);\n  const root=new THREE.Group();sc.add(root);\n\n  const cellCols=[CE,CE2,CO,CP,CG];\n  const cells=cellCols.map((col,i)=>{\n    const g=new THREE.Group();\n    \/* main body *\/\n    const body=new THREE.Mesh(new THREE.BoxGeometry(2.8,0.38,1.0),\n      new THREE.MeshPhongMaterial({color:0x0a1828,shininess:90,specular:0x223355}));\n    body.add(new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry),\n      new THREE.LineBasicMaterial({color:col,transparent:true,opacity:0.75})));\n    g.add(body);\n    \/* fill bar *\/\n    const fw=0.8+Math.random()*1.6;\n    const fill=new THREE.Mesh(new THREE.BoxGeometry(fw,0.22,0.72),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.45}));\n    fill.position.x=(fw-2.8)\/2+0.01;g.add(fill);g._fill=fill;g._fillMat=fill.material;\n    \/* terminal + *\/\n    const tp=new THREE.Mesh(new THREE.CylinderGeometry(0.08,0.08,0.22,8),\n      new THREE.MeshPhongMaterial({color:0xaabbcc,shininess:120}));\n    tp.position.set(1.5,0.25,0);tp.rotation.z=Math.PI\/2;g.add(tp);\n    \/* terminal - *\/\n    const tn=new THREE.Mesh(new THREE.CylinderGeometry(0.065,0.065,0.18,8),\n      new THREE.MeshPhongMaterial({color:0x667788}));\n    tn.position.set(-1.5,0.25,0);tn.rotation.z=Math.PI\/2;g.add(tn);\n    \/* glow cap *\/\n    const cap=new THREE.Mesh(new THREE.SphereGeometry(0.12,10,10),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.85}));\n    cap.position.set(1.58,0.25,0);g.add(cap);g._cap=cap;\n    \/* status indicator dots *\/\n    for(let d=0;d<3;d++){\n      const dot=new THREE.Mesh(new THREE.SphereGeometry(0.04,6,6),\n        new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.6+d*0.15}));\n      dot.position.set(-0.8+d*0.35,0.22,0.45);g.add(dot);\n    }\n    g.position.set(0,i*0.58-1.16,0);root.add(g);\n    return{g,cap,fill,fillMat:fill.material,t:Math.random()*Math.PI*2,col};\n  });\n\n  \/* Wire arcs between cells *\/\n  for(let i=0;i<cellCols.length-1;i++){\n    const pts=[];for(let j=0;j<=20;j++){const f=j\/20;pts.push(new THREE.Vector3(1.58+Math.sin(f*Math.PI)*0.5,(i*0.58-1.16)+(f*0.58),0));}\n    root.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts),\n      new THREE.LineBasicMaterial({color:cellCols[i],transparent:true,opacity:0.4})));\n  }\n\n  \/* Floating energy orbs *\/\n  const orbs=[];\n  for(let i=0;i<12;i++){\n    const col=cellCols[i%cellCols.length];\n    const m=new THREE.Mesh(new THREE.SphereGeometry(0.045+Math.random()*0.055,8,8),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.8}));\n    m.position.set((Math.random()-0.5)*5,(Math.random()-0.5)*3.5,(Math.random()-0.5)*2.5);\n    sc.add(m);orbs.push({m,vy:0.008+Math.random()*0.01,t:Math.random()*Math.PI*2,col});\n  }\n\n  \/* Power flow visualization \u2014 horizontal bars on right *\/\n  const flowBars=cellCols.map((col,i)=>{\n    const geo=new THREE.BoxGeometry(0.06,0.08,0.08);\n    const mat=new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.9});\n    const m=new THREE.Mesh(geo,mat);sc.add(m);\n    return{m,x:-1.4,targetX:1.4,y:i*0.58-1.16,t:Math.random(),sp:0.006+Math.random()*0.005};\n  });\n\n  window.addEventListener('resize',()=>{const W2=c.clientWidth,H2=c.clientHeight;cam.aspect=W2\/H2;cam.updateProjectionMatrix();r.setSize(W2,H2);});\n  let t=0;\n  (function anim(){requestAnimationFrame(anim);t+=0.013;\n    if(!PR){\n      cells.forEach((cell,i)=>{\n        cell.t+=0.022;\n        cell.cap.material.opacity=0.55+Math.sin(cell.t)*0.4;\n        cell.fillMat.opacity=0.3+Math.sin(cell.t*1.2)*0.2;\n        cell.g.position.z=Math.sin(t*0.7+i*0.8)*0.1;\n      });\n      orbs.forEach(b=>{b.t+=0.025;b.m.position.y+=b.vy;if(b.m.position.y>2)b.m.position.y=-2;b.m.material.opacity=0.35+Math.sin(b.t)*0.55;});\n      flowBars.forEach(fb=>{\n        fb.t+=fb.sp;if(fb.t>1)fb.t=0;\n        fb.m.position.set(fb.x+(fb.targetX-fb.x)*fb.t,fb.y,0);\n        fb.m.material.opacity=0.5+Math.sin(fb.t*Math.PI)*0.45;\n      });\n      root.rotation.y=Math.sin(t*0.28)*0.4;root.rotation.x=Math.sin(t*0.18)*0.1;\n      pL.intensity=2.5+Math.sin(t*1.4)*0.8;\n    }\n    r.render(sc,cam);\n  })();\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SCENE 4 \u2014 TRANSFORMATION: Tesla coils + lightning network\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initTrans(){\n  const c=document.getElementById('trans-3d');if(!c)return;\n  const W=c.clientWidth,H=c.clientHeight;\n  const r=mkR(c,true),sc=new THREE.Scene(),cam=mkCam(50,W,H);\n  cam.position.set(0,3,12);cam.lookAt(0,0,0);\n  sc.add(new THREE.AmbientLight(0x001830,1.1));\n  const pL=new THREE.PointLight(CE,4,30);sc.add(pL);\n  const pL2=new THREE.PointLight(CO,2.5,22);pL2.position.set(-5,1,3);sc.add(pL2);\n  const pL3=new THREE.PointLight(CP,2,20);pL3.position.set(5,1,-2);sc.add(pL3);\n  const root=new THREE.Group();sc.add(root);\n\n  function mkCoil(x,z,s){\n    const g=new THREE.Group();\n    \/* base *\/\n    g.add(Object.assign(new THREE.Mesh(new THREE.CylinderGeometry(0.7*s,0.9*s,0.35*s,14),\n      new THREE.MeshPhongMaterial({color:0x0d1f35,shininess:60}))));\n    \/* column *\/\n    const col=new THREE.Mesh(new THREE.CylinderGeometry(0.14*s,0.22*s,4*s,12),\n      new THREE.MeshPhongMaterial({color:0x1a3050,shininess:80}));\n    col.position.y=2*s;g.add(col);\n    \/* coil windings *\/\n    for(let i=0;i<10;i++){\n      const tr=new THREE.Mesh(new THREE.TorusGeometry(0.28*s,0.028*s,8,28),\n        new THREE.MeshPhongMaterial({color:0x99bbdd,shininess:140}));\n      tr.position.y=0.6*s+i*0.4*s;tr.rotation.x=Math.PI\/2;g.add(tr);\n    }\n    \/* emitter sphere *\/\n    const em=new THREE.Mesh(new THREE.SphereGeometry(0.42*s,16,16),\n      new THREE.MeshPhongMaterial({color:0x002244,shininess:240,specular:0x0099ff,transparent:true,opacity:0.88,emissive:0x001133}));\n    em.position.y=4.5*s;g.add(em);\n    \/* inner glow *\/\n    const gl=new THREE.Mesh(new THREE.SphereGeometry(0.26*s,10,10),\n      new THREE.MeshBasicMaterial({color:CE2,transparent:true,opacity:0.6}));\n    gl.position.y=4.5*s;g.add(gl);g._gl=gl;g._em=em;\n    \/* outer pulse ring *\/\n    const pr=ring(0.6*s,CE,0.3);pr.position.y=4.5*s;pr.rotation.x=Math.PI\/2;g.add(pr);g._pr=pr;\n    g.position.set(x,-2,z);return g;\n  }\n  const c1=mkCoil(0,0,1.0),c2=mkCoil(-5,0,0.72),c3=mkCoil(5,0,0.72),c4=mkCoil(-2.5,-3.5,0.55),c5=mkCoil(2.5,-3.5,0.55);\n  root.add(c1,c2,c3,c4,c5);\n\n  \/* Ground rings *\/\n  [2,3.5,5.5,8].forEach((rad,i)=>{\n    const l=ring(rad,[CE,CO,CP,CE2][i],0.12+i*0.05);l.position.y=-2;root.add(l);\n  });\n\n  \/* Lightning arcs among all coil pairs *\/\n  const emitPs=[\n    new THREE.Vector3(0,2.5,0),\n    new THREE.Vector3(-5,1.24,0),new THREE.Vector3(5,1.24,0),\n    new THREE.Vector3(-2.5,-0.5,-3.5),new THREE.Vector3(2.5,-0.5,-3.5)\n  ];\n  const arcPairs=[[0,1,CE],[0,2,CE2],[0,3,CO],[0,4,CP],[1,2,CE3],[3,4,CO],[1,3,CE],[2,4,CE2]];\n  const arcs=arcPairs.map(([a,b,col])=>{\n    const geo=new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0,0,0),new THREE.Vector3(1,0,0)]);\n    const l=new THREE.Line(geo,new THREE.LineBasicMaterial({color:col,transparent:true,opacity:0}));\n    sc.add(l);return{l,from:emitPs[a],to:emitPs[b],col,timer:Math.random()*100,interval:25+Math.random()*80};\n  });\n\n  \/* Floating lightning particles *\/\n  const epGeo=new THREE.BufferGeometry();const epN=120;const epP=new Float32Array(epN*3),epC=new Float32Array(epN*3);\n  for(let i=0;i<epN;i++){\n    const rad=1.2+Math.random()*2.2,a=Math.random()*Math.PI*2,b=Math.random()*Math.PI;\n    epP[i*3]=Math.sin(b)*Math.cos(a)*rad;epP[i*3+1]=Math.sin(b)*Math.sin(a)*rad+1.5;epP[i*3+2]=Math.cos(b)*rad;\n    const nc=[CE,CE2,CO,CP][i%4];const c3=new THREE.Color(nc);epC[i*3]=c3.r;epC[i*3+1]=c3.g;epC[i*3+2]=c3.b;\n  }\n  epGeo.setAttribute('position',new THREE.BufferAttribute(epP,3));epGeo.setAttribute('color',new THREE.BufferAttribute(epC,3));\n  sc.add(new THREE.Points(epGeo,new THREE.PointsMaterial({size:0.06,vertexColors:true,transparent:true,opacity:0.65})));\n\n  window.addEventListener('resize',()=>{const W2=c.clientWidth,H2=c.clientHeight;cam.aspect=W2\/H2;cam.updateProjectionMatrix();r.setSize(W2,H2);});\n  let t=0;\n  (function anim(){requestAnimationFrame(anim);t+=0.011;\n    if(!PR){\n      arcs.forEach(arc=>{\n        arc.timer++;\n        if(arc.timer>arc.interval){\n          const from=arc.from,to=arc.to,pts=[];\n          for(let i=0;i<=16;i++){const f=i\/16,j=(i>0&&i<16)?(Math.random()-0.5)*0.9:0;pts.push(new THREE.Vector3(from.x+(to.x-from.x)*f+j,from.y+(to.y-from.y)*f+Math.abs(j)*0.55,from.z+(to.z-from.z)*f+j*0.55));}\n          arc.l.geometry.setFromPoints(pts);arc.l.material.opacity=0.95;arc.timer=0;arc.interval=20+Math.random()*85;\n        } else arc.l.material.opacity*=0.86;\n      });\n      [c1,c2,c3,c4,c5].forEach((co,i)=>{\n        if(co._gl)co._gl.material.opacity=0.45+Math.sin(t*2.8+i)*0.48;\n        if(co._pr){co._pr.rotation.y+=0.05;co._pr.scale.setScalar(1+Math.sin(t*2+i)*0.15);}\n      });\n      \/* particle spin *\/\n      const ep=epGeo.attributes.position.array;\n      for(let i=0;i<epN;i++){const ang=Math.atan2(ep[i*3+2],ep[i*3])+0.018,rad=Math.sqrt(ep[i*3]*ep[i*3]+ep[i*3+2]*ep[i*3+2]);ep[i*3]=Math.cos(ang)*rad;ep[i*3+2]=Math.sin(ang)*rad;}\n      epGeo.attributes.position.needsUpdate=true;\n      root.rotation.y=Math.sin(t*0.16)*0.28;pL.intensity=3+Math.sin(t*2.2)*1.2;\n    }\n    r.render(sc,cam);\n  })();\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SCENE 5 \u2014 CTA: Full energy infrastructure command center\n   Shows: city power grid + transmission towers + wind turbines\n   + solar farm + glowing energy nexus\n   Meaningful: represents the actual delivery \u2014 reliability,\n   infrastructure, and modernization all in one scene\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction initCTA(){\n  const c=document.getElementById('cta-3d');if(!c)return;\n  const W=c.clientWidth,H=c.clientHeight;\n  const r=mkR(c,true),sc=new THREE.Scene(),cam=mkCam(52,W,H);\n  cam.position.set(0,9,20);cam.lookAt(0,0,0);\n\n  sc.add(new THREE.AmbientLight(0x001428,1.4));\n  const pL1=new THREE.PointLight(CE,5,40);sc.add(pL1);\n  const pL2=new THREE.PointLight(CO,2.5,30);pL2.position.set(-6,5,5);sc.add(pL2);\n  const pL3=new THREE.PointLight(CP,2,25);pL3.position.set(6,4,-4);sc.add(pL3);\n  const pL4=new THREE.PointLight(CG,1.5,20);pL4.position.set(0,8,4);sc.add(pL4);\n  sc.add(new THREE.DirectionalLight(0x4466bb,0.5));\n\n  const root=new THREE.Group();sc.add(root);\n\n  \/* Ground plane with grid *\/\n  const ground=new THREE.Mesh(new THREE.PlaneGeometry(50,40),\n    new THREE.MeshPhongMaterial({color:0x020c1a,shininess:5}));\n  ground.rotation.x=-Math.PI\/2;ground.position.y=-4;root.add(ground);\n  const gh=new THREE.GridHelper(50,25,CE,CE);\n  gh.position.y=-3.98;gh.material.transparent=true;gh.material.opacity=0.07;root.add(gh);\n\n  \/* \u2500\u2500 CENTRAL ENERGY NEXUS (glowing hub) \u2500\u2500 *\/\n  const nexus=new THREE.Group();\n  \/* outer torus ring *\/\n  const torusGeo=new THREE.TorusGeometry(1.8,0.12,16,60);\n  const torusMesh=new THREE.Mesh(torusGeo,new THREE.MeshPhongMaterial({color:CE,shininess:200,specular:0x00ffff,emissive:0x001122,transparent:true,opacity:0.85}));\n  nexus.add(torusMesh);\n  \/* inner torus *\/\n  const t2=new THREE.Mesh(new THREE.TorusGeometry(1.1,0.07,12,40),\n    new THREE.MeshPhongMaterial({color:CO,shininess:180,transparent:true,opacity:0.7}));\n  t2.rotation.x=Math.PI\/2;nexus.add(t2);\n  \/* core sphere *\/\n  const coreS=new THREE.Mesh(new THREE.SphereGeometry(0.65,20,20),\n    new THREE.MeshPhongMaterial({color:0x001840,shininess:250,specular:0x00aaff,emissive:0x002255,transparent:true,opacity:0.9}));\n  nexus.add(coreS);\n  \/* inner glow *\/\n  const innerG=new THREE.Mesh(new THREE.SphereGeometry(0.4,12,12),\n    new THREE.MeshBasicMaterial({color:CE3,transparent:true,opacity:0.4}));\n  nexus.add(innerG);\n  \/* wire shells *\/\n  nexus.add(new THREE.Mesh(new THREE.IcosahedronGeometry(0.85,1),new THREE.MeshBasicMaterial({color:CE,wireframe:true,transparent:true,opacity:0.18})));\n  nexus.add(new THREE.Mesh(new THREE.OctahedronGeometry(1.0,0),new THREE.MeshBasicMaterial({color:CP,wireframe:true,transparent:true,opacity:0.12})));\n  nexus.position.set(0,1,0);root.add(nexus);\n  nexus._t1=torusMesh;nexus._t2=t2;nexus._core=coreS;nexus._inner=innerG;\n\n  \/* \u2500\u2500 MINI WIND TURBINES with proper blade shapes \u2500\u2500 *\/\n  function mkMiniTurb(x,z,s,col){\n    const g=new THREE.Group();\n    \/* tower *\/\n    const tw=new THREE.Mesh(new THREE.CylinderGeometry(0.035*s,0.09*s,3.8*s,10),\n      new THREE.MeshPhongMaterial({color:0xe8f4ff,shininess:100,transparent:true,opacity:0.85}));\n    tw.position.y=1.9*s-4;g.add(tw);\n    \/* flange *\/\n    const fl=new THREE.Mesh(new THREE.CylinderGeometry(0.14*s,0.14*s,0.06*s,10),\n      new THREE.MeshPhongMaterial({color:0xaabccc}));\n    fl.position.y=-4+0.03;g.add(fl);\n    \/* nacelle *\/\n    const nac=new THREE.Mesh(new THREE.CylinderGeometry(0.1*s,0.12*s,0.36*s,8),\n      new THREE.MeshPhongMaterial({color:0xf0f8ff,shininess:140}));\n    nac.rotation.z=Math.PI\/2;nac.position.set(-0.06*s,3.8*s-4,0);g.add(nac);\n    \/* blade group *\/\n    const bg=new THREE.Group();\n    bg.position.set(0,3.8*s-4,0.08*s);\n    for(let i=0;i<3;i++){\n      const bGrp=new THREE.Group();bGrp.rotation.z=(i\/3)*Math.PI*2;\n      const bLen=1.6*s,bW=0.13*s;\n      const shape=new THREE.Shape();\n      shape.moveTo(0,0.06*s);\n      shape.quadraticCurveTo(bW*0.5,0.12*s,bW*0.32,bLen*0.4);\n      shape.quadraticCurveTo(bW*0.22,bLen*0.72,bW*0.06,bLen*0.9);\n      shape.quadraticCurveTo(0,bLen,0,bLen);\n      shape.quadraticCurveTo(-bW*0.04,bLen*0.9,-bW*0.05,bLen*0.7);\n      shape.quadraticCurveTo(-bW*0.08,bLen*0.4,-bW*0.1,0.12*s);\n      shape.lineTo(0,0.06*s);\n      const blade=new THREE.Mesh(\n        new THREE.ExtrudeGeometry(shape,{depth:0.012*s,bevelEnabled:true,bevelThickness:0.004*s,bevelSize:0.003*s,bevelSegments:1}),\n        new THREE.MeshPhongMaterial({color:0xf2faff,transparent:true,opacity:0.88,shininess:170,side:THREE.DoubleSide})\n      );\n      const tip=new THREE.Mesh(new THREE.SphereGeometry(0.05*s,5,5),\n        new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.85}));\n      tip.position.set(0,bLen,0.006*s);blade.add(tip);\n      bGrp.add(blade);bg.add(bGrp);\n    }\n    g.add(bg);g._bg=bg;g._bs=0.022+Math.random()*0.016;\n    \/* hub glow *\/\n    const hg=new THREE.Mesh(new THREE.SphereGeometry(0.1*s,8,8),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.55}));\n    hg.position.set(0,3.8*s-4,0.08*s);g.add(hg);\n    const hr=ring(0.28*s,col,0.3);hr.position.set(0,3.8*s-4,0);hr.rotation.x=Math.PI\/2;g.add(hr);\n    g.position.set(x,0,z);return g;\n  }\n  const ctaTurbs=[mkMiniTurb(-8,3,1.2,CE),mkMiniTurb(8,3,1.0,CE2),mkMiniTurb(-5,-6,0.9,CO),mkMiniTurb(5,-6,0.9,CP),mkMiniTurb(0,-9,0.8,CE)];\n  ctaTurbs.forEach(t=>root.add(t));\n\n  \/* \u2500\u2500 OFFSHORE WATER PLANE (adds ocean context like the photo) \u2500\u2500 *\/\n  const sea=new THREE.Mesh(new THREE.PlaneGeometry(70,50),\n    new THREE.MeshPhongMaterial({color:0x02203d,shininess:60,specular:0x0044aa,transparent:true,opacity:0.85}));\n  sea.rotation.x=-Math.PI\/2;sea.position.y=-3.99;root.add(sea);\n  \/* water shimmer lines *\/\n  for(let i=0;i<8;i++){\n    const wl=new THREE.Line(\n      new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(-20+Math.random()*40,-3.98,-15+i*4),new THREE.Vector3(-20+Math.random()*40,-3.98,-15+i*4+2+Math.random()*3)]),\n      new THREE.LineBasicMaterial({color:CE,transparent:true,opacity:0.08+Math.random()*0.06})\n    );root.add(wl);\n  }\n  \/* horizon glow ring above water *\/\n  const seaGlow=ring(28,CE,0.04,64);seaGlow.position.y=-3.6;root.add(seaGlow);\n  const seaGlow2=ring(22,CE2,0.03,48);seaGlow2.position.y=-3.5;root.add(seaGlow2);\n\n  \/* \u2500\u2500 MINI SOLAR PANELS \u2500\u2500 *\/\n  function mkSol(x,z){\n    const g=new THREE.Group();\n    for(let r2=0;r2<2;r2++)for(let cc=0;cc<3;cc++){\n      const p=new THREE.Mesh(new THREE.BoxGeometry(0.9,0.02,0.55),\n        new THREE.MeshPhongMaterial({color:0x081c38,shininess:200,specular:0x0044aa}));\n      p.add(new THREE.LineSegments(new THREE.EdgesGeometry(p.geometry),\n        new THREE.LineBasicMaterial({color:CE,transparent:true,opacity:0.35})));\n      p.position.set(cc*1.0,0,r2*0.65);p.rotation.x=-0.38;g.add(p);\n    }\n    g.position.set(x,-3.8,z);return g;\n  }\n  root.add(mkSol(-14,-4));root.add(mkSol(10,-7));\n\n  \/* \u2500\u2500 MINI SUBSTATIONS \u2500\u2500 *\/\n  function mkMiniSub(x,z){\n    const g=new THREE.Group();\n    const body=new THREE.Mesh(new THREE.BoxGeometry(1.8,0.7,1.1),\n      new THREE.MeshPhongMaterial({color:0x0d1e34,shininess:50}));\n    body.add(new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry),\n      new THREE.LineBasicMaterial({color:CE,transparent:true,opacity:0.35})));\n    g.add(body);\n    for(let i=-1;i<=1;i++){\n      const cyl=new THREE.Mesh(new THREE.CylinderGeometry(0.1,0.1,0.5,8),\n        new THREE.MeshPhongMaterial({color:0x1a3050}));\n      cyl.position.set(i*0.38,0.6,0);g.add(cyl);\n      const gw=new THREE.Mesh(new THREE.SphereGeometry(0.07,8,8),\n        new THREE.MeshBasicMaterial({color:CE,transparent:true,opacity:0.7}));\n      gw.position.set(i*0.38,0.88,0);g.add(gw);\n    }\n    g.position.set(x,-3.65,z);return g;\n  }\n  root.add(mkMiniSub(-4,6));root.add(mkMiniSub(6,2));\n\n  \/* \u2500\u2500 TRANSMISSION LINES from nexus to all elements \u2500\u2500 *\/\n  const nexPt=[0,1,0];\n  const targets=[[-8,-1,3],[8,-1,3],[-5,-1,-6],[5,-1,-6],[0,-1,-9],[-4,-1,6],[6,-1,2],[-14,-2,-4],[10,-2,-7]];\n  targets.forEach((tp,i)=>{\n    root.add(catLine(nexPt,tp,[CE,CE2,CO,CP,CG,CE,CE2,CO,CP][i],0.28,0.6,16));\n  });\n\n  \/* \u2500\u2500 ORBIT RINGS around nexus \u2500\u2500 *\/\n  const nr1=ring(2.5,CE,0.35);nr1.rotation.x=Math.PI\/2;nexus.add(nr1);\n  const nr2=ring(3.2,CO,0.22);nr2.rotation.set(Math.PI\/3,0,Math.PI\/5);nexus.add(nr2);\n  const nr3=ring(4.0,CP,0.15);nr3.rotation.set(Math.PI\/6,0,Math.PI\/4);nexus.add(nr3);\n\n  \/* \u2500\u2500 ORBITING ENERGY BEADS \u2500\u2500 *\/\n  const beads=[[3.0,CE,0,0.014],[3.0,CE2,2.1,-0.011],[3.0,CO,4.2,0.009],[3.5,CP,1.05,-0.013]].map(([rad,col,ph,sp])=>{\n    const m=new THREE.Mesh(new THREE.SphereGeometry(0.13,10,10),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.9}));\n    const glow=new THREE.Mesh(new THREE.SphereGeometry(0.28,8,8),\n      new THREE.MeshBasicMaterial({color:col,transparent:true,opacity:0.18}));\n    sc.add(m,glow);return{m,glow,r:rad,ph,sp};\n  });\n\n  \/* \u2500\u2500 BURST LINES from nexus \u2500\u2500 *\/\n  const bursts=Array.from({length:16},(_,i)=>{\n    const ang=i\/16*Math.PI*2,el=Math.random()*0.6-0.3;\n    const ep=new THREE.Vector3(Math.cos(ang)*5.5,el,Math.sin(ang)*5.5);\n    const geo=new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0,0,0),ep]);\n    const l=new THREE.Line(geo,new THREE.LineBasicMaterial({color:i%4===0?CO:i%4===1?CP:CE,transparent:true,opacity:0}));\n    nexus.add(l);return{l,timer:Math.random()*60,interval:20+Math.random()*70};\n  });\n\n  \/* \u2500\u2500 RICH PARTICLE CLOUD \u2500\u2500 *\/\n  const pcGeo=new THREE.BufferGeometry();const pcN=300;const pcP=new Float32Array(pcN*3),pcC=new Float32Array(pcN*3);\n  for(let i=0;i<pcN;i++){\n    const rad=3+Math.random()*7,a=Math.random()*Math.PI*2,b=Math.random()*Math.PI;\n    pcP[i*3]=Math.sin(b)*Math.cos(a)*rad;pcP[i*3+1]=Math.sin(b)*Math.sin(a)*rad+1;pcP[i*3+2]=Math.cos(b)*rad;\n    const nc=[CE,CE2,CO,CP,CG][i%5];const c3=new THREE.Color(nc);pcC[i*3]=c3.r;pcC[i*3+1]=c3.g;pcC[i*3+2]=c3.b;\n  }\n  pcGeo.setAttribute('position',new THREE.BufferAttribute(pcP,3));pcGeo.setAttribute('color',new THREE.BufferAttribute(pcC,3));\n  sc.add(new THREE.Points(pcGeo,new THREE.PointsMaterial({size:0.07,vertexColors:true,transparent:true,opacity:0.55})));\n\n  \/* horizon glow rings *\/\n  [14,18,22].forEach((rad,i)=>{\n    const l=ring(rad,[CE,CO,CP][i],0.04,64);l.position.y=-3.5;root.add(l);\n  });\n\n  window.addEventListener('resize',()=>{const W2=c.clientWidth,H2=c.clientHeight;cam.aspect=W2\/H2;cam.updateProjectionMatrix();r.setSize(W2,H2);});\n  let t=0;\n  (function anim(){requestAnimationFrame(anim);t+=0.01;\n    if(!PR){\n      \/* nexus rotation *\/\n      nexus._t1.rotation.z+=0.008;nexus._t1.rotation.x+=0.004;\n      nexus._t2.rotation.z-=0.006;nexus._t2.rotation.y+=0.003;\n      nexus._core.rotation.y+=0.005;nexus._core.rotation.x+=0.003;\n      nexus._inner.scale.setScalar(0.9+Math.sin(t*2)*0.15);\n      nexus._inner.material.opacity=0.25+Math.sin(t*2)*0.2;\n      nr1.rotation.y+=0.01;nr2.rotation.y-=0.007;nr3.rotation.y+=0.005;\n\n      \/* mini turbines *\/\n      ctaTurbs.forEach(tb=>{if(tb._bg)tb._bg.rotation.z+=tb._bs;});\n\n      \/* beads orbit *\/\n      beads.forEach((b,i)=>{\n        b.ph+=b.sp;\n        b.m.position.set(Math.cos(b.ph)*b.r+0,Math.sin(b.ph*0.5)*1.0,Math.sin(b.ph)*b.r);\n        b.m.position.add(nexus.position);\n        b.glow.position.copy(b.m.position);\n        b.m.scale.setScalar(1+Math.sin(t*3+i)*0.2);\n        b.glow.material.opacity=0.08+Math.sin(t*2+i)*0.12;\n      });\n\n      \/* burst flashes *\/\n      bursts.forEach(b=>{b.timer++;if(b.timer>b.interval){b.l.material.opacity=0.8;b.timer=0;b.interval=18+Math.random()*75;}else b.l.material.opacity*=0.88;});\n\n      \/* slow particle rotation *\/\n      const pp=pcGeo.attributes.position.array;\n      for(let i=0;i<pcN;i++){const ang=Math.atan2(pp[i*3+2],pp[i*3])+0.004,rad=Math.sqrt(pp[i*3]*pp[i*3]+pp[i*3+2]*pp[i*3+2]);pp[i*3]=Math.cos(ang)*rad;pp[i*3+2]=Math.sin(ang)*rad;}\n      pcGeo.attributes.position.needsUpdate=true;\n\n      \/* gentle scene drift *\/\n      root.rotation.y=Math.sin(t*0.14)*0.2;\n      pL1.position.set(Math.sin(t)*2.5,Math.cos(t*0.7)*2.5,3);\n      pL1.intensity=4+Math.sin(t*1.5)*1.5;pL4.intensity=1.2+Math.sin(t*1.2)*0.6;\n    }\n    r.render(sc,cam);\n  })();\n}\n\n\/* \u2500\u2500 BOOT ALL \u2500\u2500 *\/\nfunction initBgIcons(){\n  const container=document.getElementById('eup-icons');\n  if(!container||PR)return;\n\n  \/* Icon templates: turbine, bolt, ring, hex, orbit *\/\n  const icons=[\n    \/* Wind turbine SVG *\/\n    (col,sz)=>`<svg width=\"${sz}\" height=\"${sz*1.6}\" viewBox=\"0 0 40 64\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <rect x=\"18.5\" y=\"28\" width=\"3\" height=\"34\" rx=\"1.5\" fill=\"${col}\" opacity=\"0.7\"\/>\n      <ellipse cx=\"20\" cy=\"28\" rx=\"2.5\" ry=\"2.5\" fill=\"${col}\" opacity=\"0.9\"\/>\n      <g class=\"bgi-turb-blades\" style=\"--ts:${(2.5+Math.random()*2).toFixed(1)}s;transform-origin:20px 28px\">\n        <path d=\"M20 28 Q21.5 20 20 8 Q18.5 20 20 28Z\" fill=\"${col}\" opacity=\"0.85\"\/>\n        <path d=\"M20 28 Q27 31 38 26 Q29 22 20 28Z\" fill=\"${col}\" opacity=\"0.85\"\/>\n        <path d=\"M20 28 Q13 31 2 26 Q11 22 20 28Z\" fill=\"${col}\" opacity=\"0.85\"\/>\n      <\/g>\n      <circle cx=\"20\" cy=\"64\" r=\"3\" fill=\"${col}\" opacity=\"0.5\"\/>\n    <\/svg>`,\n    \/* Energy bolt *\/\n    (col,sz)=>`<svg width=\"${sz*0.7}\" height=\"${sz}\" viewBox=\"0 0 28 40\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"bgi-bolt\" style=\"--bf:${(1.8+Math.random()*2).toFixed(1)}s\">\n      <path d=\"M18 2L6 22H14L10 38L24 16H16L18 2Z\" fill=\"${col}\" opacity=\"0.7\" stroke=\"${col}\" stroke-width=\"0.5\"\/>\n    <\/svg>`,\n    \/* Hexagon cell *\/\n    (col,sz)=>`<svg width=\"${sz}\" height=\"${sz}\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <polygon points=\"22,2 40,12 40,32 22,42 4,32 4,12\" stroke=\"${col}\" stroke-width=\"1\" fill=\"none\" opacity=\"0.5\"\/>\n      <polygon points=\"22,10 32,16 32,28 22,34 12,28 12,16\" stroke=\"${col}\" stroke-width=\"0.5\" fill=\"none\" opacity=\"0.3\"\/>\n      <circle cx=\"22\" cy=\"22\" r=\"3\" fill=\"${col}\" opacity=\"0.6\"\/>\n    <\/svg>`,\n    \/* Orbit ring with dot *\/\n    (col,sz)=>`<svg width=\"${sz}\" height=\"${sz}\" viewBox=\"0 0 50 50\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <ellipse cx=\"25\" cy=\"25\" rx=\"20\" ry=\"8\" stroke=\"${col}\" stroke-width=\"0.8\" opacity=\"0.35\" transform=\"rotate(-30 25 25)\"\/>\n      <ellipse cx=\"25\" cy=\"25\" rx=\"20\" ry=\"8\" stroke=\"${col}\" stroke-width=\"0.8\" opacity=\"0.25\" transform=\"rotate(60 25 25)\"\/>\n      <circle cx=\"25\" cy=\"5\" r=\"2.5\" fill=\"${col}\" opacity=\"0.8\" class=\"bgi-orbit\" style=\"--od:${(4+Math.random()*3).toFixed(1)}s;transform-origin:25px 25px\"\/>\n    <\/svg>`,\n    \/* Solar panel *\/\n    (col,sz)=>`<svg width=\"${sz}\" height=\"${sz*0.7}\" viewBox=\"0 0 48 32\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <rect x=\"2\" y=\"2\" width=\"44\" height=\"28\" rx=\"2\" stroke=\"${col}\" stroke-width=\"0.8\" fill=\"none\" opacity=\"0.4\"\/>\n      <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"30\" stroke=\"${col}\" stroke-width=\"0.6\" opacity=\"0.35\"\/>\n      <line x1=\"32\" y1=\"2\" x2=\"32\" y2=\"30\" stroke=\"${col}\" stroke-width=\"0.6\" opacity=\"0.35\"\/>\n      <line x1=\"2\" y1=\"11\" x2=\"46\" y2=\"11\" stroke=\"${col}\" stroke-width=\"0.6\" opacity=\"0.35\"\/>\n      <line x1=\"2\" y1=\"21\" x2=\"46\" y2=\"21\" stroke=\"${col}\" stroke-width=\"0.6\" opacity=\"0.35\"\/>\n      <circle cx=\"9\" cy=\"6.5\" r=\"1.5\" fill=\"${col}\" opacity=\"0.5\"\/>\n      <circle cx=\"24\" cy=\"6.5\" r=\"1.5\" fill=\"${col}\" opacity=\"0.5\"\/>\n    <\/svg>`,\n    \/* Transmission tower *\/\n    (col,sz)=>`<svg width=\"${sz*0.6}\" height=\"${sz}\" viewBox=\"0 0 24 40\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n      <line x1=\"12\" y1=\"2\" x2=\"2\" y2=\"38\" stroke=\"${col}\" stroke-width=\"0.8\" opacity=\"0.5\"\/>\n      <line x1=\"12\" y1=\"2\" x2=\"22\" y2=\"38\" stroke=\"${col}\" stroke-width=\"0.8\" opacity=\"0.5\"\/>\n      <line x1=\"5\" y1=\"20\" x2=\"19\" y2=\"20\" stroke=\"${col}\" stroke-width=\"1\" opacity=\"0.55\"\/>\n      <line x1=\"4\" y1=\"30\" x2=\"20\" y2=\"30\" stroke=\"${col}\" stroke-width=\"1\" opacity=\"0.55\"\/>\n      <circle cx=\"12\" cy=\"2\" r=\"2\" fill=\"${col}\" opacity=\"0.8\"\/>\n      <circle cx=\"5\" cy=\"20\" r=\"1.2\" fill=\"${col}\" opacity=\"0.5\"\/>\n      <circle cx=\"19\" cy=\"20\" r=\"1.2\" fill=\"${col}\" opacity=\"0.5\"\/>\n    <\/svg>`,\n  ];\n\n  const colors=['#00b4ff','#00d4ff','#ff6a1a','#8b56f0','#00e8aa'];\n  const positions=[\n    [5,8],[15,25],[82,12],[92,30],[8,55],[88,68],[25,82],[70,80],\n    [45,6],[55,90],[2,40],[97,50],[35,50],[65,45],[20,65],[78,38]\n  ];\n\n  positions.forEach(([lp,tp],i)=>{\n    const el=document.createElement('div');\n    el.className='bgi';\n    const col=colors[i%colors.length];\n    const tpl=icons[i%icons.length];\n    const sz=28+Math.random()*28;\n    const op=0.06+Math.random()*0.1;\n    const dur=18+Math.random()*22;\n    const delay=Math.random()*dur;\n    const r0=(Math.random()*30-15).toFixed(0);\n    const r1=(parseFloat(r0)+(Math.random()*20-10)).toFixed(0);\n    el.style.cssText=`left:${lp+Math.random()*6-3}%;top:${tp}%;--r0:${r0}deg;--r1:${r1}deg;--sc:${(0.8+Math.random()*0.5).toFixed(2)};--op:${op};animation-duration:${dur}s;animation-delay:-${delay}s`;\n    el.innerHTML=tpl(col,sz);\n    container.appendChild(el);\n  });\n\n  \/* Extra large dim turbines in corners *\/\n  ['4%,3%','88%,2%','2%,72%','85%,70%'].forEach((pos,i)=>{\n    const [l,t]=pos.split(',');\n    const el=document.createElement('div');\n    el.className='bgi';\n    const col=colors[i%2===0?0:2];\n    const sz=80+Math.random()*40;\n    const op=0.04+Math.random()*0.04;\n    const dur=30+Math.random()*20;\n    el.style.cssText=`left:${l};top:${t};--r0:0deg;--r1:5deg;--sc:1;--op:${op};animation-duration:${dur}s;animation-delay:-${Math.random()*dur}s`;\n    el.innerHTML=icons[0](col,sz);\n    container.appendChild(el);\n  });\n}\n\nfunction initAll(){initBgIcons();initHero();initSector();initCap();initTrans();initCTA();}\nif(document.readyState==='complete'||document.readyState==='interactive')setTimeout(initAll,80);\nelse window.addEventListener('DOMContentLoaded',()=>setTimeout(initAll,80));\n\n\/* \u2500\u2500 SCROLL REVEAL \u2500\u2500 *\/\nconst obs=new IntersectionObserver(e=>{e.forEach(el=>{if(el.isIntersecting)el.target.classList.add('vis');});},{threshold:0.1,rootMargin:'0px 0px -50px 0px'});\ndocument.querySelectorAll('.iv').forEach(el=>obs.observe(el));\n\n\/* \u2500\u2500 TABS \u2500\u2500 *\/\ndocument.querySelectorAll('.eup-tab').forEach(btn=>{\n  btn.addEventListener('click',()=>{\n    document.querySelectorAll('.eup-tab').forEach(b=>b.classList.remove('on'));\n    document.querySelectorAll('.eup-spanel').forEach(p=>p.classList.remove('on'));\n    btn.classList.add('on');\n    const p=document.getElementById('sp-'+btn.dataset.p);if(p)p.classList.add('on');\n  });\n});\n})();\n<\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Energy &#038; Utilities \u2014 DT Solutions Energy &amp; Utilities Energy&amp; Utilities Support energy and utility organizations across grid modernization, infrastructure delivery, and service reliability priorities. DT Solutions supports energy providers, utility operators, infrastructure teams, and energy-transition programs with talent, delivery, and advisory capacity across environments where service reliability, field execution, regulatory obligations, asset performance, outage [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2962","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=\/wp\/v2\/pages\/2962","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2962"}],"version-history":[{"count":4,"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=\/wp\/v2\/pages\/2962\/revisions"}],"predecessor-version":[{"id":2966,"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=\/wp\/v2\/pages\/2962\/revisions\/2966"}],"wp:attachment":[{"href":"https:\/\/digi.alphanzo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}