{"title":"Volunteer Firefighter Lights","description":"\u003cp\u003eVolunteer firefighter lights solve a problem the apparatus never has: the vehicle is your own truck, it is a personal vehicle 23 hours a day, and the light has to go on in the driveway and come off at the station without leaving holes or a wire hanging out of the headliner. The other half of the problem is legal. A volunteer's light is a courtesy light in most states, which means it asks traffic to yield and does not give you the right of way, the color you may run is set by the state and not by the department, and most states require the chief's written authorization before it goes on the roof. Black Oak builds the POV layer on the same Low Pro and XDR platform as the apparatus: the \u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\"\u003e17 inch Low Pro\u003c\/a\u003e on magnetic feet is the POV classic, the \u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\"\u003e30 inch\u003c\/a\u003e on magnets covers a full-size pickup roof, and \u003ca href=\"\/products\/xdr5-emergency-strobe-light\"\u003eXDR-5\u003c\/a\u003e and \u003ca href=\"\/products\/new-xdr-4-emergency-strobe-light-led-warning-light\"\u003eXDR-4\u003c\/a\u003e heads in the grille cover the intersection. Every Low Pro is certified to SAE J845 and SAE J595 Class 1 and sealed to IP69K. Designed and engineered in Sarasota, Florida.\u003c\/p\u003e\n\u003cdiv data-lowpro-player hidden\u003e\u003c\/div\u003e\n\u003ch2\u003eWhat color may a volunteer run?\u003c\/h2\u003e\n\u003cp\u003eThis is the first question and it is decided by your state, not by what is for sale. Some states authorize red for volunteer firefighters on a POV. Some assign blue to volunteers and reserve red for the apparatus. A few allow green, and most require written authorization from the chief and a permit on file. Red and blue together is reserved for authorized emergency vehicles in every state and is not a volunteer color anywhere. The practical answer: ask the chief what the department's SOG allows, read the state code, and then pick the colorway on the product page. The 17 inch Low Pro is offered in red, red and white, blue, red and blue, green and amber combinations, so the same bar covers every state's answer. The \u003ca href=\"\/blogs\/black-oak-led-blog\/emergency-light-bars-guide\"\u003eemergency light bar guide\u003c\/a\u003e covers the state table.\u003c\/p\u003e\n\u003ch2\u003eWhy the 17 inch on magnets is the POV standard\u003c\/h2\u003e\n\u003cp\u003eA POV bar has to come off. Magnetic feet rated to 65 pounds each hold the 17 inch at road speed on a clean steel roof, the socket lead plugs into the cab, and the whole thing is in the back seat in under a minute. The 17 inch is lit around its full edge including the ends, so a single bar on a pickup roof reads front, rear and side, which matters because on a POV it is usually the only warning light on the vehicle. The 17 inch ships with a socket controller with a power rocker and a pattern button, not the full wired controller, which is the right trade for a bar that moves. The 30 inch on magnets (three pairs of feet) is the choice for a full-size pickup or SUV roof where the 17 looks lost; both come off the same way. Magnetic feet are not offered above 43 inches.\u003c\/p\u003e\n\u003ch2\u003eGrille strobes: the part most POV builds skip\u003c\/h2\u003e\n\u003cp\u003eA magnetic roof bar is invisible to the driver coming through the cross street until you are already in the intersection, because the A-pillars shadow it from 45 degrees off the nose. Two XDR-4 or XDR-5 heads in the grille, mounted with two screws and wired to a dash switch through a 5 amp fuse, are what that driver sees. They are also the only part of a POV build that stays on the truck, and at 3-7\/8 inches the XDR-4 disappears behind the grille slats when it is off. Order them in the same color the state allows on the roof.\u003c\/p\u003e\n\u003ch2\u003eRunning it responsibly\u003c\/h2\u003e\n\u003cp\u003eA courtesy light does not clear an intersection; it asks. The pattern that reads best on a single bar is a slow, steady alternate rather than the fastest strobe, because a slow alternate holds a fixed point in the mirror of the car ahead. A favorite pattern, programmed by holding the pattern button for five seconds, comes back every time the bar is plugged in, so the bar is consistent even when the volunteer is not thinking about it. Run the simulator above to see each pattern before you choose.\u003c\/p\u003e\n\u003ch2\u003eChief and department vehicles\u003c\/h2\u003e\n\u003cp\u003eA chief's or officer's assigned vehicle is a department vehicle and runs the apparatus colorway: a 43 or 49 inch Low Pro on door jamb brackets, red and white, with the full wired controller, traffic advisor and Halo scene light. Those are on the \u003ca href=\"\/collections\/fire-truck-light-bars\"\u003efire truck light bars\u003c\/a\u003e page. Departments running a station-wide POV program can \u003ca href=\"\/pages\/fleet-pricing\"\u003erequest fleet pricing\u003c\/a\u003e for a mixed order of 17 inch bars and grille heads in one colorway.\u003c\/p\u003e\n\u003ch3\u003eWhat color lights can a volunteer firefighter use?\u003c\/h3\u003e\n\u003cp\u003eIt varies by state. Red is the most common POV color, blue is assigned to volunteers in some states, green in a few, and most require written authorization from the chief. Check your state code and your department before you order.\u003c\/p\u003e\n\u003ch3\u003eCan I use a magnet mount on a POV?\u003c\/h3\u003e\n\u003cp\u003eYes. The 17 inch bar's magnetic feet are made to hold at road speed on a clean, dry steel roof. Wipe the roof and the magnets before mounting and route the lead through the door seal, not the window. An aluminium or composite roof needs the headache rack brackets instead.\u003c\/p\u003e\n\u003ch3\u003eDo these include a siren?\u003c\/h3\u003e\n\u003cp\u003eNo. These are warning lights only.\u003c\/p\u003e\n\u003ch3\u003eAre there dash or visor lights?\u003c\/h3\u003e\n\u003cp\u003eBlack Oak does not build a dedicated visor bar yet. The XDR-4 strobe mounts on a dash corner or visor edge with the 90 degree bracket and covers the forward position until the interior line ships.\u003c\/p\u003e\n\u003cp\u003eVolunteer firefighter lights sit under \u003ca href=\"\/collections\/fire-ems-lights\"\u003efire and EMS lights\u003c\/a\u003e in the \u003ca href=\"\/collections\/led-emergency-lights\"\u003eBlack Oak emergency lighting\u003c\/a\u003e range, next to \u003ca href=\"\/collections\/led-mini-light-bars\"\u003emini light bars\u003c\/a\u003e and \u003ca href=\"\/collections\/led-emergency-strobe-lights\"\u003eemergency strobe lights\u003c\/a\u003e. Backed by a limited lifetime warranty, see each product page for details.\u003c\/p\u003e","products":[{"product_id":"low-pro-emergency-light-bar","title":"49\" Low Pro Emergency Light Bar","description":"\u003c!-- LOWPRO INTERACTIVE PLAYER (test embed) --\u003e\n\u003cdiv id=\"lowpro-player-block\" style=\"margin:0 0 26px;\"\u003e\n\u003cdiv class=\"lowpro-cta\"\u003e\n\u003ch2 style=\"margin:0 0 4px;font-size:24px;line-height:1.25;\"\u003eTake the Controls: Try This Light Bar Live\u003c\/h2\u003e\n\u003cp style=\"margin:0 0 12px;font-size:15px;line-height:1.5;\"\u003ePick your colors, run the flash patterns, sweep the traffic advisor, and switch on the 360° Halo scene light, exactly like the controller in the box. Every module on a dual-color bar can show either color.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ciframe id=\"lowpro-player-frame\" class=\"lowpro-frame\" title=\"Low Pro Emergency Bar interactive demo\" style=\"width:100%;border:0;display:block;border-radius:16px;background:#0a0c0f;\" srcdoc='\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\"en\"\u0026gt;\n\u0026lt;head\u0026gt;\n\u0026lt;meta charset=\"UTF-8\"\u0026gt;\n\u0026lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u0026gt;\n\u0026lt;title\u0026gt;Black Oak LED · Low Pro Emergency Bar Interactive Demo\u0026lt;\/title\u0026gt;\n\u0026lt;style\u0026gt;\n  :root{\n    --bg:#0a0c0f; --panel:#111418; --panel2:#161a20; --edge:#242a33;\n    --txt:#e8ecf2; --dim:#8a94a3; --white-led:#F4F8FF; --navy:#0B1B2B; --accent:#C8892A;\n  }\n  *{box-sizing:border-box; -webkit-tap-highlight-color:transparent}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);\n    font-family:\"Segoe UI\",system-ui,-apple-system,Roboto,Arial,sans-serif;}\n  .wrap{max-width:1100px;margin:0 auto;padding:14px 16px 20px;}\n  header{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:6px}\n  .brand{font-weight:800;letter-spacing:.18em;font-size:19px;white-space:nowrap}\n  .brand span{color:var(--dim);font-weight:600}\n  .sub{color:var(--dim);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase}\n  .stage{background:radial-gradient(ellipse at 50% 30%, #14181e 0%, #0b0d11 70%);\n    border:1px solid var(--edge);border-radius:14px;padding:6px 10px 2px;position:relative;overflow:hidden}\n  .stage svg{display:block;width:100%;height:auto}\n  .stageLabel{position:absolute;top:10px;left:14px;font-size:11px;letter-spacing:.14em;\n    color:#5b6470;text-transform:uppercase}\n  .haloBadge{position:absolute;top:10px;right:14px;display:none;align-items:center;gap:8px;\n    font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#dfe9f7;\n    background:rgba(70,90,120,.22);border:1px solid rgba(190,215,255,.35);\n    border-radius:999px;padding:5px 12px 5px 9px;backdrop-filter:blur(2px)}\n  .haloBadge .dot{width:8px;height:8px;border-radius:50%;background:#F4F8FF;\n    box-shadow:0 0 8px 2px rgba(220,235,255,.9);flex:none}\n  .haloBadge b{font-weight:700;color:#fff}\n  .haloBadge span{color:#9fb0c6;text-transform:none;letter-spacing:.02em}\n  @media(max-width:700px){.haloBadge span{display:none}}\n  .lower{display:grid;grid-template-columns:270px 1fr;gap:14px;margin-top:14px;align-items:stretch}\n  .compactSel{display:none}\n  @media(max-width:840px){\n    .stage{padding:8px 8px 4px}\n    .stageLabel{position:static;font-size:10px;margin:0 0 6px}\n    .haloBadge{position:static;font-size:10px;padding:4px 9px;margin:0 0 6px;width:max-content}\n    .wrap{padding:6px 6px 10px !important}\n    .lower{grid-template-columns:1fr;gap:10px}\n    .cardCtl{order:1}\n    .cardColors{order:2}\n    .cardColors .cRow,.cardColors .hint{display:none}\n    .cardColors.expanded .cRow{display:block}\n    .compactSel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n    .compactSel .sw{cursor:default}\n    .compactSel .sw:hover{transform:none}\n  }\n  .card{background:var(--panel);border:1px solid var(--edge);border-radius:14px;padding:14px}\n  .card h3{margin:0 0 10px;font-size:11.5px;letter-spacing:.16em;color:var(--dim);\n    text-transform:uppercase;font-weight:700}\n  .cRow{margin-bottom:12px}\n  .cRow .lbl{font-size:12px;color:var(--dim);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}\n  .swatches{display:flex;gap:8px;flex-wrap:wrap}\n  .sw{width:38px;height:30px;border-radius:7px;border:2px solid #2c333d;cursor:pointer;\n    position:relative;transition:transform .08s}\n  .sw:hover{transform:translateY(-1px)}\n  .sw.sel{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25),0 0 14px rgba(255,255,255,.15)}\n  .sw.none{background:repeating-linear-gradient(45deg,#1a1f26 0 6px,#12161b 6px 12px)}\n  .sw.none::after{content:\"OFF\";position:absolute;inset:0;display:flex;align-items:center;\n    justify-content:center;font-size:9px;color:#6b7480;font-weight:700;letter-spacing:.05em}\n  .swapBtn{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);border-radius:7px;\n    font-size:11px;padding:4px 9px;cursor:pointer;letter-spacing:.06em}\n  .swapBtn:hover{border-color:#4a5462}\n  .hint{font-size:11.5px;line-height:1.5;color:#6d7684;border-top:1px solid var(--edge);\n    padding-top:10px;margin-top:2px}\n  .hint b{color:#9aa4b2;font-weight:600}\n  .ctlWrap{display:flex;justify-content:center}\n  .ctlWrap svg{width:100%;max-width:560px;height:auto}\n  .kb{cursor:pointer}\n  .kb rect.face,.kb circle.face,.kb path.face{fill:#20242b;stroke:#0c0e11;stroke-width:1.5;transition:fill .1s}\n  .kb:hover rect.face,.kb:hover circle.face,.kb:hover path.face{fill:#2e3641}\n  @keyframes ringPulse{0%,100%{stroke-opacity:.9}50%{stroke-opacity:.12}}\n  .pulseRing{fill:none;stroke:#ffb43a;stroke-width:2.5;animation:ringPulse 1.8s ease-in-out infinite;pointer-events:none}\n  @keyframes hintPulse{0%,100%{opacity:.6}50%{opacity:1}}\n  .tryHint{display:flex;justify-content:center;margin:10px 0 0}\n  .tryHint span{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;\n    text-transform:uppercase;color:#ffcf7d;border:1px solid rgba(255,180,58,.45);border-radius:999px;\n    padding:6px 14px;animation:hintPulse 2.4s ease-in-out infinite;background:rgba(255,180,58,.07)}\n  .tryHint .dotLive{width:7px;height:7px;border-radius:50%;background:#ffb43a;\n    box-shadow:0 0 7px 2px rgba(255,180,58,.7);flex:none}\n  .kb.lit rect.face,.kb.lit circle.face,.kb.lit path.face{fill:#dfe7f5}\n  .kb.lit text{fill:#20242b;font-weight:600}\n  .kb:active rect.face,.kb:active circle.face,.kb:active path.face{fill:#aab6c9}\n  .kb.lit{filter:url(#btnGlow)}\n  .kb text{fill:#c7cdd6;font-size:11px;text-anchor:middle;pointer-events:none;user-select:none}\n  footer{margin-top:12px;color:#59626e;font-size:11px;letter-spacing:.04em;\n    display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}\n  footer a{color:#7d8794;text-decoration:none}\n\u0026lt;\/style\u0026gt;\n\u0026lt;\/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;div class=\"wrap\"\u0026gt;\n  \u0026lt;header\u0026gt;\n    \u0026lt;div class=\"brand\"\u0026gt;BLACK OAK \u0026lt;span\u0026gt;LED\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"sub\"\u0026gt;Low Pro\u0026amp;trade; Emergency Bar · Interactive Demo \u0026amp;bull; 49\u0026amp;Prime;\u0026lt;\/div\u0026gt;\n  \u0026lt;\/header\u0026gt;\n\n  \u0026lt;div class=\"stage\"\u0026gt;\n    \u0026lt;div class=\"stageLabel\" id=\"patternLabel\"\u0026gt;Pattern 1 · Single Flash\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"haloBadge\" id=\"haloBadge\"\u0026gt;\u0026lt;i class=\"dot\"\u0026gt;\u0026lt;\/i\u0026gt;\n      \u0026lt;b\u0026gt;360\u0026amp;deg; Halo\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;\u0026amp;nbsp;scene light \u0026amp;middot; runs with or without the flashers\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;svg id=\"barSvg\" viewBox=\"0 0 1000 240\" aria-label=\"Light bar simulation\"\u0026gt;\u0026lt;\/svg\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"tryHint\" id=\"tryHint\"\u0026gt;\u0026lt;span\u0026gt;\u0026lt;i class=\"dotLive\"\u0026gt;\u0026lt;\/i\u0026gt;Live demo \u0026amp;middot; try the controller buttons\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"lower\"\u0026gt;\n    \u0026lt;div class=\"card cardColors\" id=\"colorCard\"\u0026gt;\n      \u0026lt;h3\u0026gt;Select Colors\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"compactSel\" id=\"compactSel\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 1\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw1\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 2 (dual color)\u0026lt;\/span\u0026gt;\n          \u0026lt;button class=\"swapBtn\" id=\"swapBtn\" title=\"Swap Color 1 and Color 2\"\u0026gt;\u0026amp;#8646; Swap\u0026lt;\/button\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw2\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"hint\"\u0026gt;\n        Every LED module on the Low Pro can display \u0026lt;b\u0026gt;either\u0026lt;\/b\u0026gt; selected color:\n        pick two colors and each module switches between them.\n        The right-hand cluster runs the \u0026lt;b\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/b\u0026gt;, a Low Pro\n        exclusive: it floods the area around the vehicle with steady work light,\n        with or without the warning flashers running. Try the \u0026lt;b\u0026gt;White\u0026lt;\/b\u0026gt; button.\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"card cardCtl\"\u0026gt;\n      \u0026lt;h3\u0026gt;Controller · press the buttons\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"ctlWrap\"\u0026gt;\n        \u0026lt;svg id=\"ctl\" viewBox=\"0 0 560 300\" aria-label=\"Controller keypad\"\u0026gt;\u0026lt;\/svg\u0026gt;\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;footer\u0026gt;\n    \u0026lt;div\u0026gt;BLACK OAK LED · Navigate the Night.\u0026lt;\/div\u0026gt;\n    \u0026lt;div\u0026gt;Designed and engineered in Sarasota, Florida\u0026lt;\/div\u0026gt;\n  \u0026lt;\/footer\u0026gt;\n\u0026lt;\/div\u0026gt;\n\n\u0026lt;script\u0026gt;\n\"use strict\";\nconst LEDCOLORS = {\n  amber:{main:\"#ffb43a\", core:\"#ffe9b0\", glow:\"#ff9d00\", label:\"Amber\"},\n  white:{main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#cfe4ff\", label:\"White\"},\n  red:  {main:\"#ff2d23\", core:\"#ffb0a8\", glow:\"#ff1400\", label:\"Red\"},\n  blue: {main:\"#2a62ff\", core:\"#b8ccff\", glow:\"#0040ff\", label:\"Blue\"},\n  green:{main:\"#19d949\", core:\"#c2ffcf\", glow:\"#00c832\", label:\"Green\"}\n};\nconst HALO = {main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#dcebff\"};\n\nconst S = {\n  color1:\"amber\", color2:\"white\",\n  c1on:true, c2on:false,\n  zones:{front:true, back:true, left:true, right:true},\n  halo:{front:false, back:false, left:false, right:false},\n  pattern:1,\n  ta:null,\n  cruise:false, random:false, dim50:false, autoSensor:false,\n  indicatorOff:false, favorite:1,\n  randTimer:0, randPat:1\n};\n\nconst NS=\"http:\/\/www.w3.org\/2000\/svg\";\nconst bar = document.getElementById(\"barSvg\");\nconst modules = [];\n\nfunction el(name, attrs, parent){\n  const e=document.createElementNS(NS,name);\n  for(const k in attrs) e.setAttribute(k,attrs[k]);\n  if(parent) parent.appendChild(e);\n  return e;\n}\n\nfunction buildBar(){\n  const defs = el(\"defs\",{},bar);\n  const mkGlow=(id,dev)=\u0026gt;{\n    const f=el(\"filter\",{id, x:\"-80%\",y:\"-80%\",width:\"260%\",height:\"260%\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:dev, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  };\n  mkGlow(\"ledGlow\",4);\n  (()=\u0026gt;{\n    const f=el(\"filter\",{id:\"haloGlow\", filterUnits:\"userSpaceOnUse\",\n      x:\"-120\",y:\"-160\",width:\"1240\",height:\"560\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:11, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  })();\n\n  const G = el(\"g\",{},bar);\n  const haloLayer = el(\"g\",{opacity:\"0\"},G);\n  const sidePaths = {\n    front:\"M 150,62 L 850,62\",\n    back: \"M 150,178 L 850,178\",\n    left: \"M 150,62 L 75,95 L 75,145 L 150,178\",\n    right:\"M 850,62 L 925,95 L 925,145 L 850,178\"\n  };\n  const haloEls = {};\n  for(const z in sidePaths){\n    const g=el(\"g\",{filter:\"url(#haloGlow)\"},haloLayer);\n    [[10,.9],[26,.4],[52,.16],[88,.07]].forEach(([wd,op])=\u0026gt;{\n      el(\"path\",{d:sidePaths[z], stroke:\"#eef4ff\", \"stroke-width\":wd, \"stroke-opacity\":op,\n        fill:\"none\", \"stroke-linecap\":\"round\", \"stroke-linejoin\":\"round\"},g);\n    });\n    haloEls[z]=g;\n  }\n  for(const k in haloEls){ haloEls[k].setAttribute(\"visibility\",\"hidden\"); }\n  S._haloEls = haloEls; haloLayer.setAttribute(\"opacity\",\"1\");\n\n  const bodyPts = \"150,62 850,62 925,95 925,145 850,178 150,178 75,145 75,95\";\n  el(\"polygon\",{points:bodyPts, fill:\"#15181d\", stroke:\"#3a4149\", \"stroke-width\":3},G);\n  el(\"polygon\",{points:\"158,70 842,70 913,99 913,141 842,170 158,170 87,141 87,99\",\n    fill:\"#0e1114\", stroke:\"#22272e\",\"stroke-width\":1},G);\n  el(\"text\",{x:500,y:112,\"text-anchor\":\"middle\",fill:\"#c9d0d9\",\"font-size\":\"21\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"6\",\"font-family\":\"inherit\"},G).textContent=\"BLACK OAK\";\n  el(\"text\",{x:500,y:130,\"text-anchor\":\"middle\",fill:\"#4c545e\",\"font-size\":\"9\",\n    \"letter-spacing\":\"2\"},G).textContent=\"SAE W3-1 22\";\n  el(\"circle\",{cx:500,cy:148,r:5,fill:\"#20252b\",stroke:\"#3a4149\"},G);\n\n  const ledLayer = el(\"g\",{},G);\n  const N=12;\n  const w=53, h=12, gap=4.6;\n  const startX=155, span=690;\n  let order=0;\n  const addMod=(zone,x,y,rot,cx,cy)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x,y,width:w,height:h,rx:4, fill:\"#23282f\", stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:x-6,y:y-6,width:w+12,height:h+12,rx:9, fill:\"none\",opacity:0, filter:\"url(#ledGlow)\"},g);\n    modules.push({zone, lens, halo, idx:order++, px:x+w\/2});\n  };\n  const addRot=(zone,cx,cy,len,rot)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x:cx-len\/2,y:cy-h\/2,width:len,height:h,rx:4,\n      fill:\"#23282f\",stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:cx-len\/2-6,y:cy-h\/2-6,width:len+12,height:h+12,rx:9,\n      fill:\"none\",opacity:0,filter:\"url(#ledGlow)\"},g);\n    modules.push({zone,lens,halo,idx:modules.length,px:cx});\n  };\n  for(let i=0;i\u0026lt;N;i++){ const x=startX+i*(span\/N)+gap\/2; addMod(\"front\",x,52,0,0,0); }\n  addRot(\"right\",884,73,68,23.7);\n  addRot(\"right\",921,120,46,90);\n  addRot(\"right\",884,167,68,-23.7);\n  for(let i=N-1;i\u0026gt;=0;i--){ const x=startX+i*(span\/N)+gap\/2; addMod(\"back\",x,176,0,0,0); }\n  addRot(\"left\",116,167,68,23.7);\n  addRot(\"left\",79,120,46,90);\n  addRot(\"left\",116,73,68,-23.7);\n}\nbuildBar();\nconst NMOD = modules.length;\nconst frontMods = modules.filter(m=\u0026gt;m.zone===\"front\");\nconst backMods  = modules.filter(m=\u0026gt;m.zone===\"back\");\nconst halfSplit = m=\u0026gt;{\n  if(m.zone===\"left\") return \"L\";\n  if(m.zone===\"right\") return \"R\";\n  const list = m.zone===\"front\"?frontMods:backMods;\n  const pos = list.indexOf(m);\n  const leftSide = m.zone===\"front\" ? pos \u0026lt; list.length\/2 : pos \u0026gt;= list.length\/2;\n  return leftSide ? \"L\" : \"R\";\n};\nmodules.forEach(m=\u0026gt;m.side=halfSplit(m));\nconst PXMIN=Math.min(...modules.map(m=\u0026gt;m.px)), PXMAX=Math.max(...modules.map(m=\u0026gt;m.px));\n\nfunction pulse(t, cycle, n){\n  const ph = t % cycle;\n  if(n===1) return ph \u0026lt; 168;\n  const sub = cycle\u0026gt;=800 ? 84 : (n===2 ? 83 : 67);\n  const onw = cycle\u0026gt;=800 ? 67 : 50;\n  if(ph \u0026gt;= n*sub) return false;\n  return (ph % sub) \u0026lt; onw;\n}\nfunction burst(local, half, n){\n  const sub = Math.min(half\u0026gt;=400 ? 84 : 67, half\/n);\n  if(local \u0026gt;= n*sub) return false;\n  return (local % sub) \u0026lt; sub*.75;\n}\nconst PATTERNS = {\n  1:{name:\"Single Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,1)},\n  2:{name:\"Double Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,2)},\n  3:{name:\"Triple Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,3)},\n  4:{name:\"Quintuple Flash\", cyc:800, f:(t,c)=\u0026gt;pulse(t,c,5)},\n  5:{name:\"Slow Single Flash\",cyc:800,f:(t,c)=\u0026gt;(t%c) \u0026lt; 434},\n  6:{name:\"Two Adjacent Groups Alternate\", cyc:400, group:true},\n  7:{name:\"Left \/ Right 3-Flash Alternate\", cyc:400, lr:3},\n  8:{name:\"Left \/ Right 5-Flash Alternate\", cyc:800, lr:5},\n  9:{name:\"Counterclockwise Rotation\", cyc:1400, rot:-1},\n  10:{name:\"Clockwise Rotation\",       cyc:1400, rot:1},\n  11:{name:\"Left Steady + Right Quintuple\", cyc:800, steady:\"L\"},\n  12:{name:\"Right Steady + Left Quintuple\", cyc:800, steady:\"R\"}\n};\n\nfunction moduleState(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const single = (S.c1on?1:0)+(S.c2on\u0026amp;\u0026amp;S.color2?1:0)===1;\n  if(!dual \u0026amp;\u0026amp; !single) return null;\n  const cA = S.c1on ? S.color1 : S.color2;\n  const P = PATTERNS[S.pattern];\n  const cyc = P.cyc;\n\n  if(S.cruise){\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:.7};\n  }\n\n  let phaseColor = cA;\n  let tt = t;\n  if(dual){\n    const period = cyc*2;\n    const first = (t % period) \u0026lt; cyc;\n    phaseColor = first ? S.color1 : S.color2;\n    tt = t % cyc;\n  }\n\n  if(P.rot){\n    const pos = (t % cyc)\/cyc;\n    const head = P.rot===1 ? pos : 1-pos;\n    const center = head*NMOD;\n    let d = Math.abs(m.idx - center);\n    d = Math.min(d, NMOD-d);\n    if(d \u0026gt; 3.2) return null;\n    const col = dual ? (Math.floor(t\/cyc)%2? S.color2 : S.color1) : cA;\n    return {color:col, intensity: 1 - d\/3.6};\n  }\n  if(P.lr){\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    const mineFirst = m.side===\"L\";\n    if(firstHalf!==mineFirst) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, P.lr)) return null;\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:1};\n  }\n  if(P.group){\n    const g = Math.floor(m.idx\/2)%2;\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    if((g===0)!==firstHalf) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, 3)) return null;\n    const col = dual ? (g===0?S.color1:S.color2) : phaseColor;\n    return {color:col, intensity:1};\n  }\n  if(P.steady){\n    const steadySide = P.steady;\n    if(m.side===steadySide){\n      const col = dual ? S.color1 : cA;\n      return {color:col, intensity:.4};\n    }\n    if(!pulse(tt,cyc,5)) return null;\n    const col = dual ? S.color2 : cA;\n    return {color:col, intensity:1};\n  }\n  if(!P.f(tt,cyc)) return null;\n  if(dual){\n    if(S.pattern===2||S.pattern===3){\n      const flip = S.pattern===3;\n      const c1side = flip? \"R\":\"L\";\n      return {color: m.side===c1side? S.color1:S.color2, intensity:1};\n    }\n    return {color:phaseColor, intensity:1};\n  }\n  return {color:cA, intensity:1};\n}\n\nfunction taSweep(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const T = 1600;\n  const pass = Math.floor(t\/T) % (dual?2:1);\n  const col = dual ? (pass===0 ? S.color1 : S.color2)\n                   : (S.c1on ? S.color1 : (S.color2||S.color1));\n  const ph=(t%T)\/T;\n  let build;\n  if(ph\u0026lt;.65) build = ph\/.65;\n  else if(ph\u0026lt;.8) build = 1;\n  else return null;\n  const p = (m.px-PXMIN)\/(PXMAX-PXMIN);\n  const e = .002;\n  let on=false;\n  if(S.ta===\"right\")      on = p \u0026lt;= build+e;\n  else if(S.ta===\"left\")  on = (1-p) \u0026lt;= build+e;\n  else                    on = Math.abs(p-0.5) \u0026lt;= build*0.5+e;\n  return on? {color:col,intensity:1} : null;\n}\n\nlet lastPatternShown=-1;\nfunction render(t){\n  const dimMul = S.dim50? .45 : 1;\n  if(S.random \u0026amp;\u0026amp; t-S.randTimer\u0026gt;4000){\n    S.randTimer=t; S.pattern = 1+Math.floor(Math.random()*12); syncUI();\n  }\n  const warnOn = (S.c1on || (S.c2on\u0026amp;\u0026amp;S.color2));\n  for(const m of modules){\n    let st;\n    if(S.ta) st = taSweep(m,t);\n    else if(warnOn \u0026amp;\u0026amp; S.zones[m.zone]) st = moduleState(m,t);\n    else st = null;\n    m.cur = st;\n    if(st){ m.lastT=t; m.lastC=st.color; m.lastK=st.intensity; }\n    let drawC=null, drawK=0;\n    if(st){ drawC=st.color; drawK=st.intensity; }\n    else if(m.lastC \u0026amp;\u0026amp; (t-m.lastT)\u0026lt;70){ drawC=m.lastC; drawK=m.lastK*(1-(t-m.lastT)\/70)*.7; }\n    if(drawC){\n      const c=LEDCOLORS[drawC];\n      const k=drawK*dimMul;\n      m.lens.setAttribute(\"fill\", k\u0026gt;.55? c.core : c.main);\n      m.lens.setAttribute(\"stroke\", c.main);\n      m.halo.setAttribute(\"fill\", c.glow);\n      m.halo.setAttribute(\"opacity\", (0.85*k).toFixed(2));\n    }else{\n      m.lens.setAttribute(\"fill\",\"#23282f\");\n      m.lens.setAttribute(\"stroke\",\"#10131a\");\n      m.halo.setAttribute(\"opacity\",\"0\");\n    }\n  }\n  for(const z in S._haloEls){\n    S._haloEls[z].setAttribute(\"visibility\", S.halo[z]? \"visible\":\"hidden\");\n    S._haloEls[z].setAttribute(\"opacity\", (.85*dimMul).toFixed(2));\n  }\n  if(S._dots){\n    const RED=\"#ff2622\", OFF=\"#1c2026\";\n    for(const row of [\"front\",\"back\"]){\n      const src = row===\"front\"? frontMods : backMods.slice().reverse();\n      S._dots[row].forEach((dot,i)=\u0026gt;{\n        if(S.indicatorOff){ dot.setAttribute(\"fill\",OFF); return; }\n        const m = src[Math.round(i*(src.length-1)\/(S._dots[row].length-1))];\n        dot.setAttribute(\"fill\", m.cur? RED : OFF);\n      });\n    }\n    const zoneLit = z =\u0026gt; modules.some(m=\u0026gt;m.zone===z \u0026amp;\u0026amp; m.cur);\n    S._dotL.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"left\"))?  RED : OFF);\n    S._dotR.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"right\"))? RED : OFF);\n  }\n  if(S.pattern!==lastPatternShown){ lastPatternShown=S.pattern; updateLabel(); }\n  requestAnimationFrame(render);\n}\n\nfunction updateLabel(){\n  const P=PATTERNS[S.pattern];\n  document.getElementById(\"patternLabel\").textContent =\n    `Pattern ${S.pattern} · ${P.name}` + (S.cruise? \"  •  Cruise\":\"\") + (S.ta\u0026amp;\u0026amp;!tourActive? `  •  Traffic Advisor ${S.ta}`:\"\");\n  drawDisplay();\n}\n\nconst ORDER=[\"amber\",\"white\",\"red\",\"blue\",\"green\"];\nfunction buildCompact(){\n  const c=document.getElementById(\"compactSel\");\n  c.innerHTML=\"\";\n  const mk=(col)=\u0026gt;{ const d=document.createElement(\"div\"); d.className=\"sw\";\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label; return d; };\n  const lab=document.createElement(\"span\");\n  lab.style.cssText=\"font-size:12px;color:#8a94a3\";\n  lab.textContent=\"Your colors:\";\n  c.appendChild(lab);\n  c.appendChild(mk(S.color1));\n  if(S.color2){ c.appendChild(mk(S.color2)); }\n  const btn=document.createElement(\"button\");\n  btn.className=\"swapBtn\";\n  const card=document.getElementById(\"colorCard\");\n  btn.textContent = card.classList.contains(\"expanded\") ? \"Done\" : \"Change colors\";\n  btn.onclick=()=\u0026gt;{ card.classList.toggle(\"expanded\"); buildCompact(); };\n  c.appendChild(btn);\n}\nfunction buildSwatches(){\n  buildCompact();\n  const s1=document.getElementById(\"sw1\"), s2=document.getElementById(\"sw2\");\n  s1.innerHTML=\"\"; s2.innerHTML=\"\";\n  for(const c of ORDER){\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color1===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color1=c; if(S.color2===c) S.color2=null; buildSwatches(); };\n    s1.appendChild(d);\n  }\n  const none=document.createElement(\"div\");\n  none.className=\"sw none\"+(S.color2===null?\" sel\":\"\");\n  none.title=\"Single color\"; none.onclick=()=\u0026gt;{S.color2=null; buildSwatches();};\n  s2.appendChild(none);\n  for(const c of ORDER){\n    if(c===S.color1) continue;\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color2===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color2=c; S.c2on=true; buildSwatches(); syncUI(); };\n    s2.appendChild(d);\n  }\n}\ndocument.getElementById(\"swapBtn\").onclick=()=\u0026gt;{\n  if(!S.color2) return;\n  [S.color1,S.color2]=[S.color2,S.color1]; buildSwatches();\n};\n\nconst ctl=document.getElementById(\"ctl\");\nconst buttons={};\nfunction buildController(){\n  const defs=el(\"defs\",{},ctl);\n  const f=el(\"filter\",{id:\"btnGlow\",x:\"-40%\",y:\"-40%\",width:\"180%\",height:\"180%\"},defs);\n  el(\"feGaussianBlur\",{stdDeviation:\"2.2\",result:\"b\"},f);\n  const mg=el(\"feMerge\",{},f);\n  el(\"feMergeNode\",{in:\"b\"},mg); el(\"feMergeNode\",{in:\"SourceGraphic\"},mg);\n\n  el(\"rect\",{x:2,y:2,width:556,height:296,rx:26,fill:\"#17191d\",stroke:\"#000\",\"stroke-width\":2},ctl);\n  el(\"rect\",{x:12,y:12,width:536,height:276,rx:20,fill:\"none\",stroke:\"#262a31\",\"stroke-width\":1.5},ctl);\n\n  const btn=(key,label,x,y,shape,w,h,fs)=\u0026gt;{\n    const g=el(\"g\",{class:\"kb\",tabindex:\"0\",role:\"button\",\"aria-label\":label.replace(\"\\n\",\" \")},ctl);\n    if(shape===\"circle\") el(\"circle\",{class:\"face\",cx:x,cy:y,r:w},g);\n    else if(shape===\"rect\") el(\"rect\",{class:\"face\",x:x-w\/2,y:y-h\/2,width:w,height:h,rx:8},g);\n    else el(\"path\",{class:\"face\",d:shape},g);\n    const lines=label.split(\"\\n\");\n    lines.forEach((ln,i)=\u0026gt;{\n      const tv = el(\"text\",{x:x, y:y+(i-(lines.length-1)\/2)*11+4, \"font-size\":fs||10.5},g);\n      tv.textContent=ln;\n    });\n    g.addEventListener(\"click\",()=\u0026gt;press(key));\n    g.addEventListener(\"keydown\",e=\u0026gt;{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();press(key);}});\n    buttons[key]={g};\n    return g;\n  };\n\n  const lx=88, ly=88;\n  btn(\"z_front\",\"Front\", lx,   ly-38,\"circle\",19);\n  btn(\"z_left\",\"Left\",   lx-52,ly,   \"circle\",19);\n  btn(\"z_all\",\"ALL\",     lx,   ly,   \"circle\",19);\n  btn(\"z_right\",\"Right\", lx+52,ly,   \"circle\",19);\n  btn(\"z_back\",\"Back\",   lx,   ly+38,\"circle\",19);\n\n  el(\"rect\",{x:170,y:34,width:220,height:64,rx:12,fill:\"#0a0c0e\",stroke:\"#26292f\"},ctl);\n  el(\"text\",{x:280,y:71,\"text-anchor\":\"middle\",fill:\"#b9c1cc\",\"font-size\":\"15\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"4\"},ctl).textContent=\"BLACK OAK\";\n  S._dots={front:[],back:[]};\n  for(let i=0;i\u0026lt;8;i++){\n    S._dots.front.push(el(\"circle\",{cx:198+i*24,cy:46,r:3.4,fill:\"#1c2026\"},ctl));\n    S._dots.back.push( el(\"circle\",{cx:198+i*24,cy:86,r:3.4,fill:\"#1c2026\"},ctl));\n  }\n  S._dotL = el(\"circle\",{cx:182,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n  S._dotR = el(\"circle\",{cx:382,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n\n  btn(\"ta_left\",\"Left\", 210,126,\"M186 126 L214 108 L226 108 L226 144 L214 144 Z\",0,0,9.5);\n  btn(\"ta_both\",\"Traffic\\nAdvisor\",272,126,\"M232 108 L308 108 L318 126 L308 144 L232 144 L242 126 Z\",0,0,9.5);\n  btn(\"ta_right\",\"Right\",330,126,\"M314 108 L326 108 L354 126 L326 144 L314 144 Z\",0,0,9.5);\n\n  const rx=470, ry=88;\n  btn(\"h_front\",\"Front\", rx,   ry-38,\"circle\",19);\n  btn(\"h_left\",\"Left\",   rx-52,ry,   \"circle\",19);\n  btn(\"h_white\",\"White\", rx,   ry,   \"circle\",19);\n  btn(\"h_right\",\"Right\", rx+52,ry,   \"circle\",19);\n  btn(\"h_back\",\"Back\",   rx,   ry+38,\"circle\",19);\n  el(\"text\",{x:rx,y:ry+68,\"text-anchor\":\"middle\",fill:\"#7f8b9c\",\"font-size\":\"9.5\",\n    \"font-weight\":\"700\",\"letter-spacing\":\"1.5\"},ctl).textContent=\"360° HALO\";\n  el(\"text\",{x:rx,y:ry+79,\"text-anchor\":\"middle\",fill:\"#59636f\",\"font-size\":\"8\",\n    \"letter-spacing\":\"1\"},ctl).textContent=\"SCENE LIGHT\";\n\n  btn(\"c1\",\"Color 1\\nON\/OFF\",   62,190,\"rect\",66,40,9.5);\n  btn(\"c2\",\"Color 2\\nON\/OFF\",  136,190,\"rect\",66,40,9.5);\n  btn(\"dim\",\"50%\",              62,244,\"rect\",66,34);\n  btn(\"auto\",\"Auto\\nSensor\",   136,244,\"rect\",66,40,9.5);\n\n  btn(\"last\",\"Last\\nPattern\",  228,218,\"rect\",62,44,9.5);\n  btn(\"next\",\"Next\\nPattern\",  298,218,\"rect\",62,44,9.5);\n  S._ring = el(\"rect\",{x:262,y:190,width:72,height:56,rx:12,class:\"pulseRing\"},ctl);\n\n  btn(\"ind\",\"Indicator\",       412,190,\"rect\",74,36,9.5);\n  btn(\"cruise\",\"Cruise\\nLight\",496,190,\"rect\",70,40,9.5);\n  btn(\"rand\",\"Random\",         412,244,\"rect\",74,36,9.5);\n  btn(\"fav\",\"Favorite\\nPattern\",496,244,\"rect\",70,40,9.5);\n}\nbuildController();\n\nfunction drawDisplay(){}\n\nlet favHold=null;\nfunction press(key){\n  markInteract();\n  switch(key){\n    case \"z_all\":{\n      const allOn=S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right;\n      const v=!allOn; S.zones={front:v,back:v,left:v,right:v}; break;}\n    case \"z_front\": S.zones.front=!S.zones.front; break;\n    case \"z_back\":  S.zones.back=!S.zones.back; break;\n    case \"z_left\":  S.zones.left=!S.zones.left; break;\n    case \"z_right\": S.zones.right=!S.zones.right; break;\n    case \"h_white\":{\n      const allOn=S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right;\n      const v=!allOn; S.halo={front:v,back:v,left:v,right:v}; break;}\n    case \"h_front\": S.halo.front=!S.halo.front; break;\n    case \"h_back\":  S.halo.back=!S.halo.back; break;\n    case \"h_left\":  S.halo.left=!S.halo.left; break;\n    case \"h_right\": S.halo.right=!S.halo.right; break;\n    case \"c1\": S.c1on=!S.c1on; break;\n    case \"c2\": if(S.color2) S.c2on=!S.c2on; break;\n    case \"next\": S.pattern=S.pattern%12+1; S.cruise=false; S.random=false; break;\n    case \"last\": S.pattern=(S.pattern+10)%12+1; S.cruise=false; S.random=false; break;\n    case \"cruise\": S.cruise=!S.cruise; if(S.cruise){S.random=false;} break;\n    case \"rand\": S.random=!S.random; if(S.random){S.cruise=false; S.randTimer=0;} break;\n    case \"dim\": S.dim50=!S.dim50; break;\n    case \"auto\": S.autoSensor=!S.autoSensor; break;\n    case \"ind\": S.indicatorOff=!S.indicatorOff; break;\n    case \"ta_left\":  S.ta = S.ta===\"left\"? null:\"left\"; break;\n    case \"ta_right\": S.ta = S.ta===\"right\"? null:\"right\"; break;\n    case \"ta_both\":  S.ta = S.ta===\"both\"? null:\"both\"; break;\n    case \"fav\": S.pattern=S.favorite; S.cruise=false; S.random=false; break;\n  }\n  updateLabel(); syncUI();\n}\n(function(){\n  const g=buttons[\"fav\"].g;\n  let t0=0;\n  g.addEventListener(\"pointerdown\",()=\u0026gt;{ t0=Date.now();\n    favHold=setTimeout(()=\u0026gt;{ S.favorite=S.pattern; flash(g); },1200); });\n  const clear=()=\u0026gt;{ if(favHold){clearTimeout(favHold); favHold=null;} };\n  g.addEventListener(\"pointerup\",clear); g.addEventListener(\"pointerleave\",clear);\n  function flash(el){ el.classList.add(\"lit\"); setTimeout(()=\u0026gt;syncUI(),400); }\n})();\n\nfunction syncUI(){\n  const setLit=(k,v)=\u0026gt;buttons[k].g.classList.toggle(\"lit\",!!v);\n  setLit(\"z_front\",S.zones.front); setLit(\"z_back\",S.zones.back);\n  setLit(\"z_left\",S.zones.left);   setLit(\"z_right\",S.zones.right);\n  setLit(\"z_all\",S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right);\n  setLit(\"h_front\",S.halo.front); setLit(\"h_back\",S.halo.back);\n  setLit(\"h_left\",S.halo.left);   setLit(\"h_right\",S.halo.right);\n  setLit(\"h_white\",S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right);\n  setLit(\"c1\",S.c1on); setLit(\"c2\",S.c2on\u0026amp;\u0026amp;!!S.color2);\n  setLit(\"cruise\",S.cruise); setLit(\"rand\",S.random);\n  setLit(\"dim\",S.dim50); setLit(\"auto\",S.autoSensor); setLit(\"ind\",S.indicatorOff);\n  setLit(\"ta_left\",S.ta===\"left\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_right\",S.ta===\"right\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_both\",S.ta===\"both\"\u0026amp;\u0026amp;!tourActive);\n  const haloOn = S.halo.front||S.halo.back||S.halo.left||S.halo.right;\n  document.getElementById(\"haloBadge\").style.display = haloOn? \"flex\":\"none\";\n  drawDisplay();\n}\n\n\/* default everywhere: dual-color amber\/white, steady burn; the attract sweep provides motion *\/\nS.c2on=true; S.cruise=true;\nS.interacted=false;\nlet tourActive=false, tourTimer=null, idleTimer=null;\nbuildSwatches(); syncUI(); updateLabel();\nrequestAnimationFrame(render);\n\n\/* ATTRACT MODE *\/\nfunction markInteract(){\n  if(S.interacted) return;\n  S.interacted=true;\n  if(tourActive){ tourActive=false; S.ta=null; }\n  clearTimeout(tourTimer); clearTimeout(idleTimer);\n  const h=document.getElementById(\"tryHint\");\n  if(h){ h.style.transition=\"opacity .5s\"; h.style.opacity=\"0\"; setTimeout(()=\u0026gt;h.remove(),600); }\n  if(S._ring) S._ring.remove();\n}\nfunction attractSweep(passes){\n  if(S.interacted || tourActive) return;\n  tourActive=true; S.ta=\"both\";\n  tourTimer=setTimeout(()=\u0026gt;{\n    if(tourActive){ tourActive=false; S.ta=null; }\n    scheduleIdle();\n  }, 1600*passes+400);\n}\nfunction scheduleIdle(){\n  if(S.interacted) return;\n  clearTimeout(idleTimer);\n  idleTimer=setTimeout(()=\u0026gt;attractSweep(1), 18000);\n}\ndocument.addEventListener(\"pointerdown\",e=\u0026gt;{\n  if(e.target.closest \u0026amp;\u0026amp; e.target.closest(\".sw,.swapBtn,.kb\")) markInteract();\n},true);\n(function(){\n  let fired=false;\n  const start=()=\u0026gt;{ if(!fired){ fired=true; setTimeout(()=\u0026gt;attractSweep(2), 600); } };\n  if(window.IntersectionObserver){\n    new IntersectionObserver((es,obs)=\u0026gt;{\n      if(es.some(e=\u0026gt;e.isIntersecting)){ start(); obs.disconnect(); }\n    },{threshold:.5}).observe(document.querySelector(\".stage\"));\n  } else start();\n})();\n\n(function(){\n  const embedded = (window!==parent);\n  if(embedded){\n    document.querySelector(\"header\").style.display=\"none\";\n    document.querySelector(\"footer\").style.display=\"none\";\n    if(window.innerWidth\u0026gt;840) document.querySelector(\".wrap\").style.padding=\"10px 12px 14px\";\n  }\n  const report=()=\u0026gt;{ try{\n    parent.postMessage({type:\"lowpro-player-height\",\n      height: document.querySelector(\".wrap\").scrollHeight+8}, \"*\");\n  }catch(e){} };\n  if(window.ResizeObserver) new ResizeObserver(report).observe(document.querySelector(\".wrap\"));\n  window.addEventListener(\"load\",report); window.addEventListener(\"pageshow\",report);\n  setTimeout(report,400); setTimeout(report,1500);\n  let n=0; const iv=setInterval(()=\u0026gt;{ report(); if(++n\u0026gt;10) clearInterval(iv); },1200);\n})();\n\u0026lt;\/script\u0026gt;\n\u0026lt;\/body\u0026gt;\n\u0026lt;\/html\u0026gt;\n'\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.lowpro-frame{height:700px}\n@media(max-width:840px){\n  .lowpro-cta{display:none}\n  .lowpro-frame{height:760px}\n}\n\u003c\/style\u003e\n\u003cscript\u003e\nwindow.addEventListener(\"message\",function(e){\n  if(e.data \u0026\u0026 e.data.type===\"lowpro-player-height\"){\n    var f=document.getElementById(\"lowpro-player-frame\");\n    if(f \u0026\u0026 e.data.height\u003e200) f.style.height=(e.data.height+4)+\"px\";\n  }\n});\n\u003c\/script\u003e\n\u003cdiv style=\"height:28px;\"\u003e \u003c\/div\u003e\n\u003c!-- Intro Section --\u003e\n\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cstrong\u003eBuilt for emergency response teams and public safety professionals, this high-intensity LED warning light bar delivers uncompromising performance in a sleek, durable design.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp data-start=\"530\" data-end=\"806\"\u003eThe Black Oak Low Pro Emergency Series Light Bar is engineered for maximum visibility, reliability, and user control. With ultra-bright LEDs, multiple flash patterns, and a rugged housing, this bar ensures your presence is known in any emergency situation—day or night, rain or shine.\u003c\/p\u003e\n\u003cp data-start=\"530\" data-end=\"806\"\u003e \u003c\/p\u003e\n\u003cp data-start=\"808\" data-end=\"1177\"\u003eBuilt to withstand the demands of high-speed response, off-road utility, or work site visibility, this low-profile bar features a streamlined, aerodynamic frame and a universal mounting system to ensure easy installation on any vehicle. Whether you're outfitting a patrol car, fire unit, or utility truck, this bar delivers dependable performance where it matters most.\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- TRUST STRIP --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Screenshot_2026-07-21_at_9.31.14_AM.png?v=1784641940\" alt=\"SAE J845 Certified, SAE J595 Class 1, IP69K Waterproof, Lifetime Warranty, -40F to +145F Rated, 50,000 Hour LEDs\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003c!-- SIZE SELECTOR --\u003e\n\u003cdiv style=\"margin:4px 0 2px;\"\u003e\n\u003cp style=\"margin:0 0 8px;font-weight:600;font-size:15px;\"\u003eAvailable sizes:\u003c\/p\u003e\n\u003ca href=\"\/products\/11-mini-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e11\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e17\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e30\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e43\"\u003c\/a\u003e\n\u003cspan style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:8px 14px;border-radius:8px;margin:0 6px 8px 0;font-size:15px;\"\u003e49\"\u003c\/span\u003e\n\u003ca href=\"\/products\/new-55-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e55\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-61-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e61\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e68\"\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003c!-- Collapsable Sections --\u003e\n\u003cstyle\u003e\n#MainContent details {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 16px;\n  overflow: hidden;\n  background: #fff;\n  font-family: Arial, sans-serif;\n}\n\n#MainContent details summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  padding: 14px 18px;\n  font-weight: 600;\n  font-size: 18px;\n  list-style: none;\n  background-color: #f9f9f9;\n  border-bottom: 1px solid #e0e0e0;\n  position: relative;\n}\n\n#MainContent details[open] summary {\n  background-color: #f1f1f1;\n}\n\n#MainContent details summary::after {\n  content: '+';\n  font-size: 20px;\n  font-weight: bold;\n  transition: transform 0.3s ease;\n}\n\n#MainContent details[open] summary::after {\n  content: '−';\n}\n\n#MainContent details .content {\n  padding: 16px 20px;\n  font-size: 16px;\n  line-height: 1.6;\n}\n\u003c\/style\u003e\n\u003cdetails\u003e\n\u003csummary\u003eFeatures\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003eLifetime warranty\u003c\/li\u003e\n\u003cli\u003eSAE J845 Class 1 Certified\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e360° visibility with dual-color ultra-bright LEDs\u003c\/li\u003e\n\u003cli\u003eSlim Low Profile design\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 flash patterns with memory recall\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eRugged, waterproof housing (IP69K rated)\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eIntegrated controller with pattern cycling, cruise mode, and cut-off\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIn the Box\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cb\u003eLow Pro Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eController\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWiring\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Brackets\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- COMPLIANCE SECTION --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCompliance \u0026amp; Certifications\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cp\u003e\u003cstrong\u003eMeets the standards your department requires.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"3\"\u003eCertification \u0026amp; Compliance\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J845\u003c\/th\u003e\n\u003ctd\u003e360° warning lamp photometric standard for light bars and beacons\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J595 Class 1\u003c\/th\u003e\n\u003ctd\u003eHighest intensity class — approved for primary emergency vehicles (police, fire, EMS)\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIP69K\u003c\/th\u003e\n\u003ctd\u003eSealed against high-pressure washdown, salt, dust, and submersion\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRated\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Range\u003c\/th\u003e\n\u003ctd\u003eExtreme-climate duty\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e-40°F to +145°F\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDuty Life\u003c\/th\u003e\n\u003ctd\u003eContinuous-duty LED modules\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50,000 hours\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"font-size:13px;color:#666;\"\u003e\u003cem\u003eWarning-equipment regulations vary by state and jurisdiction. Verify color and mounting requirements with your local authority. Spec sheet PDF and certification documentation available on request for procurement offices.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- Image + Text Alternating Section --\u003e\n\u003cstyle\u003e\n.text-image-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 20px;\n}\n.text-image-wrap.text-image-right {\n  flex-direction: row-reverse;\n}\n.text-image-wrap .image-wrap {\n  flex: 1;\n  max-width: 500px;\n}\n.text-image-wrap .image-wrap img {\n  width: 100%;\n  height: auto;\n  max-height: 300px; \n  display: block;\n  object-fit: contain; \n}\n.text-image-wrap .text-wrap {\n  flex: 1;\n  min-width: 300px;\n}\n\u003c\/style\u003e\n\u003c!-- Image Right - Text Left Section --\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/255283_7703341170749_330031d5_da20_475f_887e_f1269d2ad248_1.jpg?v=1763495670\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eEmergency Bar + Work Light\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eGet full 360° white-light illumination at the touch of a button. Perfect for reverse lighting, scene lighting, or any situation where you need powerful all-around visibility. It’s a true dual-purpose feature you won’t find on most emergency bars — and it comes standard on every one of ours.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_SAE_graphics.jpg?v=1758041472\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eBuilt Tough for Any Environment\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eIP69K-rated waterproof housing and reinforced aluminum construction stand up to rain, snow, mud, and dust—ideal for police, fire, tow, or off-road response vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00223.jpg?v=1754512314\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e Full 360° Warning Visibility\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003ePacked with high-output dual-color LEDs and side modules, this bar delivers all-angle visibility—ensuring you're seen from every direction, even in chaotic scenes or inclement weather.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Driver_Side_Angle.jpg?v=1761226316\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSlim, Low-Profile Design\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eEngineered to minimize wind resistance and visual bulk, this light bar features a sleek, aerodynamic frame that hugs your vehicle’s roofline. The low-profile housing not only enhances fuel efficiency but also delivers a clean, professional look without compromising brightness or performance.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\n\u003cp\u003e\u003cvideo controls=\"controls\" playsinline=\"\" loop=\"loop\" autoplay=\"autoplay\" muted=\"\" height=\"auto\" width=\"100%\"\u003e\n    \u003csource type=\"video\/mp4\" src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4ec9ce848f5e4d2d8083da9daf4dbe78.mp4\"\u003e\n    Your browser does not support the video tag.\n  \u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 Flash Patterns with Smart Memory\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eChoose from up to 45 user-selectable flash patterns to fit any scenario. Built-in memory recall stores your last used setting for consistent deployment every time.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_-_Sliding_Feet.gif?v=1758730578\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSliding Feet\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eOur sliding feet mounts are designed to give you maximum flexibility during installation. By allowing the brackets to slide along the base of the light bar, you can easily adjust spacing to match a wide variety of mounting points. This ensures a precise fit whether you’re working with factory holes, custom setups, or uneven surfaces.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HERO BANNER --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/d8j0ntlcm91z4.cloudfront.net\/user_3G9nKxyaQsdrPdDsxWr4EcSl5FL\/hf_20260715_201038_0803a0cd-07a6-4508-9c7a-50d0230a94e3.png\" alt=\"Built to Code. Backed for Life. SAE J845 and J595 Class 1 compliant, IP69K sealed, lifetime warranty\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- FLEET BLOCK --\u003e\n\u003cdiv style=\"padding:8px 0;margin:0 0 8px;\"\u003e\n\u003ch3 style=\"margin:0 0 8px;\"\u003eOutfitting a Fleet?\u003c\/h3\u003e\n\u003cp style=\"margin:0 0 14px;font-size:16px;line-height:1.6;\"\u003eVolume pricing on 5+ units, department POs accepted, W-9 on file, and spec sheets ready for your procurement office. From single patrol vehicles to full county fleets.\u003c\/p\u003e\n\u003ca href=\"\/pages\/fleet-pricing\" style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:12px 22px;border-radius:8px;text-decoration:none;\"\u003eRequest Fleet Pricing\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Dimension --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Black_Oak_-_Low_Pro_Emergency_Bar_-_All_Dimensions.jpg?v=1762971573\" alt=\"\"\u003e\u003c\/p\u003e\n\u003c!-- Specs --\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003c!-- Specs Chart --\u003e\n\u003cstyle\u003e\n  table.spec-table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    font-size: 15px;\n  }\n  table.spec-table th, table.spec-table td {\n    border: 1px solid #ccc;\n    padding: 10px;\n    text-align: left;\n  }\n  table.spec-table th {\n    background-color: #f7f7f7;\n    font-weight: 600;\n    width: 30%;\n  }\n  table.spec-table tr:hover {\n    background-color: #f2f2f2;\n  }\n  table.spec-table thead th {\n    background-color: #222;\n    color: #fff;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    text-align: center;\n  }\n\u003c\/style\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003ePower \u0026amp; Performance\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Wattage\u003c\/th\u003e\n\u003ctd\u003e408\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e30\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10-30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRaw Lumens\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Chip\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam Pattern\u003c\/th\u003e\n\u003ctd\u003eWide Angle\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertificate\u003c\/th\u003e\n\u003ctd\u003eSAE J845 \u0026amp; SAE J595 Class 1\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Single Color\u003c\/th\u003e\n\u003ctd\u003e15\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Dual Color\u003c\/th\u003e\n\u003ctd\u003e45 (15 Color 1 \/ 15 Color 2 \/ 15 Combo)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eDurability \u0026amp; Lifespan\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 Hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F\u003cbr\u003e-40° to 62° C\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited Lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30 Day Money Back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eWiring \u0026amp; Installation\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eCord Length From Light\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Included?\u003c\/th\u003e\n\u003ctd\u003eYes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector Type\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHole Size for Controller\u003c\/th\u003e\n\u003ctd\u003e\u003cbr\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting Bolt Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eGeneral\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e14.6 Lbs\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E49-\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c!-- FAQ --\u003e\n\u003ch5\u003eDimensions\u003c\/h5\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Black_Oak_-_Low_Pro_Emergency_Bar_-_49_Inch_Dimensions.jpg?v=1762972292\" alt=\"\"\u003e\u003c\/p\u003e\n\u003ch5\u003eVideo\u003c\/h5\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cvideo style=\"max-width: 100%; height: auto;\" controls=\"controls\" playsinline=\"\" loop=\"loop\" muted=\"\" autoplay=\"autoplay\"\u003e\n  \u003csource type=\"video\/mp4\" src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/f7ecf4030812467bbb46b165c21da48e.mov\"\u003e\n  Your browser does not support the video tag.\n\u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cp\u003e\u003cstrong\u003eWhat voltage and control systems does this light bar support?\u003c\/strong\u003e\u003cbr\u003eThis light bar operates on a 12 V–24 V DC power system and can be used with either push-button or wireless controllers. It’s compatible with standard vehicle electrical systems, making installation straightforward for both fleet and individual applications.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow durable is this light bar in harsh environments?\u003c\/strong\u003e\u003cbr\u003eThe Low Pro Emergency Light Bar is built with a rugged aluminum housing, sealed to an IP69K rating and tested to resist corrosion, vibration, and high-pressure water ingress. It’s designed for demanding conditions—whether roadside, rescue, or commercial use—so you can rely on consistent performance when it counts.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat beam patterns and flash modes are included?\u003c\/strong\u003e\u003cbr\u003eUp to 45 flash patterns are built into the unit—including warning, hazard, and full-output flasher modes—with memory recall so your last setting is retained even after power loss. You’ll also find low-profile steady-burn mode useful for scene lighting and standby operations.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs the light bar legal for use on public roads and emergency vehicles?\u003c\/strong\u003e\u003cbr\u003eYes. The unit meets SAE J595 Class 1 and other relevant emergency lighting standards for warning applications. However, regulations vary by jurisdiction, so we recommend checking your local laws before installation to ensure compliance with mounting height, color, and flash pattern requirements.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat’s covered by the warranty?\u003c\/strong\u003e\u003cbr\u003eOur industry-leading lifetime warranty covers manufacturing defects, driver failures, and LED module performance. It does not cover damage caused by improper installation, extreme overuse beyond defined duty cycles, or wiring issues. For full warranty terms, please refer to our Warranty \u0026amp; Returns page.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Amber \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957336637,"sku":"LP-E49-AW","price":950.62,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789229461565,"sku":"LP-E49-AW","price":976.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789229494333,"sku":"LP-E49-AW","price":980.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957402173,"sku":"LP-E49-AW","price":975.62,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789229592637,"sku":"LP-E49-AW","price":1001.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789229625405,"sku":"LP-E49-AW","price":1005.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42590527094845,"sku":"LP-E49-AB","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789229658173,"sku":"LP-E49-AB","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789229690941,"sku":"LP-E49-AB","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ Standard - 12' Lead","offer_id":42590527160381,"sku":"LP-E49-AB","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789229789245,"sku":"LP-E49-AB","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789229822013,"sku":"LP-E49-AB","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ Standard - 12' Lead","offer_id":42996858454077,"sku":"LP-E49-AG","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42996858486845,"sku":"LP-E49-AG","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42996858519613,"sku":"LP-E49-AG","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ Standard - 12' Lead","offer_id":42996858650685,"sku":"LP-E49-AG","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42996858683453,"sku":"LP-E49-AG","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42996858716221,"sku":"LP-E49-AG","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ Standard - 12' Lead","offer_id":43482688323645,"sku":"LP-E49-AR","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43482688356413,"sku":"LP-E49-AR","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43482688389181,"sku":"LP-E49-AR","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ Standard - 12' Lead","offer_id":43482688421949,"sku":"LP-E49-AR","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":43482688454717,"sku":"LP-E49-AR","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":43482688487485,"sku":"LP-E49-AR","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957434941,"sku":"LP-E49-AW","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789229854781,"sku":"LP-E49-AW","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789229887549,"sku":"LP-E49-AW","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957500477,"sku":"LP-E49-AW","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789229985853,"sku":"LP-E49-AW","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789230018621,"sku":"LP-E49-AW","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957533245,"sku":"LP-E49-BW","price":950.62,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789230051389,"sku":"LP-E49-BW","price":976.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789230084157,"sku":"LP-E49-BW","price":980.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957598781,"sku":"LP-E49-BW","price":975.62,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789230182461,"sku":"LP-E49-BW","price":1001.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789230215229,"sku":"LP-E49-BW","price":1005.57,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42590527193149,"sku":"LP-E49-BW","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789230247997,"sku":"LP-E49-BW","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789230280765,"sku":"LP-E49-BW","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42590527258685,"sku":"LP-E49-BW","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789230379069,"sku":"LP-E49-BW","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789230411837,"sku":"LP-E49-BW","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957729853,"sku":"LP-E49-RW","price":950.62,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789230444605,"sku":"LP-E49-RW","price":976.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789230477373,"sku":"LP-E49-RW","price":980.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957795389,"sku":"LP-E49-RW","price":975.62,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789230575677,"sku":"LP-E49-RW","price":1001.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789230608445,"sku":"LP-E49-RW","price":1005.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957631549,"sku":"LP-E49-RB","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789230641213,"sku":"LP-E49-RB","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789230673981,"sku":"LP-E49-RB","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957697085,"sku":"LP-E49-RB","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789230772285,"sku":"LP-E49-RB","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789230805053,"sku":"LP-E49-RB","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957828157,"sku":"LP-E49-RW","price":1005.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789230837821,"sku":"LP-E49-RW","price":1031.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789230870589,"sku":"LP-E49-RW","price":1035.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957893693,"sku":"LP-E49-RW","price":1030.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789230968893,"sku":"LP-E49-RW","price":1056.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789231001661,"sku":"LP-E49-RW","price":1060.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42514957926461,"sku":"LP-E49-AW","price":950.62,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789231034429,"sku":"LP-E49-AW","price":976.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789231067197,"sku":"LP-E49-AW","price":980.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42514957991997,"sku":"LP-E49-AW","price":975.62,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789231165501,"sku":"LP-E49-AW","price":1001.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789231198269,"sku":"LP-E49-AW","price":1005.57,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE49_Angled.png?v=1759163313"},{"product_id":"xdr5-emergency-strobe-light","title":"XDR-5 Emergency Strobe Light, LED Warning Light","description":"\u003cstyle\u003e\n#MainContent .xd-h1 { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 34px !important; font-weight: 800 !important; line-height: 1.12 !important; letter-spacing: -0.5px !important; color: #1C2026 !important; text-transform: none !important; margin: 0 0 10px !important; }\n#MainContent .xd-h2 { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 26px !important; font-weight: 800 !important; line-height: 1.2 !important; color: #1C2026 !important; text-transform: none !important; letter-spacing: -0.2px !important; margin: 0 0 8px !important; }\n#MainContent .xd-h2-light { color: #ffffff !important; }\n#MainContent .xd-h3 { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 16px !important; font-weight: 800 !important; color: #1C2026 !important; text-transform: none !important; letter-spacing: 0 !important; margin: 0 0 6px !important; }\n#MainContent .xd-eyebrow { display: block !important; font-size: 11px; font-weight: 700; letter-spacing: 1.6px; text-transform: uppercase; color: #C27C00; margin: 0 0 4px; }\n#MainContent .xd-eyebrow-dark { color: #FFB300; }\n#MainContent .xd-sub { font-size: 15.5px; line-height: 1.55; color: #5F6670; margin: 0 0 14px; }\n#MainContent .xd-flex { display: flex !important; flex-wrap: wrap; }\n#MainContent .xd-col, #MainContent .xd-card, #MainContent .xd-tile, #MainContent .xd-band { display: block !important; box-sizing: border-box; }\n#MainContent .xd-sw { display: flex !important; flex-wrap: nowrap !important; align-items: center; gap: 10px; box-sizing: border-box; }\n#MainContent .xd-card, #MainContent .xd-tile, #MainContent .xd-sw { transition: all .2s ease; }\n#MainContent .xd-card:hover, #MainContent .xd-tile:hover, #MainContent .xd-sw:hover { border-color: #FFB300 !important; box-shadow: 0 6px 18px rgba(28,32,38,.10); }\n#MainContent .xd-chip { display: inline-block !important; background: #FFF6E0; color: #1C2026; border: 1px solid #FFE1A0; border-radius: 12px; padding: 5px 11px; font-size: 12.5px; font-weight: 700; margin: 0 5px 6px 0; }\n#MainContent .xd-btn { display: inline-block !important; background: transparent; color: #fff !important; border: 2px solid #FFB300; border-radius: 10px; padding: 10px 18px; font-size: 14px; font-weight: 700; text-decoration: none !important; transition: all .18s ease; margin: 0 6px 6px 0; }\n#MainContent .xd-btn:hover { background: #FFB300; color: #111 !important; transform: translateY(-2px); }\n#MainContent .xd-dot { display: inline-block !important; width: 28px; height: 28px; border-radius: 50%; flex: 0 0 28px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.10); }\n#MainContent .xd-hero-img { text-align: center; }\n#MainContent .xd-hero-img img { max-width: 100% !important; max-height: 260px; width: auto; height: auto !important; border-radius: 14px; display: inline-block !important; }\n#MainContent .xd-tiw { display: flex !important; align-items: center; flex-wrap: wrap; gap: 18px; margin: 0 0 8px; background: #fff; border: 2px solid #E5E7EB; border-radius: 16px; padding: 10px; box-sizing: border-box; transition: all .2s ease; }\n#MainContent .xd-tiw:hover { border-color: #FFB300; box-shadow: 0 6px 18px rgba(28,32,38,.10); }\n#MainContent .xd-tiw.xd-rev { flex-direction: row-reverse; }\n#MainContent .xd-tiw-img { flex: 0 1 340px; max-width: 340px; display: block !important; border-radius: 12px; overflow: hidden; }\n#MainContent .description .xd-tiw-img img, #MainContent .xd-tiw .xd-tiw-img img { width: 100% !important; height: 170px !important; max-height: 170px !important; object-fit: cover; border-radius: 12px; display: block !important; }\n@media (max-width: 749px) { #MainContent .xd-tiw-img { flex: 1 1 100%; max-width: 100%; } }\n#MainContent .xd-tiw-txt { flex: 1 1 280px; min-width: 260px; display: block !important; }\n#MainContent .xd-tiw-txt a, #MainContent details .content a { color: #C27C00; font-weight: 700; }\n#MainContent .xd-fig img { max-width: 100% !important; max-height: 280px; width: auto; height: auto !important; border-radius: 12px; display: inline-block !important; }\n#MainContent details { border: 2px solid #E5E7EB; border-radius: 12px; margin-bottom: 8px; overflow: hidden; background: #fff; display: block; }\n#MainContent details summary { display: flex; justify-content: space-between; align-items: center; cursor: pointer; padding: 12px 18px; font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif; font-weight: 700; font-size: 16px; color: #1C2026; list-style: none; background: #fff; border-bottom: 0; }\n#MainContent details summary:hover, #MainContent details[open] summary { background: #FFF6E0; }\n#MainContent details[open] summary { border-bottom: 1px solid #FFE1A0; }\n#MainContent details summary::-webkit-details-marker { display: none; }\n#MainContent details summary::after { content: '+'; font-size: 22px; font-weight: 400; color: #C27C00; }\n#MainContent details[open] summary::after { content: '\\2212'; }\n#MainContent details .content { padding: 6px 18px 12px; font-size: 15px; line-height: 1.55; display: block; }\n#MainContent table.xd-spec { width: 100%; border-collapse: collapse; margin: 0; font-size: 14.5px; }\n#MainContent table.xd-spec th, #MainContent table.xd-spec td { border: 1px solid #E5E7EB; padding: 8px 10px; text-align: left; }\n#MainContent table.xd-spec th { background: #F6F6F4; font-weight: 600; color: #1C2026; width: 42%; }\n#MainContent table.xd-spec tr:hover td, #MainContent table.xd-spec tr:hover th { background: #FFF6E0; }\n#MainContent .description img { max-width: 100% !important; height: auto !important; }\n@media (max-width: 749px) {\n  #MainContent .xd-h1 { font-size: 27px !important; }\n  #MainContent .xd-h2 { font-size: 22px !important; }\n  #MainContent .xd-pad { padding: 20px 16px !important; }\n}\n\u003c\/style\u003e\n\u003cdiv class=\"xd-pad xd-flex\" style=\"display: flex; flex-wrap: wrap; align-items: center; gap: 22px; background: linear-gradient(165deg,#FFF6E0 0%,#ffffff 72%); border: 2px solid #E5E7EB; border-radius: 18px; padding: 26px; margin: 0 0 12px;\"\u003e\n\u003cdiv class=\"xd-col\" style=\"flex: 1 1 340px; min-width: 260px;\"\u003e\n\u003cp style=\"display: inline-block; background: #1C2026; color: #FFB300; font-size: 11px; font-weight: 700; letter-spacing: 1.4px; text-transform: uppercase; padding: 5px 11px; border-radius: 6px; margin: 0 0 10px;\"\u003eSAE J595 · IP69K · 13 Flash Patterns\u003c\/p\u003e\n\u003ch2 class=\"xd-h1\"\u003eXDR-5 Emergency Strobe Light\u003c\/h2\u003e\n\u003cp class=\"xd-sub\"\u003eA slim 5\" LED warning light for tow trucks, utility, construction, and emergency response vehicles. Six high-intensity LEDs throw a 120° wide warning pattern, the low-profile housing mounts almost anywhere, and it's sealed to IP69K for pressure washing and all-weather use.\u003c\/p\u003e\n\u003cp style=\"margin: 0; line-height: 2;\"\u003e\u003cspan class=\"xd-chip\"\u003eSAE J595\u003c\/span\u003e\u003cspan class=\"xd-chip\"\u003eIP69K Waterproof\u003c\/span\u003e\u003cspan class=\"xd-chip\"\u003e10–30V DC\u003c\/span\u003e\u003cspan class=\"xd-chip\"\u003eSync Capable\u003c\/span\u003e\u003cspan class=\"xd-chip\"\u003eLimited Lifetime Warranty\u003c\/span\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-col xd-hero-img\" style=\"flex: 1 1 260px;\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-5_-_Amber_Blue.png?v=1785501647\" alt=\"XDR-5 LED emergency strobe light in amber and blue\" width=\"500\" height=\"500\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-flex\" style=\"display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 22px;\"\u003e\n\u003cdiv class=\"xd-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003e13\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eFlash Patterns\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003e120°\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eWide Angle\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003eIP69K\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eWaterproof\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003e1.5A\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eAmp Draw\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cspan class=\"xd-eyebrow\"\u003ePick Your Colors\u003c\/span\u003e\n\u003ch2 class=\"xd-h2\"\u003e9 single and dual-color options\u003c\/h2\u003e\n\u003cp class=\"xd-sub\"\u003eRun one color or split two in the same head. Dual-color models alternate between both colors for maximum attention.\u003c\/p\u003e\n\u003cdiv class=\"xd-flex\" style=\"display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 22px;\"\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: #FFB300;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eAmber\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: #1C6FE0;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eBlue\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: #E23B3B;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eRed\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: linear-gradient(135deg,#FFB300 0 50%,#1C6FE0 50% 100%);\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eAmber \u0026amp; Blue\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: linear-gradient(135deg,#FFB300 0 50%,#2FBF5B 50% 100%);\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eAmber \u0026amp; Green\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: linear-gradient(135deg,#FFB300 0 50%,#F4F6F8 50% 100%); box-shadow: inset 0 0 0 2px #E5E7EB;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eAmber \u0026amp; White\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: linear-gradient(135deg,#1C6FE0 0 50%,#F4F6F8 50% 100%); box-shadow: inset 0 0 0 2px #E5E7EB;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eBlue \u0026amp; White\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: linear-gradient(135deg,#E23B3B 0 50%,#1C6FE0 50% 100%);\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eRed \u0026amp; Blue\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"xd-dot\" style=\"background: linear-gradient(135deg,#E23B3B 0 50%,#F4F6F8 50% 100%); box-shadow: inset 0 0 0 2px #E5E7EB;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eRed \u0026amp; White\u003c\/b\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cspan class=\"xd-eyebrow\"\u003eBuilt For The Job\u003c\/span\u003e\n\u003ch2 class=\"xd-h2\"\u003eSmall strobe, serious warning power\u003c\/h2\u003e\n\u003cdiv class=\"xd-flex\" style=\"display: flex; flex-wrap: wrap; gap: 10px; margin: 8px 0 22px;\"\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 220px; background: #fff; border: 2px solid #E5E7EB; border-radius: 14px; padding: 14px 16px;\"\u003e\n\u003ch3 class=\"xd-h3\"\u003eSAE J595 Approved\u003c\/h3\u003e\n\u003cp style=\"font-size: 14.5px; line-height: 1.5; color: #5F6670; margin: 0;\"\u003eMeets the SAE standard for directional flashing warning lamps on emergency and service vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 220px; background: #fff; border: 2px solid #E5E7EB; border-radius: 14px; padding: 14px 16px;\"\u003e\n\u003ch3 class=\"xd-h3\"\u003e13 Patterns + Sync\u003c\/h3\u003e\n\u003cp style=\"font-size: 14.5px; line-height: 1.5; color: #5F6670; margin: 0;\"\u003eSteady-on plus 13 strobe patterns. Sync multiple units to flash together or alternate side to side.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 220px; background: #fff; border: 2px solid #E5E7EB; border-radius: 14px; padding: 14px 16px;\"\u003e\n\u003ch3 class=\"xd-h3\"\u003e12V or 24V\u003c\/h3\u003e\n\u003cp style=\"font-size: 14.5px; line-height: 1.5; color: #5F6670; margin: 0;\"\u003eRuns on 10–30V DC, so it works on pickups, service bodies, and heavy trucks with no changes.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-tiw\"\u003e\n\u003cdiv class=\"xd-tiw-img\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Amber_-_White_stacked_on_top_of_each_other.jpg?v=1755002429\" alt=\"XDR-5 amber and white emergency strobe lights\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"xd-tiw-txt\"\u003e\n\u003ch3 class=\"xd-h3\" style=\"font-size: 20px !important;\"\u003eUltra Slim, Stealthy Design\u003c\/h3\u003e\n\u003cp style=\"font-size: 15.5px; line-height: 1.55; margin: 0;\"\u003eThe 5-1\/8\" low-profile housing fits tight spots in grilles, bumpers, deck lids, and headache racks, and gives you a clean, modern look. It surface mounts with two M4 bolts and a vibration foam pad. Need to mount it sideways? Add our \u003ca href=\"\/products\/xdr-4-5-90-degree-bracket\"\u003e90° mounting bracket\u003c\/a\u003e.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-tiw xd-rev\"\u003e\n\u003cdiv class=\"xd-tiw-img\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Red_-_Blue_stacked_on_top_of_each_other.jpg?v=1755002448\" alt=\"XDR-5 red and blue emergency strobe lights\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"xd-tiw-txt\"\u003e\n\u003ch3 class=\"xd-h3\" style=\"font-size: 20px !important;\"\u003ePowerful Warning Output\u003c\/h3\u003e\n\u003cp style=\"font-size: 15.5px; line-height: 1.55; margin: 0;\"\u003eSix high-intensity LEDs push an ultra-wide 120° pattern that stays visible day and night. Choose from 13 flash patterns or steady-on, and sync multiple heads for a coordinated, professional warning setup on any vehicle.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-tiw\"\u003e\n\u003cdiv class=\"xd-tiw-img\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Amber-RedBlue-White_stackedontopofeachother.jpg?v=1755002411\" alt=\"XDR-5 strobe lights in amber, red, blue and white\" style=\"object-fit: contain; background: #fff;\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"xd-tiw-txt\"\u003e\n\u003ch3 class=\"xd-h3\" style=\"font-size: 20px !important;\"\u003eRugged \u0026amp; Waterproof\u003c\/h3\u003e\n\u003cp style=\"font-size: 15.5px; line-height: 1.55; margin: 0;\"\u003eSealed to IP69K and rated from -40° to 145° F, the XDR-5 shrugs off rain, road salt, dust, and the pressure washer. It's built to run shift after shift in the conditions work trucks actually see, and it's backed by our limited lifetime warranty.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003cdetails\u003e\n\u003csummary\u003ePower \u0026amp; Performance\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"xd-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWattage\u003c\/th\u003e\n\u003ctd\u003e18W\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eAmp Draw\u003c\/th\u003e\n\u003ctd\u003e1.5A\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10–30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertification\u003c\/th\u003e\n\u003ctd\u003eSAE J595\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLEDs\u003c\/th\u003e\n\u003ctd\u003e6 high-intensity\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam\u003c\/th\u003e\n\u003ctd\u003eUltra wide, 120°\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eModes\u003c\/th\u003e\n\u003ctd\u003eSteady on + 13 strobe patterns, sync capable\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eDurability \u0026amp; Warranty\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"xd-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F (-40° to 62° C)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30-day money back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWiring \u0026amp; Installation\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"xd-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLead Length\u003c\/th\u003e\n\u003ctd\u003e12\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e24 AWG\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector\u003c\/th\u003e\n\u003ctd\u003eOpen-end pigtail\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHarness Included?\u003c\/th\u003e\n\u003ctd\u003eNo\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRecommended Fuse\u003c\/th\u003e\n\u003ctd\u003e5A\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting\u003c\/th\u003e\n\u003ctd\u003eSurface mount, 2× M4 bolts + foam pad (included)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eGeneral \u0026amp; SKUs\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"xd-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLength\u003c\/th\u003e\n\u003ctd\u003e5-1\/8\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e0.1 lb\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSingle Color\u003c\/th\u003e\n\u003ctd\u003eXDR-5S-A · XDR-5S-B · XDR-5S-R\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDual Color\u003c\/th\u003e\n\u003ctd\u003eXDR-5S-AB · XDR-5S-AG · XDR-5S-AW · XDR-5S-BW · XDR-5S-RB · XDR-5S-RW\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdiv class=\"xd-flex\" style=\"display: flex; flex-wrap: wrap; gap: 14px; margin: 18px 0 0; align-items: flex-start;\"\u003e\n\u003cdiv class=\"xd-col\" style=\"flex: 1 1 300px;\"\u003e\n\u003ch5 style=\"margin-top: 0;\"\u003eIn The Box\u003c\/h5\u003e\n\u003cdiv class=\"xd-flex\" style=\"display: flex; flex-wrap: wrap; gap: 8px;\"\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003e1 × XDR-5 Emergency Strobe\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eWith 12\" 24 AWG pigtail\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003eVibration Foam Insert\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eCushions the light against the mount\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003e2 × 1-1\/2\" M4 Bolts\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eWith washers and nuts\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003eInstructions\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eWiring and setup steps\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xd-col xd-fig\" style=\"flex: 1 1 300px;\"\u003e\n\u003ch5 style=\"margin-top: 0;\"\u003eDimensions\u003c\/h5\u003e\n\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-5_Strobe_Dimensions.png?v=1762181313\" alt=\"XDR-5 emergency strobe light dimensions\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIs the XDR-5 SAE approved?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eYes. The XDR-5 is SAE J595 approved for directional flashing warning lamps. Rules on which colors you can run vary by state and vehicle type, so check your local regulations, especially for red and blue.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWill it work on a 24V truck?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eYes. It runs on anything from 10V to 30V DC, so 12V and 24V systems both work with no changes.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCan I sync multiple XDR-5 lights?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eYes. Wire multiple heads together to flash in unison or alternate.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eDoes it come with a harness or switch?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eNo. Each light has a 12\" open-end pigtail that you wire to your own switch and a 5A fuse.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eHow do I mount it?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eIt surface mounts on any flat spot with the included M4 bolts and vibration foam pad. To mount it at a right angle, add the \u003ca href=\"\/products\/xdr-4-5-90-degree-bracket\"\u003eXDR-4 \u0026amp; XDR-5 90° mounting bracket\u003c\/a\u003e.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWhat does the warranty cover?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eOur limited lifetime warranty covers workmanship and material failures. Send the light back and once we verify the issue, we'll repair or replace it free of charge. Every order also comes with a 30-day money-back guarantee.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e","brand":"Black Oak LED","offers":[{"title":"Amber","offer_id":42512529752125,"sku":"XDR-5S-A","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Blue","offer_id":42563696623677,"sku":"XDR-5S-B","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Red","offer_id":42563696656445,"sku":"XDR-5S-R","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue","offer_id":43408883482685,"sku":"XDR-5S-AB","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green","offer_id":43408883515453,"sku":"XDR-5S-AG","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White","offer_id":42512529784893,"sku":"XDR-5S-AW","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White","offer_id":42512529817661,"sku":"XDR-5S-BW","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue","offer_id":42512529850429,"sku":"XDR-5S-RB","price":49.94,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White","offer_id":42512529883197,"sku":"XDR-5S-RW","price":49.94,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Amber-RedBlue-White_stackedontopofeachother.jpg?v=1755002411"},{"product_id":"new-17-low-pro-emergency-light-bar","title":"17\" Low Pro Emergency Light Bar","description":"\u003c!-- LOWPRO MINI INTERACTIVE PLAYER --\u003e\n\u003cdiv id=\"lowpro-player-block\" style=\"margin:0 0 26px;\"\u003e\n\u003cdiv class=\"lowpro-cta\"\u003e\n\u003ch2 style=\"margin:0 0 4px;font-size:24px;line-height:1.25;\"\u003eTake the Controls: Try This Light Bar Live\u003c\/h2\u003e\n\u003cp style=\"margin:0 0 12px;font-size:15px;line-height:1.5;\"\u003eFlip the rocker, press the pattern button, and switch on the 360° Halo scene light, exactly like the socket controller that ships in the box. Only the colors this bar is offered in can be selected.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ciframe id=\"lowpro-player-frame\" class=\"lowpro-frame\" title=\"Mini Low Pro Emergency Bar interactive demo\" style=\"width:100%;border:0;display:block;border-radius:16px;background:#0a0c0f;\" srcdoc=\"\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\u0026quot;en\u0026quot;\u0026gt;\n\u0026lt;head\u0026gt;\n\u0026lt;meta charset=\u0026quot;UTF-8\u0026quot;\u0026gt;\n\u0026lt;meta name=\u0026quot;viewport\u0026quot; content=\u0026quot;width=device-width, initial-scale=1.0\u0026quot;\u0026gt;\n\u0026lt;title\u0026gt;Mini Low Pro Simulator\u0026lt;\/title\u0026gt;\n\u0026lt;style\u0026gt;\n  :root{\n    --bg:#0a0c0f; --panel:#111418; --panel2:#161a20; --edge:#242a33;\n    --txt:#e8ecf2; --dim:#8a94a3;\n  }\n  *{box-sizing:border-box; -webkit-tap-highlight-color:transparent}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);\n    font-family:\u0026quot;Segoe UI\u0026quot;,system-ui,-apple-system,Roboto,Arial,sans-serif;}\n  .wrap{max-width:1100px;margin:0 auto;padding:14px 16px 20px;}\n  header{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:6px}\n  .brand{font-weight:800;letter-spacing:.18em;font-size:19px;white-space:nowrap}\n  .brand span{color:var(--dim);font-weight:600}\n  .sub{color:var(--dim);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase}\n  .sizeBtns{margin-left:auto;display:flex;gap:6px}\n  .sizeBtns button{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);\n    border-radius:7px;font-size:12px;padding:4px 10px;cursor:pointer}\n  .sizeBtns button.on{border-color:#ffb43a;color:#ffcf7d}\n  .stage{background:radial-gradient(ellipse at 50% 30%, #14181e 0%, #0b0d11 70%);\n    border:1px solid var(--edge);border-radius:14px;padding:6px 10px 2px;position:relative;overflow:hidden}\n  .stage svg{display:block;width:100%;height:auto}\n  .stageLabel{position:absolute;top:10px;left:14px;font-size:11px;letter-spacing:.14em;\n    color:#5b6470;text-transform:uppercase}\n  .haloBadge{position:absolute;top:10px;right:14px;display:none;align-items:center;gap:8px;\n    font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#dfe9f7;\n    background:rgba(70,90,120,.22);border:1px solid rgba(190,215,255,.35);\n    border-radius:999px;padding:5px 12px 5px 9px;backdrop-filter:blur(2px)}\n  .haloBadge .dot{width:8px;height:8px;border-radius:50%;background:#F4F8FF;\n    box-shadow:0 0 8px 2px rgba(220,235,255,.9);flex:none}\n  .haloBadge b{font-weight:700;color:#fff}\n  .haloBadge span{color:#9fb0c6;text-transform:none;letter-spacing:.02em}\n  @media(max-width:700px){.haloBadge span{display:none}}\n  .lower{display:grid;grid-template-columns:270px 1fr;gap:14px;margin-top:14px;align-items:stretch}\n  .compactSel{display:none}\n  @media(max-width:840px){\n    .stage{padding:8px 8px 4px}\n    .stageLabel{position:static;font-size:10px;margin:0 0 6px}\n    .haloBadge{position:static;font-size:10px;padding:4px 9px;margin:0 0 6px;width:max-content}\n    .wrap{padding:6px 6px 10px !important}\n    .lower{grid-template-columns:1fr;gap:10px}\n    .cardCtl{order:1}\n    .cardColors{order:2}\n    .cardColors .cRow,.cardColors .hint{display:none}\n    .cardColors.expanded .cRow{display:block}\n    .compactSel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n    .compactSel .sw{cursor:default}\n    .compactSel .sw:hover{transform:none}\n  }\n  .card{background:var(--panel);border:1px solid var(--edge);border-radius:14px;padding:14px}\n  .card h3{margin:0 0 10px;font-size:11.5px;letter-spacing:.16em;color:var(--dim);\n    text-transform:uppercase;font-weight:700}\n  .cRow{margin-bottom:12px}\n  .cRow .lbl{font-size:12px;color:var(--dim);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}\n  .swatches{display:flex;gap:8px;flex-wrap:wrap}\n  .sw{width:38px;height:30px;border-radius:7px;border:2px solid #2c333d;cursor:pointer;\n    position:relative;transition:transform .08s}\n  .sw:hover{transform:translateY(-1px)}\n  .sw.sel{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25),0 0 14px rgba(255,255,255,.15)}\n  .sw.dis{opacity:.22;cursor:not-allowed}\n  .sw.none{background:repeating-linear-gradient(45deg,#1a1f26 0 6px,#12161b 6px 12px)}\n  .sw.none::after{content:\u0026quot;OFF\u0026quot;;position:absolute;inset:0;display:flex;align-items:center;\n    justify-content:center;font-size:9px;color:#6b7480;font-weight:700;letter-spacing:.05em}\n  .hint{font-size:11.5px;line-height:1.5;color:#6d7684;border-top:1px solid var(--edge);\n    padding-top:10px;margin-top:2px}\n  .hint b{color:#9aa4b2;font-weight:600}\n  .swapBtn{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);border-radius:7px;\n    font-size:11px;padding:4px 9px;cursor:pointer;letter-spacing:.06em}\n  .swapBtn:hover{border-color:#4a5462}\n  .ctlWrap{display:flex;justify-content:center}\n  .ctlWrap svg{width:100%;max-width:300px;height:auto}\n  .legend{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 16px;\n    margin:12px auto 0;max-width:420px;border-top:1px solid var(--edge);padding-top:12px}\n  .legend div{display:flex;align-items:baseline;gap:8px;font-size:11.5px;line-height:1.4}\n  .legend b{color:#ffcf7d;font-weight:700;min-width:20px;flex:none}\n  .legend span{color:#7f8b9c}\n  @media(max-width:520px){.legend{grid-template-columns:1fr}}\n  .kb{cursor:pointer}\n  @keyframes ringPulse{0%,100%{stroke-opacity:.9}50%{stroke-opacity:.12}}\n  .pulseRing{fill:none;stroke:#ffb43a;stroke-width:2.5;animation:ringPulse 1.8s ease-in-out infinite;pointer-events:none}\n  @keyframes hintPulse{0%,100%{opacity:.6}50%{opacity:1}}\n  .tryHint{display:flex;justify-content:center;margin:10px 0 0}\n  .tryHint span{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;\n    text-transform:uppercase;color:#ffcf7d;border:1px solid rgba(255,180,58,.45);border-radius:999px;\n    padding:6px 14px;animation:hintPulse 2.4s ease-in-out infinite;background:rgba(255,180,58,.07)}\n  .tryHint .dotLive{width:7px;height:7px;border-radius:50%;background:#ffb43a;\n    box-shadow:0 0 7px 2px rgba(255,180,58,.7);flex:none}\n  footer{margin-top:12px;color:#59626e;font-size:11px;letter-spacing:.04em;\n    display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}\n\u0026lt;\/style\u0026gt;\n\u0026lt;\/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;div class=\u0026quot;wrap\u0026quot;\u0026gt;\n  \u0026lt;header\u0026gt;\n    \u0026lt;div class=\u0026quot;brand\u0026quot;\u0026gt;BLACK OAK \u0026lt;span\u0026gt;LED\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\u0026quot;sub\u0026quot;\u0026gt;Mini Low Pro\u0026amp;trade; Emergency Bar · Interactive Demo \u0026amp;bull; \u0026lt;span id=\u0026quot;sizeLabel\u0026quot;\u0026gt;17\u0026amp;Prime;\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\u0026quot;sizeBtns\u0026quot; id=\u0026quot;sizeBtns\u0026quot;\u0026gt;\u0026lt;\/div\u0026gt;\n  \u0026lt;\/header\u0026gt;\n\n  \u0026lt;div class=\u0026quot;stage\u0026quot;\u0026gt;\n    \u0026lt;div class=\u0026quot;stageLabel\u0026quot; id=\u0026quot;patternLabel\u0026quot;\u0026gt;Pattern 1 · Split Steady Burn\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\u0026quot;haloBadge\u0026quot; id=\u0026quot;haloBadge\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;dot\u0026quot;\u0026gt;\u0026lt;\/i\u0026gt;\n      \u0026lt;b\u0026gt;360\u0026amp;deg; Halo\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;\u0026amp;nbsp;scene light \u0026amp;middot; rocker down\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;svg id=\u0026quot;barSvg\u0026quot; viewBox=\u0026quot;0 0 1000 240\u0026quot; aria-label=\u0026quot;Light bar simulation\u0026quot;\u0026gt;\u0026lt;\/svg\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\u0026quot;tryHint\u0026quot; id=\u0026quot;tryHint\u0026quot;\u0026gt;\u0026lt;span\u0026gt;\u0026lt;i class=\u0026quot;dotLive\u0026quot;\u0026gt;\u0026lt;\/i\u0026gt;Live demo \u0026amp;middot; flip the rocker, press the button\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\u0026quot;lower\u0026quot;\u0026gt;\n    \u0026lt;div class=\u0026quot;card cardColors\u0026quot; id=\u0026quot;colorCard\u0026quot;\u0026gt;\n      \u0026lt;h3\u0026gt;Select Colors\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\u0026quot;compactSel\u0026quot; id=\u0026quot;compactSel\u0026quot;\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\u0026quot;cRow\u0026quot;\u0026gt;\n        \u0026lt;div class=\u0026quot;lbl\u0026quot;\u0026gt;\u0026lt;span\u0026gt;Color 1\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\u0026quot;swatches\u0026quot; id=\u0026quot;sw1\u0026quot;\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\u0026quot;cRow\u0026quot;\u0026gt;\n        \u0026lt;div class=\u0026quot;lbl\u0026quot;\u0026gt;\u0026lt;span\u0026gt;Color 2 (dual color)\u0026lt;\/span\u0026gt;\n          \u0026lt;button class=\u0026quot;swapBtn\u0026quot; id=\u0026quot;swapBtn\u0026quot; title=\u0026quot;Swap Color 1 and Color 2\u0026quot;\u0026gt;\u0026amp;#8646; Swap\u0026lt;\/button\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\u0026quot;swatches\u0026quot; id=\u0026quot;sw2\u0026quot;\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\u0026quot;hint\u0026quot; id=\u0026quot;colorHint\u0026quot;\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\u0026quot;card cardCtl\u0026quot;\u0026gt;\n      \u0026lt;h3\u0026gt;Socket Controller · flip the rocker \u0026amp;middot; press the button\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\u0026quot;ctlWrap\u0026quot;\u0026gt;\n        \u0026lt;svg id=\u0026quot;ctl\u0026quot; viewBox=\u0026quot;0 0 300 300\u0026quot; aria-label=\u0026quot;Socket plug controller\u0026quot;\u0026gt;\u0026lt;\/svg\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\u0026quot;legend\u0026quot;\u0026gt;\n        \u0026lt;div\u0026gt;\u0026lt;b\u0026gt;Button\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;Next flash pattern\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div\u0026gt;\u0026lt;b\u0026gt;I\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;Warning flash patterns\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div\u0026gt;\u0026lt;b\u0026gt;O\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;Off\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div\u0026gt;\u0026lt;b\u0026gt;II\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;footer\u0026gt;\n    \u0026lt;div\u0026gt;BLACK OAK LED · Navigate the Night.\u0026lt;\/div\u0026gt;\n    \u0026lt;div\u0026gt;Designed and engineered in Sarasota, Florida\u0026lt;\/div\u0026gt;\n  \u0026lt;\/footer\u0026gt;\n\u0026lt;\/div\u0026gt;\n\n\u0026lt;script\u0026gt;\n\u0026quot;use strict\u0026quot;;\nconst LEDCOLORS = {\n  amber:{main:\u0026quot;#ffb43a\u0026quot;, core:\u0026quot;#ffe9b0\u0026quot;, glow:\u0026quot;#ff9d00\u0026quot;, label:\u0026quot;Amber\u0026quot;},\n  white:{main:\u0026quot;#F4F8FF\u0026quot;, core:\u0026quot;#ffffff\u0026quot;, glow:\u0026quot;#cfe4ff\u0026quot;, label:\u0026quot;White\u0026quot;},\n  red:  {main:\u0026quot;#ff2d23\u0026quot;, core:\u0026quot;#ffb0a8\u0026quot;, glow:\u0026quot;#ff1400\u0026quot;, label:\u0026quot;Red\u0026quot;},\n  blue: {main:\u0026quot;#2a62ff\u0026quot;, core:\u0026quot;#b8ccff\u0026quot;, glow:\u0026quot;#0040ff\u0026quot;, label:\u0026quot;Blue\u0026quot;},\n  green:{main:\u0026quot;#19d949\u0026quot;, core:\u0026quot;#c2ffcf\u0026quot;, glow:\u0026quot;#00c832\u0026quot;, label:\u0026quot;Green\u0026quot;}\n};\n\n\/* Catalog per size, straight from the product pages.\n   singles: colors sold alone. duals: exact combos sold. *\/\nconst SIZES = {\n  \u0026quot;11\u0026quot;: {\n    label:\u0026quot;11\u0026amp;Prime;\u0026quot;, front:3, span:290, x0:355,\n    singles:[], duals:[[\u0026quot;amber\u0026quot;,\u0026quot;white\u0026quot;]],\n    note:\u0026quot;The 11\u0026amp;Prime; Mini ships in Amber \u0026amp;amp; White.\u0026quot;\n  },\n  \u0026quot;17\u0026quot;: {\n    label:\u0026quot;17\u0026amp;Prime;\u0026quot;, front:4, span:390, x0:305,\n    singles:[\u0026quot;amber\u0026quot;,\u0026quot;blue\u0026quot;,\u0026quot;green\u0026quot;,\u0026quot;red\u0026quot;,\u0026quot;white\u0026quot;],\n    duals:[[\u0026quot;amber\u0026quot;,\u0026quot;blue\u0026quot;],[\u0026quot;amber\u0026quot;,\u0026quot;green\u0026quot;],[\u0026quot;amber\u0026quot;,\u0026quot;red\u0026quot;],[\u0026quot;amber\u0026quot;,\u0026quot;white\u0026quot;],[\u0026quot;red\u0026quot;,\u0026quot;blue\u0026quot;],[\u0026quot;red\u0026quot;,\u0026quot;white\u0026quot;]],\n    note:\u0026quot;Every combo shown here is orderable on the 17\u0026amp;Prime; bar.\u0026quot;\n  }\n};\nlet SIZE = \u0026quot;17\u0026quot;;\n\nconst S = {\n  color1:\u0026quot;amber\u0026quot;, color2:\u0026quot;white\u0026quot;,\n  rocker:\u0026quot;up\u0026quot;,            \/\/ up = warning LEDs, mid = off, down = white halo\n  pattern:1\n};\n\nconst NS=\u0026quot;http:\/\/www.w3.org\/2000\/svg\u0026quot;;\nconst bar = document.getElementById(\u0026quot;barSvg\u0026quot;);\nlet modules = [];\nfunction el(name, attrs, parent){\n  const e=document.createElementNS(NS,name);\n  for(const k in attrs) e.setAttribute(k,attrs[k]);\n  if(parent) parent.appendChild(e);\n  return e;\n}\n\nfunction buildBar(){\n  bar.innerHTML=\u0026quot;\u0026quot;; modules=[];\n  const cfg=SIZES[SIZE];\n  const defs = el(\u0026quot;defs\u0026quot;,{},bar);\n  (()=\u0026gt;{ const f=el(\u0026quot;filter\u0026quot;,{id:\u0026quot;ledGlow\u0026quot;, x:\u0026quot;-80%\u0026quot;,y:\u0026quot;-80%\u0026quot;,width:\u0026quot;260%\u0026quot;,height:\u0026quot;260%\u0026quot;},defs);\n    el(\u0026quot;feGaussianBlur\u0026quot;,{stdDeviation:4, result:\u0026quot;b\u0026quot;},f);\n    const m=el(\u0026quot;feMerge\u0026quot;,{},f);\n    el(\u0026quot;feMergeNode\u0026quot;,{in:\u0026quot;b\u0026quot;},m); el(\u0026quot;feMergeNode\u0026quot;,{in:\u0026quot;SourceGraphic\u0026quot;},m); })();\n  (()=\u0026gt;{ const f=el(\u0026quot;filter\u0026quot;,{id:\u0026quot;haloGlow\u0026quot;, filterUnits:\u0026quot;userSpaceOnUse\u0026quot;,\n      x:\u0026quot;-120\u0026quot;,y:\u0026quot;-160\u0026quot;,width:\u0026quot;1240\u0026quot;,height:\u0026quot;560\u0026quot;},defs);\n    el(\u0026quot;feGaussianBlur\u0026quot;,{stdDeviation:11, result:\u0026quot;b\u0026quot;},f);\n    const m=el(\u0026quot;feMerge\u0026quot;,{},f);\n    el(\u0026quot;feMergeNode\u0026quot;,{in:\u0026quot;b\u0026quot;},m); el(\u0026quot;feMergeNode\u0026quot;,{in:\u0026quot;SourceGraphic\u0026quot;},m); })();\n\n  const L=cfg.x0, R=cfg.x0+cfg.span, cL=L-75, cR=R+75;\n  const G = el(\u0026quot;g\u0026quot;,{},bar);\n  const haloLayer = el(\u0026quot;g\u0026quot;,{},G);\n  const sidePaths = {\n    front:`M ${L},62 L ${R},62`,\n    back: `M ${L},178 L ${R},178`,\n    left: `M ${L},62 L ${cL},95 L ${cL},145 L ${L},178`,\n    right:`M ${R},62 L ${cR},95 L ${cR},145 L ${R},178`\n  };\n  const haloEls={};\n  for(const z in sidePaths){\n    const g=el(\u0026quot;g\u0026quot;,{filter:\u0026quot;url(#haloGlow)\u0026quot;},haloLayer);\n    [[10,.9],[26,.4],[52,.16],[88,.07]].forEach(([wd,op])=\u0026gt;{\n      el(\u0026quot;path\u0026quot;,{d:sidePaths[z], stroke:\u0026quot;#eef4ff\u0026quot;,\u0026quot;stroke-width\u0026quot;:wd,\u0026quot;stroke-opacity\u0026quot;:op,\n        fill:\u0026quot;none\u0026quot;,\u0026quot;stroke-linecap\u0026quot;:\u0026quot;round\u0026quot;,\u0026quot;stroke-linejoin\u0026quot;:\u0026quot;round\u0026quot;},g);\n    });\n    g.setAttribute(\u0026quot;visibility\u0026quot;,\u0026quot;hidden\u0026quot;);\n    haloEls[z]=g;\n  }\n  S._haloEls=haloEls;\n\n  el(\u0026quot;polygon\u0026quot;,{points:`${L},62 ${R},62 ${cR},95 ${cR},145 ${R},178 ${L},178 ${cL},145 ${cL},95`,\n    fill:\u0026quot;#15181d\u0026quot;, stroke:\u0026quot;#3a4149\u0026quot;,\u0026quot;stroke-width\u0026quot;:3},G);\n  el(\u0026quot;polygon\u0026quot;,{points:`${L+8},70 ${R-8},70 ${cR-12},99 ${cR-12},141 ${R-8},170 ${L+8},170 ${cL+12},141 ${cL+12},99`,\n    fill:\u0026quot;#0e1114\u0026quot;, stroke:\u0026quot;#22272e\u0026quot;,\u0026quot;stroke-width\u0026quot;:1},G);\n  el(\u0026quot;text\u0026quot;,{x:500,y:114,\u0026quot;text-anchor\u0026quot;:\u0026quot;middle\u0026quot;,fill:\u0026quot;#c9d0d9\u0026quot;,\u0026quot;font-size\u0026quot;:\u0026quot;17\u0026quot;,\n    \u0026quot;font-weight\u0026quot;:\u0026quot;800\u0026quot;,\u0026quot;letter-spacing\u0026quot;:\u0026quot;4\u0026quot;,\u0026quot;font-family\u0026quot;:\u0026quot;inherit\u0026quot;},G).textContent=\u0026quot;BLACK OAK\u0026quot;;\n  el(\u0026quot;text\u0026quot;,{x:500,y:130,\u0026quot;text-anchor\u0026quot;:\u0026quot;middle\u0026quot;,fill:\u0026quot;#4c545e\u0026quot;,\u0026quot;font-size\u0026quot;:\u0026quot;8\u0026quot;,\n    \u0026quot;letter-spacing\u0026quot;:\u0026quot;2\u0026quot;},G).textContent=\u0026quot;SAE W3-1 22\u0026quot;;\n\n  const ledLayer = el(\u0026quot;g\u0026quot;,{},G);\n  const N=cfg.front, h=12, gap=6;\n  const w = cfg.span\/N - gap;\n  const addMod=(zone,x,y)=\u0026gt;{\n    const g=el(\u0026quot;g\u0026quot;,{},ledLayer);\n    const lens=el(\u0026quot;rect\u0026quot;,{x,y,width:w,height:h,rx:4, fill:\u0026quot;#23282f\u0026quot;, stroke:\u0026quot;#10131a\u0026quot;,\u0026quot;stroke-width\u0026quot;:1},g);\n    const halo=el(\u0026quot;rect\u0026quot;,{x:x-6,y:y-6,width:w+12,height:h+12,rx:9, fill:\u0026quot;none\u0026quot;,opacity:0, filter:\u0026quot;url(#ledGlow)\u0026quot;},g);\n    modules.push({zone, lens, halo, px:x+w\/2});\n  };\n  const addRot=(zone,cx,cy,len,rot)=\u0026gt;{\n    const g=el(\u0026quot;g\u0026quot;,{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\u0026quot;rect\u0026quot;,{x:cx-len\/2,y:cy-h\/2,width:len,height:h,rx:4,\n      fill:\u0026quot;#23282f\u0026quot;,stroke:\u0026quot;#10131a\u0026quot;,\u0026quot;stroke-width\u0026quot;:1},g);\n    const halo=el(\u0026quot;rect\u0026quot;,{x:cx-len\/2-6,y:cy-h\/2-6,width:len+12,height:h+12,rx:9,\n      fill:\u0026quot;none\u0026quot;,opacity:0,filter:\u0026quot;url(#ledGlow)\u0026quot;},g);\n    modules.push({zone,lens,halo,px:cx});\n  };\n  for(let i=0;i\u0026lt;N;i++){ addMod(\u0026quot;front\u0026quot;, L+5+i*(cfg.span\/N), 52); }\n  addRot(\u0026quot;right\u0026quot;,R+34,73,64,23.7);\n  addRot(\u0026quot;right\u0026quot;,cR-4,120,44,90);\n  addRot(\u0026quot;right\u0026quot;,R+34,167,64,-23.7);\n  for(let i=N-1;i\u0026gt;=0;i--){ addMod(\u0026quot;back\u0026quot;, L+5+i*(cfg.span\/N), 176); }\n  addRot(\u0026quot;left\u0026quot;,L-34,167,64,23.7);\n  addRot(\u0026quot;left\u0026quot;,cL+4,120,44,90);\n  addRot(\u0026quot;left\u0026quot;,L-34,73,64,-23.7);\n\n  const pxs=modules.map(m=\u0026gt;m.px);\n  S._pxmin=Math.min(...pxs); S._pxmax=Math.max(...pxs);\n  const mid=(S._pxmin+S._pxmax)\/2;\n  modules.forEach(m=\u0026gt;{ m.side = m.px\u0026lt;=mid ? \u0026quot;L\u0026quot;:\u0026quot;R\u0026quot;; m.p=(m.px-S._pxmin)\/(S._pxmax-S._pxmin); });\n}\n\n\/* ---- Pattern engine. Timings measured frame-by-frame from the 17\u0026quot; socket-controller video. ---- *\/\nfunction ph(t,cyc){ return t % cyc; }\nconst PATTERNS = [\n  {name:\u0026quot;Split Steady Burn\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{           \/\/ video 11.5-16s \/ 26-37s \/ 95s-end\n    return {color: m.side===\u0026quot;L\u0026quot;?c1:c2, k:.85};\n  }},\n  {name:\u0026quot;Alternating Single Flash\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{     \/\/ video 37-42s: A 170ms, off 230, W 200, off 240\n    const p=ph(t,840);\n    if(p\u0026lt;170) return {color:c1,k:1};\n    if(p\u0026gt;=400\u0026amp;\u0026amp;p\u0026lt;600) return {color:c2,k:1};\n    return null;\n  }},\n  {name:\u0026quot;Split Flash\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{                  \/\/ video 42.5-45.8s: halves flash together, 200 on \/ 270 off\n    const p=ph(t,470);\n    if(p\u0026lt;200) return {color: m.side===\u0026quot;L\u0026quot;?c2:c1, k:1};\n    return null;\n  }},\n  {name:\u0026quot;Alternating Double Flash\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{     \/\/ video 45.9-49s\n    const p=ph(t,1470);\n    if(p\u0026lt;130||(p\u0026gt;=200\u0026amp;\u0026amp;p\u0026lt;330)) return {color:c1,k:1};\n    if((p\u0026gt;=730\u0026amp;\u0026amp;p\u0026lt;860)||(p\u0026gt;=930\u0026amp;\u0026amp;p\u0026lt;1060)) return {color:c2,k:1};\n    return null;\n  }},\n  {name:\u0026quot;Slow Alternating Flash\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{       \/\/ video 49-52s: 430 on \/ 370 off each color\n    const p=ph(t,1600);\n    if(p\u0026lt;430) return {color:c1,k:1};\n    if(p\u0026gt;=800\u0026amp;\u0026amp;p\u0026lt;1230) return {color:c2,k:1};\n    return null;\n  }},\n  {name:\u0026quot;Double Flash + Steady\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{        \/\/ video 52.2-55.9s: C1 double pulse, C2 400ms burn\n    const p=ph(t,1300);\n    if(p\u0026lt;200||(p\u0026gt;=270\u0026amp;\u0026amp;p\u0026lt;470)) return {color:c1,k:1};\n    if(p\u0026gt;=600\u0026amp;\u0026amp;p\u0026lt;1000) return {color:c2,k:.85};\n    return null;\n  }},\n  {name:\u0026quot;Half Ping-Pong\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{               \/\/ video 56-63s: L C1, R C1, L C2, R C2\n    const p=ph(t,1600), seg=Math.floor(p\/400), local=p%400;\n    if(local\u0026gt;=270) return null;\n    const col = seg\u0026lt;2?c1:c2, side = (seg%2===0)?\u0026quot;L\u0026quot;:\u0026quot;R\u0026quot;;\n    return m.side===side ? {color:col,k:1} : null;\n  }},\n  {name:\u0026quot;Dual Rotation\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{                \/\/ video 63-70.4s: opposite ends counter-chasing\n    const p=ph(t,1400)\/1400;\n    const d1=Math.abs(m.p-p), d2=Math.abs(m.p-((p+.5)%1));\n    if(Math.min(d1,1-d1)\u0026lt;.18) return {color:c1,k:1};\n    if(Math.min(d2,1-d2)\u0026lt;.18) return {color:c2,k:1};\n    return null;\n  }},\n  {name:\u0026quot;Steady + Flash Combo\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{         \/\/ video 70.4-77.5s: one half steady, other flashes; swaps\n    const swap=Math.floor(t\/3500)%2===1;\n    const steadySide = swap?\u0026quot;R\u0026quot;:\u0026quot;L\u0026quot;;\n    if(m.side===steadySide) return {color: swap?c2:c1, k:.8};\n    const p=ph(t,730);\n    if(p\u0026lt;330) return {color: swap?c1:c2, k:1};\n    return null;\n  }},\n  {name:\u0026quot;End-to-End Sweep\u0026quot;, f:(m,t,c1,c2)=\u0026gt;{             \/\/ video 77.6-85.9s: C1 builds across, then C2\n    const cyc=1700, p=ph(t,cyc), half=cyc\/2;\n    const dirFlip=Math.floor(t\/cyc)%2===1;\n    const local=p%half, col=p\u0026lt;half?c1:c2;\n    let b;\n    if(local\u0026lt;500) b=local\/500; else if(local\u0026lt;700) b=1; else return null;\n    const pos=dirFlip?1-m.p:m.p;\n    return pos\u0026lt;=b+.002 ? {color:col,k:1} : null;\n  }}\n];\n\nfunction activeColors(){\n  const c1=S.color1, c2=S.color2||S.color1;\n  return [c1,c2];\n}\n\nlet lastLabel=\u0026quot;\u0026quot;;\nfunction render(t){\n  const halo = S.rocker===\u0026quot;down\u0026quot;;\n  const on = S.rocker===\u0026quot;up\u0026quot;;\n  const [c1,c2]=activeColors();\n  const P=PATTERNS[S.pattern-1];\n  for(const m of modules){\n    let st=null;\n    if(on) st=P.f(m,t,c1,c2);\n    else if(halo) st={color:\u0026quot;white\u0026quot;,k:.9};\n    m.cur=st;\n    if(st){ m.lastT=t; m.lastC=st.color; m.lastK=st.k; }\n    let drawC=null, drawK=0;\n    if(st){ drawC=st.color; drawK=st.k; }\n    else if(m.lastC \u0026amp;\u0026amp; (t-m.lastT)\u0026lt;70){ drawC=m.lastC; drawK=m.lastK*(1-(t-m.lastT)\/70)*.7; }\n    if(drawC){\n      const c=LEDCOLORS[drawC];\n      m.lens.setAttribute(\u0026quot;fill\u0026quot;, drawK\u0026gt;.55? c.core : c.main);\n      m.lens.setAttribute(\u0026quot;stroke\u0026quot;, c.main);\n      m.halo.setAttribute(\u0026quot;fill\u0026quot;, c.glow);\n      m.halo.setAttribute(\u0026quot;opacity\u0026quot;, (0.85*drawK).toFixed(2));\n    }else{\n      m.lens.setAttribute(\u0026quot;fill\u0026quot;,\u0026quot;#23282f\u0026quot;);\n      m.lens.setAttribute(\u0026quot;stroke\u0026quot;,\u0026quot;#10131a\u0026quot;);\n      m.halo.setAttribute(\u0026quot;opacity\u0026quot;,\u0026quot;0\u0026quot;);\n    }\n  }\n  for(const z in S._haloEls) S._haloEls[z].setAttribute(\u0026quot;visibility\u0026quot;, halo?\u0026quot;visible\u0026quot;:\u0026quot;hidden\u0026quot;);\n  const lbl = S.rocker===\u0026quot;mid\u0026quot; ? \u0026quot;Rocker centered · Off\u0026quot;\n    : S.rocker===\u0026quot;down\u0026quot; ? \u0026quot;360° Halo Scene Light · steady white\u0026quot;\n    : tourActive ? \u0026quot;Live demo · try the controller\u0026quot;\n    : `Pattern ${S.pattern} · ${P.name}`;\n  if(lbl!==lastLabel){ lastLabel=lbl; document.getElementById(\u0026quot;patternLabel\u0026quot;).textContent=lbl; }\n  document.getElementById(\u0026quot;haloBadge\u0026quot;).style.display = halo ? \u0026quot;flex\u0026quot;:\u0026quot;none\u0026quot;;\n  requestAnimationFrame(render);\n}\n\n\/* ---------------- Socket controller (replica of the plug in the video) ---------------- *\/\nconst ctl=document.getElementById(\u0026quot;ctl\u0026quot;);\nlet rockerParts={}, patternBtnG=null;\nfunction buildController(){\n  ctl.innerHTML=\u0026quot;\u0026quot;;\n  const defs=el(\u0026quot;defs\u0026quot;,{},ctl);\n  (()=\u0026gt;{ const f=el(\u0026quot;filter\u0026quot;,{id:\u0026quot;btnGlow\u0026quot;,x:\u0026quot;-40%\u0026quot;,y:\u0026quot;-40%\u0026quot;,width:\u0026quot;180%\u0026quot;,height:\u0026quot;180%\u0026quot;},defs);\n    el(\u0026quot;feGaussianBlur\u0026quot;,{stdDeviation:\u0026quot;2.2\u0026quot;,result:\u0026quot;b\u0026quot;},f);\n    const m=el(\u0026quot;feMerge\u0026quot;,{},f);\n    el(\u0026quot;feMergeNode\u0026quot;,{in:\u0026quot;b\u0026quot;},m); el(\u0026quot;feMergeNode\u0026quot;,{in:\u0026quot;SourceGraphic\u0026quot;},m); })();\n  const lg=el(\u0026quot;linearGradient\u0026quot;,{id:\u0026quot;plugBody\u0026quot;,x1:\u0026quot;0\u0026quot;,y1:\u0026quot;0\u0026quot;,x2:\u0026quot;0\u0026quot;,y2:\u0026quot;1\u0026quot;},defs);\n  el(\u0026quot;stop\u0026quot;,{offset:\u0026quot;0\u0026quot;,\u0026quot;stop-color\u0026quot;:\u0026quot;#2a2f37\u0026quot;},lg);\n  el(\u0026quot;stop\u0026quot;,{offset:\u0026quot;.5\u0026quot;,\u0026quot;stop-color\u0026quot;:\u0026quot;#171a1f\u0026quot;},lg);\n  el(\u0026quot;stop\u0026quot;,{offset:\u0026quot;1\u0026quot;,\u0026quot;stop-color\u0026quot;:\u0026quot;#0d0f12\u0026quot;},lg);\n\n  \/* socket base (the 12V outlet it plugs into) *\/\n  el(\u0026quot;ellipse\u0026quot;,{cx:150,cy:262,rx:118,ry:26,fill:\u0026quot;#0b0d10\u0026quot;,stroke:\u0026quot;#242a33\u0026quot;},ctl);\n  el(\u0026quot;ellipse\u0026quot;,{cx:150,cy:256,rx:100,ry:20,fill:\u0026quot;#10131a\u0026quot;,stroke:\u0026quot;#2b333d\u0026quot;},ctl);\n  el(\u0026quot;ellipse\u0026quot;,{cx:150,cy:254,rx:74,ry:14,fill:\u0026quot;none\u0026quot;,stroke:\u0026quot;#2a62ff\u0026quot;,\u0026quot;stroke-opacity\u0026quot;:\u0026quot;.55\u0026quot;,\u0026quot;stroke-width\u0026quot;:\u0026quot;3\u0026quot;,filter:\u0026quot;url(#btnGlow)\u0026quot;},ctl);\n\n  \/* plug barrel *\/\n  el(\u0026quot;rect\u0026quot;,{x:116,y:196,width:68,height:62,rx:14,fill:\u0026quot;url(#plugBody)\u0026quot;,stroke:\u0026quot;#000\u0026quot;},ctl);\n\n  \/* controller head *\/\n  el(\u0026quot;rect\u0026quot;,{x:70,y:26,width:160,height:184,rx:26,fill:\u0026quot;url(#plugBody)\u0026quot;,stroke:\u0026quot;#000\u0026quot;,\u0026quot;stroke-width\u0026quot;:\u0026quot;2\u0026quot;},ctl);\n  el(\u0026quot;rect\u0026quot;,{x:78,y:34,width:144,height:168,rx:20,fill:\u0026quot;none\u0026quot;,stroke:\u0026quot;#2c333d\u0026quot;,\u0026quot;stroke-width\u0026quot;:\u0026quot;1.2\u0026quot;},ctl);\n\n  \/* pattern button on top *\/\n  const pb=el(\u0026quot;g\u0026quot;,{class:\u0026quot;kb\u0026quot;,role:\u0026quot;button\u0026quot;,tabindex:\u0026quot;0\u0026quot;,\u0026quot;aria-label\u0026quot;:\u0026quot;Cycle flash pattern\u0026quot;},ctl);\n  el(\u0026quot;circle\u0026quot;,{cx:150,cy:58,r:20,fill:\u0026quot;#101318\u0026quot;,stroke:\u0026quot;#000\u0026quot;,\u0026quot;stroke-width\u0026quot;:\u0026quot;2\u0026quot;},pb);\n  const pbFace=el(\u0026quot;circle\u0026quot;,{cx:150,cy:58,r:14,fill:\u0026quot;#22262d\u0026quot;,stroke:\u0026quot;#3a414b\u0026quot;,\u0026quot;stroke-width\u0026quot;:\u0026quot;1.5\u0026quot;},pb);\n  el(\u0026quot;text\u0026quot;,{x:150,y:92,\u0026quot;text-anchor\u0026quot;:\u0026quot;middle\u0026quot;,fill:\u0026quot;#8a94a3\u0026quot;,\u0026quot;font-size\u0026quot;:\u0026quot;10\u0026quot;,\u0026quot;letter-spacing\u0026quot;:\u0026quot;1.5\u0026quot;,\u0026quot;font-weight\u0026quot;:\u0026quot;700\u0026quot;},pb).textContent=\u0026quot;PATTERN\u0026quot;;\n  pb.addEventListener(\u0026quot;click\u0026quot;,()=\u0026gt;press(\u0026quot;pattern\u0026quot;));\n  pb.addEventListener(\u0026quot;keydown\u0026quot;,e=\u0026gt;{if(e.key===\u0026quot;Enter\u0026quot;||e.key===\u0026quot; \u0026quot;){e.preventDefault();press(\u0026quot;pattern\u0026quot;);}});\n  patternBtnG={g:pb,face:pbFace};\n  S._ring=el(\u0026quot;circle\u0026quot;,{cx:150,cy:58,r:24,class:\u0026quot;pulseRing\u0026quot;},ctl);\n\n  \/* 3-position rocker *\/\n  const rx=150, ry=150, rw=56, rh=92;\n  el(\u0026quot;rect\u0026quot;,{x:rx-rw\/2-7,y:ry-rh\/2-7,width:rw+14,height:rh+14,rx:12,fill:\u0026quot;#0c0e12\u0026quot;,stroke:\u0026quot;#000\u0026quot;},ctl);\n  const zones=[\n    {pos:\u0026quot;up\u0026quot;,   y:ry-rh\/2,      lab:\u0026quot;I\u0026quot;},\n    {pos:\u0026quot;mid\u0026quot;,  y:ry-rh\/6,      lab:\u0026quot;O\u0026quot;},\n    {pos:\u0026quot;down\u0026quot;, y:ry+rh\/6,      lab:\u0026quot;II\u0026quot;}\n  ];\n  rockerParts={};\n  zones.forEach(z=\u0026gt;{\n    const g=el(\u0026quot;g\u0026quot;,{class:\u0026quot;kb\u0026quot;,role:\u0026quot;button\u0026quot;,tabindex:\u0026quot;0\u0026quot;,\u0026quot;aria-label\u0026quot;:\u0026quot;Rocker \u0026quot;+z.pos},ctl);\n    const r=el(\u0026quot;rect\u0026quot;,{x:rx-rw\/2,y:z.y,width:rw,height:rh\/3,fill:\u0026quot;#1b1f26\u0026quot;,stroke:\u0026quot;#31383f\u0026quot;,\u0026quot;stroke-width\u0026quot;:\u0026quot;1\u0026quot;},g);\n    const tx=el(\u0026quot;text\u0026quot;,{x:rx,y:z.y+rh\/6+4,\u0026quot;text-anchor\u0026quot;:\u0026quot;middle\u0026quot;,fill:\u0026quot;#9aa4b2\u0026quot;,\u0026quot;font-size\u0026quot;:\u0026quot;13\u0026quot;,\u0026quot;font-weight\u0026quot;:\u0026quot;700\u0026quot;},g);\n    tx.textContent=z.lab;\n    g.addEventListener(\u0026quot;click\u0026quot;,()=\u0026gt;press(\u0026quot;rocker_\u0026quot;+z.pos));\n    g.addEventListener(\u0026quot;keydown\u0026quot;,e=\u0026gt;{if(e.key===\u0026quot;Enter\u0026quot;||e.key===\u0026quot; \u0026quot;){e.preventDefault();press(\u0026quot;rocker_\u0026quot;+z.pos);}});\n    rockerParts[z.pos]={rect:r,text:tx};\n  });\n\n  el(\u0026quot;text\u0026quot;,{x:150,y:288,fill:\u0026quot;#59636f\u0026quot;,\u0026quot;font-size\u0026quot;:\u0026quot;10\u0026quot;,\u0026quot;letter-spacing\u0026quot;:\u0026quot;1.5\u0026quot;,\u0026quot;text-anchor\u0026quot;:\u0026quot;middle\u0026quot;},ctl).textContent=\u0026quot;12V SOCKET\u0026quot;;\n  syncRocker();\n}\nfunction syncRocker(){\n  for(const pos in rockerParts){\n    const on = S.rocker===pos;\n    rockerParts[pos].rect.setAttribute(\u0026quot;fill\u0026quot;, on? (pos===\u0026quot;mid\u0026quot;?\u0026quot;#3a414b\u0026quot;:\u0026quot;#dfe7f5\u0026quot;) : \u0026quot;#1b1f26\u0026quot;);\n    rockerParts[pos].text.setAttribute(\u0026quot;fill\u0026quot;, on? \u0026quot;#12151a\u0026quot; : \u0026quot;#9aa4b2\u0026quot;);\n    if(on) rockerParts[pos].rect.setAttribute(\u0026quot;filter\u0026quot;,\u0026quot;url(#btnGlow)\u0026quot;);\n    else rockerParts[pos].rect.removeAttribute(\u0026quot;filter\u0026quot;);\n  }\n}\nfunction press(key){\n  markInteract();\n  if(key===\u0026quot;pattern\u0026quot;){\n    if(S.rocker!==\u0026quot;up\u0026quot;){ S.rocker=\u0026quot;up\u0026quot;; }   \/\/ like the hardware: button only matters with rocker up\n    else S.pattern = S.pattern % PATTERNS.length + 1;\n    patternBtnG.face.setAttribute(\u0026quot;fill\u0026quot;,\u0026quot;#aab6c9\u0026quot;);\n    setTimeout(()=\u0026gt;patternBtnG.face.setAttribute(\u0026quot;fill\u0026quot;,\u0026quot;#22262d\u0026quot;),140);\n  }\n  if(key===\u0026quot;rocker_up\u0026quot;) S.rocker=\u0026quot;up\u0026quot;;\n  if(key===\u0026quot;rocker_mid\u0026quot;) S.rocker=\u0026quot;mid\u0026quot;;\n  if(key===\u0026quot;rocker_down\u0026quot;) S.rocker=\u0026quot;down\u0026quot;;\n  syncRocker();\n}\n\n\/* ---------------- Color selection, constrained to the catalog ---------------- *\/\nfunction catalog(){ return SIZES[SIZE]; }\nfunction validC2(c1){\n  const c=catalog(); const out=[];\n  c.duals.forEach(([a,b])=\u0026gt;{ if(a===c1) out.push(b); else if(b===c1) out.push(a); });\n  return out;\n}\nfunction allC1(){\n  const c=catalog(); const set=new Set(c.singles);\n  c.duals.forEach(([a,b])=\u0026gt;{set.add(a);set.add(b);});\n  return [\u0026quot;amber\u0026quot;,\u0026quot;white\u0026quot;,\u0026quot;red\u0026quot;,\u0026quot;blue\u0026quot;,\u0026quot;green\u0026quot;].filter(x=\u0026gt;set.has(x));\n}\nfunction buildCompact(){\n  const c=document.getElementById(\u0026quot;compactSel\u0026quot;);\n  c.innerHTML=\u0026quot;\u0026quot;;\n  const mk=(col)=\u0026gt;{ const d=document.createElement(\u0026quot;div\u0026quot;); d.className=\u0026quot;sw\u0026quot;;\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label; return d; };\n  const lab=document.createElement(\u0026quot;span\u0026quot;);\n  lab.style.cssText=\u0026quot;font-size:12px;color:#8a94a3\u0026quot;;\n  lab.textContent=\u0026quot;Your colors:\u0026quot;;\n  c.appendChild(lab);\n  c.appendChild(mk(S.color1));\n  if(S.color2) c.appendChild(mk(S.color2));\n  const btn=document.createElement(\u0026quot;button\u0026quot;);\n  btn.className=\u0026quot;swapBtn\u0026quot;;\n  const card=document.getElementById(\u0026quot;colorCard\u0026quot;);\n  btn.textContent = card.classList.contains(\u0026quot;expanded\u0026quot;) ? \u0026quot;Done\u0026quot; : \u0026quot;Change colors\u0026quot;;\n  btn.onclick=()=\u0026gt;{ card.classList.toggle(\u0026quot;expanded\u0026quot;); buildCompact(); };\n  c.appendChild(btn);\n}\nfunction buildSwatches(){\n  buildCompact();\n  const s1=document.getElementById(\u0026quot;sw1\u0026quot;), s2=document.getElementById(\u0026quot;sw2\u0026quot;);\n  s1.innerHTML=\u0026quot;\u0026quot;; s2.innerHTML=\u0026quot;\u0026quot;;\n  const c=catalog();\n  for(const col of allC1()){\n    const d=document.createElement(\u0026quot;div\u0026quot;);\n    d.className=\u0026quot;sw\u0026quot;+(S.color1===col?\u0026quot; sel\u0026quot;:\u0026quot;\u0026quot;);\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label;\n    d.onclick=()=\u0026gt;{\n      S.color1=col;\n      const v=validC2(col);\n      if(S.color2 \u0026amp;\u0026amp; !v.includes(S.color2)) S.color2 = v.length? v[0] : null;\n      if(!S.color2 \u0026amp;\u0026amp; !c.singles.includes(col) \u0026amp;\u0026amp; v.length) S.color2=v[0];\n      buildSwatches();\n    };\n    s1.appendChild(d);\n  }\n  const v=validC2(S.color1);\n  if(c.singles.includes(S.color1)){\n    const none=document.createElement(\u0026quot;div\u0026quot;);\n    none.className=\u0026quot;sw none\u0026quot;+(S.color2===null?\u0026quot; sel\u0026quot;:\u0026quot;\u0026quot;);\n    none.title=\u0026quot;Single color\u0026quot;; none.onclick=()=\u0026gt;{S.color2=null; buildSwatches();};\n    s2.appendChild(none);\n  }\n  for(const col of [\u0026quot;amber\u0026quot;,\u0026quot;white\u0026quot;,\u0026quot;red\u0026quot;,\u0026quot;blue\u0026quot;,\u0026quot;green\u0026quot;]){\n    if(col===S.color1) continue;\n    const ok=v.includes(col);\n    const d=document.createElement(\u0026quot;div\u0026quot;);\n    d.className=\u0026quot;sw\u0026quot;+(S.color2===col?\u0026quot; sel\u0026quot;:\u0026quot;\u0026quot;)+(ok?\u0026quot;\u0026quot;:\u0026quot; dis\u0026quot;);\n    d.style.background=LEDCOLORS[col].main;\n    d.title=ok? LEDCOLORS[col].label : \u0026quot;Not offered with \u0026quot;+LEDCOLORS[S.color1].label+\u0026quot; on this size\u0026quot;;\n    if(ok) d.onclick=()=\u0026gt;{ S.color2=col; buildSwatches(); };\n    s2.appendChild(d);\n  }\n  document.getElementById(\u0026quot;colorHint\u0026quot;).innerHTML =\n    catalog().note + \u0026quot; Rocker \u0026lt;b\u0026gt;up\u0026lt;\/b\u0026gt; runs the warning patterns and the button steps through them, \u0026quot; +\n    \u0026quot;exactly like the switch built into the socket plug. Rocker \u0026lt;b\u0026gt;down\u0026lt;\/b\u0026gt; is the \u0026lt;b\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/b\u0026gt;: \u0026quot; +\n    \u0026quot;steady white work light, a Low Pro exclusive.\u0026quot;;\n}\ndocument.getElementById(\u0026quot;swapBtn\u0026quot;).onclick=()=\u0026gt;{\n  if(!S.color2) return;\n  const a=S.color1,b=S.color2;\n  const c=catalog();\n  const ok=c.duals.some(([x,y])=\u0026gt;(x===b\u0026amp;\u0026amp;y===a)||(x===a\u0026amp;\u0026amp;y===b));\n  if(ok){ S.color1=b; S.color2=a; buildSwatches(); }\n};\n\n\/* ---------------- Size selector (prototype only; each product page pins its size) ---------------- *\/\nfunction buildSizeBtns(){\n  const holder=document.getElementById(\u0026quot;sizeBtns\u0026quot;);\n  holder.innerHTML=\u0026quot;\u0026quot;;\n  for(const s in SIZES){\n    const b=document.createElement(\u0026quot;button\u0026quot;);\n    b.textContent=s+'\u0026quot;'; b.className=SIZE===s?\u0026quot;on\u0026quot;:\u0026quot;\u0026quot;;\n    b.onclick=()=\u0026gt;{ SIZE=s; applySize(); };\n    holder.appendChild(b);\n  }\n}\nfunction applySize(){\n  document.getElementById(\u0026quot;sizeLabel\u0026quot;).innerHTML=SIZES[SIZE].label;\n  const c=catalog();\n  \/* prefer amber\/white, the house default, when the size offers it *\/\n  const pref=c.duals.find(([a,b])=\u0026gt;(a===\u0026quot;amber\u0026quot;\u0026amp;\u0026amp;b===\u0026quot;white\u0026quot;)||(a===\u0026quot;white\u0026quot;\u0026amp;\u0026amp;b===\u0026quot;amber\u0026quot;));\n  const firstDual=pref||c.duals[0];\n  S.color1=firstDual?\u0026quot;amber\u0026quot;:(c.singles[0]||\u0026quot;amber\u0026quot;);\n  if(firstDual\u0026amp;\u0026amp;!firstDual.includes(\u0026quot;amber\u0026quot;)) S.color1=firstDual[0];\n  S.color2=firstDual?(firstDual.find(x=\u0026gt;x!==S.color1)||null):null;\n  S.pattern=1;\n  buildBar(); buildSwatches(); buildSizeBtns();\n}\n\n\/* ---------------- Attract mode ---------------- *\/\nlet interacted=false, idleTimer=null, tourTimer=null, tourActive=false;\nfunction markInteract(){\n  if(interacted) return;\n  interacted=true;\n  if(tourActive){ tourActive=false; S.pattern=1; }\n  clearTimeout(tourTimer); clearTimeout(idleTimer);\n  const h=document.getElementById(\u0026quot;tryHint\u0026quot;);\n  if(h){ h.style.transition=\u0026quot;opacity .5s\u0026quot;; h.style.opacity=\u0026quot;0\u0026quot;; setTimeout(()=\u0026gt;h.remove(),600); }\n  if(S._ring) S._ring.remove();\n}\nfunction attractSweep(){\n  if(interacted||tourActive) return;\n  tourActive=true;\n  const prev=S.pattern; S.pattern=10;      \/\/ End-to-End Sweep as the attract animation\n  tourTimer=setTimeout(()=\u0026gt;{ if(tourActive){ tourActive=false; S.pattern=prev; } scheduleIdle(); }, 3600);\n}\nfunction scheduleIdle(){\n  if(interacted) return;\n  clearTimeout(idleTimer);\n  idleTimer=setTimeout(attractSweep, 18000);\n}\n(function(){\n  let fired=false;\n  const start=()=\u0026gt;{ if(!fired){ fired=true; setTimeout(attractSweep, 700); } };\n  if(window.IntersectionObserver){\n    new IntersectionObserver((es,obs)=\u0026gt;{\n      if(es.some(e=\u0026gt;e.isIntersecting)){ start(); obs.disconnect(); }\n    },{threshold:.5}).observe(document.querySelector(\u0026quot;.stage\u0026quot;));\n  } else start();\n})();\n\n\/* ---------------- Boot + embed plumbing ---------------- *\/\nbuildController();\napplySize();\nrequestAnimationFrame(render);\n\n(function(){\n  const embedded = (window!==parent);\n  if(embedded){\n    document.querySelector(\u0026quot;header\u0026quot;).style.display=\u0026quot;none\u0026quot;;\n    document.querySelector(\u0026quot;footer\u0026quot;).style.display=\u0026quot;none\u0026quot;;\n    document.getElementById(\u0026quot;sizeBtns\u0026quot;).style.display=\u0026quot;none\u0026quot;;\n    if(window.innerWidth\u0026gt;840) document.querySelector(\u0026quot;.wrap\u0026quot;).style.padding=\u0026quot;10px 12px 14px\u0026quot;;\n  }\n  const report=()=\u0026gt;{ try{\n    parent.postMessage({type:\u0026quot;lowpro-player-height\u0026quot;,\n      height: document.querySelector(\u0026quot;.wrap\u0026quot;).scrollHeight+8}, \u0026quot;*\u0026quot;);\n  }catch(e){} };\n  if(window.ResizeObserver) new ResizeObserver(report).observe(document.querySelector(\u0026quot;.wrap\u0026quot;));\n  window.addEventListener(\u0026quot;load\u0026quot;,report); window.addEventListener(\u0026quot;pageshow\u0026quot;,report);\n  setTimeout(report,400); setTimeout(report,1500);\n  let n=0; const iv=setInterval(()=\u0026gt;{ report(); if(++n\u0026gt;10) clearInterval(iv); },1200);\n})();\n\u0026lt;\/script\u0026gt;\n\u0026lt;\/body\u0026gt;\n\u0026lt;\/html\u0026gt;\n\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.lowpro-frame{height:775px}\n@media(max-width:840px){\n  .lowpro-cta{display:none}\n  .lowpro-frame{height:790px}\n}\n\u003c\/style\u003e\n\u003cscript\u003e\nwindow.addEventListener(\"message\",function(e){\n  if(e.data \u0026\u0026 e.data.type===\"lowpro-player-height\"){\n    var f=document.getElementById(\"lowpro-player-frame\");\n    if(f \u0026\u0026 e.data.height\u003e200) f.style.height=(e.data.height+4)+\"px\";\n  }\n});\n\u003c\/script\u003e\n\u003cdiv style=\"height:28px;\"\u003e \u003c\/div\u003e\n\u003c!-- Intro Section --\u003e\n\u003cp\u003e\u003cstrong\u003eBuilt for emergency response teams and public safety professionals, this high-intensity LED warning light bar delivers uncompromising performance in a sleek, durable design.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003eThe Black Oak Low Pro Emergency Series Light Bar is engineered for maximum visibility, reliability, and user control. With ultra-bright LEDs, multiple flash patterns, and a rugged housing, this bar ensures your presence is known in any emergency situation—day or night, rain or shine.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003eBuilt to withstand the demands of high-speed response, off-road utility, or work site visibility, this low-profile bar features a streamlined, aerodynamic frame and a universal mounting system to ensure easy installation on any vehicle. Whether you're outfitting a patrol car, fire unit, or utility truck, this bar delivers dependable performance where it matters most.\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- TRUST STRIP --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Screenshot_2026-07-21_at_9.31.14_AM.png?v=1784641940\" alt=\"SAE J845 Certified, SAE J595 Class 1, IP69K Waterproof, Lifetime Warranty, -40F to +145F Rated, 50,000 Hour LEDs\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003c!-- SIZE SELECTOR --\u003e\n\u003cdiv style=\"margin:4px 0 2px;\"\u003e\n\u003cp style=\"margin:0 0 8px;font-weight:600;font-size:15px;\"\u003eAvailable sizes:\u003c\/p\u003e\n\u003ca href=\"\/products\/11-mini-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e11\"\u003c\/a\u003e\n\u003cspan style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:8px 14px;border-radius:8px;margin:0 6px 8px 0;font-size:15px;\"\u003e17\"\u003c\/span\u003e\n\u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e30\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e43\"\u003c\/a\u003e\n\u003ca href=\"\/products\/low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e49\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-55-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e55\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-61-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e61\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e68\"\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003c!-- Collapsable Sections --\u003e\n\u003cstyle\u003e\n#MainContent details {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 16px;\n  overflow: hidden;\n  background: #fff;\n  font-family: Arial, sans-serif;\n}\n#MainContent details summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  padding: 14px 18px;\n  font-weight: 600;\n  font-size: 18px;\n  list-style: none;\n  background-color: #f9f9f9;\n  border-bottom: 1px solid #e0e0e0;\n  position: relative;\n}\n#MainContent details[open] summary {\n  background-color: #f1f1f1;\n}\n#MainContent details summary::after {\n  content: '+';\n  font-size: 20px;\n  font-weight: bold;\n  transition: transform 0.3s ease;\n}\n#MainContent details[open] summary::after {\n  content: '−';\n}\n#MainContent details .content {\n  padding: 16px 20px;\n  font-size: 16px;\n  line-height: 1.6;\n}\n\u003c\/style\u003e\n\u003cdetails\u003e\n\u003csummary\u003eFeatures\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003eLifetime Warranty\u003c\/li\u003e\n\u003cli\u003eSAE J845 Class 1 Certified\u003c\/li\u003e\n\u003cli\u003e360° visibility with dual-color ultra-bright LEDs\u003c\/li\u003e\n\u003cli\u003eSlim Low Profile design\u003c\/li\u003e\n\u003cli\u003eUp to 45 flash patterns with memory recall\u003c\/li\u003e\n\u003cli\u003eRugged, waterproof housing (IP69K rated)\u003c\/li\u003e\n\u003cli\u003eIntegrated controller with pattern cycling, cruise mode, and cut-off\n\u003cul\u003e\n\u003cli\u003eNote - this is built into the back of the \u003cspan style=\"text-decoration: underline;\"\u003esocket plug\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003eThis bar \u003cspan style=\"text-decoration: underline;\"\u003edoes not\u003c\/span\u003e come with a standard controller!\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIn the Box\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cb\u003eLow Pro Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWiring\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Brackets\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- COMPLIANCE SECTION --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCompliance \u0026amp; Certifications\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cp\u003e\u003cstrong\u003eMeets the standards your department requires.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"3\"\u003eCertification \u0026amp; Compliance\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J845\u003c\/th\u003e\n\u003ctd\u003e360° warning lamp photometric standard for light bars and beacons\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J595 Class 1\u003c\/th\u003e\n\u003ctd\u003eHighest intensity class — approved for primary emergency vehicles (police, fire, EMS)\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIP69K\u003c\/th\u003e\n\u003ctd\u003eSealed against high-pressure washdown, salt, dust, and submersion\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRated\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Range\u003c\/th\u003e\n\u003ctd\u003eExtreme-climate duty\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e-40°F to +145°F\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDuty Life\u003c\/th\u003e\n\u003ctd\u003eContinuous-duty LED modules\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50,000 hours\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"font-size:13px;color:#666;\"\u003e\u003cem\u003eWarning-equipment regulations vary by state and jurisdiction. Verify color and mounting requirements with your local authority. Spec sheet PDF and certification documentation available on request for procurement offices.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- Image + Text Alternating Section --\u003e\n\u003cstyle\u003e\n.text-image-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 20px;\n}\n.text-image-wrap.text-image-right {\n  flex-direction: row-reverse;\n}\n.text-image-wrap .image-wrap {\n  flex: 1;\n  max-width: 500px;\n}\n.text-image-wrap .image-wrap img {\n  width: 100%;\n  height: auto;\n  max-height: 300px; \n  display: block;\n  object-fit: contain; \n}\n.text-image-wrap .text-wrap {\n  flex: 1;\n  min-width: 300px;\n}\n\u003c\/style\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/255283_7703341170749_330031d5_da20_475f_887e_f1269d2ad248_1.jpg?v=1763495670\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eEmergency Bar + Work Light\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003eGet full 360° white-light illumination at the touch of a button. Perfect for reverse lighting, scene lighting, or any situation where you need powerful all-around visibility. It's a true dual-purpose feature you won't find on most emergency bars — and it comes standard on every one of ours.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_SAE_graphics.jpg?v=1758041472\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eBuilt Tough for Any Environment\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003eIP69K-rated waterproof housing and reinforced aluminum construction stand up to rain, snow, mud, and dust—ideal for police, fire, tow, or off-road response vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00223.jpg?v=1754512314\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eFull 360° Warning Visibility\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003ePacked with high-output dual-color LEDs and side modules, this bar delivers all-angle visibility—ensuring you're seen from every direction, even in chaotic scenes or inclement weather.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Driver_Side_Angle.jpg?v=1761226316\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eSlim, Low-Profile Design\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003eEngineered to minimize wind resistance and visual bulk, this light bar features a sleek, aerodynamic frame that hugs your vehicle's roofline. The low-profile housing not only enhances fuel efficiency but also delivers a clean, professional look without compromising brightness or performance.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\n\u003cp\u003e\u003cvideo width=\"100%\" height=\"auto\" muted=\"\" autoplay=\"autoplay\" loop=\"loop\" playsinline=\"\" controls=\"controls\"\u003e\u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4ec9ce848f5e4d2d8083da9daf4dbe78.mp4\" type=\"video\/mp4\"\u003eYour browser does not support the video tag.\u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eUp to 45 Flash Patterns with Smart Memory\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003eChoose from up to 45 user-selectable flash patterns to fit any scenario. Built-in memory recall stores your last used setting for consistent deployment every time.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HERO BANNER --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/d8j0ntlcm91z4.cloudfront.net\/user_3G9nKxyaQsdrPdDsxWr4EcSl5FL\/hf_20260715_201038_0803a0cd-07a6-4508-9c7a-50d0230a94e3.png\" alt=\"Built to Code. Backed for Life. SAE J845 and J595 Class 1 compliant, IP69K sealed, lifetime warranty\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- FLEET BLOCK --\u003e\n\u003cdiv style=\"padding:8px 0;margin:0 0 8px;\"\u003e\n\u003ch3 style=\"margin:0 0 8px;\"\u003eOutfitting a Fleet?\u003c\/h3\u003e\n\u003cp style=\"margin:0 0 14px;font-size:16px;line-height:1.6;\"\u003eVolume pricing on 5+ units, department POs accepted, W-9 on file, and spec sheets ready for your procurement office. From single patrol vehicles to full county fleets.\u003c\/p\u003e\n\u003ca href=\"\/pages\/fleet-pricing\" style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:12px 22px;border-radius:8px;text-decoration:none;\"\u003eRequest Fleet Pricing\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Dimension --\u003e\u003c!-- Specs --\u003e\n\u003cp\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Black_Oak_-_Low_Pro_Emergency_Bar_-_All_Dimensions.jpg?v=1762971573\"\u003e\u003c\/p\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003cstyle\u003e\n  table.spec-table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    font-size: 15px;\n  }\n  table.spec-table th, table.spec-table td {\n    border: 1px solid #ccc;\n    padding: 10px;\n    text-align: left;\n  }\n  table.spec-table th {\n    background-color: #f7f7f7;\n    font-weight: 600;\n    width: 30%;\n  }\n  table.spec-table tr:hover {\n    background-color: #f2f2f2;\n  }\n  table.spec-table thead th {\n    background-color: #222;\n    color: #fff;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    text-align: center;\n  }\n\u003c\/style\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"2\"\u003ePower \u0026amp; Performance\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Wattage\u003c\/th\u003e\n\u003ctd\u003e168\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e13\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10-30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRaw Lumens\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Chip\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam Pattern\u003c\/th\u003e\n\u003ctd\u003eWide Angle\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertificate\u003c\/th\u003e\n\u003ctd\u003eSAE J845 \u0026amp; SAE J595 Class 1\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Single Color\u003c\/th\u003e\n\u003ctd\u003e15\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Dual Color\u003c\/th\u003e\n\u003ctd\u003e45 (15 Color 1 \/ 15 Color 2 \/ 15 Combo)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"2\"\u003eDurability \u0026amp; Lifespan\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 Hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F\u003cbr\u003e-40° to 62° C\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited Lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30 Day Money Back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"2\"\u003eWiring \u0026amp; Installation\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eCord Length From Light\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Included?\u003c\/th\u003e\n\u003ctd\u003eYes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector Type\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHole Size for Controller\u003c\/th\u003e\n\u003ctd\u003e\u003cbr\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting Bolt Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"2\"\u003eGeneral\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E17\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003ch5\u003eDimensions\u003c\/h5\u003e\n\u003cp\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Black_Oak_-_Low_Pro_Emergency_Bar_-_17_Inch_Dimensions_cd599dcc-36bf-40dd-8ca3-e3c397f939e8.jpg?v=1762971479\"\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cp\u003e\u003cstrong\u003eWhat voltage and control systems does this light bar support?\u003c\/strong\u003e\u003cbr\u003eThis light bar operates on a 12 V–24 V DC power system and can be used with either push-button or wireless controllers. It's compatible with standard vehicle electrical systems, making installation straightforward for both fleet and individual applications.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow durable is this light bar in harsh environments?\u003c\/strong\u003e\u003cbr\u003eThe Low Pro Emergency Light Bar is built with a rugged aluminum housing, sealed to an IP69K rating and tested to resist corrosion, vibration, and high-pressure water ingress. It's designed for demanding conditions—whether roadside, rescue, or commercial use—so you can rely on consistent performance when it counts.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat beam patterns and flash modes are included?\u003c\/strong\u003e\u003cbr\u003eUp to 45 flash patterns are built into the unit—including warning, hazard, and full-output flasher modes—with memory recall so your last setting is retained even after power loss. You'll also find low-profile steady-burn mode useful for scene lighting and standby operations.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs the light bar legal for use on public roads and emergency vehicles?\u003c\/strong\u003e\u003cbr\u003eYes. The unit meets SAE J595 Class 1 and other relevant emergency lighting standards for warning applications. However, regulations vary by jurisdiction, so we recommend checking your local laws before installation to ensure compliance with mounting height, color, and flash pattern requirements.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat's covered by the warranty?\u003c\/strong\u003e\u003cbr\u003eOur industry-leading lifetime warranty covers manufacturing defects, driver failures, and LED module performance. It does not cover damage caused by improper installation, extreme overuse beyond defined duty cycles, or wiring issues. For full warranty terms, please refer to our Warranty \u0026amp; Returns page.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Amber \/ Magnet","offer_id":42583918968893,"sku":"LP-E17-AW","price":349.37,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (X2)","offer_id":42583919001661,"sku":"LP-E17-AW","price":374.37,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet","offer_id":42590511628349,"sku":"LP-E17-AB","price":368.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack (X2)","offer_id":42590511661117,"sku":"LP-E17-AB","price":393.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet","offer_id":42590511693885,"sku":"LP-E17-AG","price":368.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack (X2)","offer_id":42590511726653,"sku":"LP-E17-AG","price":393.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet","offer_id":43482672496701,"sku":"LP-E17-AR","price":368.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack (X2)","offer_id":43482672529469,"sku":"LP-E17-AR","price":393.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet","offer_id":42583919067197,"sku":"LP-E17-AW","price":368.12,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack (X2)","offer_id":42583919099965,"sku":"LP-E17-AW","price":393.12,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet","offer_id":42583919165501,"sku":"LP-E17-AB","price":349.37,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack (X2)","offer_id":42583919198269,"sku":"LP-E17-AB","price":374.37,"currency_code":"USD","in_stock":true},{"title":"Green \/ Magnet","offer_id":42590511759421,"sku":"LP-E17-AG","price":349.37,"currency_code":"USD","in_stock":true},{"title":"Green \/ Headache Rack (X2)","offer_id":42590511792189,"sku":"LP-E17-AG","price":374.37,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet","offer_id":42583919263805,"sku":"LP-E17-RB","price":368.12,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack (X2)","offer_id":42583919296573,"sku":"LP-E17-RB","price":393.12,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet","offer_id":42583919362109,"sku":"LP-E17-RW","price":349.37,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack (X2)","offer_id":42583919394877,"sku":"LP-E17-RW","price":374.37,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet","offer_id":42583919460413,"sku":"LP-E17-RW","price":368.12,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack (X2)","offer_id":42583919493181,"sku":"LP-E17-RW","price":393.12,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet","offer_id":42583919558717,"sku":"LP-E17-AW","price":349.37,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack (X2)","offer_id":42583919591485,"sku":"LP-E17-AW","price":374.37,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE-17-inch-emergency-light-bar.png?v=1788466003"},{"product_id":"new-30-low-pro-emergency-light-bar","title":"30\" Low Pro Emergency Light Bar","description":"\u003c!-- LOWPRO INTERACTIVE PLAYER (test embed) --\u003e\n\u003cdiv id=\"lowpro-player-block\" style=\"margin:0 0 26px;\"\u003e\n\u003cdiv class=\"lowpro-cta\"\u003e\n\u003ch2 style=\"margin:0 0 4px;font-size:24px;line-height:1.25;\"\u003eTake the Controls: Try This Light Bar Live\u003c\/h2\u003e\n\u003cp style=\"margin:0 0 12px;font-size:15px;line-height:1.5;\"\u003ePick your colors, run the flash patterns, sweep the traffic advisor, and switch on the 360° Halo scene light, exactly like the controller in the box. Every module on a dual-color bar can show either color.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ciframe id=\"lowpro-player-frame\" class=\"lowpro-frame\" title=\"Low Pro Emergency Bar interactive demo\" style=\"width:100%;border:0;display:block;border-radius:16px;background:#0a0c0f;\" srcdoc='\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\"en\"\u0026gt;\n\u0026lt;head\u0026gt;\n\u0026lt;meta charset=\"UTF-8\"\u0026gt;\n\u0026lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u0026gt;\n\u0026lt;title\u0026gt;Black Oak LED · Low Pro Emergency Bar Interactive Demo\u0026lt;\/title\u0026gt;\n\u0026lt;style\u0026gt;\n  :root{\n    --bg:#0a0c0f; --panel:#111418; --panel2:#161a20; --edge:#242a33;\n    --txt:#e8ecf2; --dim:#8a94a3; --white-led:#F4F8FF; --navy:#0B1B2B; --accent:#C8892A;\n  }\n  *{box-sizing:border-box; -webkit-tap-highlight-color:transparent}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);\n    font-family:\"Segoe UI\",system-ui,-apple-system,Roboto,Arial,sans-serif;}\n  .wrap{max-width:1100px;margin:0 auto;padding:14px 16px 20px;}\n  header{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:6px}\n  .brand{font-weight:800;letter-spacing:.18em;font-size:19px;white-space:nowrap}\n  .brand span{color:var(--dim);font-weight:600}\n  .sub{color:var(--dim);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase}\n  .stage{background:radial-gradient(ellipse at 50% 30%, #14181e 0%, #0b0d11 70%);\n    border:1px solid var(--edge);border-radius:14px;padding:6px 10px 2px;position:relative;overflow:hidden}\n  .stage svg{display:block;width:100%;height:auto}\n  .stageLabel{position:absolute;top:10px;left:14px;font-size:11px;letter-spacing:.14em;\n    color:#5b6470;text-transform:uppercase}\n  .haloBadge{position:absolute;top:10px;right:14px;display:none;align-items:center;gap:8px;\n    font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#dfe9f7;\n    background:rgba(70,90,120,.22);border:1px solid rgba(190,215,255,.35);\n    border-radius:999px;padding:5px 12px 5px 9px;backdrop-filter:blur(2px)}\n  .haloBadge .dot{width:8px;height:8px;border-radius:50%;background:#F4F8FF;\n    box-shadow:0 0 8px 2px rgba(220,235,255,.9);flex:none}\n  .haloBadge b{font-weight:700;color:#fff}\n  .haloBadge span{color:#9fb0c6;text-transform:none;letter-spacing:.02em}\n  @media(max-width:700px){.haloBadge span{display:none}}\n  .lower{display:grid;grid-template-columns:270px 1fr;gap:14px;margin-top:14px;align-items:stretch}\n  .compactSel{display:none}\n  @media(max-width:840px){\n    .stage{padding:8px 8px 4px}\n    .stageLabel{position:static;font-size:10px;margin:0 0 6px}\n    .haloBadge{position:static;font-size:10px;padding:4px 9px;margin:0 0 6px;width:max-content}\n    .wrap{padding:6px 6px 10px !important}\n    .lower{grid-template-columns:1fr;gap:10px}\n    .cardCtl{order:1}\n    .cardColors{order:2}\n    .cardColors .cRow,.cardColors .hint{display:none}\n    .cardColors.expanded .cRow{display:block}\n    .compactSel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n    .compactSel .sw{cursor:default}\n    .compactSel .sw:hover{transform:none}\n  }\n  .card{background:var(--panel);border:1px solid var(--edge);border-radius:14px;padding:14px}\n  .card h3{margin:0 0 10px;font-size:11.5px;letter-spacing:.16em;color:var(--dim);\n    text-transform:uppercase;font-weight:700}\n  .cRow{margin-bottom:12px}\n  .cRow .lbl{font-size:12px;color:var(--dim);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}\n  .swatches{display:flex;gap:8px;flex-wrap:wrap}\n  .sw{width:38px;height:30px;border-radius:7px;border:2px solid #2c333d;cursor:pointer;\n    position:relative;transition:transform .08s}\n  .sw:hover{transform:translateY(-1px)}\n  .sw.sel{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25),0 0 14px rgba(255,255,255,.15)}\n  .sw.none{background:repeating-linear-gradient(45deg,#1a1f26 0 6px,#12161b 6px 12px)}\n  .sw.none::after{content:\"OFF\";position:absolute;inset:0;display:flex;align-items:center;\n    justify-content:center;font-size:9px;color:#6b7480;font-weight:700;letter-spacing:.05em}\n  .swapBtn{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);border-radius:7px;\n    font-size:11px;padding:4px 9px;cursor:pointer;letter-spacing:.06em}\n  .swapBtn:hover{border-color:#4a5462}\n  .hint{font-size:11.5px;line-height:1.5;color:#6d7684;border-top:1px solid var(--edge);\n    padding-top:10px;margin-top:2px}\n  .hint b{color:#9aa4b2;font-weight:600}\n  .ctlWrap{display:flex;justify-content:center}\n  .ctlWrap svg{width:100%;max-width:560px;height:auto}\n  .kb{cursor:pointer}\n  .kb rect.face,.kb circle.face,.kb path.face{fill:#20242b;stroke:#0c0e11;stroke-width:1.5;transition:fill .1s}\n  .kb:hover rect.face,.kb:hover circle.face,.kb:hover path.face{fill:#2e3641}\n  @keyframes ringPulse{0%,100%{stroke-opacity:.9}50%{stroke-opacity:.12}}\n  .pulseRing{fill:none;stroke:#ffb43a;stroke-width:2.5;animation:ringPulse 1.8s ease-in-out infinite;pointer-events:none}\n  @keyframes hintPulse{0%,100%{opacity:.6}50%{opacity:1}}\n  .tryHint{display:flex;justify-content:center;margin:10px 0 0}\n  .tryHint span{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;\n    text-transform:uppercase;color:#ffcf7d;border:1px solid rgba(255,180,58,.45);border-radius:999px;\n    padding:6px 14px;animation:hintPulse 2.4s ease-in-out infinite;background:rgba(255,180,58,.07)}\n  .tryHint .dotLive{width:7px;height:7px;border-radius:50%;background:#ffb43a;\n    box-shadow:0 0 7px 2px rgba(255,180,58,.7);flex:none}\n  .kb.lit rect.face,.kb.lit circle.face,.kb.lit path.face{fill:#dfe7f5}\n  .kb.lit text{fill:#20242b;font-weight:600}\n  .kb:active rect.face,.kb:active circle.face,.kb:active path.face{fill:#aab6c9}\n  .kb.lit{filter:url(#btnGlow)}\n  .kb text{fill:#c7cdd6;font-size:11px;text-anchor:middle;pointer-events:none;user-select:none}\n  footer{margin-top:12px;color:#59626e;font-size:11px;letter-spacing:.04em;\n    display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}\n  footer a{color:#7d8794;text-decoration:none}\n\u0026lt;\/style\u0026gt;\n\u0026lt;\/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;div class=\"wrap\"\u0026gt;\n  \u0026lt;header\u0026gt;\n    \u0026lt;div class=\"brand\"\u0026gt;BLACK OAK \u0026lt;span\u0026gt;LED\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"sub\"\u0026gt;Low Pro\u0026amp;trade; Emergency Bar · Interactive Demo \u0026amp;bull; 30\u0026amp;Prime;\u0026lt;\/div\u0026gt;\n  \u0026lt;\/header\u0026gt;\n\n  \u0026lt;div class=\"stage\"\u0026gt;\n    \u0026lt;div class=\"stageLabel\" id=\"patternLabel\"\u0026gt;Pattern 1 · Single Flash\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"haloBadge\" id=\"haloBadge\"\u0026gt;\u0026lt;i class=\"dot\"\u0026gt;\u0026lt;\/i\u0026gt;\n      \u0026lt;b\u0026gt;360\u0026amp;deg; Halo\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;\u0026amp;nbsp;scene light \u0026amp;middot; runs with or without the flashers\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;svg id=\"barSvg\" viewBox=\"0 0 1000 240\" aria-label=\"Light bar simulation\"\u0026gt;\u0026lt;\/svg\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"tryHint\" id=\"tryHint\"\u0026gt;\u0026lt;span\u0026gt;\u0026lt;i class=\"dotLive\"\u0026gt;\u0026lt;\/i\u0026gt;Live demo \u0026amp;middot; try the controller buttons\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"lower\"\u0026gt;\n    \u0026lt;div class=\"card cardColors\" id=\"colorCard\"\u0026gt;\n      \u0026lt;h3\u0026gt;Select Colors\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"compactSel\" id=\"compactSel\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 1\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw1\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 2 (dual color)\u0026lt;\/span\u0026gt;\n          \u0026lt;button class=\"swapBtn\" id=\"swapBtn\" title=\"Swap Color 1 and Color 2\"\u0026gt;\u0026amp;#8646; Swap\u0026lt;\/button\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw2\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"hint\"\u0026gt;\n        Every LED module on the Low Pro can display \u0026lt;b\u0026gt;either\u0026lt;\/b\u0026gt; selected color:\n        pick two colors and each module switches between them.\n        The right-hand cluster runs the \u0026lt;b\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/b\u0026gt;, a Low Pro\n        exclusive: it floods the area around the vehicle with steady work light,\n        with or without the warning flashers running. Try the \u0026lt;b\u0026gt;White\u0026lt;\/b\u0026gt; button.\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"card cardCtl\"\u0026gt;\n      \u0026lt;h3\u0026gt;Controller · press the buttons\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"ctlWrap\"\u0026gt;\n        \u0026lt;svg id=\"ctl\" viewBox=\"0 0 560 300\" aria-label=\"Controller keypad\"\u0026gt;\u0026lt;\/svg\u0026gt;\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;footer\u0026gt;\n    \u0026lt;div\u0026gt;BLACK OAK LED · Navigate the Night.\u0026lt;\/div\u0026gt;\n    \u0026lt;div\u0026gt;Designed and engineered in Sarasota, Florida\u0026lt;\/div\u0026gt;\n  \u0026lt;\/footer\u0026gt;\n\u0026lt;\/div\u0026gt;\n\n\u0026lt;script\u0026gt;\n\"use strict\";\nconst LEDCOLORS = {\n  amber:{main:\"#ffb43a\", core:\"#ffe9b0\", glow:\"#ff9d00\", label:\"Amber\"},\n  white:{main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#cfe4ff\", label:\"White\"},\n  red:  {main:\"#ff2d23\", core:\"#ffb0a8\", glow:\"#ff1400\", label:\"Red\"},\n  blue: {main:\"#2a62ff\", core:\"#b8ccff\", glow:\"#0040ff\", label:\"Blue\"},\n  green:{main:\"#19d949\", core:\"#c2ffcf\", glow:\"#00c832\", label:\"Green\"}\n};\nconst HALO = {main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#dcebff\"};\n\nconst S = {\n  color1:\"amber\", color2:\"white\",\n  c1on:true, c2on:false,\n  zones:{front:true, back:true, left:true, right:true},\n  halo:{front:false, back:false, left:false, right:false},\n  pattern:1,\n  ta:null,\n  cruise:false, random:false, dim50:false, autoSensor:false,\n  indicatorOff:false, favorite:1,\n  randTimer:0, randPat:1\n};\n\nconst NS=\"http:\/\/www.w3.org\/2000\/svg\";\nconst bar = document.getElementById(\"barSvg\");\nconst modules = [];\n\nfunction el(name, attrs, parent){\n  const e=document.createElementNS(NS,name);\n  for(const k in attrs) e.setAttribute(k,attrs[k]);\n  if(parent) parent.appendChild(e);\n  return e;\n}\n\nfunction buildBar(){\n  const defs = el(\"defs\",{},bar);\n  const mkGlow=(id,dev)=\u0026gt;{\n    const f=el(\"filter\",{id, x:\"-80%\",y:\"-80%\",width:\"260%\",height:\"260%\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:dev, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  };\n  mkGlow(\"ledGlow\",4);\n  (()=\u0026gt;{\n    const f=el(\"filter\",{id:\"haloGlow\", filterUnits:\"userSpaceOnUse\",\n      x:\"-120\",y:\"-160\",width:\"1240\",height:\"560\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:11, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  })();\n\n  const G = el(\"g\",{},bar);\n  const haloLayer = el(\"g\",{opacity:\"0\"},G);\n  const sidePaths = {\n    front:\"M 150,62 L 850,62\",\n    back: \"M 150,178 L 850,178\",\n    left: \"M 150,62 L 75,95 L 75,145 L 150,178\",\n    right:\"M 850,62 L 925,95 L 925,145 L 850,178\"\n  };\n  const haloEls = {};\n  for(const z in sidePaths){\n    const g=el(\"g\",{filter:\"url(#haloGlow)\"},haloLayer);\n    [[10,.9],[26,.4],[52,.16],[88,.07]].forEach(([wd,op])=\u0026gt;{\n      el(\"path\",{d:sidePaths[z], stroke:\"#eef4ff\", \"stroke-width\":wd, \"stroke-opacity\":op,\n        fill:\"none\", \"stroke-linecap\":\"round\", \"stroke-linejoin\":\"round\"},g);\n    });\n    haloEls[z]=g;\n  }\n  for(const k in haloEls){ haloEls[k].setAttribute(\"visibility\",\"hidden\"); }\n  S._haloEls = haloEls; haloLayer.setAttribute(\"opacity\",\"1\");\n\n  const bodyPts = \"150,62 850,62 925,95 925,145 850,178 150,178 75,145 75,95\";\n  el(\"polygon\",{points:bodyPts, fill:\"#15181d\", stroke:\"#3a4149\", \"stroke-width\":3},G);\n  el(\"polygon\",{points:\"158,70 842,70 913,99 913,141 842,170 158,170 87,141 87,99\",\n    fill:\"#0e1114\", stroke:\"#22272e\",\"stroke-width\":1},G);\n  el(\"text\",{x:500,y:112,\"text-anchor\":\"middle\",fill:\"#c9d0d9\",\"font-size\":\"21\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"6\",\"font-family\":\"inherit\"},G).textContent=\"BLACK OAK\";\n  el(\"text\",{x:500,y:130,\"text-anchor\":\"middle\",fill:\"#4c545e\",\"font-size\":\"9\",\n    \"letter-spacing\":\"2\"},G).textContent=\"SAE W3-1 22\";\n  el(\"circle\",{cx:500,cy:148,r:5,fill:\"#20252b\",stroke:\"#3a4149\"},G);\n\n  const ledLayer = el(\"g\",{},G);\n  const N=12;\n  const w=53, h=12, gap=4.6;\n  const startX=155, span=690;\n  let order=0;\n  const addMod=(zone,x,y,rot,cx,cy)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x,y,width:w,height:h,rx:4, fill:\"#23282f\", stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:x-6,y:y-6,width:w+12,height:h+12,rx:9, fill:\"none\",opacity:0, filter:\"url(#ledGlow)\"},g);\n    modules.push({zone, lens, halo, idx:order++, px:x+w\/2});\n  };\n  const addRot=(zone,cx,cy,len,rot)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x:cx-len\/2,y:cy-h\/2,width:len,height:h,rx:4,\n      fill:\"#23282f\",stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:cx-len\/2-6,y:cy-h\/2-6,width:len+12,height:h+12,rx:9,\n      fill:\"none\",opacity:0,filter:\"url(#ledGlow)\"},g);\n    modules.push({zone,lens,halo,idx:modules.length,px:cx});\n  };\n  for(let i=0;i\u0026lt;N;i++){ const x=startX+i*(span\/N)+gap\/2; addMod(\"front\",x,52,0,0,0); }\n  addRot(\"right\",884,73,68,23.7);\n  addRot(\"right\",921,120,46,90);\n  addRot(\"right\",884,167,68,-23.7);\n  for(let i=N-1;i\u0026gt;=0;i--){ const x=startX+i*(span\/N)+gap\/2; addMod(\"back\",x,176,0,0,0); }\n  addRot(\"left\",116,167,68,23.7);\n  addRot(\"left\",79,120,46,90);\n  addRot(\"left\",116,73,68,-23.7);\n}\nbuildBar();\nconst NMOD = modules.length;\nconst frontMods = modules.filter(m=\u0026gt;m.zone===\"front\");\nconst backMods  = modules.filter(m=\u0026gt;m.zone===\"back\");\nconst halfSplit = m=\u0026gt;{\n  if(m.zone===\"left\") return \"L\";\n  if(m.zone===\"right\") return \"R\";\n  const list = m.zone===\"front\"?frontMods:backMods;\n  const pos = list.indexOf(m);\n  const leftSide = m.zone===\"front\" ? pos \u0026lt; list.length\/2 : pos \u0026gt;= list.length\/2;\n  return leftSide ? \"L\" : \"R\";\n};\nmodules.forEach(m=\u0026gt;m.side=halfSplit(m));\nconst PXMIN=Math.min(...modules.map(m=\u0026gt;m.px)), PXMAX=Math.max(...modules.map(m=\u0026gt;m.px));\n\nfunction pulse(t, cycle, n){\n  const ph = t % cycle;\n  if(n===1) return ph \u0026lt; 168;\n  const sub = cycle\u0026gt;=800 ? 84 : (n===2 ? 83 : 67);\n  const onw = cycle\u0026gt;=800 ? 67 : 50;\n  if(ph \u0026gt;= n*sub) return false;\n  return (ph % sub) \u0026lt; onw;\n}\nfunction burst(local, half, n){\n  const sub = Math.min(half\u0026gt;=400 ? 84 : 67, half\/n);\n  if(local \u0026gt;= n*sub) return false;\n  return (local % sub) \u0026lt; sub*.75;\n}\nconst PATTERNS = {\n  1:{name:\"Single Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,1)},\n  2:{name:\"Double Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,2)},\n  3:{name:\"Triple Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,3)},\n  4:{name:\"Quintuple Flash\", cyc:800, f:(t,c)=\u0026gt;pulse(t,c,5)},\n  5:{name:\"Slow Single Flash\",cyc:800,f:(t,c)=\u0026gt;(t%c) \u0026lt; 434},\n  6:{name:\"Two Adjacent Groups Alternate\", cyc:400, group:true},\n  7:{name:\"Left \/ Right 3-Flash Alternate\", cyc:400, lr:3},\n  8:{name:\"Left \/ Right 5-Flash Alternate\", cyc:800, lr:5},\n  9:{name:\"Counterclockwise Rotation\", cyc:1400, rot:-1},\n  10:{name:\"Clockwise Rotation\",       cyc:1400, rot:1},\n  11:{name:\"Left Steady + Right Quintuple\", cyc:800, steady:\"L\"},\n  12:{name:\"Right Steady + Left Quintuple\", cyc:800, steady:\"R\"}\n};\n\nfunction moduleState(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const single = (S.c1on?1:0)+(S.c2on\u0026amp;\u0026amp;S.color2?1:0)===1;\n  if(!dual \u0026amp;\u0026amp; !single) return null;\n  const cA = S.c1on ? S.color1 : S.color2;\n  const P = PATTERNS[S.pattern];\n  const cyc = P.cyc;\n\n  if(S.cruise){\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:.7};\n  }\n\n  let phaseColor = cA;\n  let tt = t;\n  if(dual){\n    const period = cyc*2;\n    const first = (t % period) \u0026lt; cyc;\n    phaseColor = first ? S.color1 : S.color2;\n    tt = t % cyc;\n  }\n\n  if(P.rot){\n    const pos = (t % cyc)\/cyc;\n    const head = P.rot===1 ? pos : 1-pos;\n    const center = head*NMOD;\n    let d = Math.abs(m.idx - center);\n    d = Math.min(d, NMOD-d);\n    if(d \u0026gt; 3.2) return null;\n    const col = dual ? (Math.floor(t\/cyc)%2? S.color2 : S.color1) : cA;\n    return {color:col, intensity: 1 - d\/3.6};\n  }\n  if(P.lr){\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    const mineFirst = m.side===\"L\";\n    if(firstHalf!==mineFirst) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, P.lr)) return null;\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:1};\n  }\n  if(P.group){\n    const g = Math.floor(m.idx\/2)%2;\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    if((g===0)!==firstHalf) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, 3)) return null;\n    const col = dual ? (g===0?S.color1:S.color2) : phaseColor;\n    return {color:col, intensity:1};\n  }\n  if(P.steady){\n    const steadySide = P.steady;\n    if(m.side===steadySide){\n      const col = dual ? S.color1 : cA;\n      return {color:col, intensity:.4};\n    }\n    if(!pulse(tt,cyc,5)) return null;\n    const col = dual ? S.color2 : cA;\n    return {color:col, intensity:1};\n  }\n  if(!P.f(tt,cyc)) return null;\n  if(dual){\n    if(S.pattern===2||S.pattern===3){\n      const flip = S.pattern===3;\n      const c1side = flip? \"R\":\"L\";\n      return {color: m.side===c1side? S.color1:S.color2, intensity:1};\n    }\n    return {color:phaseColor, intensity:1};\n  }\n  return {color:cA, intensity:1};\n}\n\nfunction taSweep(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const T = 1600;\n  const pass = Math.floor(t\/T) % (dual?2:1);\n  const col = dual ? (pass===0 ? S.color1 : S.color2)\n                   : (S.c1on ? S.color1 : (S.color2||S.color1));\n  const ph=(t%T)\/T;\n  let build;\n  if(ph\u0026lt;.65) build = ph\/.65;\n  else if(ph\u0026lt;.8) build = 1;\n  else return null;\n  const p = (m.px-PXMIN)\/(PXMAX-PXMIN);\n  const e = .002;\n  let on=false;\n  if(S.ta===\"right\")      on = p \u0026lt;= build+e;\n  else if(S.ta===\"left\")  on = (1-p) \u0026lt;= build+e;\n  else                    on = Math.abs(p-0.5) \u0026lt;= build*0.5+e;\n  return on? {color:col,intensity:1} : null;\n}\n\nlet lastPatternShown=-1;\nfunction render(t){\n  const dimMul = S.dim50? .45 : 1;\n  if(S.random \u0026amp;\u0026amp; t-S.randTimer\u0026gt;4000){\n    S.randTimer=t; S.pattern = 1+Math.floor(Math.random()*12); syncUI();\n  }\n  const warnOn = (S.c1on || (S.c2on\u0026amp;\u0026amp;S.color2));\n  for(const m of modules){\n    let st;\n    if(S.ta) st = taSweep(m,t);\n    else if(warnOn \u0026amp;\u0026amp; S.zones[m.zone]) st = moduleState(m,t);\n    else st = null;\n    m.cur = st;\n    if(st){ m.lastT=t; m.lastC=st.color; m.lastK=st.intensity; }\n    let drawC=null, drawK=0;\n    if(st){ drawC=st.color; drawK=st.intensity; }\n    else if(m.lastC \u0026amp;\u0026amp; (t-m.lastT)\u0026lt;70){ drawC=m.lastC; drawK=m.lastK*(1-(t-m.lastT)\/70)*.7; }\n    if(drawC){\n      const c=LEDCOLORS[drawC];\n      const k=drawK*dimMul;\n      m.lens.setAttribute(\"fill\", k\u0026gt;.55? c.core : c.main);\n      m.lens.setAttribute(\"stroke\", c.main);\n      m.halo.setAttribute(\"fill\", c.glow);\n      m.halo.setAttribute(\"opacity\", (0.85*k).toFixed(2));\n    }else{\n      m.lens.setAttribute(\"fill\",\"#23282f\");\n      m.lens.setAttribute(\"stroke\",\"#10131a\");\n      m.halo.setAttribute(\"opacity\",\"0\");\n    }\n  }\n  for(const z in S._haloEls){\n    S._haloEls[z].setAttribute(\"visibility\", S.halo[z]? \"visible\":\"hidden\");\n    S._haloEls[z].setAttribute(\"opacity\", (.85*dimMul).toFixed(2));\n  }\n  if(S._dots){\n    const RED=\"#ff2622\", OFF=\"#1c2026\";\n    for(const row of [\"front\",\"back\"]){\n      const src = row===\"front\"? frontMods : backMods.slice().reverse();\n      S._dots[row].forEach((dot,i)=\u0026gt;{\n        if(S.indicatorOff){ dot.setAttribute(\"fill\",OFF); return; }\n        const m = src[Math.round(i*(src.length-1)\/(S._dots[row].length-1))];\n        dot.setAttribute(\"fill\", m.cur? RED : OFF);\n      });\n    }\n    const zoneLit = z =\u0026gt; modules.some(m=\u0026gt;m.zone===z \u0026amp;\u0026amp; m.cur);\n    S._dotL.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"left\"))?  RED : OFF);\n    S._dotR.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"right\"))? RED : OFF);\n  }\n  if(S.pattern!==lastPatternShown){ lastPatternShown=S.pattern; updateLabel(); }\n  requestAnimationFrame(render);\n}\n\nfunction updateLabel(){\n  const P=PATTERNS[S.pattern];\n  document.getElementById(\"patternLabel\").textContent =\n    `Pattern ${S.pattern} · ${P.name}` + (S.cruise? \"  •  Cruise\":\"\") + (S.ta\u0026amp;\u0026amp;!tourActive? `  •  Traffic Advisor ${S.ta}`:\"\");\n  drawDisplay();\n}\n\nconst ORDER=[\"amber\",\"white\",\"red\",\"blue\",\"green\"];\nfunction buildCompact(){\n  const c=document.getElementById(\"compactSel\");\n  c.innerHTML=\"\";\n  const mk=(col)=\u0026gt;{ const d=document.createElement(\"div\"); d.className=\"sw\";\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label; return d; };\n  const lab=document.createElement(\"span\");\n  lab.style.cssText=\"font-size:12px;color:#8a94a3\";\n  lab.textContent=\"Your colors:\";\n  c.appendChild(lab);\n  c.appendChild(mk(S.color1));\n  if(S.color2){ c.appendChild(mk(S.color2)); }\n  const btn=document.createElement(\"button\");\n  btn.className=\"swapBtn\";\n  const card=document.getElementById(\"colorCard\");\n  btn.textContent = card.classList.contains(\"expanded\") ? \"Done\" : \"Change colors\";\n  btn.onclick=()=\u0026gt;{ card.classList.toggle(\"expanded\"); buildCompact(); };\n  c.appendChild(btn);\n}\nfunction buildSwatches(){\n  buildCompact();\n  const s1=document.getElementById(\"sw1\"), s2=document.getElementById(\"sw2\");\n  s1.innerHTML=\"\"; s2.innerHTML=\"\";\n  for(const c of ORDER){\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color1===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color1=c; if(S.color2===c) S.color2=null; buildSwatches(); };\n    s1.appendChild(d);\n  }\n  const none=document.createElement(\"div\");\n  none.className=\"sw none\"+(S.color2===null?\" sel\":\"\");\n  none.title=\"Single color\"; none.onclick=()=\u0026gt;{S.color2=null; buildSwatches();};\n  s2.appendChild(none);\n  for(const c of ORDER){\n    if(c===S.color1) continue;\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color2===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color2=c; S.c2on=true; buildSwatches(); syncUI(); };\n    s2.appendChild(d);\n  }\n}\ndocument.getElementById(\"swapBtn\").onclick=()=\u0026gt;{\n  if(!S.color2) return;\n  [S.color1,S.color2]=[S.color2,S.color1]; buildSwatches();\n};\n\nconst ctl=document.getElementById(\"ctl\");\nconst buttons={};\nfunction buildController(){\n  const defs=el(\"defs\",{},ctl);\n  const f=el(\"filter\",{id:\"btnGlow\",x:\"-40%\",y:\"-40%\",width:\"180%\",height:\"180%\"},defs);\n  el(\"feGaussianBlur\",{stdDeviation:\"2.2\",result:\"b\"},f);\n  const mg=el(\"feMerge\",{},f);\n  el(\"feMergeNode\",{in:\"b\"},mg); el(\"feMergeNode\",{in:\"SourceGraphic\"},mg);\n\n  el(\"rect\",{x:2,y:2,width:556,height:296,rx:26,fill:\"#17191d\",stroke:\"#000\",\"stroke-width\":2},ctl);\n  el(\"rect\",{x:12,y:12,width:536,height:276,rx:20,fill:\"none\",stroke:\"#262a31\",\"stroke-width\":1.5},ctl);\n\n  const btn=(key,label,x,y,shape,w,h,fs)=\u0026gt;{\n    const g=el(\"g\",{class:\"kb\",tabindex:\"0\",role:\"button\",\"aria-label\":label.replace(\"\\n\",\" \")},ctl);\n    if(shape===\"circle\") el(\"circle\",{class:\"face\",cx:x,cy:y,r:w},g);\n    else if(shape===\"rect\") el(\"rect\",{class:\"face\",x:x-w\/2,y:y-h\/2,width:w,height:h,rx:8},g);\n    else el(\"path\",{class:\"face\",d:shape},g);\n    const lines=label.split(\"\\n\");\n    lines.forEach((ln,i)=\u0026gt;{\n      const tv = el(\"text\",{x:x, y:y+(i-(lines.length-1)\/2)*11+4, \"font-size\":fs||10.5},g);\n      tv.textContent=ln;\n    });\n    g.addEventListener(\"click\",()=\u0026gt;press(key));\n    g.addEventListener(\"keydown\",e=\u0026gt;{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();press(key);}});\n    buttons[key]={g};\n    return g;\n  };\n\n  const lx=88, ly=88;\n  btn(\"z_front\",\"Front\", lx,   ly-38,\"circle\",19);\n  btn(\"z_left\",\"Left\",   lx-52,ly,   \"circle\",19);\n  btn(\"z_all\",\"ALL\",     lx,   ly,   \"circle\",19);\n  btn(\"z_right\",\"Right\", lx+52,ly,   \"circle\",19);\n  btn(\"z_back\",\"Back\",   lx,   ly+38,\"circle\",19);\n\n  el(\"rect\",{x:170,y:34,width:220,height:64,rx:12,fill:\"#0a0c0e\",stroke:\"#26292f\"},ctl);\n  el(\"text\",{x:280,y:71,\"text-anchor\":\"middle\",fill:\"#b9c1cc\",\"font-size\":\"15\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"4\"},ctl).textContent=\"BLACK OAK\";\n  S._dots={front:[],back:[]};\n  for(let i=0;i\u0026lt;8;i++){\n    S._dots.front.push(el(\"circle\",{cx:198+i*24,cy:46,r:3.4,fill:\"#1c2026\"},ctl));\n    S._dots.back.push( el(\"circle\",{cx:198+i*24,cy:86,r:3.4,fill:\"#1c2026\"},ctl));\n  }\n  S._dotL = el(\"circle\",{cx:182,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n  S._dotR = el(\"circle\",{cx:382,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n\n  btn(\"ta_left\",\"Left\", 210,126,\"M186 126 L214 108 L226 108 L226 144 L214 144 Z\",0,0,9.5);\n  btn(\"ta_both\",\"Traffic\\nAdvisor\",272,126,\"M232 108 L308 108 L318 126 L308 144 L232 144 L242 126 Z\",0,0,9.5);\n  btn(\"ta_right\",\"Right\",330,126,\"M314 108 L326 108 L354 126 L326 144 L314 144 Z\",0,0,9.5);\n\n  const rx=470, ry=88;\n  btn(\"h_front\",\"Front\", rx,   ry-38,\"circle\",19);\n  btn(\"h_left\",\"Left\",   rx-52,ry,   \"circle\",19);\n  btn(\"h_white\",\"White\", rx,   ry,   \"circle\",19);\n  btn(\"h_right\",\"Right\", rx+52,ry,   \"circle\",19);\n  btn(\"h_back\",\"Back\",   rx,   ry+38,\"circle\",19);\n  el(\"text\",{x:rx,y:ry+68,\"text-anchor\":\"middle\",fill:\"#7f8b9c\",\"font-size\":\"9.5\",\n    \"font-weight\":\"700\",\"letter-spacing\":\"1.5\"},ctl).textContent=\"360° HALO\";\n  el(\"text\",{x:rx,y:ry+79,\"text-anchor\":\"middle\",fill:\"#59636f\",\"font-size\":\"8\",\n    \"letter-spacing\":\"1\"},ctl).textContent=\"SCENE LIGHT\";\n\n  btn(\"c1\",\"Color 1\\nON\/OFF\",   62,190,\"rect\",66,40,9.5);\n  btn(\"c2\",\"Color 2\\nON\/OFF\",  136,190,\"rect\",66,40,9.5);\n  btn(\"dim\",\"50%\",              62,244,\"rect\",66,34);\n  btn(\"auto\",\"Auto\\nSensor\",   136,244,\"rect\",66,40,9.5);\n\n  btn(\"last\",\"Last\\nPattern\",  228,218,\"rect\",62,44,9.5);\n  btn(\"next\",\"Next\\nPattern\",  298,218,\"rect\",62,44,9.5);\n  S._ring = el(\"rect\",{x:262,y:190,width:72,height:56,rx:12,class:\"pulseRing\"},ctl);\n\n  btn(\"ind\",\"Indicator\",       412,190,\"rect\",74,36,9.5);\n  btn(\"cruise\",\"Cruise\\nLight\",496,190,\"rect\",70,40,9.5);\n  btn(\"rand\",\"Random\",         412,244,\"rect\",74,36,9.5);\n  btn(\"fav\",\"Favorite\\nPattern\",496,244,\"rect\",70,40,9.5);\n}\nbuildController();\n\nfunction drawDisplay(){}\n\nlet favHold=null;\nfunction press(key){\n  markInteract();\n  switch(key){\n    case \"z_all\":{\n      const allOn=S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right;\n      const v=!allOn; S.zones={front:v,back:v,left:v,right:v}; break;}\n    case \"z_front\": S.zones.front=!S.zones.front; break;\n    case \"z_back\":  S.zones.back=!S.zones.back; break;\n    case \"z_left\":  S.zones.left=!S.zones.left; break;\n    case \"z_right\": S.zones.right=!S.zones.right; break;\n    case \"h_white\":{\n      const allOn=S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right;\n      const v=!allOn; S.halo={front:v,back:v,left:v,right:v}; break;}\n    case \"h_front\": S.halo.front=!S.halo.front; break;\n    case \"h_back\":  S.halo.back=!S.halo.back; break;\n    case \"h_left\":  S.halo.left=!S.halo.left; break;\n    case \"h_right\": S.halo.right=!S.halo.right; break;\n    case \"c1\": S.c1on=!S.c1on; break;\n    case \"c2\": if(S.color2) S.c2on=!S.c2on; break;\n    case \"next\": S.pattern=S.pattern%12+1; S.cruise=false; S.random=false; break;\n    case \"last\": S.pattern=(S.pattern+10)%12+1; S.cruise=false; S.random=false; break;\n    case \"cruise\": S.cruise=!S.cruise; if(S.cruise){S.random=false;} break;\n    case \"rand\": S.random=!S.random; if(S.random){S.cruise=false; S.randTimer=0;} break;\n    case \"dim\": S.dim50=!S.dim50; break;\n    case \"auto\": S.autoSensor=!S.autoSensor; break;\n    case \"ind\": S.indicatorOff=!S.indicatorOff; break;\n    case \"ta_left\":  S.ta = S.ta===\"left\"? null:\"left\"; break;\n    case \"ta_right\": S.ta = S.ta===\"right\"? null:\"right\"; break;\n    case \"ta_both\":  S.ta = S.ta===\"both\"? null:\"both\"; break;\n    case \"fav\": S.pattern=S.favorite; S.cruise=false; S.random=false; break;\n  }\n  updateLabel(); syncUI();\n}\n(function(){\n  const g=buttons[\"fav\"].g;\n  let t0=0;\n  g.addEventListener(\"pointerdown\",()=\u0026gt;{ t0=Date.now();\n    favHold=setTimeout(()=\u0026gt;{ S.favorite=S.pattern; flash(g); },1200); });\n  const clear=()=\u0026gt;{ if(favHold){clearTimeout(favHold); favHold=null;} };\n  g.addEventListener(\"pointerup\",clear); g.addEventListener(\"pointerleave\",clear);\n  function flash(el){ el.classList.add(\"lit\"); setTimeout(()=\u0026gt;syncUI(),400); }\n})();\n\nfunction syncUI(){\n  const setLit=(k,v)=\u0026gt;buttons[k].g.classList.toggle(\"lit\",!!v);\n  setLit(\"z_front\",S.zones.front); setLit(\"z_back\",S.zones.back);\n  setLit(\"z_left\",S.zones.left);   setLit(\"z_right\",S.zones.right);\n  setLit(\"z_all\",S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right);\n  setLit(\"h_front\",S.halo.front); setLit(\"h_back\",S.halo.back);\n  setLit(\"h_left\",S.halo.left);   setLit(\"h_right\",S.halo.right);\n  setLit(\"h_white\",S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right);\n  setLit(\"c1\",S.c1on); setLit(\"c2\",S.c2on\u0026amp;\u0026amp;!!S.color2);\n  setLit(\"cruise\",S.cruise); setLit(\"rand\",S.random);\n  setLit(\"dim\",S.dim50); setLit(\"auto\",S.autoSensor); setLit(\"ind\",S.indicatorOff);\n  setLit(\"ta_left\",S.ta===\"left\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_right\",S.ta===\"right\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_both\",S.ta===\"both\"\u0026amp;\u0026amp;!tourActive);\n  const haloOn = S.halo.front||S.halo.back||S.halo.left||S.halo.right;\n  document.getElementById(\"haloBadge\").style.display = haloOn? \"flex\":\"none\";\n  drawDisplay();\n}\n\n\/* default everywhere: dual-color amber\/white, steady burn; the attract sweep provides motion *\/\nS.c2on=true; S.cruise=true;\nS.interacted=false;\nlet tourActive=false, tourTimer=null, idleTimer=null;\nbuildSwatches(); syncUI(); updateLabel();\nrequestAnimationFrame(render);\n\n\/* ATTRACT MODE *\/\nfunction markInteract(){\n  if(S.interacted) return;\n  S.interacted=true;\n  if(tourActive){ tourActive=false; S.ta=null; }\n  clearTimeout(tourTimer); clearTimeout(idleTimer);\n  const h=document.getElementById(\"tryHint\");\n  if(h){ h.style.transition=\"opacity .5s\"; h.style.opacity=\"0\"; setTimeout(()=\u0026gt;h.remove(),600); }\n  if(S._ring) S._ring.remove();\n}\nfunction attractSweep(passes){\n  if(S.interacted || tourActive) return;\n  tourActive=true; S.ta=\"both\";\n  tourTimer=setTimeout(()=\u0026gt;{\n    if(tourActive){ tourActive=false; S.ta=null; }\n    scheduleIdle();\n  }, 1600*passes+400);\n}\nfunction scheduleIdle(){\n  if(S.interacted) return;\n  clearTimeout(idleTimer);\n  idleTimer=setTimeout(()=\u0026gt;attractSweep(1), 18000);\n}\ndocument.addEventListener(\"pointerdown\",e=\u0026gt;{\n  if(e.target.closest \u0026amp;\u0026amp; e.target.closest(\".sw,.swapBtn,.kb\")) markInteract();\n},true);\n(function(){\n  let fired=false;\n  const start=()=\u0026gt;{ if(!fired){ fired=true; setTimeout(()=\u0026gt;attractSweep(2), 600); } };\n  if(window.IntersectionObserver){\n    new IntersectionObserver((es,obs)=\u0026gt;{\n      if(es.some(e=\u0026gt;e.isIntersecting)){ start(); obs.disconnect(); }\n    },{threshold:.5}).observe(document.querySelector(\".stage\"));\n  } else start();\n})();\n\n(function(){\n  const embedded = (window!==parent);\n  if(embedded){\n    document.querySelector(\"header\").style.display=\"none\";\n    document.querySelector(\"footer\").style.display=\"none\";\n    if(window.innerWidth\u0026gt;840) document.querySelector(\".wrap\").style.padding=\"10px 12px 14px\";\n  }\n  const report=()=\u0026gt;{ try{\n    parent.postMessage({type:\"lowpro-player-height\",\n      height: document.querySelector(\".wrap\").scrollHeight+8}, \"*\");\n  }catch(e){} };\n  if(window.ResizeObserver) new ResizeObserver(report).observe(document.querySelector(\".wrap\"));\n  window.addEventListener(\"load\",report); window.addEventListener(\"pageshow\",report);\n  setTimeout(report,400); setTimeout(report,1500);\n  let n=0; const iv=setInterval(()=\u0026gt;{ report(); if(++n\u0026gt;10) clearInterval(iv); },1200);\n})();\n\u0026lt;\/script\u0026gt;\n\u0026lt;\/body\u0026gt;\n\u0026lt;\/html\u0026gt;\n'\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.lowpro-frame{height:700px}\n@media(max-width:840px){\n  .lowpro-cta{display:none}\n  .lowpro-frame{height:760px}\n}\n\u003c\/style\u003e\n\u003cscript\u003e\nwindow.addEventListener(\"message\",function(e){\n  if(e.data \u0026\u0026 e.data.type===\"lowpro-player-height\"){\n    var f=document.getElementById(\"lowpro-player-frame\");\n    if(f \u0026\u0026 e.data.height\u003e200) f.style.height=(e.data.height+4)+\"px\";\n  }\n});\n\u003c\/script\u003e\n\u003cdiv style=\"height:28px;\"\u003e \u003c\/div\u003e\n\u003c!-- Intro Section --\u003e\n\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cstrong\u003eBuilt for emergency response teams and public safety professionals, this high-intensity LED warning light bar delivers uncompromising performance in a sleek, durable design.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003eThe Black Oak Low Pro Emergency Series Light Bar is engineered for maximum visibility, reliability, and user control. With ultra-bright LEDs, multiple flash patterns, and a rugged housing, this bar ensures your presence is known in any emergency situation—day or night, rain or shine.\u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003e \u003c\/p\u003e\n\u003cp data-end=\"1177\" data-start=\"808\"\u003eBuilt to withstand the demands of high-speed response, off-road utility, or work site visibility, this low-profile bar features a streamlined, aerodynamic frame and a universal mounting system to ensure easy installation on any vehicle. Whether you're outfitting a patrol car, fire unit, or utility truck, this bar delivers dependable performance where it matters most.\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- TRUST STRIP --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Screenshot_2026-07-21_at_9.31.14_AM.png?v=1784641940\" alt=\"SAE J845 Certified, SAE J595 Class 1, IP69K Waterproof, Lifetime Warranty, -40F to +145F Rated, 50,000 Hour LEDs\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003c!-- SIZE SELECTOR --\u003e\n\u003cdiv style=\"margin:4px 0 2px;\"\u003e\n\u003cp style=\"margin:0 0 8px;font-weight:600;font-size:15px;\"\u003eAvailable sizes:\u003c\/p\u003e\n\u003ca href=\"\/products\/11-mini-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e11\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e17\"\u003c\/a\u003e\n\u003cspan style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:8px 14px;border-radius:8px;margin:0 6px 8px 0;font-size:15px;\"\u003e30\"\u003c\/span\u003e\n\u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e43\"\u003c\/a\u003e\n\u003ca href=\"\/products\/low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e49\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-55-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e55\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-61-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e61\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e68\"\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003c!-- Collapsable Sections --\u003e\n\u003cstyle\u003e\n#MainContent details {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 16px;\n  overflow: hidden;\n  background: #fff;\n  font-family: Arial, sans-serif;\n}\n\n#MainContent details summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  padding: 14px 18px;\n  font-weight: 600;\n  font-size: 18px;\n  list-style: none;\n  background-color: #f9f9f9;\n  border-bottom: 1px solid #e0e0e0;\n  position: relative;\n}\n\n#MainContent details[open] summary {\n  background-color: #f1f1f1;\n}\n\n#MainContent details summary::after {\n  content: '+';\n  font-size: 20px;\n  font-weight: bold;\n  transition: transform 0.3s ease;\n}\n\n#MainContent details[open] summary::after {\n  content: '−';\n}\n\n#MainContent details .content {\n  padding: 16px 20px;\n  font-size: 16px;\n  line-height: 1.6;\n}\n\u003c\/style\u003e\n\u003cdetails\u003e\n\u003csummary\u003eFeatures\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003eLifetime Warranty\u003c\/li\u003e\n\u003cli\u003eSAE J845 Class 1 Certified\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e360° visibility with dual-color ultra-bright LEDs\u003c\/li\u003e\n\u003cli\u003eSlim Low Profile design\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 flash patterns with memory recall\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eRugged, waterproof housing (IP69K rated)\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eIntegrated controller with pattern cycling, cruise mode, and cut-off\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIn the Box\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cb\u003eLow Pro Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eController\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWiring\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Brackets\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- COMPLIANCE SECTION --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCompliance \u0026amp; Certifications\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cp\u003e\u003cstrong\u003eMeets the standards your department requires.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"3\"\u003eCertification \u0026amp; Compliance\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J845\u003c\/th\u003e\n\u003ctd\u003e360° warning lamp photometric standard for light bars and beacons\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J595 Class 1\u003c\/th\u003e\n\u003ctd\u003eHighest intensity class — approved for primary emergency vehicles (police, fire, EMS)\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIP69K\u003c\/th\u003e\n\u003ctd\u003eSealed against high-pressure washdown, salt, dust, and submersion\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRated\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Range\u003c\/th\u003e\n\u003ctd\u003eExtreme-climate duty\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e-40°F to +145°F\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDuty Life\u003c\/th\u003e\n\u003ctd\u003eContinuous-duty LED modules\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50,000 hours\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"font-size:13px;color:#666;\"\u003e\u003cem\u003eWarning-equipment regulations vary by state and jurisdiction. Verify color and mounting requirements with your local authority. Spec sheet PDF and certification documentation available on request for procurement offices.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- Image + Text Alternating Section --\u003e\n\u003cstyle\u003e\n.text-image-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 20px;\n}\n.text-image-wrap.text-image-right {\n  flex-direction: row-reverse;\n}\n.text-image-wrap .image-wrap {\n  flex: 1;\n  max-width: 500px;\n}\n.text-image-wrap .image-wrap img {\n  width: 100%;\n  height: auto;\n  max-height: 300px; \n  display: block;\n  object-fit: contain; \n}\n.text-image-wrap .text-wrap {\n  flex: 1;\n  min-width: 300px;\n}\n\u003c\/style\u003e\n\u003c!-- Image Right - Text Left Section --\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/255283_7703341170749_330031d5_da20_475f_887e_f1269d2ad248_1.jpg?v=1763495670\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eEmergency Bar + Work Light\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eGet full 360° white-light illumination at the touch of a button. Perfect for reverse lighting, scene lighting, or any situation where you need powerful all-around visibility. It’s a true dual-purpose feature you won’t find on most emergency bars — and it comes standard on every one of ours.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_SAE_graphics.jpg?v=1758041472\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eBuilt Tough for Any Environment\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eIP69K-rated waterproof housing and reinforced aluminum construction stand up to rain, snow, mud, and dust—ideal for police, fire, tow, or off-road response vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00223.jpg?v=1754512314\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e Full 360° Warning Visibility\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003ePacked with high-output dual-color LEDs and side modules, this bar delivers all-angle visibility—ensuring you're seen from every direction, even in chaotic scenes or inclement weather.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Driver_Side_Angle.jpg?v=1761226316\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSlim, Low-Profile Design\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eEngineered to minimize wind resistance and visual bulk, this light bar features a sleek, aerodynamic frame that hugs your vehicle’s roofline. The low-profile housing not only enhances fuel efficiency but also delivers a clean, professional look without compromising brightness or performance.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\n\u003cp\u003e\u003cvideo width=\"100%\" height=\"auto\" muted=\"\" autoplay=\"autoplay\" loop=\"loop\" playsinline=\"\" controls=\"controls\"\u003e\n    \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4ec9ce848f5e4d2d8083da9daf4dbe78.mp4\" type=\"video\/mp4\"\u003e\n    Your browser does not support the video tag.\n  \u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 Flash Patterns with Smart Memory\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eChoose from up to 45 user-selectable flash patterns to fit any scenario. Built-in memory recall stores your last used setting for consistent deployment every time.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_-_Sliding_Feet.gif?v=1758730578\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSliding Feet\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eOur sliding feet mounts are designed to give you maximum flexibility during installation. By allowing the brackets to slide along the base of the light bar, you can easily adjust spacing to match a wide variety of mounting points. This ensures a precise fit whether you’re working with factory holes, custom setups, or uneven surfaces.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HERO BANNER --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/d8j0ntlcm91z4.cloudfront.net\/user_3G9nKxyaQsdrPdDsxWr4EcSl5FL\/hf_20260715_201038_0803a0cd-07a6-4508-9c7a-50d0230a94e3.png\" alt=\"Built to Code. Backed for Life. SAE J845 and J595 Class 1 compliant, IP69K sealed, lifetime warranty\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- FLEET BLOCK --\u003e\n\u003cdiv style=\"padding:8px 0;margin:0 0 8px;\"\u003e\n\u003ch3 style=\"margin:0 0 8px;\"\u003eOutfitting a Fleet?\u003c\/h3\u003e\n\u003cp style=\"margin:0 0 14px;font-size:16px;line-height:1.6;\"\u003eVolume pricing on 5+ units, department POs accepted, W-9 on file, and spec sheets ready for your procurement office. From single patrol vehicles to full county fleets.\u003c\/p\u003e\n\u003ca href=\"\/pages\/fleet-pricing\" style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:12px 22px;border-radius:8px;text-decoration:none;\"\u003eRequest Fleet Pricing\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Dimension --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Black_Oak_-_Low_Pro_Emergency_Bar_-_All_Dimensions.jpg?v=1762971573\" alt=\"\"\u003e\u003c\/p\u003e\n\u003c!-- Specs --\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003c!-- Specs Chart --\u003e\n\u003cstyle\u003e\n  table.spec-table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    font-size: 15px;\n  }\n  table.spec-table th, table.spec-table td {\n    border: 1px solid #ccc;\n    padding: 10px;\n    text-align: left;\n  }\n  table.spec-table th {\n    background-color: #f7f7f7;\n    font-weight: 600;\n    width: 30%;\n  }\n  table.spec-table tr:hover {\n    background-color: #f2f2f2;\n  }\n  table.spec-table thead th {\n    background-color: #222;\n    color: #fff;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    text-align: center;\n  }\n\u003c\/style\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003ePower \u0026amp; Performance\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Wattage\u003c\/th\u003e\n\u003ctd\u003e264\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e20\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10-30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRaw Lumens\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Chip\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam Pattern\u003c\/th\u003e\n\u003ctd\u003eWide Angle\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertificate\u003c\/th\u003e\n\u003ctd\u003eSAE J845 \u0026amp; SAE J595 Class 1\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Single Color\u003c\/th\u003e\n\u003ctd\u003e15\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Dual Color\u003c\/th\u003e\n\u003ctd\u003e45 (15 Color 1 \/ 15 Color 2 \/ 15 Combo)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eDurability \u0026amp; Lifespan\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 Hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F\u003cbr\u003e-40° to 62° C\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited Lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30 Day Money Back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eWiring \u0026amp; Installation\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eCord Length From Light\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Included?\u003c\/th\u003e\n\u003ctd\u003eYes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector Type\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHole Size for Controller\u003c\/th\u003e\n\u003ctd\u003e\u003cbr\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting Bolt Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eGeneral\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e9.4 Lbs\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E30-\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c!-- FAQ --\u003e\n\u003ch5\u003eDimensions\u003c\/h5\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Black_Oak_-_Low_Pro_Emergency_Bar_-_30_Inch_Dimensions.jpg?v=1762972188\" alt=\"\"\u003e\u003c\/p\u003e\n\u003ch5\u003eVideo\u003c\/h5\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cvideo style=\"max-width: 100%; height: auto;\" controls=\"controls\" playsinline=\"\" loop=\"loop\" muted=\"\" autoplay=\"autoplay\"\u003e\n  \u003csource type=\"video\/mp4\" src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/f7ecf4030812467bbb46b165c21da48e.mov\"\u003e\n  Your browser does not support the video tag.\n\u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cp\u003e\u003cstrong\u003eWhat voltage and control systems does this light bar support?\u003c\/strong\u003e\u003cbr\u003eThis light bar operates on a 12 V–24 V DC power system and can be used with either push-button or wireless controllers. It’s compatible with standard vehicle electrical systems, making installation straightforward for both fleet and individual applications.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow durable is this light bar in harsh environments?\u003c\/strong\u003e\u003cbr\u003eThe Low Pro Emergency Light Bar is built with a rugged aluminum housing, sealed to an IP69K rating and tested to resist corrosion, vibration, and high-pressure water ingress. It’s designed for demanding conditions—whether roadside, rescue, or commercial use—so you can rely on consistent performance when it counts.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat beam patterns and flash modes are included?\u003c\/strong\u003e\u003cbr\u003eUp to 45 flash patterns are built into the unit—including warning, hazard, and full-output flasher modes—with memory recall so your last setting is retained even after power loss. You’ll also find low-profile steady-burn mode useful for scene lighting and standby operations.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs the light bar legal for use on public roads and emergency vehicles?\u003c\/strong\u003e\u003cbr\u003eYes. The unit meets SAE J595 Class 1 and other relevant emergency lighting standards for warning applications. However, regulations vary by jurisdiction, so we recommend checking your local laws before installation to ensure compliance with mounting height, color, and flash pattern requirements.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat’s covered by the warranty?\u003c\/strong\u003e\u003cbr\u003eOur industry-leading lifetime warranty covers manufacturing defects, driver failures, and LED module performance. It does not cover damage caused by improper installation, extreme overuse beyond defined duty cycles, or wiring issues. For full warranty terms, please refer to our Warranty \u0026amp; Returns page.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Amber \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975067709,"sku":"LP-E30-AW","price":615.62,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732312002621,"sku":"LP-E30-AW","price":641.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732312035389,"sku":"LP-E30-AW","price":645.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Magnet \/ Standard 12' Lead","offer_id":42583975100477,"sku":"LP-E30-AW","price":655.62,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732312068157,"sku":"LP-E30-AW","price":681.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732312100925,"sku":"LP-E30-AW","price":685.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975133245,"sku":"LP-E30-AW","price":640.62,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732312133693,"sku":"LP-E30-AW","price":666.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732312166461,"sku":"LP-E30-AW","price":670.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ Standard 12' Lead","offer_id":42590516871229,"sku":"LP-E30-AB","price":645.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732312199229,"sku":"LP-E30-AB","price":671.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732312231997,"sku":"LP-E30-AB","price":675.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet \/ Standard 12' Lead","offer_id":42590516903997,"sku":"LP-E30-AB","price":685.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732312264765,"sku":"LP-E30-AB","price":711.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732312297533,"sku":"LP-E30-AB","price":715.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ Standard 12' Lead","offer_id":42590516936765,"sku":"LP-E30-AB","price":670.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732312330301,"sku":"LP-E30-AB","price":696.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732312363069,"sku":"LP-E30-AB","price":700.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ Standard 12' Lead","offer_id":42996860321853,"sku":"LP-E30-AG","price":645.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42996860354621,"sku":"LP-E30-AG","price":671.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42996860387389,"sku":"LP-E30-AG","price":675.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet \/ Standard 12' Lead","offer_id":42996860420157,"sku":"LP-E30-AG","price":685.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42996860452925,"sku":"LP-E30-AG","price":711.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42996860485693,"sku":"LP-E30-AG","price":715.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ Standard 12' Lead","offer_id":42996860518461,"sku":"LP-E30-AG","price":670.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42996860551229,"sku":"LP-E30-AG","price":696.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42996860583997,"sku":"LP-E30-AG","price":700.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ Standard 12' Lead","offer_id":43482683211837,"sku":"LP-E30-AR","price":645.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":43482683244605,"sku":"LP-E30-AR","price":671.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":43482683277373,"sku":"LP-E30-AR","price":675.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet \/ Standard 12' Lead","offer_id":43482683310141,"sku":"LP-E30-AR","price":685.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":43482683342909,"sku":"LP-E30-AR","price":711.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":43482683375677,"sku":"LP-E30-AR","price":715.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ Standard 12' Lead","offer_id":43482683408445,"sku":"LP-E30-AR","price":670.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":43482683441213,"sku":"LP-E30-AR","price":696.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":43482683473981,"sku":"LP-E30-AR","price":700.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975166013,"sku":"LP-E30-AW","price":645.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732312395837,"sku":"LP-E30-AW","price":671.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732312428605,"sku":"LP-E30-AW","price":675.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet \/ Standard 12' Lead","offer_id":42583975198781,"sku":"LP-E30-AW","price":685.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732312461373,"sku":"LP-E30-AW","price":711.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732312494141,"sku":"LP-E30-AW","price":715.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975231549,"sku":"LP-E30-AW","price":670.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732312526909,"sku":"LP-E30-AW","price":696.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732312559677,"sku":"LP-E30-AW","price":700.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975264317,"sku":"LP-E30-AB","price":615.62,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732312592445,"sku":"LP-E30-AB","price":641.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732312625213,"sku":"LP-E30-AB","price":645.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet \/ Standard 12' Lead","offer_id":42583975297085,"sku":"LP-E30-AB","price":655.62,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732312657981,"sku":"LP-E30-AB","price":681.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732312690749,"sku":"LP-E30-AB","price":685.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975329853,"sku":"LP-E30-AB","price":640.62,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732312723517,"sku":"LP-E30-AB","price":666.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732312756285,"sku":"LP-E30-AB","price":670.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975460925,"sku":"LP-E30-RW","price":615.62,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732312789053,"sku":"LP-E30-RW","price":641.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732312821821,"sku":"LP-E30-RW","price":645.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet \/ Standard 12' Lead","offer_id":42583975493693,"sku":"LP-E30-RW","price":655.62,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732312854589,"sku":"LP-E30-RW","price":681.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732312887357,"sku":"LP-E30-RW","price":685.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975526461,"sku":"LP-E30-RW","price":640.62,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732312920125,"sku":"LP-E30-RW","price":666.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732312952893,"sku":"LP-E30-RW","price":670.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975362621,"sku":"LP-E30-RB","price":645.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732312985661,"sku":"LP-E30-RB","price":671.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732313018429,"sku":"LP-E30-RB","price":675.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet \/ Standard 12' Lead","offer_id":42583975395389,"sku":"LP-E30-RB","price":685.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732313051197,"sku":"LP-E30-RB","price":711.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732313083965,"sku":"LP-E30-RB","price":715.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975428157,"sku":"LP-E30-RB","price":670.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732313116733,"sku":"LP-E30-RB","price":696.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732313149501,"sku":"LP-E30-RB","price":700.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975559229,"sku":"LP-E30-RW","price":645.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732313182269,"sku":"LP-E30-RW","price":671.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732313215037,"sku":"LP-E30-RW","price":675.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet \/ Standard 12' Lead","offer_id":42583975591997,"sku":"LP-E30-RW","price":685.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732313247805,"sku":"LP-E30-RW","price":711.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732313280573,"sku":"LP-E30-RW","price":715.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975624765,"sku":"LP-E30-RW","price":670.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732313313341,"sku":"LP-E30-RW","price":696.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732313346109,"sku":"LP-E30-RW","price":700.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ Standard 12' Lead","offer_id":42583975657533,"sku":"LP-E30-AW","price":615.62,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 22' Total (12’ + 10' Extension)","offer_id":42732313378877,"sku":"LP-E30-AW","price":641.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 27' Total (12’ + 15' Extension)","offer_id":42732313411645,"sku":"LP-E30-AW","price":645.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet \/ Standard 12' Lead","offer_id":42583975690301,"sku":"LP-E30-AW","price":655.62,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet \/ 22' Total (12’ + 10' Extension)","offer_id":42732313444413,"sku":"LP-E30-AW","price":681.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet \/ 27' Total (12’ + 15' Extension)","offer_id":42732313477181,"sku":"LP-E30-AW","price":685.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ Standard 12' Lead","offer_id":42583975723069,"sku":"LP-E30-AW","price":640.62,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ 22' Total (12’ + 10' Extension)","offer_id":42732313509949,"sku":"LP-E30-AW","price":666.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ 27' Total (12’ + 15' Extension)","offer_id":42732313542717,"sku":"LP-E30-AW","price":670.57,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE30_Angled.png?v=1759159738"},{"product_id":"new-43-low-pro-emergency-light-bar","title":"43\" Low Pro Emergency Light Bar","description":"\u003c!-- LOWPRO INTERACTIVE PLAYER (test embed) --\u003e\n\u003cdiv id=\"lowpro-player-block\" style=\"margin:0 0 26px;\"\u003e\n\u003cdiv class=\"lowpro-cta\"\u003e\n\u003ch2 style=\"margin:0 0 4px;font-size:24px;line-height:1.25;\"\u003eTake the Controls: Try This Light Bar Live\u003c\/h2\u003e\n\u003cp style=\"margin:0 0 12px;font-size:15px;line-height:1.5;\"\u003ePick your colors, run the flash patterns, sweep the traffic advisor, and switch on the 360° Halo scene light, exactly like the controller in the box. Every module on a dual-color bar can show either color.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ciframe id=\"lowpro-player-frame\" class=\"lowpro-frame\" title=\"Low Pro Emergency Bar interactive demo\" style=\"width:100%;border:0;display:block;border-radius:16px;background:#0a0c0f;\" srcdoc='\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\"en\"\u0026gt;\n\u0026lt;head\u0026gt;\n\u0026lt;meta charset=\"UTF-8\"\u0026gt;\n\u0026lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u0026gt;\n\u0026lt;title\u0026gt;Black Oak LED · Low Pro Emergency Bar Interactive Demo\u0026lt;\/title\u0026gt;\n\u0026lt;style\u0026gt;\n  :root{\n    --bg:#0a0c0f; --panel:#111418; --panel2:#161a20; --edge:#242a33;\n    --txt:#e8ecf2; --dim:#8a94a3; --white-led:#F4F8FF; --navy:#0B1B2B; --accent:#C8892A;\n  }\n  *{box-sizing:border-box; -webkit-tap-highlight-color:transparent}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);\n    font-family:\"Segoe UI\",system-ui,-apple-system,Roboto,Arial,sans-serif;}\n  .wrap{max-width:1100px;margin:0 auto;padding:14px 16px 20px;}\n  header{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:6px}\n  .brand{font-weight:800;letter-spacing:.18em;font-size:19px;white-space:nowrap}\n  .brand span{color:var(--dim);font-weight:600}\n  .sub{color:var(--dim);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase}\n  .stage{background:radial-gradient(ellipse at 50% 30%, #14181e 0%, #0b0d11 70%);\n    border:1px solid var(--edge);border-radius:14px;padding:6px 10px 2px;position:relative;overflow:hidden}\n  .stage svg{display:block;width:100%;height:auto}\n  .stageLabel{position:absolute;top:10px;left:14px;font-size:11px;letter-spacing:.14em;\n    color:#5b6470;text-transform:uppercase}\n  .haloBadge{position:absolute;top:10px;right:14px;display:none;align-items:center;gap:8px;\n    font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#dfe9f7;\n    background:rgba(70,90,120,.22);border:1px solid rgba(190,215,255,.35);\n    border-radius:999px;padding:5px 12px 5px 9px;backdrop-filter:blur(2px)}\n  .haloBadge .dot{width:8px;height:8px;border-radius:50%;background:#F4F8FF;\n    box-shadow:0 0 8px 2px rgba(220,235,255,.9);flex:none}\n  .haloBadge b{font-weight:700;color:#fff}\n  .haloBadge span{color:#9fb0c6;text-transform:none;letter-spacing:.02em}\n  @media(max-width:700px){.haloBadge span{display:none}}\n  .lower{display:grid;grid-template-columns:270px 1fr;gap:14px;margin-top:14px;align-items:stretch}\n  .compactSel{display:none}\n  @media(max-width:840px){\n    .stage{padding:8px 8px 4px}\n    .stageLabel{position:static;font-size:10px;margin:0 0 6px}\n    .haloBadge{position:static;font-size:10px;padding:4px 9px;margin:0 0 6px;width:max-content}\n    .wrap{padding:6px 6px 10px !important}\n    .lower{grid-template-columns:1fr;gap:10px}\n    .cardCtl{order:1}\n    .cardColors{order:2}\n    .cardColors .cRow,.cardColors .hint{display:none}\n    .cardColors.expanded .cRow{display:block}\n    .compactSel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n    .compactSel .sw{cursor:default}\n    .compactSel .sw:hover{transform:none}\n  }\n  .card{background:var(--panel);border:1px solid var(--edge);border-radius:14px;padding:14px}\n  .card h3{margin:0 0 10px;font-size:11.5px;letter-spacing:.16em;color:var(--dim);\n    text-transform:uppercase;font-weight:700}\n  .cRow{margin-bottom:12px}\n  .cRow .lbl{font-size:12px;color:var(--dim);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}\n  .swatches{display:flex;gap:8px;flex-wrap:wrap}\n  .sw{width:38px;height:30px;border-radius:7px;border:2px solid #2c333d;cursor:pointer;\n    position:relative;transition:transform .08s}\n  .sw:hover{transform:translateY(-1px)}\n  .sw.sel{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25),0 0 14px rgba(255,255,255,.15)}\n  .sw.none{background:repeating-linear-gradient(45deg,#1a1f26 0 6px,#12161b 6px 12px)}\n  .sw.none::after{content:\"OFF\";position:absolute;inset:0;display:flex;align-items:center;\n    justify-content:center;font-size:9px;color:#6b7480;font-weight:700;letter-spacing:.05em}\n  .swapBtn{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);border-radius:7px;\n    font-size:11px;padding:4px 9px;cursor:pointer;letter-spacing:.06em}\n  .swapBtn:hover{border-color:#4a5462}\n  .hint{font-size:11.5px;line-height:1.5;color:#6d7684;border-top:1px solid var(--edge);\n    padding-top:10px;margin-top:2px}\n  .hint b{color:#9aa4b2;font-weight:600}\n  .ctlWrap{display:flex;justify-content:center}\n  .ctlWrap svg{width:100%;max-width:560px;height:auto}\n  .kb{cursor:pointer}\n  .kb rect.face,.kb circle.face,.kb path.face{fill:#20242b;stroke:#0c0e11;stroke-width:1.5;transition:fill .1s}\n  .kb:hover rect.face,.kb:hover circle.face,.kb:hover path.face{fill:#2e3641}\n  @keyframes ringPulse{0%,100%{stroke-opacity:.9}50%{stroke-opacity:.12}}\n  .pulseRing{fill:none;stroke:#ffb43a;stroke-width:2.5;animation:ringPulse 1.8s ease-in-out infinite;pointer-events:none}\n  @keyframes hintPulse{0%,100%{opacity:.6}50%{opacity:1}}\n  .tryHint{display:flex;justify-content:center;margin:10px 0 0}\n  .tryHint span{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;\n    text-transform:uppercase;color:#ffcf7d;border:1px solid rgba(255,180,58,.45);border-radius:999px;\n    padding:6px 14px;animation:hintPulse 2.4s ease-in-out infinite;background:rgba(255,180,58,.07)}\n  .tryHint .dotLive{width:7px;height:7px;border-radius:50%;background:#ffb43a;\n    box-shadow:0 0 7px 2px rgba(255,180,58,.7);flex:none}\n  .kb.lit rect.face,.kb.lit circle.face,.kb.lit path.face{fill:#dfe7f5}\n  .kb.lit text{fill:#20242b;font-weight:600}\n  .kb:active rect.face,.kb:active circle.face,.kb:active path.face{fill:#aab6c9}\n  .kb.lit{filter:url(#btnGlow)}\n  .kb text{fill:#c7cdd6;font-size:11px;text-anchor:middle;pointer-events:none;user-select:none}\n  footer{margin-top:12px;color:#59626e;font-size:11px;letter-spacing:.04em;\n    display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}\n  footer a{color:#7d8794;text-decoration:none}\n\u0026lt;\/style\u0026gt;\n\u0026lt;\/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;div class=\"wrap\"\u0026gt;\n  \u0026lt;header\u0026gt;\n    \u0026lt;div class=\"brand\"\u0026gt;BLACK OAK \u0026lt;span\u0026gt;LED\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"sub\"\u0026gt;Low Pro\u0026amp;trade; Emergency Bar · Interactive Demo \u0026amp;bull; 43\u0026amp;Prime;\u0026lt;\/div\u0026gt;\n  \u0026lt;\/header\u0026gt;\n\n  \u0026lt;div class=\"stage\"\u0026gt;\n    \u0026lt;div class=\"stageLabel\" id=\"patternLabel\"\u0026gt;Pattern 1 · Single Flash\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"haloBadge\" id=\"haloBadge\"\u0026gt;\u0026lt;i class=\"dot\"\u0026gt;\u0026lt;\/i\u0026gt;\n      \u0026lt;b\u0026gt;360\u0026amp;deg; Halo\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;\u0026amp;nbsp;scene light \u0026amp;middot; runs with or without the flashers\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;svg id=\"barSvg\" viewBox=\"0 0 1000 240\" aria-label=\"Light bar simulation\"\u0026gt;\u0026lt;\/svg\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"tryHint\" id=\"tryHint\"\u0026gt;\u0026lt;span\u0026gt;\u0026lt;i class=\"dotLive\"\u0026gt;\u0026lt;\/i\u0026gt;Live demo \u0026amp;middot; try the controller buttons\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"lower\"\u0026gt;\n    \u0026lt;div class=\"card cardColors\" id=\"colorCard\"\u0026gt;\n      \u0026lt;h3\u0026gt;Select Colors\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"compactSel\" id=\"compactSel\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 1\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw1\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 2 (dual color)\u0026lt;\/span\u0026gt;\n          \u0026lt;button class=\"swapBtn\" id=\"swapBtn\" title=\"Swap Color 1 and Color 2\"\u0026gt;\u0026amp;#8646; Swap\u0026lt;\/button\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw2\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"hint\"\u0026gt;\n        Every LED module on the Low Pro can display \u0026lt;b\u0026gt;either\u0026lt;\/b\u0026gt; selected color:\n        pick two colors and each module switches between them.\n        The right-hand cluster runs the \u0026lt;b\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/b\u0026gt;, a Low Pro\n        exclusive: it floods the area around the vehicle with steady work light,\n        with or without the warning flashers running. Try the \u0026lt;b\u0026gt;White\u0026lt;\/b\u0026gt; button.\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"card cardCtl\"\u0026gt;\n      \u0026lt;h3\u0026gt;Controller · press the buttons\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"ctlWrap\"\u0026gt;\n        \u0026lt;svg id=\"ctl\" viewBox=\"0 0 560 300\" aria-label=\"Controller keypad\"\u0026gt;\u0026lt;\/svg\u0026gt;\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;footer\u0026gt;\n    \u0026lt;div\u0026gt;BLACK OAK LED · Navigate the Night.\u0026lt;\/div\u0026gt;\n    \u0026lt;div\u0026gt;Designed and engineered in Sarasota, Florida\u0026lt;\/div\u0026gt;\n  \u0026lt;\/footer\u0026gt;\n\u0026lt;\/div\u0026gt;\n\n\u0026lt;script\u0026gt;\n\"use strict\";\nconst LEDCOLORS = {\n  amber:{main:\"#ffb43a\", core:\"#ffe9b0\", glow:\"#ff9d00\", label:\"Amber\"},\n  white:{main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#cfe4ff\", label:\"White\"},\n  red:  {main:\"#ff2d23\", core:\"#ffb0a8\", glow:\"#ff1400\", label:\"Red\"},\n  blue: {main:\"#2a62ff\", core:\"#b8ccff\", glow:\"#0040ff\", label:\"Blue\"},\n  green:{main:\"#19d949\", core:\"#c2ffcf\", glow:\"#00c832\", label:\"Green\"}\n};\nconst HALO = {main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#dcebff\"};\n\nconst S = {\n  color1:\"amber\", color2:\"white\",\n  c1on:true, c2on:false,\n  zones:{front:true, back:true, left:true, right:true},\n  halo:{front:false, back:false, left:false, right:false},\n  pattern:1,\n  ta:null,\n  cruise:false, random:false, dim50:false, autoSensor:false,\n  indicatorOff:false, favorite:1,\n  randTimer:0, randPat:1\n};\n\nconst NS=\"http:\/\/www.w3.org\/2000\/svg\";\nconst bar = document.getElementById(\"barSvg\");\nconst modules = [];\n\nfunction el(name, attrs, parent){\n  const e=document.createElementNS(NS,name);\n  for(const k in attrs) e.setAttribute(k,attrs[k]);\n  if(parent) parent.appendChild(e);\n  return e;\n}\n\nfunction buildBar(){\n  const defs = el(\"defs\",{},bar);\n  const mkGlow=(id,dev)=\u0026gt;{\n    const f=el(\"filter\",{id, x:\"-80%\",y:\"-80%\",width:\"260%\",height:\"260%\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:dev, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  };\n  mkGlow(\"ledGlow\",4);\n  (()=\u0026gt;{\n    const f=el(\"filter\",{id:\"haloGlow\", filterUnits:\"userSpaceOnUse\",\n      x:\"-120\",y:\"-160\",width:\"1240\",height:\"560\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:11, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  })();\n\n  const G = el(\"g\",{},bar);\n  const haloLayer = el(\"g\",{opacity:\"0\"},G);\n  const sidePaths = {\n    front:\"M 150,62 L 850,62\",\n    back: \"M 150,178 L 850,178\",\n    left: \"M 150,62 L 75,95 L 75,145 L 150,178\",\n    right:\"M 850,62 L 925,95 L 925,145 L 850,178\"\n  };\n  const haloEls = {};\n  for(const z in sidePaths){\n    const g=el(\"g\",{filter:\"url(#haloGlow)\"},haloLayer);\n    [[10,.9],[26,.4],[52,.16],[88,.07]].forEach(([wd,op])=\u0026gt;{\n      el(\"path\",{d:sidePaths[z], stroke:\"#eef4ff\", \"stroke-width\":wd, \"stroke-opacity\":op,\n        fill:\"none\", \"stroke-linecap\":\"round\", \"stroke-linejoin\":\"round\"},g);\n    });\n    haloEls[z]=g;\n  }\n  for(const k in haloEls){ haloEls[k].setAttribute(\"visibility\",\"hidden\"); }\n  S._haloEls = haloEls; haloLayer.setAttribute(\"opacity\",\"1\");\n\n  const bodyPts = \"150,62 850,62 925,95 925,145 850,178 150,178 75,145 75,95\";\n  el(\"polygon\",{points:bodyPts, fill:\"#15181d\", stroke:\"#3a4149\", \"stroke-width\":3},G);\n  el(\"polygon\",{points:\"158,70 842,70 913,99 913,141 842,170 158,170 87,141 87,99\",\n    fill:\"#0e1114\", stroke:\"#22272e\",\"stroke-width\":1},G);\n  el(\"text\",{x:500,y:112,\"text-anchor\":\"middle\",fill:\"#c9d0d9\",\"font-size\":\"21\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"6\",\"font-family\":\"inherit\"},G).textContent=\"BLACK OAK\";\n  el(\"text\",{x:500,y:130,\"text-anchor\":\"middle\",fill:\"#4c545e\",\"font-size\":\"9\",\n    \"letter-spacing\":\"2\"},G).textContent=\"SAE W3-1 22\";\n  el(\"circle\",{cx:500,cy:148,r:5,fill:\"#20252b\",stroke:\"#3a4149\"},G);\n\n  const ledLayer = el(\"g\",{},G);\n  const N=12;\n  const w=53, h=12, gap=4.6;\n  const startX=155, span=690;\n  let order=0;\n  const addMod=(zone,x,y,rot,cx,cy)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x,y,width:w,height:h,rx:4, fill:\"#23282f\", stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:x-6,y:y-6,width:w+12,height:h+12,rx:9, fill:\"none\",opacity:0, filter:\"url(#ledGlow)\"},g);\n    modules.push({zone, lens, halo, idx:order++, px:x+w\/2});\n  };\n  const addRot=(zone,cx,cy,len,rot)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x:cx-len\/2,y:cy-h\/2,width:len,height:h,rx:4,\n      fill:\"#23282f\",stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:cx-len\/2-6,y:cy-h\/2-6,width:len+12,height:h+12,rx:9,\n      fill:\"none\",opacity:0,filter:\"url(#ledGlow)\"},g);\n    modules.push({zone,lens,halo,idx:modules.length,px:cx});\n  };\n  for(let i=0;i\u0026lt;N;i++){ const x=startX+i*(span\/N)+gap\/2; addMod(\"front\",x,52,0,0,0); }\n  addRot(\"right\",884,73,68,23.7);\n  addRot(\"right\",921,120,46,90);\n  addRot(\"right\",884,167,68,-23.7);\n  for(let i=N-1;i\u0026gt;=0;i--){ const x=startX+i*(span\/N)+gap\/2; addMod(\"back\",x,176,0,0,0); }\n  addRot(\"left\",116,167,68,23.7);\n  addRot(\"left\",79,120,46,90);\n  addRot(\"left\",116,73,68,-23.7);\n}\nbuildBar();\nconst NMOD = modules.length;\nconst frontMods = modules.filter(m=\u0026gt;m.zone===\"front\");\nconst backMods  = modules.filter(m=\u0026gt;m.zone===\"back\");\nconst halfSplit = m=\u0026gt;{\n  if(m.zone===\"left\") return \"L\";\n  if(m.zone===\"right\") return \"R\";\n  const list = m.zone===\"front\"?frontMods:backMods;\n  const pos = list.indexOf(m);\n  const leftSide = m.zone===\"front\" ? pos \u0026lt; list.length\/2 : pos \u0026gt;= list.length\/2;\n  return leftSide ? \"L\" : \"R\";\n};\nmodules.forEach(m=\u0026gt;m.side=halfSplit(m));\nconst PXMIN=Math.min(...modules.map(m=\u0026gt;m.px)), PXMAX=Math.max(...modules.map(m=\u0026gt;m.px));\n\nfunction pulse(t, cycle, n){\n  const ph = t % cycle;\n  if(n===1) return ph \u0026lt; 168;\n  const sub = cycle\u0026gt;=800 ? 84 : (n===2 ? 83 : 67);\n  const onw = cycle\u0026gt;=800 ? 67 : 50;\n  if(ph \u0026gt;= n*sub) return false;\n  return (ph % sub) \u0026lt; onw;\n}\nfunction burst(local, half, n){\n  const sub = Math.min(half\u0026gt;=400 ? 84 : 67, half\/n);\n  if(local \u0026gt;= n*sub) return false;\n  return (local % sub) \u0026lt; sub*.75;\n}\nconst PATTERNS = {\n  1:{name:\"Single Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,1)},\n  2:{name:\"Double Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,2)},\n  3:{name:\"Triple Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,3)},\n  4:{name:\"Quintuple Flash\", cyc:800, f:(t,c)=\u0026gt;pulse(t,c,5)},\n  5:{name:\"Slow Single Flash\",cyc:800,f:(t,c)=\u0026gt;(t%c) \u0026lt; 434},\n  6:{name:\"Two Adjacent Groups Alternate\", cyc:400, group:true},\n  7:{name:\"Left \/ Right 3-Flash Alternate\", cyc:400, lr:3},\n  8:{name:\"Left \/ Right 5-Flash Alternate\", cyc:800, lr:5},\n  9:{name:\"Counterclockwise Rotation\", cyc:1400, rot:-1},\n  10:{name:\"Clockwise Rotation\",       cyc:1400, rot:1},\n  11:{name:\"Left Steady + Right Quintuple\", cyc:800, steady:\"L\"},\n  12:{name:\"Right Steady + Left Quintuple\", cyc:800, steady:\"R\"}\n};\n\nfunction moduleState(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const single = (S.c1on?1:0)+(S.c2on\u0026amp;\u0026amp;S.color2?1:0)===1;\n  if(!dual \u0026amp;\u0026amp; !single) return null;\n  const cA = S.c1on ? S.color1 : S.color2;\n  const P = PATTERNS[S.pattern];\n  const cyc = P.cyc;\n\n  if(S.cruise){\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:.7};\n  }\n\n  let phaseColor = cA;\n  let tt = t;\n  if(dual){\n    const period = cyc*2;\n    const first = (t % period) \u0026lt; cyc;\n    phaseColor = first ? S.color1 : S.color2;\n    tt = t % cyc;\n  }\n\n  if(P.rot){\n    const pos = (t % cyc)\/cyc;\n    const head = P.rot===1 ? pos : 1-pos;\n    const center = head*NMOD;\n    let d = Math.abs(m.idx - center);\n    d = Math.min(d, NMOD-d);\n    if(d \u0026gt; 3.2) return null;\n    const col = dual ? (Math.floor(t\/cyc)%2? S.color2 : S.color1) : cA;\n    return {color:col, intensity: 1 - d\/3.6};\n  }\n  if(P.lr){\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    const mineFirst = m.side===\"L\";\n    if(firstHalf!==mineFirst) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, P.lr)) return null;\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:1};\n  }\n  if(P.group){\n    const g = Math.floor(m.idx\/2)%2;\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    if((g===0)!==firstHalf) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, 3)) return null;\n    const col = dual ? (g===0?S.color1:S.color2) : phaseColor;\n    return {color:col, intensity:1};\n  }\n  if(P.steady){\n    const steadySide = P.steady;\n    if(m.side===steadySide){\n      const col = dual ? S.color1 : cA;\n      return {color:col, intensity:.4};\n    }\n    if(!pulse(tt,cyc,5)) return null;\n    const col = dual ? S.color2 : cA;\n    return {color:col, intensity:1};\n  }\n  if(!P.f(tt,cyc)) return null;\n  if(dual){\n    if(S.pattern===2||S.pattern===3){\n      const flip = S.pattern===3;\n      const c1side = flip? \"R\":\"L\";\n      return {color: m.side===c1side? S.color1:S.color2, intensity:1};\n    }\n    return {color:phaseColor, intensity:1};\n  }\n  return {color:cA, intensity:1};\n}\n\nfunction taSweep(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const T = 1600;\n  const pass = Math.floor(t\/T) % (dual?2:1);\n  const col = dual ? (pass===0 ? S.color1 : S.color2)\n                   : (S.c1on ? S.color1 : (S.color2||S.color1));\n  const ph=(t%T)\/T;\n  let build;\n  if(ph\u0026lt;.65) build = ph\/.65;\n  else if(ph\u0026lt;.8) build = 1;\n  else return null;\n  const p = (m.px-PXMIN)\/(PXMAX-PXMIN);\n  const e = .002;\n  let on=false;\n  if(S.ta===\"right\")      on = p \u0026lt;= build+e;\n  else if(S.ta===\"left\")  on = (1-p) \u0026lt;= build+e;\n  else                    on = Math.abs(p-0.5) \u0026lt;= build*0.5+e;\n  return on? {color:col,intensity:1} : null;\n}\n\nlet lastPatternShown=-1;\nfunction render(t){\n  const dimMul = S.dim50? .45 : 1;\n  if(S.random \u0026amp;\u0026amp; t-S.randTimer\u0026gt;4000){\n    S.randTimer=t; S.pattern = 1+Math.floor(Math.random()*12); syncUI();\n  }\n  const warnOn = (S.c1on || (S.c2on\u0026amp;\u0026amp;S.color2));\n  for(const m of modules){\n    let st;\n    if(S.ta) st = taSweep(m,t);\n    else if(warnOn \u0026amp;\u0026amp; S.zones[m.zone]) st = moduleState(m,t);\n    else st = null;\n    m.cur = st;\n    if(st){ m.lastT=t; m.lastC=st.color; m.lastK=st.intensity; }\n    let drawC=null, drawK=0;\n    if(st){ drawC=st.color; drawK=st.intensity; }\n    else if(m.lastC \u0026amp;\u0026amp; (t-m.lastT)\u0026lt;70){ drawC=m.lastC; drawK=m.lastK*(1-(t-m.lastT)\/70)*.7; }\n    if(drawC){\n      const c=LEDCOLORS[drawC];\n      const k=drawK*dimMul;\n      m.lens.setAttribute(\"fill\", k\u0026gt;.55? c.core : c.main);\n      m.lens.setAttribute(\"stroke\", c.main);\n      m.halo.setAttribute(\"fill\", c.glow);\n      m.halo.setAttribute(\"opacity\", (0.85*k).toFixed(2));\n    }else{\n      m.lens.setAttribute(\"fill\",\"#23282f\");\n      m.lens.setAttribute(\"stroke\",\"#10131a\");\n      m.halo.setAttribute(\"opacity\",\"0\");\n    }\n  }\n  for(const z in S._haloEls){\n    S._haloEls[z].setAttribute(\"visibility\", S.halo[z]? \"visible\":\"hidden\");\n    S._haloEls[z].setAttribute(\"opacity\", (.85*dimMul).toFixed(2));\n  }\n  if(S._dots){\n    const RED=\"#ff2622\", OFF=\"#1c2026\";\n    for(const row of [\"front\",\"back\"]){\n      const src = row===\"front\"? frontMods : backMods.slice().reverse();\n      S._dots[row].forEach((dot,i)=\u0026gt;{\n        if(S.indicatorOff){ dot.setAttribute(\"fill\",OFF); return; }\n        const m = src[Math.round(i*(src.length-1)\/(S._dots[row].length-1))];\n        dot.setAttribute(\"fill\", m.cur? RED : OFF);\n      });\n    }\n    const zoneLit = z =\u0026gt; modules.some(m=\u0026gt;m.zone===z \u0026amp;\u0026amp; m.cur);\n    S._dotL.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"left\"))?  RED : OFF);\n    S._dotR.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"right\"))? RED : OFF);\n  }\n  if(S.pattern!==lastPatternShown){ lastPatternShown=S.pattern; updateLabel(); }\n  requestAnimationFrame(render);\n}\n\nfunction updateLabel(){\n  const P=PATTERNS[S.pattern];\n  document.getElementById(\"patternLabel\").textContent =\n    `Pattern ${S.pattern} · ${P.name}` + (S.cruise? \"  •  Cruise\":\"\") + (S.ta\u0026amp;\u0026amp;!tourActive? `  •  Traffic Advisor ${S.ta}`:\"\");\n  drawDisplay();\n}\n\nconst ORDER=[\"amber\",\"white\",\"red\",\"blue\",\"green\"];\nfunction buildCompact(){\n  const c=document.getElementById(\"compactSel\");\n  c.innerHTML=\"\";\n  const mk=(col)=\u0026gt;{ const d=document.createElement(\"div\"); d.className=\"sw\";\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label; return d; };\n  const lab=document.createElement(\"span\");\n  lab.style.cssText=\"font-size:12px;color:#8a94a3\";\n  lab.textContent=\"Your colors:\";\n  c.appendChild(lab);\n  c.appendChild(mk(S.color1));\n  if(S.color2){ c.appendChild(mk(S.color2)); }\n  const btn=document.createElement(\"button\");\n  btn.className=\"swapBtn\";\n  const card=document.getElementById(\"colorCard\");\n  btn.textContent = card.classList.contains(\"expanded\") ? \"Done\" : \"Change colors\";\n  btn.onclick=()=\u0026gt;{ card.classList.toggle(\"expanded\"); buildCompact(); };\n  c.appendChild(btn);\n}\nfunction buildSwatches(){\n  buildCompact();\n  const s1=document.getElementById(\"sw1\"), s2=document.getElementById(\"sw2\");\n  s1.innerHTML=\"\"; s2.innerHTML=\"\";\n  for(const c of ORDER){\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color1===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color1=c; if(S.color2===c) S.color2=null; buildSwatches(); };\n    s1.appendChild(d);\n  }\n  const none=document.createElement(\"div\");\n  none.className=\"sw none\"+(S.color2===null?\" sel\":\"\");\n  none.title=\"Single color\"; none.onclick=()=\u0026gt;{S.color2=null; buildSwatches();};\n  s2.appendChild(none);\n  for(const c of ORDER){\n    if(c===S.color1) continue;\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color2===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color2=c; S.c2on=true; buildSwatches(); syncUI(); };\n    s2.appendChild(d);\n  }\n}\ndocument.getElementById(\"swapBtn\").onclick=()=\u0026gt;{\n  if(!S.color2) return;\n  [S.color1,S.color2]=[S.color2,S.color1]; buildSwatches();\n};\n\nconst ctl=document.getElementById(\"ctl\");\nconst buttons={};\nfunction buildController(){\n  const defs=el(\"defs\",{},ctl);\n  const f=el(\"filter\",{id:\"btnGlow\",x:\"-40%\",y:\"-40%\",width:\"180%\",height:\"180%\"},defs);\n  el(\"feGaussianBlur\",{stdDeviation:\"2.2\",result:\"b\"},f);\n  const mg=el(\"feMerge\",{},f);\n  el(\"feMergeNode\",{in:\"b\"},mg); el(\"feMergeNode\",{in:\"SourceGraphic\"},mg);\n\n  el(\"rect\",{x:2,y:2,width:556,height:296,rx:26,fill:\"#17191d\",stroke:\"#000\",\"stroke-width\":2},ctl);\n  el(\"rect\",{x:12,y:12,width:536,height:276,rx:20,fill:\"none\",stroke:\"#262a31\",\"stroke-width\":1.5},ctl);\n\n  const btn=(key,label,x,y,shape,w,h,fs)=\u0026gt;{\n    const g=el(\"g\",{class:\"kb\",tabindex:\"0\",role:\"button\",\"aria-label\":label.replace(\"\\n\",\" \")},ctl);\n    if(shape===\"circle\") el(\"circle\",{class:\"face\",cx:x,cy:y,r:w},g);\n    else if(shape===\"rect\") el(\"rect\",{class:\"face\",x:x-w\/2,y:y-h\/2,width:w,height:h,rx:8},g);\n    else el(\"path\",{class:\"face\",d:shape},g);\n    const lines=label.split(\"\\n\");\n    lines.forEach((ln,i)=\u0026gt;{\n      const tv = el(\"text\",{x:x, y:y+(i-(lines.length-1)\/2)*11+4, \"font-size\":fs||10.5},g);\n      tv.textContent=ln;\n    });\n    g.addEventListener(\"click\",()=\u0026gt;press(key));\n    g.addEventListener(\"keydown\",e=\u0026gt;{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();press(key);}});\n    buttons[key]={g};\n    return g;\n  };\n\n  const lx=88, ly=88;\n  btn(\"z_front\",\"Front\", lx,   ly-38,\"circle\",19);\n  btn(\"z_left\",\"Left\",   lx-52,ly,   \"circle\",19);\n  btn(\"z_all\",\"ALL\",     lx,   ly,   \"circle\",19);\n  btn(\"z_right\",\"Right\", lx+52,ly,   \"circle\",19);\n  btn(\"z_back\",\"Back\",   lx,   ly+38,\"circle\",19);\n\n  el(\"rect\",{x:170,y:34,width:220,height:64,rx:12,fill:\"#0a0c0e\",stroke:\"#26292f\"},ctl);\n  el(\"text\",{x:280,y:71,\"text-anchor\":\"middle\",fill:\"#b9c1cc\",\"font-size\":\"15\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"4\"},ctl).textContent=\"BLACK OAK\";\n  S._dots={front:[],back:[]};\n  for(let i=0;i\u0026lt;8;i++){\n    S._dots.front.push(el(\"circle\",{cx:198+i*24,cy:46,r:3.4,fill:\"#1c2026\"},ctl));\n    S._dots.back.push( el(\"circle\",{cx:198+i*24,cy:86,r:3.4,fill:\"#1c2026\"},ctl));\n  }\n  S._dotL = el(\"circle\",{cx:182,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n  S._dotR = el(\"circle\",{cx:382,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n\n  btn(\"ta_left\",\"Left\", 210,126,\"M186 126 L214 108 L226 108 L226 144 L214 144 Z\",0,0,9.5);\n  btn(\"ta_both\",\"Traffic\\nAdvisor\",272,126,\"M232 108 L308 108 L318 126 L308 144 L232 144 L242 126 Z\",0,0,9.5);\n  btn(\"ta_right\",\"Right\",330,126,\"M314 108 L326 108 L354 126 L326 144 L314 144 Z\",0,0,9.5);\n\n  const rx=470, ry=88;\n  btn(\"h_front\",\"Front\", rx,   ry-38,\"circle\",19);\n  btn(\"h_left\",\"Left\",   rx-52,ry,   \"circle\",19);\n  btn(\"h_white\",\"White\", rx,   ry,   \"circle\",19);\n  btn(\"h_right\",\"Right\", rx+52,ry,   \"circle\",19);\n  btn(\"h_back\",\"Back\",   rx,   ry+38,\"circle\",19);\n  el(\"text\",{x:rx,y:ry+68,\"text-anchor\":\"middle\",fill:\"#7f8b9c\",\"font-size\":\"9.5\",\n    \"font-weight\":\"700\",\"letter-spacing\":\"1.5\"},ctl).textContent=\"360° HALO\";\n  el(\"text\",{x:rx,y:ry+79,\"text-anchor\":\"middle\",fill:\"#59636f\",\"font-size\":\"8\",\n    \"letter-spacing\":\"1\"},ctl).textContent=\"SCENE LIGHT\";\n\n  btn(\"c1\",\"Color 1\\nON\/OFF\",   62,190,\"rect\",66,40,9.5);\n  btn(\"c2\",\"Color 2\\nON\/OFF\",  136,190,\"rect\",66,40,9.5);\n  btn(\"dim\",\"50%\",              62,244,\"rect\",66,34);\n  btn(\"auto\",\"Auto\\nSensor\",   136,244,\"rect\",66,40,9.5);\n\n  btn(\"last\",\"Last\\nPattern\",  228,218,\"rect\",62,44,9.5);\n  btn(\"next\",\"Next\\nPattern\",  298,218,\"rect\",62,44,9.5);\n  S._ring = el(\"rect\",{x:262,y:190,width:72,height:56,rx:12,class:\"pulseRing\"},ctl);\n\n  btn(\"ind\",\"Indicator\",       412,190,\"rect\",74,36,9.5);\n  btn(\"cruise\",\"Cruise\\nLight\",496,190,\"rect\",70,40,9.5);\n  btn(\"rand\",\"Random\",         412,244,\"rect\",74,36,9.5);\n  btn(\"fav\",\"Favorite\\nPattern\",496,244,\"rect\",70,40,9.5);\n}\nbuildController();\n\nfunction drawDisplay(){}\n\nlet favHold=null;\nfunction press(key){\n  markInteract();\n  switch(key){\n    case \"z_all\":{\n      const allOn=S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right;\n      const v=!allOn; S.zones={front:v,back:v,left:v,right:v}; break;}\n    case \"z_front\": S.zones.front=!S.zones.front; break;\n    case \"z_back\":  S.zones.back=!S.zones.back; break;\n    case \"z_left\":  S.zones.left=!S.zones.left; break;\n    case \"z_right\": S.zones.right=!S.zones.right; break;\n    case \"h_white\":{\n      const allOn=S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right;\n      const v=!allOn; S.halo={front:v,back:v,left:v,right:v}; break;}\n    case \"h_front\": S.halo.front=!S.halo.front; break;\n    case \"h_back\":  S.halo.back=!S.halo.back; break;\n    case \"h_left\":  S.halo.left=!S.halo.left; break;\n    case \"h_right\": S.halo.right=!S.halo.right; break;\n    case \"c1\": S.c1on=!S.c1on; break;\n    case \"c2\": if(S.color2) S.c2on=!S.c2on; break;\n    case \"next\": S.pattern=S.pattern%12+1; S.cruise=false; S.random=false; break;\n    case \"last\": S.pattern=(S.pattern+10)%12+1; S.cruise=false; S.random=false; break;\n    case \"cruise\": S.cruise=!S.cruise; if(S.cruise){S.random=false;} break;\n    case \"rand\": S.random=!S.random; if(S.random){S.cruise=false; S.randTimer=0;} break;\n    case \"dim\": S.dim50=!S.dim50; break;\n    case \"auto\": S.autoSensor=!S.autoSensor; break;\n    case \"ind\": S.indicatorOff=!S.indicatorOff; break;\n    case \"ta_left\":  S.ta = S.ta===\"left\"? null:\"left\"; break;\n    case \"ta_right\": S.ta = S.ta===\"right\"? null:\"right\"; break;\n    case \"ta_both\":  S.ta = S.ta===\"both\"? null:\"both\"; break;\n    case \"fav\": S.pattern=S.favorite; S.cruise=false; S.random=false; break;\n  }\n  updateLabel(); syncUI();\n}\n(function(){\n  const g=buttons[\"fav\"].g;\n  let t0=0;\n  g.addEventListener(\"pointerdown\",()=\u0026gt;{ t0=Date.now();\n    favHold=setTimeout(()=\u0026gt;{ S.favorite=S.pattern; flash(g); },1200); });\n  const clear=()=\u0026gt;{ if(favHold){clearTimeout(favHold); favHold=null;} };\n  g.addEventListener(\"pointerup\",clear); g.addEventListener(\"pointerleave\",clear);\n  function flash(el){ el.classList.add(\"lit\"); setTimeout(()=\u0026gt;syncUI(),400); }\n})();\n\nfunction syncUI(){\n  const setLit=(k,v)=\u0026gt;buttons[k].g.classList.toggle(\"lit\",!!v);\n  setLit(\"z_front\",S.zones.front); setLit(\"z_back\",S.zones.back);\n  setLit(\"z_left\",S.zones.left);   setLit(\"z_right\",S.zones.right);\n  setLit(\"z_all\",S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right);\n  setLit(\"h_front\",S.halo.front); setLit(\"h_back\",S.halo.back);\n  setLit(\"h_left\",S.halo.left);   setLit(\"h_right\",S.halo.right);\n  setLit(\"h_white\",S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right);\n  setLit(\"c1\",S.c1on); setLit(\"c2\",S.c2on\u0026amp;\u0026amp;!!S.color2);\n  setLit(\"cruise\",S.cruise); setLit(\"rand\",S.random);\n  setLit(\"dim\",S.dim50); setLit(\"auto\",S.autoSensor); setLit(\"ind\",S.indicatorOff);\n  setLit(\"ta_left\",S.ta===\"left\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_right\",S.ta===\"right\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_both\",S.ta===\"both\"\u0026amp;\u0026amp;!tourActive);\n  const haloOn = S.halo.front||S.halo.back||S.halo.left||S.halo.right;\n  document.getElementById(\"haloBadge\").style.display = haloOn? \"flex\":\"none\";\n  drawDisplay();\n}\n\n\/* default everywhere: dual-color amber\/white, steady burn; the attract sweep provides motion *\/\nS.c2on=true; S.cruise=true;\nS.interacted=false;\nlet tourActive=false, tourTimer=null, idleTimer=null;\nbuildSwatches(); syncUI(); updateLabel();\nrequestAnimationFrame(render);\n\n\/* ATTRACT MODE *\/\nfunction markInteract(){\n  if(S.interacted) return;\n  S.interacted=true;\n  if(tourActive){ tourActive=false; S.ta=null; }\n  clearTimeout(tourTimer); clearTimeout(idleTimer);\n  const h=document.getElementById(\"tryHint\");\n  if(h){ h.style.transition=\"opacity .5s\"; h.style.opacity=\"0\"; setTimeout(()=\u0026gt;h.remove(),600); }\n  if(S._ring) S._ring.remove();\n}\nfunction attractSweep(passes){\n  if(S.interacted || tourActive) return;\n  tourActive=true; S.ta=\"both\";\n  tourTimer=setTimeout(()=\u0026gt;{\n    if(tourActive){ tourActive=false; S.ta=null; }\n    scheduleIdle();\n  }, 1600*passes+400);\n}\nfunction scheduleIdle(){\n  if(S.interacted) return;\n  clearTimeout(idleTimer);\n  idleTimer=setTimeout(()=\u0026gt;attractSweep(1), 18000);\n}\ndocument.addEventListener(\"pointerdown\",e=\u0026gt;{\n  if(e.target.closest \u0026amp;\u0026amp; e.target.closest(\".sw,.swapBtn,.kb\")) markInteract();\n},true);\n(function(){\n  let fired=false;\n  const start=()=\u0026gt;{ if(!fired){ fired=true; setTimeout(()=\u0026gt;attractSweep(2), 600); } };\n  if(window.IntersectionObserver){\n    new IntersectionObserver((es,obs)=\u0026gt;{\n      if(es.some(e=\u0026gt;e.isIntersecting)){ start(); obs.disconnect(); }\n    },{threshold:.5}).observe(document.querySelector(\".stage\"));\n  } else start();\n})();\n\n(function(){\n  const embedded = (window!==parent);\n  if(embedded){\n    document.querySelector(\"header\").style.display=\"none\";\n    document.querySelector(\"footer\").style.display=\"none\";\n    if(window.innerWidth\u0026gt;840) document.querySelector(\".wrap\").style.padding=\"10px 12px 14px\";\n  }\n  const report=()=\u0026gt;{ try{\n    parent.postMessage({type:\"lowpro-player-height\",\n      height: document.querySelector(\".wrap\").scrollHeight+8}, \"*\");\n  }catch(e){} };\n  if(window.ResizeObserver) new ResizeObserver(report).observe(document.querySelector(\".wrap\"));\n  window.addEventListener(\"load\",report); window.addEventListener(\"pageshow\",report);\n  setTimeout(report,400); setTimeout(report,1500);\n  let n=0; const iv=setInterval(()=\u0026gt;{ report(); if(++n\u0026gt;10) clearInterval(iv); },1200);\n})();\n\u0026lt;\/script\u0026gt;\n\u0026lt;\/body\u0026gt;\n\u0026lt;\/html\u0026gt;\n'\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.lowpro-frame{height:700px}\n@media(max-width:840px){\n  .lowpro-cta{display:none}\n  .lowpro-frame{height:760px}\n}\n\u003c\/style\u003e\n\u003cscript\u003e\nwindow.addEventListener(\"message\",function(e){\n  if(e.data \u0026\u0026 e.data.type===\"lowpro-player-height\"){\n    var f=document.getElementById(\"lowpro-player-frame\");\n    if(f \u0026\u0026 e.data.height\u003e200) f.style.height=(e.data.height+4)+\"px\";\n  }\n});\n\u003c\/script\u003e\n\u003cdiv style=\"height:28px;\"\u003e \u003c\/div\u003e\n\u003cp\u003e\u003c!-- Intro Section --\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cstrong\u003eBuilt for emergency response teams and public safety professionals, this high-intensity LED warning light bar delivers uncompromising performance in a sleek, durable design.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003eThe Black Oak Low Pro Emergency Series Light Bar is engineered for maximum visibility, reliability, and user control. With ultra-bright LEDs, multiple flash patterns, and a rugged housing, this bar ensures your presence is known in any emergency situation, day or night, rain or shine.\u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003e \u003c\/p\u003e\n\u003cp data-end=\"1177\" data-start=\"808\"\u003eBuilt to withstand the demands of high-speed response, off-road utility, or work site visibility, this low-profile bar features a streamlined, aerodynamic frame and a universal mounting system to ensure easy installation on any vehicle. Whether you're outfitting a patrol car, fire unit, or utility truck, this bar delivers dependable performance where it matters most.\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- TRUST STRIP --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Screenshot_2026-07-21_at_9.31.14_AM.png?v=1784641940\" alt=\"SAE J845 Certified, SAE J595 Class 1, IP69K Waterproof, Lifetime Warranty, -40F to +145F Rated, 50,000 Hour LEDs\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003c!-- SIZE SELECTOR --\u003e\n\u003cdiv style=\"margin:4px 0 2px;\"\u003e\n\u003cp style=\"margin:0 0 8px;font-weight:600;font-size:15px;\"\u003eAvailable sizes:\u003c\/p\u003e\n\u003ca href=\"\/products\/11-mini-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e11\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e17\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e30\"\u003c\/a\u003e\n\u003cspan style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:8px 14px;border-radius:8px;margin:0 6px 8px 0;font-size:15px;\"\u003e43\"\u003c\/span\u003e\n\u003ca href=\"\/products\/low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e49\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-55-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e55\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-61-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e61\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e68\"\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003c!-- Collapsable Sections --\u003e\n\u003cstyle\u003e\n#MainContent details {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 16px;\n  overflow: hidden;\n  background: #fff;\n  font-family: Arial, sans-serif;\n}\n\n#MainContent details summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  padding: 14px 18px;\n  font-weight: 600;\n  font-size: 18px;\n  list-style: none;\n  background-color: #f9f9f9;\n  border-bottom: 1px solid #e0e0e0;\n  position: relative;\n}\n\n#MainContent details[open] summary {\n  background-color: #f1f1f1;\n}\n\n#MainContent details summary::after {\n  content: '+';\n  font-size: 20px;\n  font-weight: bold;\n  transition: transform 0.3s ease;\n}\n\n#MainContent details[open] summary::after {\n  content: '−';\n}\n\n#MainContent details .content {\n  padding: 16px 20px;\n  font-size: 16px;\n  line-height: 1.6;\n}\n\u003c\/style\u003e\n\u003cdetails\u003e\n\u003csummary\u003eFeatures\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003eLifetime Warranty\u003c\/li\u003e\n\u003cli\u003eSAE J845 Class 1 Certified\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e360° visibility with dual-color ultra-bright LEDs\u003c\/li\u003e\n\u003cli\u003eSlim Low Profile design\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 flash patterns with memory recall\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eRugged, waterproof housing (IP69K rated)\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eIntegrated controller with pattern cycling, cruise mode, and cut-off\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIn the Box\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cb\u003eLow Pro Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eController\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWiring\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Brackets\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- COMPLIANCE SECTION --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCompliance \u0026amp; Certifications\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cp\u003e\u003cstrong\u003eMeets the standards your department requires.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"3\"\u003eCertification \u0026amp; Compliance\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J845\u003c\/th\u003e\n\u003ctd\u003e360° warning lamp photometric standard for light bars and beacons\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J595 Class 1\u003c\/th\u003e\n\u003ctd\u003eHighest intensity class — approved for primary emergency vehicles (police, fire, EMS)\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIP69K\u003c\/th\u003e\n\u003ctd\u003eSealed against high-pressure washdown, salt, dust, and submersion\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRated\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Range\u003c\/th\u003e\n\u003ctd\u003eExtreme-climate duty\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e-40°F to +145°F\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDuty Life\u003c\/th\u003e\n\u003ctd\u003eContinuous-duty LED modules\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50,000 hours\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"font-size:13px;color:#666;\"\u003e\u003cem\u003eWarning-equipment regulations vary by state and jurisdiction. Verify color and mounting requirements with your local authority. Spec sheet PDF and certification documentation available on request for procurement offices.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- Image + Text Alternating Section --\u003e\n\u003cstyle\u003e\n.text-image-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 20px;\n}\n.text-image-wrap.text-image-right {\n  flex-direction: row-reverse;\n}\n.text-image-wrap .image-wrap {\n  flex: 1;\n  max-width: 500px;\n}\n.text-image-wrap .image-wrap img {\n  width: 100%;\n  height: auto;\n  max-height: 300px; \n  display: block;\n  object-fit: contain; \n}\n.text-image-wrap .text-wrap {\n  flex: 1;\n  min-width: 300px;\n}\n\u003c\/style\u003e\n\u003c!-- Image Right - Text Left Section --\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/255283_7703341170749_330031d5_da20_475f_887e_f1269d2ad248_1.jpg?v=1763495670\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eEmergency Bar + Work Light\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eGet full 360° white-light illumination at the touch of a button. Perfect for reverse lighting, scene lighting, or any situation where you need powerful all-around visibility. It’s a true dual-purpose feature you won’t find on most emergency bars — and it comes standard on every one of ours.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_SAE_graphics.jpg?v=1758041472\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eBuilt Tough for Any Environment\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eIP69K-rated waterproof housing and reinforced aluminum construction stand up to rain, snow, mud, and dust—ideal for police, fire, tow, or off-road response vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00223.jpg?v=1754512314\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e Full 360° Warning Visibility\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003ePacked with high-output dual-color LEDs and side modules, this bar delivers all-angle visibility—ensuring you're seen from every direction, even in chaotic scenes or inclement weather.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Driver_Side_Angle.jpg?v=1761226316\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSlim, Low-Profile Design\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eEngineered to minimize wind resistance and visual bulk, this light bar features a sleek, aerodynamic frame that hugs your vehicle’s roofline. The low-profile housing not only enhances fuel efficiency but also delivers a clean, professional look without compromising brightness or performance.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\n\u003cp\u003e\u003cvideo width=\"100%\" height=\"auto\" muted=\"\" autoplay=\"autoplay\" loop=\"loop\" playsinline=\"\" controls=\"controls\"\u003e\n    \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4ec9ce848f5e4d2d8083da9daf4dbe78.mp4\" type=\"video\/mp4\"\u003e\n    Your browser does not support the video tag.\n  \u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 Flash Patterns with Smart Memory\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eChoose from up to 45 user-selectable flash patterns to fit any scenario. Built-in memory recall stores your last used setting for consistent deployment every time.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_-_Sliding_Feet.gif?v=1758730578\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSliding Feet\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eOur sliding feet mounts are designed to give you maximum flexibility during installation. By allowing the brackets to slide along the base of the light bar, you can easily adjust spacing to match a wide variety of mounting points. This ensures a precise fit whether you’re working with factory holes, custom setups, or uneven surfaces.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HERO BANNER --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/d8j0ntlcm91z4.cloudfront.net\/user_3G9nKxyaQsdrPdDsxWr4EcSl5FL\/hf_20260715_201038_0803a0cd-07a6-4508-9c7a-50d0230a94e3.png\" alt=\"Built to Code. Backed for Life. SAE J845 and J595 Class 1 compliant, IP69K sealed, lifetime warranty\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- FLEET BLOCK --\u003e\n\u003cdiv style=\"padding:8px 0;margin:0 0 8px;\"\u003e\n\u003ch3 style=\"margin:0 0 8px;\"\u003eOutfitting a Fleet?\u003c\/h3\u003e\n\u003cp style=\"margin:0 0 14px;font-size:16px;line-height:1.6;\"\u003eVolume pricing on 5+ units, department POs accepted, W-9 on file, and spec sheets ready for your procurement office. From single patrol vehicles to full county fleets.\u003c\/p\u003e\n\u003ca href=\"\/pages\/fleet-pricing\" style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:12px 22px;border-radius:8px;text-decoration:none;\"\u003eRequest Fleet Pricing\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Dimension --\u003e\u003c!-- Specs --\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003c!-- Specs Chart --\u003e\n\u003cstyle\u003e\n  table.spec-table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    font-size: 15px;\n  }\n  table.spec-table th, table.spec-table td {\n    border: 1px solid #ccc;\n    padding: 10px;\n    text-align: left;\n  }\n  table.spec-table th {\n    background-color: #f7f7f7;\n    font-weight: 600;\n    width: 30%;\n  }\n  table.spec-table tr:hover {\n    background-color: #f2f2f2;\n  }\n  table.spec-table thead th {\n    background-color: #222;\n    color: #fff;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    text-align: center;\n  }\n\u003c\/style\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003ePower \u0026amp; Performance\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Wattage\u003c\/th\u003e\n\u003ctd\u003e360\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e27\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10-30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRaw Lumens\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Chip\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam Pattern\u003c\/th\u003e\n\u003ctd\u003eWide Angle\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertificate\u003c\/th\u003e\n\u003ctd\u003eSAE J845 \u0026amp; SAE J595 Class 1\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Single Color\u003c\/th\u003e\n\u003ctd\u003e15\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Dual Color\u003c\/th\u003e\n\u003ctd\u003e45 (15 Color 1 \/ 15 Color 2 \/ 15 Combo)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eDurability \u0026amp; Lifespan\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 Hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F\u003cbr\u003e-40° to 62° C\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited Lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30 Day Money Back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eWiring \u0026amp; Installation\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eCord Length From Light\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Included?\u003c\/th\u003e\n\u003ctd\u003eYes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector Type\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHole Size for Controller\u003c\/th\u003e\n\u003ctd\u003e\u003cbr\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting Bolt Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eGeneral\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e13 Lbs\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c!-- FAQ --\u003e\n\u003ch5\u003eDimensions\u003c\/h5\u003e\n\u003cp\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/43_Inch_Low_Pro_Dimensions.png?v=1779800831\"\u003e\u003c\/p\u003e\n\u003ch5\u003eVideo\u003c\/h5\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cvideo style=\"max-width: 100%; height: auto;\" controls=\"controls\" playsinline=\"\" loop=\"loop\" muted=\"\" autoplay=\"autoplay\"\u003e\n  \u003csource type=\"video\/mp4\" src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/f7ecf4030812467bbb46b165c21da48e.mov\"\u003e\n  Your browser does not support the video tag.\n\u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cp\u003e\u003cstrong\u003eWhat voltage and control systems does this light bar support?\u003c\/strong\u003e\u003cbr\u003eThis light bar operates on a 12 V–24 V DC power system and can be used with either push-button or wireless controllers. It’s compatible with standard vehicle electrical systems, making installation straightforward for both fleet and individual applications.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow durable is this light bar in harsh environments?\u003c\/strong\u003e\u003cbr\u003eThe Low Pro Emergency Light Bar is built with a rugged aluminum housing, sealed to an IP69K rating and tested to resist corrosion, vibration, and high-pressure water ingress. It’s designed for demanding conditions—whether roadside, rescue, or commercial use—so you can rely on consistent performance when it counts.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat beam patterns and flash modes are included?\u003c\/strong\u003e\u003cbr\u003eUp to 45 flash patterns are built into the unit—including warning, hazard, and full-output flasher modes—with memory recall so your last setting is retained even after power loss. You’ll also find low-profile steady-burn mode useful for scene lighting and standby operations.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs the light bar legal for use on public roads and emergency vehicles?\u003c\/strong\u003e\u003cbr\u003eYes. The unit meets SAE J595 Class 1 and other relevant emergency lighting standards for warning applications. However, regulations vary by jurisdiction, so we recommend checking your local laws before installation to ensure compliance with mounting height, color, and flash pattern requirements.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat’s covered by the warranty?\u003c\/strong\u003e\u003cbr\u003eOur industry-leading lifetime warranty covers manufacturing defects, driver failures, and LED module performance. It does not cover damage caused by improper installation, extreme overuse beyond defined duty cycles, or wiring issues. For full warranty terms, please refer to our Warranty \u0026amp; Returns page.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Amber \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981031485,"sku":"LP-E43-AW","price":767.5,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789181947965,"sku":"LP-E43-AW","price":793.45,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789181980733,"sku":"LP-E43-AW","price":797.45,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981097021,"sku":"LP-E43-AW","price":792.5,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789182079037,"sku":"LP-E43-AW","price":818.45,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789182111805,"sku":"LP-E43-AW","price":822.45,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Magnet \/ Standard - 12' Lead","offer_id":43423999393853,"sku":"LP-E43-AW","price":805.62,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43423999426621,"sku":"LP-E43-AW","price":831.57,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43423999459389,"sku":"LP-E43-AW","price":835.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42590506254397,"sku":"LP-E43-AB","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789182144573,"sku":"LP-E43-AB","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789182177341,"sku":"LP-E43-AB","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ Standard - 12' Lead","offer_id":42590506319933,"sku":"LP-E43-AB","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789182275645,"sku":"LP-E43-AB","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789182308413,"sku":"LP-E43-AB","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet \/ Standard - 12' Lead","offer_id":43423999492157,"sku":"LP-E43-AB","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43423999524925,"sku":"LP-E43-AB","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43423999557693,"sku":"LP-E43-AB","price":880.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ Standard - 12' Lead","offer_id":42996859469885,"sku":"LP-E43-AG","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42996859502653,"sku":"LP-E43-AG","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42996859535421,"sku":"LP-E43-AG","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ Standard - 12' Lead","offer_id":42996859666493,"sku":"LP-E43-AG","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42996859699261,"sku":"LP-E43-AG","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42996859732029,"sku":"LP-E43-AG","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet \/ Standard - 12' Lead","offer_id":43423999590461,"sku":"LP-E43-AG","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43423999623229,"sku":"LP-E43-AG","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Green \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43423999655997,"sku":"LP-E43-AG","price":880.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ Standard - 12' Lead","offer_id":43482685046845,"sku":"LP-E43-AR","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43482685079613,"sku":"LP-E43-AR","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43482685112381,"sku":"LP-E43-AR","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ Standard - 12' Lead","offer_id":43482685145149,"sku":"LP-E43-AR","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":43482685177917,"sku":"LP-E43-AR","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":43482685210685,"sku":"LP-E43-AR","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet \/ Standard - 12' Lead","offer_id":43482685243453,"sku":"LP-E43-AR","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43482685276221,"sku":"LP-E43-AR","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43482685308989,"sku":"LP-E43-AR","price":880.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981129789,"sku":"LP-E43-AW","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789182341181,"sku":"LP-E43-AW","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789182373949,"sku":"LP-E43-AW","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981195325,"sku":"LP-E43-AW","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789182472253,"sku":"LP-E43-AW","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789182505021,"sku":"LP-E43-AW","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet \/ Standard - 12' Lead","offer_id":43423999688765,"sku":"LP-E43-AW","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43423999721533,"sku":"LP-E43-AW","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43423999754301,"sku":"LP-E43-AW","price":880.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981228093,"sku":"LP-E43-BW","price":767.5,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789182537789,"sku":"LP-E43-BW","price":793.45,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789182570557,"sku":"LP-E43-BW","price":797.45,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981293629,"sku":"LP-E43-BW","price":792.5,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789182668861,"sku":"LP-E43-BW","price":818.45,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789182701629,"sku":"LP-E43-BW","price":822.45,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet \/ Standard - 12' Lead","offer_id":43423999787069,"sku":"LP-E43-BW","price":805.62,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43423999819837,"sku":"LP-E43-BW","price":831.57,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43423999852605,"sku":"LP-E43-BW","price":835.57,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":43118360100925,"sku":"LP-E43-BW","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43118360133693,"sku":"LP-E43-BW","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43118360166461,"sku":"LP-E43-BW","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack \/ Standard - 12' Lead","offer_id":43118360199229,"sku":"LP-E43-BW","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":43118360231997,"sku":"LP-E43-BW","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":43118360264765,"sku":"LP-E43-BW","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Magnet \/ Standard - 12' Lead","offer_id":43423999885373,"sku":"LP-E43-BW","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43423999918141,"sku":"LP-E43-BW","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43423999950909,"sku":"LP-E43-BW","price":880.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981424701,"sku":"LP-E43-RW","price":767.5,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789182734397,"sku":"LP-E43-RW","price":793.45,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789182767165,"sku":"LP-E43-RW","price":797.45,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981490237,"sku":"LP-E43-RW","price":792.5,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789182865469,"sku":"LP-E43-RW","price":818.45,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789182898237,"sku":"LP-E43-RW","price":822.45,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet \/ Standard - 12' Lead","offer_id":43423999983677,"sku":"LP-E43-RW","price":805.62,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43424000016445,"sku":"LP-E43-RW","price":831.57,"currency_code":"USD","in_stock":true},{"title":"Red \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43424000049213,"sku":"LP-E43-RW","price":835.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981326397,"sku":"LP-E43-RB","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789182931005,"sku":"LP-E43-RB","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789182963773,"sku":"LP-E43-RB","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981391933,"sku":"LP-E43-RB","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789183062077,"sku":"LP-E43-RB","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789183094845,"sku":"LP-E43-RB","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet \/ Standard - 12' Lead","offer_id":43424000081981,"sku":"LP-E43-RB","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43424000114749,"sku":"LP-E43-RB","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43424000147517,"sku":"LP-E43-RB","price":880.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981523005,"sku":"LP-E43-RW","price":812.5,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789183127613,"sku":"LP-E43-RW","price":838.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789183160381,"sku":"LP-E43-RW","price":842.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981588541,"sku":"LP-E43-RW","price":837.5,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789183258685,"sku":"LP-E43-RW","price":863.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789183291453,"sku":"LP-E43-RW","price":867.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet \/ Standard - 12' Lead","offer_id":43424000180285,"sku":"LP-E43-RW","price":850.62,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43424000213053,"sku":"LP-E43-RW","price":876.57,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43424000245821,"sku":"LP-E43-RW","price":880.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583981621309,"sku":"LP-E43-AW","price":767.5,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789183324221,"sku":"LP-E43-AW","price":793.45,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789183356989,"sku":"LP-E43-AW","price":797.45,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ Standard - 12' Lead","offer_id":42583981686845,"sku":"LP-E43-AW","price":792.5,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ 22' Total - (12' + 10' Extension)","offer_id":42789183455293,"sku":"LP-E43-AW","price":818.45,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack \/ 27' Total - (12' + 15' Extension)","offer_id":42789183488061,"sku":"LP-E43-AW","price":822.45,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet \/ Standard - 12' Lead","offer_id":43424000278589,"sku":"LP-E43-AW","price":805.62,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet \/ 22' Total - (12' + 10' Extension)","offer_id":43424000311357,"sku":"LP-E43-AW","price":831.57,"currency_code":"USD","in_stock":true},{"title":"White \/ Magnet \/ 27' Total - (12' + 15' Extension)","offer_id":43424000344125,"sku":"LP-E43-AW","price":835.57,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE43_Angled.png?v=1759162162"},{"product_id":"new-55-low-pro-emergency-light-bar","title":"55\" Low Pro Emergency Light Bar","description":"\u003c!-- LOWPRO INTERACTIVE PLAYER (test embed) --\u003e\n\u003cdiv id=\"lowpro-player-block\" style=\"margin:0 0 26px;\"\u003e\n\u003cdiv class=\"lowpro-cta\"\u003e\n\u003ch2 style=\"margin:0 0 4px;font-size:24px;line-height:1.25;\"\u003eTake the Controls: Try This Light Bar Live\u003c\/h2\u003e\n\u003cp style=\"margin:0 0 12px;font-size:15px;line-height:1.5;\"\u003ePick your colors, run the flash patterns, sweep the traffic advisor, and switch on the 360° Halo scene light, exactly like the controller in the box. Every module on a dual-color bar can show either color.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ciframe id=\"lowpro-player-frame\" class=\"lowpro-frame\" title=\"Low Pro Emergency Bar interactive demo\" style=\"width:100%;border:0;display:block;border-radius:16px;background:#0a0c0f;\" srcdoc='\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\"en\"\u0026gt;\n\u0026lt;head\u0026gt;\n\u0026lt;meta charset=\"UTF-8\"\u0026gt;\n\u0026lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u0026gt;\n\u0026lt;title\u0026gt;Black Oak LED · Low Pro Emergency Bar Interactive Demo\u0026lt;\/title\u0026gt;\n\u0026lt;style\u0026gt;\n  :root{\n    --bg:#0a0c0f; --panel:#111418; --panel2:#161a20; --edge:#242a33;\n    --txt:#e8ecf2; --dim:#8a94a3; --white-led:#F4F8FF; --navy:#0B1B2B; --accent:#C8892A;\n  }\n  *{box-sizing:border-box; -webkit-tap-highlight-color:transparent}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);\n    font-family:\"Segoe UI\",system-ui,-apple-system,Roboto,Arial,sans-serif;}\n  .wrap{max-width:1100px;margin:0 auto;padding:14px 16px 20px;}\n  header{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:6px}\n  .brand{font-weight:800;letter-spacing:.18em;font-size:19px;white-space:nowrap}\n  .brand span{color:var(--dim);font-weight:600}\n  .sub{color:var(--dim);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase}\n  .stage{background:radial-gradient(ellipse at 50% 30%, #14181e 0%, #0b0d11 70%);\n    border:1px solid var(--edge);border-radius:14px;padding:6px 10px 2px;position:relative;overflow:hidden}\n  .stage svg{display:block;width:100%;height:auto}\n  .stageLabel{position:absolute;top:10px;left:14px;font-size:11px;letter-spacing:.14em;\n    color:#5b6470;text-transform:uppercase}\n  .haloBadge{position:absolute;top:10px;right:14px;display:none;align-items:center;gap:8px;\n    font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#dfe9f7;\n    background:rgba(70,90,120,.22);border:1px solid rgba(190,215,255,.35);\n    border-radius:999px;padding:5px 12px 5px 9px;backdrop-filter:blur(2px)}\n  .haloBadge .dot{width:8px;height:8px;border-radius:50%;background:#F4F8FF;\n    box-shadow:0 0 8px 2px rgba(220,235,255,.9);flex:none}\n  .haloBadge b{font-weight:700;color:#fff}\n  .haloBadge span{color:#9fb0c6;text-transform:none;letter-spacing:.02em}\n  @media(max-width:700px){.haloBadge span{display:none}}\n  .lower{display:grid;grid-template-columns:270px 1fr;gap:14px;margin-top:14px;align-items:stretch}\n  .compactSel{display:none}\n  @media(max-width:840px){\n    .stage{padding:8px 8px 4px}\n    .stageLabel{position:static;font-size:10px;margin:0 0 6px}\n    .haloBadge{position:static;font-size:10px;padding:4px 9px;margin:0 0 6px;width:max-content}\n    .wrap{padding:6px 6px 10px !important}\n    .lower{grid-template-columns:1fr;gap:10px}\n    .cardCtl{order:1}\n    .cardColors{order:2}\n    .cardColors .cRow,.cardColors .hint{display:none}\n    .cardColors.expanded .cRow{display:block}\n    .compactSel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n    .compactSel .sw{cursor:default}\n    .compactSel .sw:hover{transform:none}\n  }\n  .card{background:var(--panel);border:1px solid var(--edge);border-radius:14px;padding:14px}\n  .card h3{margin:0 0 10px;font-size:11.5px;letter-spacing:.16em;color:var(--dim);\n    text-transform:uppercase;font-weight:700}\n  .cRow{margin-bottom:12px}\n  .cRow .lbl{font-size:12px;color:var(--dim);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}\n  .swatches{display:flex;gap:8px;flex-wrap:wrap}\n  .sw{width:38px;height:30px;border-radius:7px;border:2px solid #2c333d;cursor:pointer;\n    position:relative;transition:transform .08s}\n  .sw:hover{transform:translateY(-1px)}\n  .sw.sel{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25),0 0 14px rgba(255,255,255,.15)}\n  .sw.none{background:repeating-linear-gradient(45deg,#1a1f26 0 6px,#12161b 6px 12px)}\n  .sw.none::after{content:\"OFF\";position:absolute;inset:0;display:flex;align-items:center;\n    justify-content:center;font-size:9px;color:#6b7480;font-weight:700;letter-spacing:.05em}\n  .swapBtn{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);border-radius:7px;\n    font-size:11px;padding:4px 9px;cursor:pointer;letter-spacing:.06em}\n  .swapBtn:hover{border-color:#4a5462}\n  .hint{font-size:11.5px;line-height:1.5;color:#6d7684;border-top:1px solid var(--edge);\n    padding-top:10px;margin-top:2px}\n  .hint b{color:#9aa4b2;font-weight:600}\n  .ctlWrap{display:flex;justify-content:center}\n  .ctlWrap svg{width:100%;max-width:560px;height:auto}\n  .kb{cursor:pointer}\n  .kb rect.face,.kb circle.face,.kb path.face{fill:#20242b;stroke:#0c0e11;stroke-width:1.5;transition:fill .1s}\n  .kb:hover rect.face,.kb:hover circle.face,.kb:hover path.face{fill:#2e3641}\n  @keyframes ringPulse{0%,100%{stroke-opacity:.9}50%{stroke-opacity:.12}}\n  .pulseRing{fill:none;stroke:#ffb43a;stroke-width:2.5;animation:ringPulse 1.8s ease-in-out infinite;pointer-events:none}\n  @keyframes hintPulse{0%,100%{opacity:.6}50%{opacity:1}}\n  .tryHint{display:flex;justify-content:center;margin:10px 0 0}\n  .tryHint span{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;\n    text-transform:uppercase;color:#ffcf7d;border:1px solid rgba(255,180,58,.45);border-radius:999px;\n    padding:6px 14px;animation:hintPulse 2.4s ease-in-out infinite;background:rgba(255,180,58,.07)}\n  .tryHint .dotLive{width:7px;height:7px;border-radius:50%;background:#ffb43a;\n    box-shadow:0 0 7px 2px rgba(255,180,58,.7);flex:none}\n  .kb.lit rect.face,.kb.lit circle.face,.kb.lit path.face{fill:#dfe7f5}\n  .kb.lit text{fill:#20242b;font-weight:600}\n  .kb:active rect.face,.kb:active circle.face,.kb:active path.face{fill:#aab6c9}\n  .kb.lit{filter:url(#btnGlow)}\n  .kb text{fill:#c7cdd6;font-size:11px;text-anchor:middle;pointer-events:none;user-select:none}\n  footer{margin-top:12px;color:#59626e;font-size:11px;letter-spacing:.04em;\n    display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}\n  footer a{color:#7d8794;text-decoration:none}\n\u0026lt;\/style\u0026gt;\n\u0026lt;\/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;div class=\"wrap\"\u0026gt;\n  \u0026lt;header\u0026gt;\n    \u0026lt;div class=\"brand\"\u0026gt;BLACK OAK \u0026lt;span\u0026gt;LED\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"sub\"\u0026gt;Low Pro\u0026amp;trade; Emergency Bar · Interactive Demo \u0026amp;bull; 55\u0026amp;Prime;\u0026lt;\/div\u0026gt;\n  \u0026lt;\/header\u0026gt;\n\n  \u0026lt;div class=\"stage\"\u0026gt;\n    \u0026lt;div class=\"stageLabel\" id=\"patternLabel\"\u0026gt;Pattern 1 · Single Flash\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"haloBadge\" id=\"haloBadge\"\u0026gt;\u0026lt;i class=\"dot\"\u0026gt;\u0026lt;\/i\u0026gt;\n      \u0026lt;b\u0026gt;360\u0026amp;deg; Halo\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;\u0026amp;nbsp;scene light \u0026amp;middot; runs with or without the flashers\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;svg id=\"barSvg\" viewBox=\"0 0 1000 240\" aria-label=\"Light bar simulation\"\u0026gt;\u0026lt;\/svg\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"tryHint\" id=\"tryHint\"\u0026gt;\u0026lt;span\u0026gt;\u0026lt;i class=\"dotLive\"\u0026gt;\u0026lt;\/i\u0026gt;Live demo \u0026amp;middot; try the controller buttons\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"lower\"\u0026gt;\n    \u0026lt;div class=\"card cardColors\" id=\"colorCard\"\u0026gt;\n      \u0026lt;h3\u0026gt;Select Colors\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"compactSel\" id=\"compactSel\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 1\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw1\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 2 (dual color)\u0026lt;\/span\u0026gt;\n          \u0026lt;button class=\"swapBtn\" id=\"swapBtn\" title=\"Swap Color 1 and Color 2\"\u0026gt;\u0026amp;#8646; Swap\u0026lt;\/button\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw2\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"hint\"\u0026gt;\n        Every LED module on the Low Pro can display \u0026lt;b\u0026gt;either\u0026lt;\/b\u0026gt; selected color:\n        pick two colors and each module switches between them.\n        The right-hand cluster runs the \u0026lt;b\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/b\u0026gt;, a Low Pro\n        exclusive: it floods the area around the vehicle with steady work light,\n        with or without the warning flashers running. Try the \u0026lt;b\u0026gt;White\u0026lt;\/b\u0026gt; button.\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"card cardCtl\"\u0026gt;\n      \u0026lt;h3\u0026gt;Controller · press the buttons\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"ctlWrap\"\u0026gt;\n        \u0026lt;svg id=\"ctl\" viewBox=\"0 0 560 300\" aria-label=\"Controller keypad\"\u0026gt;\u0026lt;\/svg\u0026gt;\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;footer\u0026gt;\n    \u0026lt;div\u0026gt;BLACK OAK LED · Navigate the Night.\u0026lt;\/div\u0026gt;\n    \u0026lt;div\u0026gt;Designed and engineered in Sarasota, Florida\u0026lt;\/div\u0026gt;\n  \u0026lt;\/footer\u0026gt;\n\u0026lt;\/div\u0026gt;\n\n\u0026lt;script\u0026gt;\n\"use strict\";\nconst LEDCOLORS = {\n  amber:{main:\"#ffb43a\", core:\"#ffe9b0\", glow:\"#ff9d00\", label:\"Amber\"},\n  white:{main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#cfe4ff\", label:\"White\"},\n  red:  {main:\"#ff2d23\", core:\"#ffb0a8\", glow:\"#ff1400\", label:\"Red\"},\n  blue: {main:\"#2a62ff\", core:\"#b8ccff\", glow:\"#0040ff\", label:\"Blue\"},\n  green:{main:\"#19d949\", core:\"#c2ffcf\", glow:\"#00c832\", label:\"Green\"}\n};\nconst HALO = {main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#dcebff\"};\n\nconst S = {\n  color1:\"amber\", color2:\"white\",\n  c1on:true, c2on:false,\n  zones:{front:true, back:true, left:true, right:true},\n  halo:{front:false, back:false, left:false, right:false},\n  pattern:1,\n  ta:null,\n  cruise:false, random:false, dim50:false, autoSensor:false,\n  indicatorOff:false, favorite:1,\n  randTimer:0, randPat:1\n};\n\nconst NS=\"http:\/\/www.w3.org\/2000\/svg\";\nconst bar = document.getElementById(\"barSvg\");\nconst modules = [];\n\nfunction el(name, attrs, parent){\n  const e=document.createElementNS(NS,name);\n  for(const k in attrs) e.setAttribute(k,attrs[k]);\n  if(parent) parent.appendChild(e);\n  return e;\n}\n\nfunction buildBar(){\n  const defs = el(\"defs\",{},bar);\n  const mkGlow=(id,dev)=\u0026gt;{\n    const f=el(\"filter\",{id, x:\"-80%\",y:\"-80%\",width:\"260%\",height:\"260%\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:dev, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  };\n  mkGlow(\"ledGlow\",4);\n  (()=\u0026gt;{\n    const f=el(\"filter\",{id:\"haloGlow\", filterUnits:\"userSpaceOnUse\",\n      x:\"-120\",y:\"-160\",width:\"1240\",height:\"560\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:11, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  })();\n\n  const G = el(\"g\",{},bar);\n  const haloLayer = el(\"g\",{opacity:\"0\"},G);\n  const sidePaths = {\n    front:\"M 150,62 L 850,62\",\n    back: \"M 150,178 L 850,178\",\n    left: \"M 150,62 L 75,95 L 75,145 L 150,178\",\n    right:\"M 850,62 L 925,95 L 925,145 L 850,178\"\n  };\n  const haloEls = {};\n  for(const z in sidePaths){\n    const g=el(\"g\",{filter:\"url(#haloGlow)\"},haloLayer);\n    [[10,.9],[26,.4],[52,.16],[88,.07]].forEach(([wd,op])=\u0026gt;{\n      el(\"path\",{d:sidePaths[z], stroke:\"#eef4ff\", \"stroke-width\":wd, \"stroke-opacity\":op,\n        fill:\"none\", \"stroke-linecap\":\"round\", \"stroke-linejoin\":\"round\"},g);\n    });\n    haloEls[z]=g;\n  }\n  for(const k in haloEls){ haloEls[k].setAttribute(\"visibility\",\"hidden\"); }\n  S._haloEls = haloEls; haloLayer.setAttribute(\"opacity\",\"1\");\n\n  const bodyPts = \"150,62 850,62 925,95 925,145 850,178 150,178 75,145 75,95\";\n  el(\"polygon\",{points:bodyPts, fill:\"#15181d\", stroke:\"#3a4149\", \"stroke-width\":3},G);\n  el(\"polygon\",{points:\"158,70 842,70 913,99 913,141 842,170 158,170 87,141 87,99\",\n    fill:\"#0e1114\", stroke:\"#22272e\",\"stroke-width\":1},G);\n  el(\"text\",{x:500,y:112,\"text-anchor\":\"middle\",fill:\"#c9d0d9\",\"font-size\":\"21\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"6\",\"font-family\":\"inherit\"},G).textContent=\"BLACK OAK\";\n  el(\"text\",{x:500,y:130,\"text-anchor\":\"middle\",fill:\"#4c545e\",\"font-size\":\"9\",\n    \"letter-spacing\":\"2\"},G).textContent=\"SAE W3-1 22\";\n  el(\"circle\",{cx:500,cy:148,r:5,fill:\"#20252b\",stroke:\"#3a4149\"},G);\n\n  const ledLayer = el(\"g\",{},G);\n  const N=12;\n  const w=53, h=12, gap=4.6;\n  const startX=155, span=690;\n  let order=0;\n  const addMod=(zone,x,y,rot,cx,cy)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x,y,width:w,height:h,rx:4, fill:\"#23282f\", stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:x-6,y:y-6,width:w+12,height:h+12,rx:9, fill:\"none\",opacity:0, filter:\"url(#ledGlow)\"},g);\n    modules.push({zone, lens, halo, idx:order++, px:x+w\/2});\n  };\n  const addRot=(zone,cx,cy,len,rot)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x:cx-len\/2,y:cy-h\/2,width:len,height:h,rx:4,\n      fill:\"#23282f\",stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:cx-len\/2-6,y:cy-h\/2-6,width:len+12,height:h+12,rx:9,\n      fill:\"none\",opacity:0,filter:\"url(#ledGlow)\"},g);\n    modules.push({zone,lens,halo,idx:modules.length,px:cx});\n  };\n  for(let i=0;i\u0026lt;N;i++){ const x=startX+i*(span\/N)+gap\/2; addMod(\"front\",x,52,0,0,0); }\n  addRot(\"right\",884,73,68,23.7);\n  addRot(\"right\",921,120,46,90);\n  addRot(\"right\",884,167,68,-23.7);\n  for(let i=N-1;i\u0026gt;=0;i--){ const x=startX+i*(span\/N)+gap\/2; addMod(\"back\",x,176,0,0,0); }\n  addRot(\"left\",116,167,68,23.7);\n  addRot(\"left\",79,120,46,90);\n  addRot(\"left\",116,73,68,-23.7);\n}\nbuildBar();\nconst NMOD = modules.length;\nconst frontMods = modules.filter(m=\u0026gt;m.zone===\"front\");\nconst backMods  = modules.filter(m=\u0026gt;m.zone===\"back\");\nconst halfSplit = m=\u0026gt;{\n  if(m.zone===\"left\") return \"L\";\n  if(m.zone===\"right\") return \"R\";\n  const list = m.zone===\"front\"?frontMods:backMods;\n  const pos = list.indexOf(m);\n  const leftSide = m.zone===\"front\" ? pos \u0026lt; list.length\/2 : pos \u0026gt;= list.length\/2;\n  return leftSide ? \"L\" : \"R\";\n};\nmodules.forEach(m=\u0026gt;m.side=halfSplit(m));\nconst PXMIN=Math.min(...modules.map(m=\u0026gt;m.px)), PXMAX=Math.max(...modules.map(m=\u0026gt;m.px));\n\nfunction pulse(t, cycle, n){\n  const ph = t % cycle;\n  if(n===1) return ph \u0026lt; 168;\n  const sub = cycle\u0026gt;=800 ? 84 : (n===2 ? 83 : 67);\n  const onw = cycle\u0026gt;=800 ? 67 : 50;\n  if(ph \u0026gt;= n*sub) return false;\n  return (ph % sub) \u0026lt; onw;\n}\nfunction burst(local, half, n){\n  const sub = Math.min(half\u0026gt;=400 ? 84 : 67, half\/n);\n  if(local \u0026gt;= n*sub) return false;\n  return (local % sub) \u0026lt; sub*.75;\n}\nconst PATTERNS = {\n  1:{name:\"Single Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,1)},\n  2:{name:\"Double Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,2)},\n  3:{name:\"Triple Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,3)},\n  4:{name:\"Quintuple Flash\", cyc:800, f:(t,c)=\u0026gt;pulse(t,c,5)},\n  5:{name:\"Slow Single Flash\",cyc:800,f:(t,c)=\u0026gt;(t%c) \u0026lt; 434},\n  6:{name:\"Two Adjacent Groups Alternate\", cyc:400, group:true},\n  7:{name:\"Left \/ Right 3-Flash Alternate\", cyc:400, lr:3},\n  8:{name:\"Left \/ Right 5-Flash Alternate\", cyc:800, lr:5},\n  9:{name:\"Counterclockwise Rotation\", cyc:1400, rot:-1},\n  10:{name:\"Clockwise Rotation\",       cyc:1400, rot:1},\n  11:{name:\"Left Steady + Right Quintuple\", cyc:800, steady:\"L\"},\n  12:{name:\"Right Steady + Left Quintuple\", cyc:800, steady:\"R\"}\n};\n\nfunction moduleState(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const single = (S.c1on?1:0)+(S.c2on\u0026amp;\u0026amp;S.color2?1:0)===1;\n  if(!dual \u0026amp;\u0026amp; !single) return null;\n  const cA = S.c1on ? S.color1 : S.color2;\n  const P = PATTERNS[S.pattern];\n  const cyc = P.cyc;\n\n  if(S.cruise){\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:.7};\n  }\n\n  let phaseColor = cA;\n  let tt = t;\n  if(dual){\n    const period = cyc*2;\n    const first = (t % period) \u0026lt; cyc;\n    phaseColor = first ? S.color1 : S.color2;\n    tt = t % cyc;\n  }\n\n  if(P.rot){\n    const pos = (t % cyc)\/cyc;\n    const head = P.rot===1 ? pos : 1-pos;\n    const center = head*NMOD;\n    let d = Math.abs(m.idx - center);\n    d = Math.min(d, NMOD-d);\n    if(d \u0026gt; 3.2) return null;\n    const col = dual ? (Math.floor(t\/cyc)%2? S.color2 : S.color1) : cA;\n    return {color:col, intensity: 1 - d\/3.6};\n  }\n  if(P.lr){\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    const mineFirst = m.side===\"L\";\n    if(firstHalf!==mineFirst) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, P.lr)) return null;\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:1};\n  }\n  if(P.group){\n    const g = Math.floor(m.idx\/2)%2;\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    if((g===0)!==firstHalf) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, 3)) return null;\n    const col = dual ? (g===0?S.color1:S.color2) : phaseColor;\n    return {color:col, intensity:1};\n  }\n  if(P.steady){\n    const steadySide = P.steady;\n    if(m.side===steadySide){\n      const col = dual ? S.color1 : cA;\n      return {color:col, intensity:.4};\n    }\n    if(!pulse(tt,cyc,5)) return null;\n    const col = dual ? S.color2 : cA;\n    return {color:col, intensity:1};\n  }\n  if(!P.f(tt,cyc)) return null;\n  if(dual){\n    if(S.pattern===2||S.pattern===3){\n      const flip = S.pattern===3;\n      const c1side = flip? \"R\":\"L\";\n      return {color: m.side===c1side? S.color1:S.color2, intensity:1};\n    }\n    return {color:phaseColor, intensity:1};\n  }\n  return {color:cA, intensity:1};\n}\n\nfunction taSweep(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const T = 1600;\n  const pass = Math.floor(t\/T) % (dual?2:1);\n  const col = dual ? (pass===0 ? S.color1 : S.color2)\n                   : (S.c1on ? S.color1 : (S.color2||S.color1));\n  const ph=(t%T)\/T;\n  let build;\n  if(ph\u0026lt;.65) build = ph\/.65;\n  else if(ph\u0026lt;.8) build = 1;\n  else return null;\n  const p = (m.px-PXMIN)\/(PXMAX-PXMIN);\n  const e = .002;\n  let on=false;\n  if(S.ta===\"right\")      on = p \u0026lt;= build+e;\n  else if(S.ta===\"left\")  on = (1-p) \u0026lt;= build+e;\n  else                    on = Math.abs(p-0.5) \u0026lt;= build*0.5+e;\n  return on? {color:col,intensity:1} : null;\n}\n\nlet lastPatternShown=-1;\nfunction render(t){\n  const dimMul = S.dim50? .45 : 1;\n  if(S.random \u0026amp;\u0026amp; t-S.randTimer\u0026gt;4000){\n    S.randTimer=t; S.pattern = 1+Math.floor(Math.random()*12); syncUI();\n  }\n  const warnOn = (S.c1on || (S.c2on\u0026amp;\u0026amp;S.color2));\n  for(const m of modules){\n    let st;\n    if(S.ta) st = taSweep(m,t);\n    else if(warnOn \u0026amp;\u0026amp; S.zones[m.zone]) st = moduleState(m,t);\n    else st = null;\n    m.cur = st;\n    if(st){ m.lastT=t; m.lastC=st.color; m.lastK=st.intensity; }\n    let drawC=null, drawK=0;\n    if(st){ drawC=st.color; drawK=st.intensity; }\n    else if(m.lastC \u0026amp;\u0026amp; (t-m.lastT)\u0026lt;70){ drawC=m.lastC; drawK=m.lastK*(1-(t-m.lastT)\/70)*.7; }\n    if(drawC){\n      const c=LEDCOLORS[drawC];\n      const k=drawK*dimMul;\n      m.lens.setAttribute(\"fill\", k\u0026gt;.55? c.core : c.main);\n      m.lens.setAttribute(\"stroke\", c.main);\n      m.halo.setAttribute(\"fill\", c.glow);\n      m.halo.setAttribute(\"opacity\", (0.85*k).toFixed(2));\n    }else{\n      m.lens.setAttribute(\"fill\",\"#23282f\");\n      m.lens.setAttribute(\"stroke\",\"#10131a\");\n      m.halo.setAttribute(\"opacity\",\"0\");\n    }\n  }\n  for(const z in S._haloEls){\n    S._haloEls[z].setAttribute(\"visibility\", S.halo[z]? \"visible\":\"hidden\");\n    S._haloEls[z].setAttribute(\"opacity\", (.85*dimMul).toFixed(2));\n  }\n  if(S._dots){\n    const RED=\"#ff2622\", OFF=\"#1c2026\";\n    for(const row of [\"front\",\"back\"]){\n      const src = row===\"front\"? frontMods : backMods.slice().reverse();\n      S._dots[row].forEach((dot,i)=\u0026gt;{\n        if(S.indicatorOff){ dot.setAttribute(\"fill\",OFF); return; }\n        const m = src[Math.round(i*(src.length-1)\/(S._dots[row].length-1))];\n        dot.setAttribute(\"fill\", m.cur? RED : OFF);\n      });\n    }\n    const zoneLit = z =\u0026gt; modules.some(m=\u0026gt;m.zone===z \u0026amp;\u0026amp; m.cur);\n    S._dotL.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"left\"))?  RED : OFF);\n    S._dotR.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"right\"))? RED : OFF);\n  }\n  if(S.pattern!==lastPatternShown){ lastPatternShown=S.pattern; updateLabel(); }\n  requestAnimationFrame(render);\n}\n\nfunction updateLabel(){\n  const P=PATTERNS[S.pattern];\n  document.getElementById(\"patternLabel\").textContent =\n    `Pattern ${S.pattern} · ${P.name}` + (S.cruise? \"  •  Cruise\":\"\") + (S.ta\u0026amp;\u0026amp;!tourActive? `  •  Traffic Advisor ${S.ta}`:\"\");\n  drawDisplay();\n}\n\nconst ORDER=[\"amber\",\"white\",\"red\",\"blue\",\"green\"];\nfunction buildCompact(){\n  const c=document.getElementById(\"compactSel\");\n  c.innerHTML=\"\";\n  const mk=(col)=\u0026gt;{ const d=document.createElement(\"div\"); d.className=\"sw\";\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label; return d; };\n  const lab=document.createElement(\"span\");\n  lab.style.cssText=\"font-size:12px;color:#8a94a3\";\n  lab.textContent=\"Your colors:\";\n  c.appendChild(lab);\n  c.appendChild(mk(S.color1));\n  if(S.color2){ c.appendChild(mk(S.color2)); }\n  const btn=document.createElement(\"button\");\n  btn.className=\"swapBtn\";\n  const card=document.getElementById(\"colorCard\");\n  btn.textContent = card.classList.contains(\"expanded\") ? \"Done\" : \"Change colors\";\n  btn.onclick=()=\u0026gt;{ card.classList.toggle(\"expanded\"); buildCompact(); };\n  c.appendChild(btn);\n}\nfunction buildSwatches(){\n  buildCompact();\n  const s1=document.getElementById(\"sw1\"), s2=document.getElementById(\"sw2\");\n  s1.innerHTML=\"\"; s2.innerHTML=\"\";\n  for(const c of ORDER){\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color1===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color1=c; if(S.color2===c) S.color2=null; buildSwatches(); };\n    s1.appendChild(d);\n  }\n  const none=document.createElement(\"div\");\n  none.className=\"sw none\"+(S.color2===null?\" sel\":\"\");\n  none.title=\"Single color\"; none.onclick=()=\u0026gt;{S.color2=null; buildSwatches();};\n  s2.appendChild(none);\n  for(const c of ORDER){\n    if(c===S.color1) continue;\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color2===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color2=c; S.c2on=true; buildSwatches(); syncUI(); };\n    s2.appendChild(d);\n  }\n}\ndocument.getElementById(\"swapBtn\").onclick=()=\u0026gt;{\n  if(!S.color2) return;\n  [S.color1,S.color2]=[S.color2,S.color1]; buildSwatches();\n};\n\nconst ctl=document.getElementById(\"ctl\");\nconst buttons={};\nfunction buildController(){\n  const defs=el(\"defs\",{},ctl);\n  const f=el(\"filter\",{id:\"btnGlow\",x:\"-40%\",y:\"-40%\",width:\"180%\",height:\"180%\"},defs);\n  el(\"feGaussianBlur\",{stdDeviation:\"2.2\",result:\"b\"},f);\n  const mg=el(\"feMerge\",{},f);\n  el(\"feMergeNode\",{in:\"b\"},mg); el(\"feMergeNode\",{in:\"SourceGraphic\"},mg);\n\n  el(\"rect\",{x:2,y:2,width:556,height:296,rx:26,fill:\"#17191d\",stroke:\"#000\",\"stroke-width\":2},ctl);\n  el(\"rect\",{x:12,y:12,width:536,height:276,rx:20,fill:\"none\",stroke:\"#262a31\",\"stroke-width\":1.5},ctl);\n\n  const btn=(key,label,x,y,shape,w,h,fs)=\u0026gt;{\n    const g=el(\"g\",{class:\"kb\",tabindex:\"0\",role:\"button\",\"aria-label\":label.replace(\"\\n\",\" \")},ctl);\n    if(shape===\"circle\") el(\"circle\",{class:\"face\",cx:x,cy:y,r:w},g);\n    else if(shape===\"rect\") el(\"rect\",{class:\"face\",x:x-w\/2,y:y-h\/2,width:w,height:h,rx:8},g);\n    else el(\"path\",{class:\"face\",d:shape},g);\n    const lines=label.split(\"\\n\");\n    lines.forEach((ln,i)=\u0026gt;{\n      const tv = el(\"text\",{x:x, y:y+(i-(lines.length-1)\/2)*11+4, \"font-size\":fs||10.5},g);\n      tv.textContent=ln;\n    });\n    g.addEventListener(\"click\",()=\u0026gt;press(key));\n    g.addEventListener(\"keydown\",e=\u0026gt;{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();press(key);}});\n    buttons[key]={g};\n    return g;\n  };\n\n  const lx=88, ly=88;\n  btn(\"z_front\",\"Front\", lx,   ly-38,\"circle\",19);\n  btn(\"z_left\",\"Left\",   lx-52,ly,   \"circle\",19);\n  btn(\"z_all\",\"ALL\",     lx,   ly,   \"circle\",19);\n  btn(\"z_right\",\"Right\", lx+52,ly,   \"circle\",19);\n  btn(\"z_back\",\"Back\",   lx,   ly+38,\"circle\",19);\n\n  el(\"rect\",{x:170,y:34,width:220,height:64,rx:12,fill:\"#0a0c0e\",stroke:\"#26292f\"},ctl);\n  el(\"text\",{x:280,y:71,\"text-anchor\":\"middle\",fill:\"#b9c1cc\",\"font-size\":\"15\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"4\"},ctl).textContent=\"BLACK OAK\";\n  S._dots={front:[],back:[]};\n  for(let i=0;i\u0026lt;8;i++){\n    S._dots.front.push(el(\"circle\",{cx:198+i*24,cy:46,r:3.4,fill:\"#1c2026\"},ctl));\n    S._dots.back.push( el(\"circle\",{cx:198+i*24,cy:86,r:3.4,fill:\"#1c2026\"},ctl));\n  }\n  S._dotL = el(\"circle\",{cx:182,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n  S._dotR = el(\"circle\",{cx:382,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n\n  btn(\"ta_left\",\"Left\", 210,126,\"M186 126 L214 108 L226 108 L226 144 L214 144 Z\",0,0,9.5);\n  btn(\"ta_both\",\"Traffic\\nAdvisor\",272,126,\"M232 108 L308 108 L318 126 L308 144 L232 144 L242 126 Z\",0,0,9.5);\n  btn(\"ta_right\",\"Right\",330,126,\"M314 108 L326 108 L354 126 L326 144 L314 144 Z\",0,0,9.5);\n\n  const rx=470, ry=88;\n  btn(\"h_front\",\"Front\", rx,   ry-38,\"circle\",19);\n  btn(\"h_left\",\"Left\",   rx-52,ry,   \"circle\",19);\n  btn(\"h_white\",\"White\", rx,   ry,   \"circle\",19);\n  btn(\"h_right\",\"Right\", rx+52,ry,   \"circle\",19);\n  btn(\"h_back\",\"Back\",   rx,   ry+38,\"circle\",19);\n  el(\"text\",{x:rx,y:ry+68,\"text-anchor\":\"middle\",fill:\"#7f8b9c\",\"font-size\":\"9.5\",\n    \"font-weight\":\"700\",\"letter-spacing\":\"1.5\"},ctl).textContent=\"360° HALO\";\n  el(\"text\",{x:rx,y:ry+79,\"text-anchor\":\"middle\",fill:\"#59636f\",\"font-size\":\"8\",\n    \"letter-spacing\":\"1\"},ctl).textContent=\"SCENE LIGHT\";\n\n  btn(\"c1\",\"Color 1\\nON\/OFF\",   62,190,\"rect\",66,40,9.5);\n  btn(\"c2\",\"Color 2\\nON\/OFF\",  136,190,\"rect\",66,40,9.5);\n  btn(\"dim\",\"50%\",              62,244,\"rect\",66,34);\n  btn(\"auto\",\"Auto\\nSensor\",   136,244,\"rect\",66,40,9.5);\n\n  btn(\"last\",\"Last\\nPattern\",  228,218,\"rect\",62,44,9.5);\n  btn(\"next\",\"Next\\nPattern\",  298,218,\"rect\",62,44,9.5);\n  S._ring = el(\"rect\",{x:262,y:190,width:72,height:56,rx:12,class:\"pulseRing\"},ctl);\n\n  btn(\"ind\",\"Indicator\",       412,190,\"rect\",74,36,9.5);\n  btn(\"cruise\",\"Cruise\\nLight\",496,190,\"rect\",70,40,9.5);\n  btn(\"rand\",\"Random\",         412,244,\"rect\",74,36,9.5);\n  btn(\"fav\",\"Favorite\\nPattern\",496,244,\"rect\",70,40,9.5);\n}\nbuildController();\n\nfunction drawDisplay(){}\n\nlet favHold=null;\nfunction press(key){\n  markInteract();\n  switch(key){\n    case \"z_all\":{\n      const allOn=S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right;\n      const v=!allOn; S.zones={front:v,back:v,left:v,right:v}; break;}\n    case \"z_front\": S.zones.front=!S.zones.front; break;\n    case \"z_back\":  S.zones.back=!S.zones.back; break;\n    case \"z_left\":  S.zones.left=!S.zones.left; break;\n    case \"z_right\": S.zones.right=!S.zones.right; break;\n    case \"h_white\":{\n      const allOn=S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right;\n      const v=!allOn; S.halo={front:v,back:v,left:v,right:v}; break;}\n    case \"h_front\": S.halo.front=!S.halo.front; break;\n    case \"h_back\":  S.halo.back=!S.halo.back; break;\n    case \"h_left\":  S.halo.left=!S.halo.left; break;\n    case \"h_right\": S.halo.right=!S.halo.right; break;\n    case \"c1\": S.c1on=!S.c1on; break;\n    case \"c2\": if(S.color2) S.c2on=!S.c2on; break;\n    case \"next\": S.pattern=S.pattern%12+1; S.cruise=false; S.random=false; break;\n    case \"last\": S.pattern=(S.pattern+10)%12+1; S.cruise=false; S.random=false; break;\n    case \"cruise\": S.cruise=!S.cruise; if(S.cruise){S.random=false;} break;\n    case \"rand\": S.random=!S.random; if(S.random){S.cruise=false; S.randTimer=0;} break;\n    case \"dim\": S.dim50=!S.dim50; break;\n    case \"auto\": S.autoSensor=!S.autoSensor; break;\n    case \"ind\": S.indicatorOff=!S.indicatorOff; break;\n    case \"ta_left\":  S.ta = S.ta===\"left\"? null:\"left\"; break;\n    case \"ta_right\": S.ta = S.ta===\"right\"? null:\"right\"; break;\n    case \"ta_both\":  S.ta = S.ta===\"both\"? null:\"both\"; break;\n    case \"fav\": S.pattern=S.favorite; S.cruise=false; S.random=false; break;\n  }\n  updateLabel(); syncUI();\n}\n(function(){\n  const g=buttons[\"fav\"].g;\n  let t0=0;\n  g.addEventListener(\"pointerdown\",()=\u0026gt;{ t0=Date.now();\n    favHold=setTimeout(()=\u0026gt;{ S.favorite=S.pattern; flash(g); },1200); });\n  const clear=()=\u0026gt;{ if(favHold){clearTimeout(favHold); favHold=null;} };\n  g.addEventListener(\"pointerup\",clear); g.addEventListener(\"pointerleave\",clear);\n  function flash(el){ el.classList.add(\"lit\"); setTimeout(()=\u0026gt;syncUI(),400); }\n})();\n\nfunction syncUI(){\n  const setLit=(k,v)=\u0026gt;buttons[k].g.classList.toggle(\"lit\",!!v);\n  setLit(\"z_front\",S.zones.front); setLit(\"z_back\",S.zones.back);\n  setLit(\"z_left\",S.zones.left);   setLit(\"z_right\",S.zones.right);\n  setLit(\"z_all\",S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right);\n  setLit(\"h_front\",S.halo.front); setLit(\"h_back\",S.halo.back);\n  setLit(\"h_left\",S.halo.left);   setLit(\"h_right\",S.halo.right);\n  setLit(\"h_white\",S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right);\n  setLit(\"c1\",S.c1on); setLit(\"c2\",S.c2on\u0026amp;\u0026amp;!!S.color2);\n  setLit(\"cruise\",S.cruise); setLit(\"rand\",S.random);\n  setLit(\"dim\",S.dim50); setLit(\"auto\",S.autoSensor); setLit(\"ind\",S.indicatorOff);\n  setLit(\"ta_left\",S.ta===\"left\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_right\",S.ta===\"right\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_both\",S.ta===\"both\"\u0026amp;\u0026amp;!tourActive);\n  const haloOn = S.halo.front||S.halo.back||S.halo.left||S.halo.right;\n  document.getElementById(\"haloBadge\").style.display = haloOn? \"flex\":\"none\";\n  drawDisplay();\n}\n\n\/* default everywhere: dual-color amber\/white, steady burn; the attract sweep provides motion *\/\nS.c2on=true; S.cruise=true;\nS.interacted=false;\nlet tourActive=false, tourTimer=null, idleTimer=null;\nbuildSwatches(); syncUI(); updateLabel();\nrequestAnimationFrame(render);\n\n\/* ATTRACT MODE *\/\nfunction markInteract(){\n  if(S.interacted) return;\n  S.interacted=true;\n  if(tourActive){ tourActive=false; S.ta=null; }\n  clearTimeout(tourTimer); clearTimeout(idleTimer);\n  const h=document.getElementById(\"tryHint\");\n  if(h){ h.style.transition=\"opacity .5s\"; h.style.opacity=\"0\"; setTimeout(()=\u0026gt;h.remove(),600); }\n  if(S._ring) S._ring.remove();\n}\nfunction attractSweep(passes){\n  if(S.interacted || tourActive) return;\n  tourActive=true; S.ta=\"both\";\n  tourTimer=setTimeout(()=\u0026gt;{\n    if(tourActive){ tourActive=false; S.ta=null; }\n    scheduleIdle();\n  }, 1600*passes+400);\n}\nfunction scheduleIdle(){\n  if(S.interacted) return;\n  clearTimeout(idleTimer);\n  idleTimer=setTimeout(()=\u0026gt;attractSweep(1), 18000);\n}\ndocument.addEventListener(\"pointerdown\",e=\u0026gt;{\n  if(e.target.closest \u0026amp;\u0026amp; e.target.closest(\".sw,.swapBtn,.kb\")) markInteract();\n},true);\n(function(){\n  let fired=false;\n  const start=()=\u0026gt;{ if(!fired){ fired=true; setTimeout(()=\u0026gt;attractSweep(2), 600); } };\n  if(window.IntersectionObserver){\n    new IntersectionObserver((es,obs)=\u0026gt;{\n      if(es.some(e=\u0026gt;e.isIntersecting)){ start(); obs.disconnect(); }\n    },{threshold:.5}).observe(document.querySelector(\".stage\"));\n  } else start();\n})();\n\n(function(){\n  const embedded = (window!==parent);\n  if(embedded){\n    document.querySelector(\"header\").style.display=\"none\";\n    document.querySelector(\"footer\").style.display=\"none\";\n    if(window.innerWidth\u0026gt;840) document.querySelector(\".wrap\").style.padding=\"10px 12px 14px\";\n  }\n  const report=()=\u0026gt;{ try{\n    parent.postMessage({type:\"lowpro-player-height\",\n      height: document.querySelector(\".wrap\").scrollHeight+8}, \"*\");\n  }catch(e){} };\n  if(window.ResizeObserver) new ResizeObserver(report).observe(document.querySelector(\".wrap\"));\n  window.addEventListener(\"load\",report); window.addEventListener(\"pageshow\",report);\n  setTimeout(report,400); setTimeout(report,1500);\n  let n=0; const iv=setInterval(()=\u0026gt;{ report(); if(++n\u0026gt;10) clearInterval(iv); },1200);\n})();\n\u0026lt;\/script\u0026gt;\n\u0026lt;\/body\u0026gt;\n\u0026lt;\/html\u0026gt;\n'\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.lowpro-frame{height:700px}\n@media(max-width:840px){\n  .lowpro-cta{display:none}\n  .lowpro-frame{height:760px}\n}\n\u003c\/style\u003e\n\u003cscript\u003e\nwindow.addEventListener(\"message\",function(e){\n  if(e.data \u0026\u0026 e.data.type===\"lowpro-player-height\"){\n    var f=document.getElementById(\"lowpro-player-frame\");\n    if(f \u0026\u0026 e.data.height\u003e200) f.style.height=(e.data.height+4)+\"px\";\n  }\n});\n\u003c\/script\u003e\n\u003cdiv style=\"height:28px;\"\u003e \u003c\/div\u003e\n\u003cp\u003e\u003c!-- Intro Section --\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cstrong\u003eBuilt for emergency response teams and public safety professionals, this high-intensity LED warning light bar delivers uncompromising performance in a sleek, durable design.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003eThe Black Oak Low Pro Emergency Series Light Bar is engineered for maximum visibility, reliability, and user control. With ultra-bright LEDs, multiple flash patterns, and a rugged housing, this bar ensures your presence is known in any emergency situation, day or night, rain or shine.\u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003e \u003c\/p\u003e\n\u003cp data-end=\"1177\" data-start=\"808\"\u003eBuilt to withstand the demands of high-speed response, off-road utility, or work site visibility, this low-profile bar features a streamlined, aerodynamic frame and a universal mounting system to ensure easy installation on any vehicle. Whether you're outfitting a patrol car, fire unit, or utility truck, this bar delivers dependable performance where it matters most.\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003c!-- TRUST STRIP --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Screenshot_2026-07-21_at_9.31.14_AM.png?v=1784641940\" alt=\"SAE J845 Certified, SAE J595 Class 1, IP69K Waterproof, Lifetime Warranty, -40F to +145F Rated, 50,000 Hour LEDs\" style=\"width: 100%; display: block; border-radius: 10px;\"\u003e\u003c\/p\u003e\n\u003c!-- SIZE SELECTOR --\u003e\n\u003cdiv style=\"margin: 4px 0 2px;\"\u003e\n\u003cp style=\"margin: 0 0 8px; font-weight: 600; font-size: 15px;\"\u003eAvailable sizes:\u003c\/p\u003e\n\u003ca href=\"\/products\/11-mini-low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e11\"\u003c\/a\u003e \u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e17\"\u003c\/a\u003e \u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e30\"\u003c\/a\u003e \u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e43\"\u003c\/a\u003e \u003ca href=\"\/products\/low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e49\"\u003c\/a\u003e \u003cspan style=\"display: inline-block; background: #FFB300; color: #111; font-weight: bold; padding: 8px 14px; border-radius: 8px; margin: 0 6px 8px 0; font-size: 15px;\"\u003e55\"\u003c\/span\u003e \u003ca href=\"\/products\/new-61-low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e61\"\u003c\/a\u003e \u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\" style=\"display: inline-block; border: 2px solid #FFB300; color: #111; font-weight: bold; padding: 6px 12px; border-radius: 8px; margin: 0 6px 8px 0; text-decoration: none; font-size: 15px;\"\u003e68\"\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003c!-- Collapsable Sections --\u003e\n\u003cstyle\u003e\n#MainContent details {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 16px;\n  overflow: hidden;\n  background: #fff;\n  font-family: Arial, sans-serif;\n}\n\n#MainContent details summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  padding: 14px 18px;\n  font-weight: 600;\n  font-size: 18px;\n  list-style: none;\n  background-color: #f9f9f9;\n  border-bottom: 1px solid #e0e0e0;\n  position: relative;\n}\n\n#MainContent details[open] summary {\n  background-color: #f1f1f1;\n}\n\n#MainContent details summary::after {\n  content: '+';\n  font-size: 20px;\n  font-weight: bold;\n  transition: transform 0.3s ease;\n}\n\n#MainContent details[open] summary::after {\n  content: '−';\n}\n\n#MainContent details .content {\n  padding: 16px 20px;\n  font-size: 16px;\n  line-height: 1.6;\n}\n\u003c\/style\u003e\n\u003cdetails\u003e\n\u003csummary\u003eFeatures\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003eLifetime Warranty\u003c\/li\u003e\n\u003cli\u003eSAE J845 Class 1 Certified\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e360° visibility with dual-color ultra-bright LEDs\u003c\/li\u003e\n\u003cli\u003eSlim Low Profile design\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 flash patterns with memory recall\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eRugged, waterproof housing (IP69K rated)\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eIntegrated controller with pattern cycling, cruise mode, and cut-off\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIn the Box\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cb\u003eLow Pro Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eController\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWiring\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Brackets\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- COMPLIANCE SECTION --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCompliance \u0026amp; Certifications\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cp\u003e\u003cstrong\u003eMeets the standards your department requires.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"3\"\u003eCertification \u0026amp; Compliance\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J845\u003c\/th\u003e\n\u003ctd\u003e360° warning lamp photometric standard for light bars and beacons\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J595 Class 1\u003c\/th\u003e\n\u003ctd\u003eHighest intensity class — approved for primary emergency vehicles (police, fire, EMS)\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIP69K\u003c\/th\u003e\n\u003ctd\u003eSealed against high-pressure washdown, salt, dust, and submersion\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRated\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Range\u003c\/th\u003e\n\u003ctd\u003eExtreme-climate duty\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e-40°F to +145°F\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDuty Life\u003c\/th\u003e\n\u003ctd\u003eContinuous-duty LED modules\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50,000 hours\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"font-size: 13px; color: #666;\"\u003e\u003cem\u003eWarning-equipment regulations vary by state and jurisdiction. Verify color and mounting requirements with your local authority. Spec sheet PDF and certification documentation available on request for procurement offices.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- Image + Text Alternating Section --\u003e\n\u003cstyle\u003e\n.text-image-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 20px;\n}\n.text-image-wrap.text-image-right {\n  flex-direction: row-reverse;\n}\n.text-image-wrap .image-wrap {\n  flex: 1;\n  max-width: 500px;\n}\n.text-image-wrap .image-wrap img {\n  width: 100%;\n  height: auto;\n  max-height: 300px; \n  display: block;\n  object-fit: contain; \n}\n.text-image-wrap .text-wrap {\n  flex: 1;\n  min-width: 300px;\n}\n\u003c\/style\u003e\n\u003c!-- Image Right - Text Left Section --\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/255283_7703341170749_330031d5_da20_475f_887e_f1269d2ad248_1.jpg?v=1763495670\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eEmergency Bar + Work Light\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eGet full 360° white-light illumination at the touch of a button. Perfect for reverse lighting, scene lighting, or any situation where you need powerful all-around visibility. It’s a true dual-purpose feature you won’t find on most emergency bars — and it comes standard on every one of ours.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_SAE_graphics.jpg?v=1758041472\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eBuilt Tough for Any Environment\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eIP69K-rated waterproof housing and reinforced aluminum construction stand up to rain, snow, mud, and dust—ideal for police, fire, tow, or off-road response vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00223.jpg?v=1754512314\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e Full 360° Warning Visibility\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003ePacked with high-output dual-color LEDs and side modules, this bar delivers all-angle visibility—ensuring you're seen from every direction, even in chaotic scenes or inclement weather.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Driver_Side_Angle.jpg?v=1761226035\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSlim, Low-Profile Design\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eEngineered to minimize wind resistance and visual bulk, this light bar features a sleek, aerodynamic frame that hugs your vehicle’s roofline. The low-profile housing not only enhances fuel efficiency but also delivers a clean, professional look without compromising brightness or performance.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\n\u003cp\u003e\u003cvideo width=\"100%\" height=\"auto\" muted=\"\" autoplay=\"autoplay\" loop=\"loop\" playsinline=\"\" controls=\"controls\"\u003e\n    \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4ec9ce848f5e4d2d8083da9daf4dbe78.mp4\" type=\"video\/mp4\"\u003e\n    Your browser does not support the video tag.\n  \u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 Flash Patterns with Smart Memory\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eChoose from up to 45 user-selectable flash patterns to fit any scenario. Built-in memory recall stores your last used setting for consistent deployment every time.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_-_Sliding_Feet.gif?v=1758730578\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSliding Feet\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eOur sliding feet mounts are designed to give you maximum flexibility during installation. By allowing the brackets to slide along the base of the light bar, you can easily adjust spacing to match a wide variety of mounting points. This ensures a precise fit whether you’re working with factory holes, custom setups, or uneven surfaces.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HERO BANNER --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/d8j0ntlcm91z4.cloudfront.net\/user_3G9nKxyaQsdrPdDsxWr4EcSl5FL\/hf_20260715_201038_0803a0cd-07a6-4508-9c7a-50d0230a94e3.png\" alt=\"Built to Code. Backed for Life. SAE J845 and J595 Class 1 compliant, IP69K sealed, lifetime warranty\" style=\"width: 100%; display: block; border-radius: 10px;\"\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003c!-- FLEET BLOCK --\u003e\n\u003cdiv style=\"padding: 8px 0; margin: 0 0 8px;\"\u003e\n\u003ch3 style=\"margin: 0 0 8px;\"\u003eOutfitting a Fleet?\u003c\/h3\u003e\n\u003cp style=\"margin: 0 0 14px; font-size: 16px; line-height: 1.6;\"\u003eVolume pricing on 5+ units, department POs accepted, W-9 on file, and spec sheets ready for your procurement office. From single patrol vehicles to full county fleets.\u003c\/p\u003e\n\u003ca href=\"\/pages\/fleet-pricing\" style=\"display: inline-block; background: #FFB300; color: #111; font-weight: bold; padding: 12px 22px; border-radius: 8px; text-decoration: none;\"\u003eRequest Fleet Pricing\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Dimension --\u003e\u003c!-- Specs --\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003c!-- Specs Chart --\u003e\n\u003cstyle\u003e\n  table.spec-table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    font-size: 15px;\n  }\n  table.spec-table th, table.spec-table td {\n    border: 1px solid #ccc;\n    padding: 10px;\n    text-align: left;\n  }\n  table.spec-table th {\n    background-color: #f7f7f7;\n    font-weight: 600;\n    width: 30%;\n  }\n  table.spec-table tr:hover {\n    background-color: #f2f2f2;\n  }\n  table.spec-table thead th {\n    background-color: #222;\n    color: #fff;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    text-align: center;\n  }\n\u003c\/style\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003ePower \u0026amp; Performance\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Wattage\u003c\/th\u003e\n\u003ctd\u003e456\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e35\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10-30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRaw Lumens\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Chip\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam Pattern\u003c\/th\u003e\n\u003ctd\u003eWide Angle\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertificate\u003c\/th\u003e\n\u003ctd\u003eSAE J845 \u0026amp; SAE J595 Class 1\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Single Color\u003c\/th\u003e\n\u003ctd\u003e15\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Dual Color\u003c\/th\u003e\n\u003ctd\u003e45 (15 Color 1 \/ 15 Color 2 \/ 15 Combo)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eDurability \u0026amp; Lifespan\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 Hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F\u003cbr\u003e-40° to 62° C\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited Lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30 Day Money Back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eWiring \u0026amp; Installation\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eCord Length From Light\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Included?\u003c\/th\u003e\n\u003ctd\u003eYes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector Type\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHole Size for Controller\u003c\/th\u003e\n\u003ctd\u003e\u003cbr\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting Bolt Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eGeneral\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e18.9 Lbs\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E55-\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c!-- FAQ --\u003e\n\u003ch5\u003eDimensions\u003c\/h5\u003e\n\u003cp\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/55_Inch_Low_Pro_Dimensions.png?v=1779800831\"\u003e\u003c\/p\u003e\n\u003ch5\u003eVideo\u003c\/h5\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cvideo style=\"max-width: 100%; height: auto;\" controls=\"controls\" playsinline=\"\" loop=\"loop\" muted=\"\" autoplay=\"autoplay\"\u003e\n  \u003csource type=\"video\/mp4\" src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/f7ecf4030812467bbb46b165c21da48e.mov\"\u003e\n  Your browser does not support the video tag.\n\u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cp\u003e\u003cstrong\u003eWhat voltage and control systems does this light bar support?\u003c\/strong\u003e\u003cbr\u003eThis light bar operates on a 12 V–24 V DC power system and can be used with either push-button or wireless controllers. It’s compatible with standard vehicle electrical systems, making installation straightforward for both fleet and individual applications.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow durable is this light bar in harsh environments?\u003c\/strong\u003e\u003cbr\u003eThe Low Pro Emergency Light Bar is built with a rugged aluminum housing, sealed to an IP69K rating and tested to resist corrosion, vibration, and high-pressure water ingress. It’s designed for demanding conditions—whether roadside, rescue, or commercial use—so you can rely on consistent performance when it counts.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat beam patterns and flash modes are included?\u003c\/strong\u003e\u003cbr\u003eUp to 45 flash patterns are built into the unit—including warning, hazard, and full-output flasher modes—with memory recall so your last setting is retained even after power loss. You’ll also find low-profile steady-burn mode useful for scene lighting and standby operations.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs the light bar legal for use on public roads and emergency vehicles?\u003c\/strong\u003e\u003cbr\u003eYes. The unit meets SAE J595 Class 1 and other relevant emergency lighting standards for warning applications. However, regulations vary by jurisdiction, so we recommend checking your local laws before installation to ensure compliance with mounting height, color, and flash pattern requirements.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat’s covered by the warranty?\u003c\/strong\u003e\u003cbr\u003eOur industry-leading lifetime warranty covers manufacturing defects, driver failures, and LED module performance. It does not cover damage caused by improper installation, extreme overuse beyond defined duty cycles, or wiring issues. For full warranty terms, please refer to our Warranty \u0026amp; Returns page.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Amber \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583995580477,"sku":"LP-E55-AW","price":1121.25,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789102649405,"sku":"LP-E55-AW","price":1147.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789102682173,"sku":"LP-E55-AW","price":1151.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583995646013,"sku":"LP-E55-AW","price":1171.25,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789102714941,"sku":"LP-E55-AW","price":1197.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789102747709,"sku":"LP-E55-AW","price":1201.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":43067200110653,"sku":"LP-E55-AB","price":1221.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43067200143421,"sku":"LP-E55-AB","price":1247.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43067200176189,"sku":"LP-E55-AB","price":1251.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":43067200208957,"sku":"LP-E55-AB","price":1271.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":43067200241725,"sku":"LP-E55-AB","price":1297.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":43067200274493,"sku":"LP-E55-AB","price":1301.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583995678781,"sku":"LP-E55-AW","price":1221.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789102780477,"sku":"LP-E55-AW","price":1247.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789102813245,"sku":"LP-E55-AW","price":1251.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583995744317,"sku":"LP-E55-AW","price":1271.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789102846013,"sku":"LP-E55-AW","price":1297.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789102878781,"sku":"LP-E55-AW","price":1301.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42590485741629,"sku":"LP-E55-AW-T","price":1246.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789102911549,"sku":"LP-E55-AW-T","price":1272.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789102944317,"sku":"LP-E55-AW-T","price":1276.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42590485774397,"sku":"LP-E55-AW-T","price":1296.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789102977085,"sku":"LP-E55-AW-T","price":1322.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103009853,"sku":"LP-E55-AW-T","price":1326.2,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583995777085,"sku":"LP-E55-BW","price":1121.25,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103042621,"sku":"LP-E55-BW","price":1147.2,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103075389,"sku":"LP-E55-BW","price":1151.2,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583995842621,"sku":"LP-E55-BW","price":1171.25,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103108157,"sku":"LP-E55-BW","price":1197.2,"currency_code":"USD","in_stock":true},{"title":"Blue \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103140925,"sku":"LP-E55-BW","price":1201.2,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":43118371078205,"sku":"LP-E55-BW","price":1221.25,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43118371110973,"sku":"LP-E55-BW","price":1247.2,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43118371143741,"sku":"LP-E55-BW","price":1251.2,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":43118371176509,"sku":"LP-E55-BW","price":1271.25,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":43118371209277,"sku":"LP-E55-BW","price":1297.2,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":43118371242045,"sku":"LP-E55-BW","price":1301.2,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583995973693,"sku":"LP-E55-RW","price":1121.25,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103173693,"sku":"LP-E55-RW","price":1147.2,"currency_code":"USD","in_stock":true},{"title":"Red \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103206461,"sku":"LP-E55-RW","price":1151.2,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583996039229,"sku":"LP-E55-RW","price":1171.25,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103239229,"sku":"LP-E55-RW","price":1197.2,"currency_code":"USD","in_stock":true},{"title":"Red \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103271997,"sku":"LP-E55-RW","price":1201.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583995875389,"sku":"LP-E55-RB","price":1221.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103304765,"sku":"LP-E55-RB","price":1247.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103337533,"sku":"LP-E55-RB","price":1251.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583995940925,"sku":"LP-E55-RB","price":1271.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103370301,"sku":"LP-E55-RB","price":1297.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103403069,"sku":"LP-E55-RB","price":1301.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42590485872701,"sku":"LP-E55-RB-T","price":1246.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103435837,"sku":"LP-E55-RB-T","price":1272.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103468605,"sku":"LP-E55-RB-T","price":1276.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42590485905469,"sku":"LP-E55-RB-T","price":1296.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103501373,"sku":"LP-E55-RB-T","price":1322.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103534141,"sku":"LP-E55-RB-T","price":1326.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583996071997,"sku":"LP-E55-RW","price":1221.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103566909,"sku":"LP-E55-RW","price":1247.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103599677,"sku":"LP-E55-RW","price":1251.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583996137533,"sku":"LP-E55-RW","price":1271.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103632445,"sku":"LP-E55-RW","price":1297.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103665213,"sku":"LP-E55-RW","price":1301.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42590485807165,"sku":"LP-E55-RW-T","price":1246.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103697981,"sku":"LP-E55-RW-T","price":1272.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103730749,"sku":"LP-E55-RW-T","price":1276.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42590485839933,"sku":"LP-E55-RW-T","price":1296.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103763517,"sku":"LP-E55-RW-T","price":1322.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103796285,"sku":"LP-E55-RW-T","price":1326.2,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ Standard - 12' Lead","offer_id":42583996170301,"sku":"LP-E55-AW","price":1121.25,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42789103829053,"sku":"LP-E55-AW","price":1147.2,"currency_code":"USD","in_stock":true},{"title":"White \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42789103861821,"sku":"LP-E55-AW","price":1151.2,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42583996235837,"sku":"LP-E55-AW","price":1171.25,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42789103894589,"sku":"LP-E55-AW","price":1197.2,"currency_code":"USD","in_stock":true},{"title":"White \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42789103927357,"sku":"LP-E55-AW","price":1201.2,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00229_Edit.jpg?v=1757536386"},{"product_id":"new-61-low-pro-emergency-light-bar","title":"61\" Low Pro Emergency Light Bar","description":"\u003c!-- LOWPRO INTERACTIVE PLAYER (test embed) --\u003e\n\u003cdiv id=\"lowpro-player-block\" style=\"margin:0 0 26px;\"\u003e\n\u003cdiv class=\"lowpro-cta\"\u003e\n\u003ch2 style=\"margin:0 0 4px;font-size:24px;line-height:1.25;\"\u003eTake the Controls: Try This Light Bar Live\u003c\/h2\u003e\n\u003cp style=\"margin:0 0 12px;font-size:15px;line-height:1.5;\"\u003ePick your colors, run the flash patterns, sweep the traffic advisor, and switch on the 360° Halo scene light, exactly like the controller in the box. Every module on a dual-color bar can show either color.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003ciframe id=\"lowpro-player-frame\" class=\"lowpro-frame\" title=\"Low Pro Emergency Bar interactive demo\" style=\"width:100%;border:0;display:block;border-radius:16px;background:#0a0c0f;\" srcdoc='\u0026lt;!DOCTYPE html\u0026gt;\n\u0026lt;html lang=\"en\"\u0026gt;\n\u0026lt;head\u0026gt;\n\u0026lt;meta charset=\"UTF-8\"\u0026gt;\n\u0026lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u0026gt;\n\u0026lt;title\u0026gt;Black Oak LED · Low Pro Emergency Bar Interactive Demo\u0026lt;\/title\u0026gt;\n\u0026lt;style\u0026gt;\n  :root{\n    --bg:#0a0c0f; --panel:#111418; --panel2:#161a20; --edge:#242a33;\n    --txt:#e8ecf2; --dim:#8a94a3; --white-led:#F4F8FF; --navy:#0B1B2B; --accent:#C8892A;\n  }\n  *{box-sizing:border-box; -webkit-tap-highlight-color:transparent}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--txt);\n    font-family:\"Segoe UI\",system-ui,-apple-system,Roboto,Arial,sans-serif;}\n  .wrap{max-width:1100px;margin:0 auto;padding:14px 16px 20px;}\n  header{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:6px}\n  .brand{font-weight:800;letter-spacing:.18em;font-size:19px;white-space:nowrap}\n  .brand span{color:var(--dim);font-weight:600}\n  .sub{color:var(--dim);font-size:12.5px;letter-spacing:.08em;text-transform:uppercase}\n  .stage{background:radial-gradient(ellipse at 50% 30%, #14181e 0%, #0b0d11 70%);\n    border:1px solid var(--edge);border-radius:14px;padding:6px 10px 2px;position:relative;overflow:hidden}\n  .stage svg{display:block;width:100%;height:auto}\n  .stageLabel{position:absolute;top:10px;left:14px;font-size:11px;letter-spacing:.14em;\n    color:#5b6470;text-transform:uppercase}\n  .haloBadge{position:absolute;top:10px;right:14px;display:none;align-items:center;gap:8px;\n    font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#dfe9f7;\n    background:rgba(70,90,120,.22);border:1px solid rgba(190,215,255,.35);\n    border-radius:999px;padding:5px 12px 5px 9px;backdrop-filter:blur(2px)}\n  .haloBadge .dot{width:8px;height:8px;border-radius:50%;background:#F4F8FF;\n    box-shadow:0 0 8px 2px rgba(220,235,255,.9);flex:none}\n  .haloBadge b{font-weight:700;color:#fff}\n  .haloBadge span{color:#9fb0c6;text-transform:none;letter-spacing:.02em}\n  @media(max-width:700px){.haloBadge span{display:none}}\n  .lower{display:grid;grid-template-columns:270px 1fr;gap:14px;margin-top:14px;align-items:stretch}\n  .compactSel{display:none}\n  @media(max-width:840px){\n    .stage{padding:8px 8px 4px}\n    .stageLabel{position:static;font-size:10px;margin:0 0 6px}\n    .haloBadge{position:static;font-size:10px;padding:4px 9px;margin:0 0 6px;width:max-content}\n    .wrap{padding:6px 6px 10px !important}\n    .lower{grid-template-columns:1fr;gap:10px}\n    .cardCtl{order:1}\n    .cardColors{order:2}\n    .cardColors .cRow,.cardColors .hint{display:none}\n    .cardColors.expanded .cRow{display:block}\n    .compactSel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}\n    .compactSel .sw{cursor:default}\n    .compactSel .sw:hover{transform:none}\n  }\n  .card{background:var(--panel);border:1px solid var(--edge);border-radius:14px;padding:14px}\n  .card h3{margin:0 0 10px;font-size:11.5px;letter-spacing:.16em;color:var(--dim);\n    text-transform:uppercase;font-weight:700}\n  .cRow{margin-bottom:12px}\n  .cRow .lbl{font-size:12px;color:var(--dim);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}\n  .swatches{display:flex;gap:8px;flex-wrap:wrap}\n  .sw{width:38px;height:30px;border-radius:7px;border:2px solid #2c333d;cursor:pointer;\n    position:relative;transition:transform .08s}\n  .sw:hover{transform:translateY(-1px)}\n  .sw.sel{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25),0 0 14px rgba(255,255,255,.15)}\n  .sw.none{background:repeating-linear-gradient(45deg,#1a1f26 0 6px,#12161b 6px 12px)}\n  .sw.none::after{content:\"OFF\";position:absolute;inset:0;display:flex;align-items:center;\n    justify-content:center;font-size:9px;color:#6b7480;font-weight:700;letter-spacing:.05em}\n  .swapBtn{background:var(--panel2);border:1px solid #2c333d;color:var(--txt);border-radius:7px;\n    font-size:11px;padding:4px 9px;cursor:pointer;letter-spacing:.06em}\n  .swapBtn:hover{border-color:#4a5462}\n  .hint{font-size:11.5px;line-height:1.5;color:#6d7684;border-top:1px solid var(--edge);\n    padding-top:10px;margin-top:2px}\n  .hint b{color:#9aa4b2;font-weight:600}\n  .ctlWrap{display:flex;justify-content:center}\n  .ctlWrap svg{width:100%;max-width:560px;height:auto}\n  .kb{cursor:pointer}\n  .kb rect.face,.kb circle.face,.kb path.face{fill:#20242b;stroke:#0c0e11;stroke-width:1.5;transition:fill .1s}\n  .kb:hover rect.face,.kb:hover circle.face,.kb:hover path.face{fill:#2e3641}\n  @keyframes ringPulse{0%,100%{stroke-opacity:.9}50%{stroke-opacity:.12}}\n  .pulseRing{fill:none;stroke:#ffb43a;stroke-width:2.5;animation:ringPulse 1.8s ease-in-out infinite;pointer-events:none}\n  @keyframes hintPulse{0%,100%{opacity:.6}50%{opacity:1}}\n  .tryHint{display:flex;justify-content:center;margin:10px 0 0}\n  .tryHint span{display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;\n    text-transform:uppercase;color:#ffcf7d;border:1px solid rgba(255,180,58,.45);border-radius:999px;\n    padding:6px 14px;animation:hintPulse 2.4s ease-in-out infinite;background:rgba(255,180,58,.07)}\n  .tryHint .dotLive{width:7px;height:7px;border-radius:50%;background:#ffb43a;\n    box-shadow:0 0 7px 2px rgba(255,180,58,.7);flex:none}\n  .kb.lit rect.face,.kb.lit circle.face,.kb.lit path.face{fill:#dfe7f5}\n  .kb.lit text{fill:#20242b;font-weight:600}\n  .kb:active rect.face,.kb:active circle.face,.kb:active path.face{fill:#aab6c9}\n  .kb.lit{filter:url(#btnGlow)}\n  .kb text{fill:#c7cdd6;font-size:11px;text-anchor:middle;pointer-events:none;user-select:none}\n  footer{margin-top:12px;color:#59626e;font-size:11px;letter-spacing:.04em;\n    display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px}\n  footer a{color:#7d8794;text-decoration:none}\n\u0026lt;\/style\u0026gt;\n\u0026lt;\/head\u0026gt;\n\u0026lt;body\u0026gt;\n\u0026lt;div class=\"wrap\"\u0026gt;\n  \u0026lt;header\u0026gt;\n    \u0026lt;div class=\"brand\"\u0026gt;BLACK OAK \u0026lt;span\u0026gt;LED\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"sub\"\u0026gt;Low Pro\u0026amp;trade; Emergency Bar · Interactive Demo \u0026amp;bull; 61\u0026amp;Prime;\u0026lt;\/div\u0026gt;\n  \u0026lt;\/header\u0026gt;\n\n  \u0026lt;div class=\"stage\"\u0026gt;\n    \u0026lt;div class=\"stageLabel\" id=\"patternLabel\"\u0026gt;Pattern 1 · Single Flash\u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"haloBadge\" id=\"haloBadge\"\u0026gt;\u0026lt;i class=\"dot\"\u0026gt;\u0026lt;\/i\u0026gt;\n      \u0026lt;b\u0026gt;360\u0026amp;deg; Halo\u0026lt;\/b\u0026gt;\u0026lt;span\u0026gt;\u0026amp;nbsp;scene light \u0026amp;middot; runs with or without the flashers\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n    \u0026lt;svg id=\"barSvg\" viewBox=\"0 0 1000 240\" aria-label=\"Light bar simulation\"\u0026gt;\u0026lt;\/svg\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"tryHint\" id=\"tryHint\"\u0026gt;\u0026lt;span\u0026gt;\u0026lt;i class=\"dotLive\"\u0026gt;\u0026lt;\/i\u0026gt;Live demo \u0026amp;middot; try the controller buttons\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n\n  \u0026lt;div class=\"lower\"\u0026gt;\n    \u0026lt;div class=\"card cardColors\" id=\"colorCard\"\u0026gt;\n      \u0026lt;h3\u0026gt;Select Colors\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"compactSel\" id=\"compactSel\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 1\u0026lt;\/span\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw1\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"cRow\"\u0026gt;\n        \u0026lt;div class=\"lbl\"\u0026gt;\u0026lt;span\u0026gt;Color 2 (dual color)\u0026lt;\/span\u0026gt;\n          \u0026lt;button class=\"swapBtn\" id=\"swapBtn\" title=\"Swap Color 1 and Color 2\"\u0026gt;\u0026amp;#8646; Swap\u0026lt;\/button\u0026gt;\u0026lt;\/div\u0026gt;\n        \u0026lt;div class=\"swatches\" id=\"sw2\"\u0026gt;\u0026lt;\/div\u0026gt;\n      \u0026lt;\/div\u0026gt;\n      \u0026lt;div class=\"hint\"\u0026gt;\n        Every LED module on the Low Pro can display \u0026lt;b\u0026gt;either\u0026lt;\/b\u0026gt; selected color:\n        pick two colors and each module switches between them.\n        The right-hand cluster runs the \u0026lt;b\u0026gt;360\u0026amp;deg; Halo scene light\u0026lt;\/b\u0026gt;, a Low Pro\n        exclusive: it floods the area around the vehicle with steady work light,\n        with or without the warning flashers running. Try the \u0026lt;b\u0026gt;White\u0026lt;\/b\u0026gt; button.\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n    \u0026lt;div class=\"card cardCtl\"\u0026gt;\n      \u0026lt;h3\u0026gt;Controller · press the buttons\u0026lt;\/h3\u0026gt;\n      \u0026lt;div class=\"ctlWrap\"\u0026gt;\n        \u0026lt;svg id=\"ctl\" viewBox=\"0 0 560 300\" aria-label=\"Controller keypad\"\u0026gt;\u0026lt;\/svg\u0026gt;\n      \u0026lt;\/div\u0026gt;\n    \u0026lt;\/div\u0026gt;\n  \u0026lt;\/div\u0026gt;\n\n  \u0026lt;footer\u0026gt;\n    \u0026lt;div\u0026gt;BLACK OAK LED · Navigate the Night.\u0026lt;\/div\u0026gt;\n    \u0026lt;div\u0026gt;Designed and engineered in Sarasota, Florida\u0026lt;\/div\u0026gt;\n  \u0026lt;\/footer\u0026gt;\n\u0026lt;\/div\u0026gt;\n\n\u0026lt;script\u0026gt;\n\"use strict\";\nconst LEDCOLORS = {\n  amber:{main:\"#ffb43a\", core:\"#ffe9b0\", glow:\"#ff9d00\", label:\"Amber\"},\n  white:{main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#cfe4ff\", label:\"White\"},\n  red:  {main:\"#ff2d23\", core:\"#ffb0a8\", glow:\"#ff1400\", label:\"Red\"},\n  blue: {main:\"#2a62ff\", core:\"#b8ccff\", glow:\"#0040ff\", label:\"Blue\"},\n  green:{main:\"#19d949\", core:\"#c2ffcf\", glow:\"#00c832\", label:\"Green\"}\n};\nconst HALO = {main:\"#F4F8FF\", core:\"#ffffff\", glow:\"#dcebff\"};\n\nconst S = {\n  color1:\"amber\", color2:\"white\",\n  c1on:true, c2on:false,\n  zones:{front:true, back:true, left:true, right:true},\n  halo:{front:false, back:false, left:false, right:false},\n  pattern:1,\n  ta:null,\n  cruise:false, random:false, dim50:false, autoSensor:false,\n  indicatorOff:false, favorite:1,\n  randTimer:0, randPat:1\n};\n\nconst NS=\"http:\/\/www.w3.org\/2000\/svg\";\nconst bar = document.getElementById(\"barSvg\");\nconst modules = [];\n\nfunction el(name, attrs, parent){\n  const e=document.createElementNS(NS,name);\n  for(const k in attrs) e.setAttribute(k,attrs[k]);\n  if(parent) parent.appendChild(e);\n  return e;\n}\n\nfunction buildBar(){\n  const defs = el(\"defs\",{},bar);\n  const mkGlow=(id,dev)=\u0026gt;{\n    const f=el(\"filter\",{id, x:\"-80%\",y:\"-80%\",width:\"260%\",height:\"260%\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:dev, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  };\n  mkGlow(\"ledGlow\",4);\n  (()=\u0026gt;{\n    const f=el(\"filter\",{id:\"haloGlow\", filterUnits:\"userSpaceOnUse\",\n      x:\"-120\",y:\"-160\",width:\"1240\",height:\"560\"},defs);\n    el(\"feGaussianBlur\",{stdDeviation:11, result:\"b\"},f);\n    const m=el(\"feMerge\",{},f);\n    el(\"feMergeNode\",{in:\"b\"},m); el(\"feMergeNode\",{in:\"SourceGraphic\"},m);\n  })();\n\n  const G = el(\"g\",{},bar);\n  const haloLayer = el(\"g\",{opacity:\"0\"},G);\n  const sidePaths = {\n    front:\"M 150,62 L 850,62\",\n    back: \"M 150,178 L 850,178\",\n    left: \"M 150,62 L 75,95 L 75,145 L 150,178\",\n    right:\"M 850,62 L 925,95 L 925,145 L 850,178\"\n  };\n  const haloEls = {};\n  for(const z in sidePaths){\n    const g=el(\"g\",{filter:\"url(#haloGlow)\"},haloLayer);\n    [[10,.9],[26,.4],[52,.16],[88,.07]].forEach(([wd,op])=\u0026gt;{\n      el(\"path\",{d:sidePaths[z], stroke:\"#eef4ff\", \"stroke-width\":wd, \"stroke-opacity\":op,\n        fill:\"none\", \"stroke-linecap\":\"round\", \"stroke-linejoin\":\"round\"},g);\n    });\n    haloEls[z]=g;\n  }\n  for(const k in haloEls){ haloEls[k].setAttribute(\"visibility\",\"hidden\"); }\n  S._haloEls = haloEls; haloLayer.setAttribute(\"opacity\",\"1\");\n\n  const bodyPts = \"150,62 850,62 925,95 925,145 850,178 150,178 75,145 75,95\";\n  el(\"polygon\",{points:bodyPts, fill:\"#15181d\", stroke:\"#3a4149\", \"stroke-width\":3},G);\n  el(\"polygon\",{points:\"158,70 842,70 913,99 913,141 842,170 158,170 87,141 87,99\",\n    fill:\"#0e1114\", stroke:\"#22272e\",\"stroke-width\":1},G);\n  el(\"text\",{x:500,y:112,\"text-anchor\":\"middle\",fill:\"#c9d0d9\",\"font-size\":\"21\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"6\",\"font-family\":\"inherit\"},G).textContent=\"BLACK OAK\";\n  el(\"text\",{x:500,y:130,\"text-anchor\":\"middle\",fill:\"#4c545e\",\"font-size\":\"9\",\n    \"letter-spacing\":\"2\"},G).textContent=\"SAE W3-1 22\";\n  el(\"circle\",{cx:500,cy:148,r:5,fill:\"#20252b\",stroke:\"#3a4149\"},G);\n\n  const ledLayer = el(\"g\",{},G);\n  const N=12;\n  const w=53, h=12, gap=4.6;\n  const startX=155, span=690;\n  let order=0;\n  const addMod=(zone,x,y,rot,cx,cy)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x,y,width:w,height:h,rx:4, fill:\"#23282f\", stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:x-6,y:y-6,width:w+12,height:h+12,rx:9, fill:\"none\",opacity:0, filter:\"url(#ledGlow)\"},g);\n    modules.push({zone, lens, halo, idx:order++, px:x+w\/2});\n  };\n  const addRot=(zone,cx,cy,len,rot)=\u0026gt;{\n    const g=el(\"g\",{transform:`rotate(${rot} ${cx} ${cy})`},ledLayer);\n    const lens=el(\"rect\",{x:cx-len\/2,y:cy-h\/2,width:len,height:h,rx:4,\n      fill:\"#23282f\",stroke:\"#10131a\",\"stroke-width\":1},g);\n    const halo=el(\"rect\",{x:cx-len\/2-6,y:cy-h\/2-6,width:len+12,height:h+12,rx:9,\n      fill:\"none\",opacity:0,filter:\"url(#ledGlow)\"},g);\n    modules.push({zone,lens,halo,idx:modules.length,px:cx});\n  };\n  for(let i=0;i\u0026lt;N;i++){ const x=startX+i*(span\/N)+gap\/2; addMod(\"front\",x,52,0,0,0); }\n  addRot(\"right\",884,73,68,23.7);\n  addRot(\"right\",921,120,46,90);\n  addRot(\"right\",884,167,68,-23.7);\n  for(let i=N-1;i\u0026gt;=0;i--){ const x=startX+i*(span\/N)+gap\/2; addMod(\"back\",x,176,0,0,0); }\n  addRot(\"left\",116,167,68,23.7);\n  addRot(\"left\",79,120,46,90);\n  addRot(\"left\",116,73,68,-23.7);\n}\nbuildBar();\nconst NMOD = modules.length;\nconst frontMods = modules.filter(m=\u0026gt;m.zone===\"front\");\nconst backMods  = modules.filter(m=\u0026gt;m.zone===\"back\");\nconst halfSplit = m=\u0026gt;{\n  if(m.zone===\"left\") return \"L\";\n  if(m.zone===\"right\") return \"R\";\n  const list = m.zone===\"front\"?frontMods:backMods;\n  const pos = list.indexOf(m);\n  const leftSide = m.zone===\"front\" ? pos \u0026lt; list.length\/2 : pos \u0026gt;= list.length\/2;\n  return leftSide ? \"L\" : \"R\";\n};\nmodules.forEach(m=\u0026gt;m.side=halfSplit(m));\nconst PXMIN=Math.min(...modules.map(m=\u0026gt;m.px)), PXMAX=Math.max(...modules.map(m=\u0026gt;m.px));\n\nfunction pulse(t, cycle, n){\n  const ph = t % cycle;\n  if(n===1) return ph \u0026lt; 168;\n  const sub = cycle\u0026gt;=800 ? 84 : (n===2 ? 83 : 67);\n  const onw = cycle\u0026gt;=800 ? 67 : 50;\n  if(ph \u0026gt;= n*sub) return false;\n  return (ph % sub) \u0026lt; onw;\n}\nfunction burst(local, half, n){\n  const sub = Math.min(half\u0026gt;=400 ? 84 : 67, half\/n);\n  if(local \u0026gt;= n*sub) return false;\n  return (local % sub) \u0026lt; sub*.75;\n}\nconst PATTERNS = {\n  1:{name:\"Single Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,1)},\n  2:{name:\"Double Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,2)},\n  3:{name:\"Triple Flash\",    cyc:400, f:(t,c)=\u0026gt;pulse(t,c,3)},\n  4:{name:\"Quintuple Flash\", cyc:800, f:(t,c)=\u0026gt;pulse(t,c,5)},\n  5:{name:\"Slow Single Flash\",cyc:800,f:(t,c)=\u0026gt;(t%c) \u0026lt; 434},\n  6:{name:\"Two Adjacent Groups Alternate\", cyc:400, group:true},\n  7:{name:\"Left \/ Right 3-Flash Alternate\", cyc:400, lr:3},\n  8:{name:\"Left \/ Right 5-Flash Alternate\", cyc:800, lr:5},\n  9:{name:\"Counterclockwise Rotation\", cyc:1400, rot:-1},\n  10:{name:\"Clockwise Rotation\",       cyc:1400, rot:1},\n  11:{name:\"Left Steady + Right Quintuple\", cyc:800, steady:\"L\"},\n  12:{name:\"Right Steady + Left Quintuple\", cyc:800, steady:\"R\"}\n};\n\nfunction moduleState(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const single = (S.c1on?1:0)+(S.c2on\u0026amp;\u0026amp;S.color2?1:0)===1;\n  if(!dual \u0026amp;\u0026amp; !single) return null;\n  const cA = S.c1on ? S.color1 : S.color2;\n  const P = PATTERNS[S.pattern];\n  const cyc = P.cyc;\n\n  if(S.cruise){\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:.7};\n  }\n\n  let phaseColor = cA;\n  let tt = t;\n  if(dual){\n    const period = cyc*2;\n    const first = (t % period) \u0026lt; cyc;\n    phaseColor = first ? S.color1 : S.color2;\n    tt = t % cyc;\n  }\n\n  if(P.rot){\n    const pos = (t % cyc)\/cyc;\n    const head = P.rot===1 ? pos : 1-pos;\n    const center = head*NMOD;\n    let d = Math.abs(m.idx - center);\n    d = Math.min(d, NMOD-d);\n    if(d \u0026gt; 3.2) return null;\n    const col = dual ? (Math.floor(t\/cyc)%2? S.color2 : S.color1) : cA;\n    return {color:col, intensity: 1 - d\/3.6};\n  }\n  if(P.lr){\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    const mineFirst = m.side===\"L\";\n    if(firstHalf!==mineFirst) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, P.lr)) return null;\n    const col = dual ? (m.side===\"L\"?S.color1:S.color2) : cA;\n    return {color:col, intensity:1};\n  }\n  if(P.group){\n    const g = Math.floor(m.idx\/2)%2;\n    const firstHalf = (tt % cyc) \u0026lt; cyc\/2;\n    if((g===0)!==firstHalf) return null;\n    const local = tt % (cyc\/2);\n    if(!burst(local, cyc\/2, 3)) return null;\n    const col = dual ? (g===0?S.color1:S.color2) : phaseColor;\n    return {color:col, intensity:1};\n  }\n  if(P.steady){\n    const steadySide = P.steady;\n    if(m.side===steadySide){\n      const col = dual ? S.color1 : cA;\n      return {color:col, intensity:.4};\n    }\n    if(!pulse(tt,cyc,5)) return null;\n    const col = dual ? S.color2 : cA;\n    return {color:col, intensity:1};\n  }\n  if(!P.f(tt,cyc)) return null;\n  if(dual){\n    if(S.pattern===2||S.pattern===3){\n      const flip = S.pattern===3;\n      const c1side = flip? \"R\":\"L\";\n      return {color: m.side===c1side? S.color1:S.color2, intensity:1};\n    }\n    return {color:phaseColor, intensity:1};\n  }\n  return {color:cA, intensity:1};\n}\n\nfunction taSweep(m, t){\n  const dual = S.c1on \u0026amp;\u0026amp; S.c2on \u0026amp;\u0026amp; S.color2;\n  const T = 1600;\n  const pass = Math.floor(t\/T) % (dual?2:1);\n  const col = dual ? (pass===0 ? S.color1 : S.color2)\n                   : (S.c1on ? S.color1 : (S.color2||S.color1));\n  const ph=(t%T)\/T;\n  let build;\n  if(ph\u0026lt;.65) build = ph\/.65;\n  else if(ph\u0026lt;.8) build = 1;\n  else return null;\n  const p = (m.px-PXMIN)\/(PXMAX-PXMIN);\n  const e = .002;\n  let on=false;\n  if(S.ta===\"right\")      on = p \u0026lt;= build+e;\n  else if(S.ta===\"left\")  on = (1-p) \u0026lt;= build+e;\n  else                    on = Math.abs(p-0.5) \u0026lt;= build*0.5+e;\n  return on? {color:col,intensity:1} : null;\n}\n\nlet lastPatternShown=-1;\nfunction render(t){\n  const dimMul = S.dim50? .45 : 1;\n  if(S.random \u0026amp;\u0026amp; t-S.randTimer\u0026gt;4000){\n    S.randTimer=t; S.pattern = 1+Math.floor(Math.random()*12); syncUI();\n  }\n  const warnOn = (S.c1on || (S.c2on\u0026amp;\u0026amp;S.color2));\n  for(const m of modules){\n    let st;\n    if(S.ta) st = taSweep(m,t);\n    else if(warnOn \u0026amp;\u0026amp; S.zones[m.zone]) st = moduleState(m,t);\n    else st = null;\n    m.cur = st;\n    if(st){ m.lastT=t; m.lastC=st.color; m.lastK=st.intensity; }\n    let drawC=null, drawK=0;\n    if(st){ drawC=st.color; drawK=st.intensity; }\n    else if(m.lastC \u0026amp;\u0026amp; (t-m.lastT)\u0026lt;70){ drawC=m.lastC; drawK=m.lastK*(1-(t-m.lastT)\/70)*.7; }\n    if(drawC){\n      const c=LEDCOLORS[drawC];\n      const k=drawK*dimMul;\n      m.lens.setAttribute(\"fill\", k\u0026gt;.55? c.core : c.main);\n      m.lens.setAttribute(\"stroke\", c.main);\n      m.halo.setAttribute(\"fill\", c.glow);\n      m.halo.setAttribute(\"opacity\", (0.85*k).toFixed(2));\n    }else{\n      m.lens.setAttribute(\"fill\",\"#23282f\");\n      m.lens.setAttribute(\"stroke\",\"#10131a\");\n      m.halo.setAttribute(\"opacity\",\"0\");\n    }\n  }\n  for(const z in S._haloEls){\n    S._haloEls[z].setAttribute(\"visibility\", S.halo[z]? \"visible\":\"hidden\");\n    S._haloEls[z].setAttribute(\"opacity\", (.85*dimMul).toFixed(2));\n  }\n  if(S._dots){\n    const RED=\"#ff2622\", OFF=\"#1c2026\";\n    for(const row of [\"front\",\"back\"]){\n      const src = row===\"front\"? frontMods : backMods.slice().reverse();\n      S._dots[row].forEach((dot,i)=\u0026gt;{\n        if(S.indicatorOff){ dot.setAttribute(\"fill\",OFF); return; }\n        const m = src[Math.round(i*(src.length-1)\/(S._dots[row].length-1))];\n        dot.setAttribute(\"fill\", m.cur? RED : OFF);\n      });\n    }\n    const zoneLit = z =\u0026gt; modules.some(m=\u0026gt;m.zone===z \u0026amp;\u0026amp; m.cur);\n    S._dotL.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"left\"))?  RED : OFF);\n    S._dotR.setAttribute(\"fill\", (!S.indicatorOff \u0026amp;\u0026amp; zoneLit(\"right\"))? RED : OFF);\n  }\n  if(S.pattern!==lastPatternShown){ lastPatternShown=S.pattern; updateLabel(); }\n  requestAnimationFrame(render);\n}\n\nfunction updateLabel(){\n  const P=PATTERNS[S.pattern];\n  document.getElementById(\"patternLabel\").textContent =\n    `Pattern ${S.pattern} · ${P.name}` + (S.cruise? \"  •  Cruise\":\"\") + (S.ta\u0026amp;\u0026amp;!tourActive? `  •  Traffic Advisor ${S.ta}`:\"\");\n  drawDisplay();\n}\n\nconst ORDER=[\"amber\",\"white\",\"red\",\"blue\",\"green\"];\nfunction buildCompact(){\n  const c=document.getElementById(\"compactSel\");\n  c.innerHTML=\"\";\n  const mk=(col)=\u0026gt;{ const d=document.createElement(\"div\"); d.className=\"sw\";\n    d.style.background=LEDCOLORS[col].main; d.title=LEDCOLORS[col].label; return d; };\n  const lab=document.createElement(\"span\");\n  lab.style.cssText=\"font-size:12px;color:#8a94a3\";\n  lab.textContent=\"Your colors:\";\n  c.appendChild(lab);\n  c.appendChild(mk(S.color1));\n  if(S.color2){ c.appendChild(mk(S.color2)); }\n  const btn=document.createElement(\"button\");\n  btn.className=\"swapBtn\";\n  const card=document.getElementById(\"colorCard\");\n  btn.textContent = card.classList.contains(\"expanded\") ? \"Done\" : \"Change colors\";\n  btn.onclick=()=\u0026gt;{ card.classList.toggle(\"expanded\"); buildCompact(); };\n  c.appendChild(btn);\n}\nfunction buildSwatches(){\n  buildCompact();\n  const s1=document.getElementById(\"sw1\"), s2=document.getElementById(\"sw2\");\n  s1.innerHTML=\"\"; s2.innerHTML=\"\";\n  for(const c of ORDER){\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color1===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color1=c; if(S.color2===c) S.color2=null; buildSwatches(); };\n    s1.appendChild(d);\n  }\n  const none=document.createElement(\"div\");\n  none.className=\"sw none\"+(S.color2===null?\" sel\":\"\");\n  none.title=\"Single color\"; none.onclick=()=\u0026gt;{S.color2=null; buildSwatches();};\n  s2.appendChild(none);\n  for(const c of ORDER){\n    if(c===S.color1) continue;\n    const d=document.createElement(\"div\");\n    d.className=\"sw\"+(S.color2===c?\" sel\":\"\");\n    d.style.background=LEDCOLORS[c].main; d.title=LEDCOLORS[c].label;\n    d.onclick=()=\u0026gt;{ S.color2=c; S.c2on=true; buildSwatches(); syncUI(); };\n    s2.appendChild(d);\n  }\n}\ndocument.getElementById(\"swapBtn\").onclick=()=\u0026gt;{\n  if(!S.color2) return;\n  [S.color1,S.color2]=[S.color2,S.color1]; buildSwatches();\n};\n\nconst ctl=document.getElementById(\"ctl\");\nconst buttons={};\nfunction buildController(){\n  const defs=el(\"defs\",{},ctl);\n  const f=el(\"filter\",{id:\"btnGlow\",x:\"-40%\",y:\"-40%\",width:\"180%\",height:\"180%\"},defs);\n  el(\"feGaussianBlur\",{stdDeviation:\"2.2\",result:\"b\"},f);\n  const mg=el(\"feMerge\",{},f);\n  el(\"feMergeNode\",{in:\"b\"},mg); el(\"feMergeNode\",{in:\"SourceGraphic\"},mg);\n\n  el(\"rect\",{x:2,y:2,width:556,height:296,rx:26,fill:\"#17191d\",stroke:\"#000\",\"stroke-width\":2},ctl);\n  el(\"rect\",{x:12,y:12,width:536,height:276,rx:20,fill:\"none\",stroke:\"#262a31\",\"stroke-width\":1.5},ctl);\n\n  const btn=(key,label,x,y,shape,w,h,fs)=\u0026gt;{\n    const g=el(\"g\",{class:\"kb\",tabindex:\"0\",role:\"button\",\"aria-label\":label.replace(\"\\n\",\" \")},ctl);\n    if(shape===\"circle\") el(\"circle\",{class:\"face\",cx:x,cy:y,r:w},g);\n    else if(shape===\"rect\") el(\"rect\",{class:\"face\",x:x-w\/2,y:y-h\/2,width:w,height:h,rx:8},g);\n    else el(\"path\",{class:\"face\",d:shape},g);\n    const lines=label.split(\"\\n\");\n    lines.forEach((ln,i)=\u0026gt;{\n      const tv = el(\"text\",{x:x, y:y+(i-(lines.length-1)\/2)*11+4, \"font-size\":fs||10.5},g);\n      tv.textContent=ln;\n    });\n    g.addEventListener(\"click\",()=\u0026gt;press(key));\n    g.addEventListener(\"keydown\",e=\u0026gt;{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();press(key);}});\n    buttons[key]={g};\n    return g;\n  };\n\n  const lx=88, ly=88;\n  btn(\"z_front\",\"Front\", lx,   ly-38,\"circle\",19);\n  btn(\"z_left\",\"Left\",   lx-52,ly,   \"circle\",19);\n  btn(\"z_all\",\"ALL\",     lx,   ly,   \"circle\",19);\n  btn(\"z_right\",\"Right\", lx+52,ly,   \"circle\",19);\n  btn(\"z_back\",\"Back\",   lx,   ly+38,\"circle\",19);\n\n  el(\"rect\",{x:170,y:34,width:220,height:64,rx:12,fill:\"#0a0c0e\",stroke:\"#26292f\"},ctl);\n  el(\"text\",{x:280,y:71,\"text-anchor\":\"middle\",fill:\"#b9c1cc\",\"font-size\":\"15\",\n    \"font-weight\":\"800\",\"letter-spacing\":\"4\"},ctl).textContent=\"BLACK OAK\";\n  S._dots={front:[],back:[]};\n  for(let i=0;i\u0026lt;8;i++){\n    S._dots.front.push(el(\"circle\",{cx:198+i*24,cy:46,r:3.4,fill:\"#1c2026\"},ctl));\n    S._dots.back.push( el(\"circle\",{cx:198+i*24,cy:86,r:3.4,fill:\"#1c2026\"},ctl));\n  }\n  S._dotL = el(\"circle\",{cx:182,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n  S._dotR = el(\"circle\",{cx:382,cy:66,r:3.4,fill:\"#1c2026\"},ctl);\n\n  btn(\"ta_left\",\"Left\", 210,126,\"M186 126 L214 108 L226 108 L226 144 L214 144 Z\",0,0,9.5);\n  btn(\"ta_both\",\"Traffic\\nAdvisor\",272,126,\"M232 108 L308 108 L318 126 L308 144 L232 144 L242 126 Z\",0,0,9.5);\n  btn(\"ta_right\",\"Right\",330,126,\"M314 108 L326 108 L354 126 L326 144 L314 144 Z\",0,0,9.5);\n\n  const rx=470, ry=88;\n  btn(\"h_front\",\"Front\", rx,   ry-38,\"circle\",19);\n  btn(\"h_left\",\"Left\",   rx-52,ry,   \"circle\",19);\n  btn(\"h_white\",\"White\", rx,   ry,   \"circle\",19);\n  btn(\"h_right\",\"Right\", rx+52,ry,   \"circle\",19);\n  btn(\"h_back\",\"Back\",   rx,   ry+38,\"circle\",19);\n  el(\"text\",{x:rx,y:ry+68,\"text-anchor\":\"middle\",fill:\"#7f8b9c\",\"font-size\":\"9.5\",\n    \"font-weight\":\"700\",\"letter-spacing\":\"1.5\"},ctl).textContent=\"360° HALO\";\n  el(\"text\",{x:rx,y:ry+79,\"text-anchor\":\"middle\",fill:\"#59636f\",\"font-size\":\"8\",\n    \"letter-spacing\":\"1\"},ctl).textContent=\"SCENE LIGHT\";\n\n  btn(\"c1\",\"Color 1\\nON\/OFF\",   62,190,\"rect\",66,40,9.5);\n  btn(\"c2\",\"Color 2\\nON\/OFF\",  136,190,\"rect\",66,40,9.5);\n  btn(\"dim\",\"50%\",              62,244,\"rect\",66,34);\n  btn(\"auto\",\"Auto\\nSensor\",   136,244,\"rect\",66,40,9.5);\n\n  btn(\"last\",\"Last\\nPattern\",  228,218,\"rect\",62,44,9.5);\n  btn(\"next\",\"Next\\nPattern\",  298,218,\"rect\",62,44,9.5);\n  S._ring = el(\"rect\",{x:262,y:190,width:72,height:56,rx:12,class:\"pulseRing\"},ctl);\n\n  btn(\"ind\",\"Indicator\",       412,190,\"rect\",74,36,9.5);\n  btn(\"cruise\",\"Cruise\\nLight\",496,190,\"rect\",70,40,9.5);\n  btn(\"rand\",\"Random\",         412,244,\"rect\",74,36,9.5);\n  btn(\"fav\",\"Favorite\\nPattern\",496,244,\"rect\",70,40,9.5);\n}\nbuildController();\n\nfunction drawDisplay(){}\n\nlet favHold=null;\nfunction press(key){\n  markInteract();\n  switch(key){\n    case \"z_all\":{\n      const allOn=S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right;\n      const v=!allOn; S.zones={front:v,back:v,left:v,right:v}; break;}\n    case \"z_front\": S.zones.front=!S.zones.front; break;\n    case \"z_back\":  S.zones.back=!S.zones.back; break;\n    case \"z_left\":  S.zones.left=!S.zones.left; break;\n    case \"z_right\": S.zones.right=!S.zones.right; break;\n    case \"h_white\":{\n      const allOn=S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right;\n      const v=!allOn; S.halo={front:v,back:v,left:v,right:v}; break;}\n    case \"h_front\": S.halo.front=!S.halo.front; break;\n    case \"h_back\":  S.halo.back=!S.halo.back; break;\n    case \"h_left\":  S.halo.left=!S.halo.left; break;\n    case \"h_right\": S.halo.right=!S.halo.right; break;\n    case \"c1\": S.c1on=!S.c1on; break;\n    case \"c2\": if(S.color2) S.c2on=!S.c2on; break;\n    case \"next\": S.pattern=S.pattern%12+1; S.cruise=false; S.random=false; break;\n    case \"last\": S.pattern=(S.pattern+10)%12+1; S.cruise=false; S.random=false; break;\n    case \"cruise\": S.cruise=!S.cruise; if(S.cruise){S.random=false;} break;\n    case \"rand\": S.random=!S.random; if(S.random){S.cruise=false; S.randTimer=0;} break;\n    case \"dim\": S.dim50=!S.dim50; break;\n    case \"auto\": S.autoSensor=!S.autoSensor; break;\n    case \"ind\": S.indicatorOff=!S.indicatorOff; break;\n    case \"ta_left\":  S.ta = S.ta===\"left\"? null:\"left\"; break;\n    case \"ta_right\": S.ta = S.ta===\"right\"? null:\"right\"; break;\n    case \"ta_both\":  S.ta = S.ta===\"both\"? null:\"both\"; break;\n    case \"fav\": S.pattern=S.favorite; S.cruise=false; S.random=false; break;\n  }\n  updateLabel(); syncUI();\n}\n(function(){\n  const g=buttons[\"fav\"].g;\n  let t0=0;\n  g.addEventListener(\"pointerdown\",()=\u0026gt;{ t0=Date.now();\n    favHold=setTimeout(()=\u0026gt;{ S.favorite=S.pattern; flash(g); },1200); });\n  const clear=()=\u0026gt;{ if(favHold){clearTimeout(favHold); favHold=null;} };\n  g.addEventListener(\"pointerup\",clear); g.addEventListener(\"pointerleave\",clear);\n  function flash(el){ el.classList.add(\"lit\"); setTimeout(()=\u0026gt;syncUI(),400); }\n})();\n\nfunction syncUI(){\n  const setLit=(k,v)=\u0026gt;buttons[k].g.classList.toggle(\"lit\",!!v);\n  setLit(\"z_front\",S.zones.front); setLit(\"z_back\",S.zones.back);\n  setLit(\"z_left\",S.zones.left);   setLit(\"z_right\",S.zones.right);\n  setLit(\"z_all\",S.zones.front\u0026amp;\u0026amp;S.zones.back\u0026amp;\u0026amp;S.zones.left\u0026amp;\u0026amp;S.zones.right);\n  setLit(\"h_front\",S.halo.front); setLit(\"h_back\",S.halo.back);\n  setLit(\"h_left\",S.halo.left);   setLit(\"h_right\",S.halo.right);\n  setLit(\"h_white\",S.halo.front\u0026amp;\u0026amp;S.halo.back\u0026amp;\u0026amp;S.halo.left\u0026amp;\u0026amp;S.halo.right);\n  setLit(\"c1\",S.c1on); setLit(\"c2\",S.c2on\u0026amp;\u0026amp;!!S.color2);\n  setLit(\"cruise\",S.cruise); setLit(\"rand\",S.random);\n  setLit(\"dim\",S.dim50); setLit(\"auto\",S.autoSensor); setLit(\"ind\",S.indicatorOff);\n  setLit(\"ta_left\",S.ta===\"left\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_right\",S.ta===\"right\"\u0026amp;\u0026amp;!tourActive); setLit(\"ta_both\",S.ta===\"both\"\u0026amp;\u0026amp;!tourActive);\n  const haloOn = S.halo.front||S.halo.back||S.halo.left||S.halo.right;\n  document.getElementById(\"haloBadge\").style.display = haloOn? \"flex\":\"none\";\n  drawDisplay();\n}\n\n\/* default everywhere: dual-color amber\/white, steady burn; the attract sweep provides motion *\/\nS.c2on=true; S.cruise=true;\nS.interacted=false;\nlet tourActive=false, tourTimer=null, idleTimer=null;\nbuildSwatches(); syncUI(); updateLabel();\nrequestAnimationFrame(render);\n\n\/* ATTRACT MODE *\/\nfunction markInteract(){\n  if(S.interacted) return;\n  S.interacted=true;\n  if(tourActive){ tourActive=false; S.ta=null; }\n  clearTimeout(tourTimer); clearTimeout(idleTimer);\n  const h=document.getElementById(\"tryHint\");\n  if(h){ h.style.transition=\"opacity .5s\"; h.style.opacity=\"0\"; setTimeout(()=\u0026gt;h.remove(),600); }\n  if(S._ring) S._ring.remove();\n}\nfunction attractSweep(passes){\n  if(S.interacted || tourActive) return;\n  tourActive=true; S.ta=\"both\";\n  tourTimer=setTimeout(()=\u0026gt;{\n    if(tourActive){ tourActive=false; S.ta=null; }\n    scheduleIdle();\n  }, 1600*passes+400);\n}\nfunction scheduleIdle(){\n  if(S.interacted) return;\n  clearTimeout(idleTimer);\n  idleTimer=setTimeout(()=\u0026gt;attractSweep(1), 18000);\n}\ndocument.addEventListener(\"pointerdown\",e=\u0026gt;{\n  if(e.target.closest \u0026amp;\u0026amp; e.target.closest(\".sw,.swapBtn,.kb\")) markInteract();\n},true);\n(function(){\n  let fired=false;\n  const start=()=\u0026gt;{ if(!fired){ fired=true; setTimeout(()=\u0026gt;attractSweep(2), 600); } };\n  if(window.IntersectionObserver){\n    new IntersectionObserver((es,obs)=\u0026gt;{\n      if(es.some(e=\u0026gt;e.isIntersecting)){ start(); obs.disconnect(); }\n    },{threshold:.5}).observe(document.querySelector(\".stage\"));\n  } else start();\n})();\n\n(function(){\n  const embedded = (window!==parent);\n  if(embedded){\n    document.querySelector(\"header\").style.display=\"none\";\n    document.querySelector(\"footer\").style.display=\"none\";\n    if(window.innerWidth\u0026gt;840) document.querySelector(\".wrap\").style.padding=\"10px 12px 14px\";\n  }\n  const report=()=\u0026gt;{ try{\n    parent.postMessage({type:\"lowpro-player-height\",\n      height: document.querySelector(\".wrap\").scrollHeight+8}, \"*\");\n  }catch(e){} };\n  if(window.ResizeObserver) new ResizeObserver(report).observe(document.querySelector(\".wrap\"));\n  window.addEventListener(\"load\",report); window.addEventListener(\"pageshow\",report);\n  setTimeout(report,400); setTimeout(report,1500);\n  let n=0; const iv=setInterval(()=\u0026gt;{ report(); if(++n\u0026gt;10) clearInterval(iv); },1200);\n})();\n\u0026lt;\/script\u0026gt;\n\u0026lt;\/body\u0026gt;\n\u0026lt;\/html\u0026gt;\n'\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cstyle\u003e\n.lowpro-frame{height:700px}\n@media(max-width:840px){\n  .lowpro-cta{display:none}\n  .lowpro-frame{height:760px}\n}\n\u003c\/style\u003e\n\u003cscript\u003e\nwindow.addEventListener(\"message\",function(e){\n  if(e.data \u0026\u0026 e.data.type===\"lowpro-player-height\"){\n    var f=document.getElementById(\"lowpro-player-frame\");\n    if(f \u0026\u0026 e.data.height\u003e200) f.style.height=(e.data.height+4)+\"px\";\n  }\n});\n\u003c\/script\u003e\n\u003cdiv style=\"height:28px;\"\u003e \u003c\/div\u003e\n\u003cp\u003e\u003c!-- Intro Section --\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cstrong\u003eBuilt for emergency response teams and public safety professionals, this high-intensity LED warning light bar delivers uncompromising performance in a sleek, durable design.\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003eThe Black Oak Low Pro Emergency Series Light Bar is engineered for maximum visibility, reliability, and user control. With ultra-bright LEDs, multiple flash patterns, and a rugged housing, this bar ensures your presence is known in any emergency situation, day or night, rain or shine.\u003c\/p\u003e\n\u003cp data-end=\"806\" data-start=\"530\"\u003e \u003c\/p\u003e\n\u003cp data-end=\"1177\" data-start=\"808\"\u003eBuilt to withstand the demands of high-speed response, off-road utility, or work site visibility, this low-profile bar features a streamlined, aerodynamic frame and a universal mounting system to ensure easy installation on any vehicle. Whether you're outfitting a patrol car, fire unit, or utility truck, this bar delivers dependable performance where it matters most.\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- TRUST STRIP --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Screenshot_2026-07-21_at_9.31.14_AM.png?v=1784641940\" alt=\"SAE J845 Certified, SAE J595 Class 1, IP69K Waterproof, Lifetime Warranty, -40F to +145F Rated, 50,000 Hour LEDs\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003c!-- SIZE SELECTOR --\u003e\n\u003cdiv style=\"margin:4px 0 2px;\"\u003e\n\u003cp style=\"margin:0 0 8px;font-weight:600;font-size:15px;\"\u003eAvailable sizes:\u003c\/p\u003e\n\u003ca href=\"\/products\/11-mini-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e11\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e17\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e30\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e43\"\u003c\/a\u003e\n\u003ca href=\"\/products\/low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e49\"\u003c\/a\u003e\n\u003ca href=\"\/products\/new-55-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e55\"\u003c\/a\u003e\n\u003cspan style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:8px 14px;border-radius:8px;margin:0 6px 8px 0;font-size:15px;\"\u003e61\"\u003c\/span\u003e\n\u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\" style=\"display:inline-block;border:2px solid #FFB300;color:#111;font-weight:700;padding:6px 12px;border-radius:8px;margin:0 6px 8px 0;text-decoration:none;font-size:15px;\"\u003e68\"\u003c\/a\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\n\u003c!-- Collapsable Sections --\u003e\n\u003cstyle\u003e\n#MainContent details {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 16px;\n  overflow: hidden;\n  background: #fff;\n  font-family: Arial, sans-serif;\n}\n\n#MainContent details summary {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  cursor: pointer;\n  padding: 14px 18px;\n  font-weight: 600;\n  font-size: 18px;\n  list-style: none;\n  background-color: #f9f9f9;\n  border-bottom: 1px solid #e0e0e0;\n  position: relative;\n}\n\n#MainContent details[open] summary {\n  background-color: #f1f1f1;\n}\n\n#MainContent details summary::after {\n  content: '+';\n  font-size: 20px;\n  font-weight: bold;\n  transition: transform 0.3s ease;\n}\n\n#MainContent details[open] summary::after {\n  content: '−';\n}\n\n#MainContent details .content {\n  padding: 16px 20px;\n  font-size: 16px;\n  line-height: 1.6;\n}\n\u003c\/style\u003e\n\u003cdetails\u003e\n\u003csummary\u003eFeatures\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003eLifetime Warranty\u003c\/li\u003e\n\u003cli\u003eSAE J845 Class 1 Certified\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e360° visibility with dual-color ultra-bright LEDs\u003c\/li\u003e\n\u003cli\u003eSlim Low Profile design\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 flash patterns with memory recall\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eRugged, waterproof housing (IP69K rated)\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003eIntegrated controller with pattern cycling, cruise mode, and cut-off\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIn the Box\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cb\u003eLow Pro Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eController\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWiring\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Brackets\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- COMPLIANCE SECTION --\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCompliance \u0026amp; Certifications\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\n\u003cp\u003e\u003cstrong\u003eMeets the standards your department requires.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"3\"\u003eCertification \u0026amp; Compliance\u003c\/th\u003e\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J845\u003c\/th\u003e\n\u003ctd\u003e360° warning lamp photometric standard for light bars and beacons\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSAE J595 Class 1\u003c\/th\u003e\n\u003ctd\u003eHighest intensity class — approved for primary emergency vehicles (police, fire, EMS)\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eCertified\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIP69K\u003c\/th\u003e\n\u003ctd\u003eSealed against high-pressure washdown, salt, dust, and submersion\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003eRated\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Range\u003c\/th\u003e\n\u003ctd\u003eExtreme-climate duty\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e-40°F to +145°F\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDuty Life\u003c\/th\u003e\n\u003ctd\u003eContinuous-duty LED modules\u003c\/td\u003e\n\u003ctd\u003e\u003cstrong\u003e50,000 hours\u003c\/strong\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp style=\"font-size:13px;color:#666;\"\u003e\u003cem\u003eWarning-equipment regulations vary by state and jurisdiction. Verify color and mounting requirements with your local authority. Spec sheet PDF and certification documentation available on request for procurement offices.\u003c\/em\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/details\u003e\n\u003c!-- Image + Text Alternating Section --\u003e\n\u003cstyle\u003e\n.text-image-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 20px;\n}\n.text-image-wrap.text-image-right {\n  flex-direction: row-reverse;\n}\n.text-image-wrap .image-wrap {\n  flex: 1;\n  max-width: 500px;\n}\n.text-image-wrap .image-wrap img {\n  width: 100%;\n  height: auto;\n  max-height: 300px; \n  display: block;\n  object-fit: contain; \n}\n.text-image-wrap .text-wrap {\n  flex: 1;\n  min-width: 300px;\n}\n\u003c\/style\u003e\n\u003c!-- Image Right - Text Left Section --\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/255283_7703341170749_330031d5_da20_475f_887e_f1269d2ad248_1.jpg?v=1763495670\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003eEmergency Bar + Work Light\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eGet full 360° white-light illumination at the touch of a button. Perfect for reverse lighting, scene lighting, or any situation where you need powerful all-around visibility. It’s a true dual-purpose feature you won’t find on most emergency bars — and it comes standard on every one of ours.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_SAE_graphics.jpg?v=1758041472\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eBuilt Tough for Any Environment\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eIP69K-rated waterproof housing and reinforced aluminum construction stand up to rain, snow, mud, and dust—ideal for police, fire, tow, or off-road response vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/DSC00223.jpg?v=1754512314\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e Full 360° Warning Visibility\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003ePacked with high-output dual-color LEDs and side modules, this bar delivers all-angle visibility—ensuring you're seen from every direction, even in chaotic scenes or inclement weather.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Driver_Side_Angle.jpg?v=1761226316\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSlim, Low-Profile Design\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eEngineered to minimize wind resistance and visual bulk, this light bar features a sleek, aerodynamic frame that hugs your vehicle’s roofline. The low-profile housing not only enhances fuel efficiency but also delivers a clean, professional look without compromising brightness or performance.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap text-image-right\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\n\u003cp\u003e\u003cvideo width=\"100%\" height=\"auto\" muted=\"\" autoplay=\"autoplay\" loop=\"loop\" playsinline=\"\" controls=\"controls\"\u003e\n    \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/4ec9ce848f5e4d2d8083da9daf4dbe78.mp4\" type=\"video\/mp4\"\u003e\n    Your browser does not support the video tag.\n  \u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eUp to 45 Flash Patterns with Smart Memory\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eChoose from up to 45 user-selectable flash patterns to fit any scenario. Built-in memory recall stores your last used setting for consistent deployment every time.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/Low_Pro_Emergency_Bar_-_Sliding_Feet.gif?v=1758730578\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSliding Feet\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eOur sliding feet mounts are designed to give you maximum flexibility during installation. By allowing the brackets to slide along the base of the light bar, you can easily adjust spacing to match a wide variety of mounting points. This ensures a precise fit whether you’re working with factory holes, custom setups, or uneven surfaces.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HERO BANNER --\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/d8j0ntlcm91z4.cloudfront.net\/user_3G9nKxyaQsdrPdDsxWr4EcSl5FL\/hf_20260715_201038_0803a0cd-07a6-4508-9c7a-50d0230a94e3.png\" alt=\"Built to Code. Backed for Life. SAE J845 and J595 Class 1 compliant, IP69K sealed, lifetime warranty\" style=\"width:100%;display:block;border-radius:10px;\"\u003e\u003c\/p\u003e\n\u003cbr\u003e\n\u003c!-- FLEET BLOCK --\u003e\n\u003cdiv style=\"padding:8px 0;margin:0 0 8px;\"\u003e\n\u003ch3 style=\"margin:0 0 8px;\"\u003eOutfitting a Fleet?\u003c\/h3\u003e\n\u003cp style=\"margin:0 0 14px;font-size:16px;line-height:1.6;\"\u003eVolume pricing on 5+ units, department POs accepted, W-9 on file, and spec sheets ready for your procurement office. From single patrol vehicles to full county fleets.\u003c\/p\u003e\n\u003ca href=\"\/pages\/fleet-pricing\" style=\"display:inline-block;background:#FFB300;color:#111;font-weight:700;padding:12px 22px;border-radius:8px;text-decoration:none;\"\u003eRequest Fleet Pricing\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Dimension --\u003e\u003c!-- Specs --\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003c!-- Specs Chart --\u003e\n\u003cstyle\u003e\n  table.spec-table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    font-size: 15px;\n  }\n  table.spec-table th, table.spec-table td {\n    border: 1px solid #ccc;\n    padding: 10px;\n    text-align: left;\n  }\n  table.spec-table th {\n    background-color: #f7f7f7;\n    font-weight: 600;\n    width: 30%;\n  }\n  table.spec-table tr:hover {\n    background-color: #f2f2f2;\n  }\n  table.spec-table thead th {\n    background-color: #222;\n    color: #fff;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    text-align: center;\n  }\n\u003c\/style\u003e\n\u003ctable class=\"spec-table\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003ePower \u0026amp; Performance\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Wattage\u003c\/th\u003e\n\u003ctd\u003e456\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e35\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10-30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRaw Lumens\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Chip\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam Pattern\u003c\/th\u003e\n\u003ctd\u003eWide Angle\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertificate\u003c\/th\u003e\n\u003ctd\u003eSAE J845 \u0026amp; SAE J595 Class 1\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Single Color\u003c\/th\u003e\n\u003ctd\u003e15\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns – Dual Color\u003c\/th\u003e\n\u003ctd\u003e45 (15 Color 1 \/ 15 Color 2 \/ 15 Combo)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eDurability \u0026amp; Lifespan\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 Hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F\u003cbr\u003e-40° to 62° C\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited Lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30 Day Money Back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eWiring \u0026amp; Installation\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eCord Length From Light\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Included?\u003c\/th\u003e\n\u003ctd\u003eYes\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e9'\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector Type\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHole Size for Controller\u003c\/th\u003e\n\u003ctd\u003e\u003cbr\u003e\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting Bolt Size\u003c\/th\u003e\n\u003ctd\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eGeneral\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e21.2 Lbs\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E61-\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c!-- FAQ --\u003e\n\u003ch5\u003eDimensions\u003c\/h5\u003e\n\u003cp\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/61_Inch_Low_Pro_Dimensions.png?v=1762971848\"\u003e\u003c\/p\u003e\n\u003ch5\u003eVideo\u003c\/h5\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cvideo style=\"max-width: 100%; height: auto;\" controls=\"controls\" playsinline=\"\" loop=\"loop\" muted=\"\" autoplay=\"autoplay\"\u003e\n  \u003csource type=\"video\/mp4\" src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/f7ecf4030812467bbb46b165c21da48e.mov\"\u003e\n  Your browser does not support the video tag.\n\u003c\/source\u003e\u003c\/video\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cp\u003e\u003cstrong\u003eWhat voltage and control systems does this light bar support?\u003c\/strong\u003e\u003cbr\u003eThis light bar operates on a 12 V–24 V DC power system and can be used with either push-button or wireless controllers. It’s compatible with standard vehicle electrical systems, making installation straightforward for both fleet and individual applications.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow durable is this light bar in harsh environments?\u003c\/strong\u003e\u003cbr\u003eThe Low Pro Emergency Light Bar is built with a rugged aluminum housing, sealed to an IP69K rating and tested to resist corrosion, vibration, and high-pressure water ingress. It’s designed for demanding conditions—whether roadside, rescue, or commercial use—so you can rely on consistent performance when it counts.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat beam patterns and flash modes are included?\u003c\/strong\u003e\u003cbr\u003eUp to 45 flash patterns are built into the unit—including warning, hazard, and full-output flasher modes—with memory recall so your last setting is retained even after power loss. You’ll also find low-profile steady-burn mode useful for scene lighting and standby operations.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs the light bar legal for use on public roads and emergency vehicles?\u003c\/strong\u003e\u003cbr\u003eYes. The unit meets SAE J595 Class 1 and other relevant emergency lighting standards for warning applications. However, regulations vary by jurisdiction, so we recommend checking your local laws before installation to ensure compliance with mounting height, color, and flash pattern requirements.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat’s covered by the warranty?\u003c\/strong\u003e\u003cbr\u003eOur industry-leading lifetime warranty covers manufacturing defects, driver failures, and LED module performance. It does not cover damage caused by improper installation, extreme overuse beyond defined duty cycles, or wiring issues. For full warranty terms, please refer to our Warranty \u0026amp; Returns page.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Amber \/ Door Jamb \/ Standard - 12' Lead","offer_id":42592566476861,"sku":"LP-E61-A","price":1371.25,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788989370429,"sku":"LP-E61-A","price":1397.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788989403197,"sku":"LP-E61-A","price":1401.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592566509629,"sku":"LP-E61-A","price":1421.25,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788989435965,"sku":"LP-E61-A","price":1447.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788989468733,"sku":"LP-E61-A","price":1451.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":43067218100285,"sku":"LP-E61-AB-T","price":1496.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43067218133053,"sku":"LP-E61-AB-T","price":1522.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43067218165821,"sku":"LP-E61-AB-T","price":1526.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":43067218198589,"sku":"LP-E61-AB-T","price":1546.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":43067218231357,"sku":"LP-E61-AB-T","price":1572.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":43067218264125,"sku":"LP-E61-AB-T","price":1576.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42592569950269,"sku":"LP-E61-AR-T","price":1496.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788989501501,"sku":"LP-E61-AR-T","price":1522.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788989534269,"sku":"LP-E61-AR-T","price":1526.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592569983037,"sku":"LP-E61-AR-T","price":1546.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788989567037,"sku":"LP-E61-AR-T","price":1572.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788989599805,"sku":"LP-E61-AR-T","price":1576.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42592566607933,"sku":"LP-E61-AW-T","price":1496.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788989632573,"sku":"LP-E61-AW-T","price":1522.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788989665341,"sku":"LP-E61-AW-T","price":1526.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592566640701,"sku":"LP-E61-AW-T","price":1546.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788989698109,"sku":"LP-E61-AW-T","price":1572.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788989730877,"sku":"LP-E61-AW-T","price":1576.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42592567001149,"sku":"LP-E61-RW-T","price":1496.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788989894717,"sku":"LP-E61-RW-T","price":1522.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788989927485,"sku":"LP-E61-RW-T","price":1526.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592567033917,"sku":"LP-E61-RW-T","price":1546.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788989960253,"sku":"LP-E61-RW-T","price":1572.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788989993021,"sku":"LP-E61-RW-T","price":1576.2,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE61_Angled.png?v=1759162543"},{"product_id":"new-xdr-4-emergency-strobe-light-led-warning-light","title":"XDR-4 Emergency Strobe Light, LED Warning Light","description":"\u003cstyle\u003e\n#MainContent .x4-h1 { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 34px !important; font-weight: 800 !important; line-height: 1.12 !important; letter-spacing: -0.5px !important; color: #1C2026 !important; text-transform: none !important; margin: 0 0 10px !important; }\n#MainContent .x4-h2 { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 26px !important; font-weight: 800 !important; line-height: 1.2 !important; color: #1C2026 !important; text-transform: none !important; letter-spacing: -0.2px !important; margin: 0 0 8px !important; }\n#MainContent .x4-h3 { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 16px !important; font-weight: 800 !important; color: #1C2026 !important; text-transform: none !important; letter-spacing: 0 !important; margin: 0 0 6px !important; }\n#MainContent .x4-eyebrow { display: block !important; font-size: 11px; font-weight: 700; letter-spacing: 1.6px; text-transform: uppercase; color: #C27C00; margin: 0 0 4px; }\n#MainContent .x4-sub { font-size: 15.5px; line-height: 1.55; color: #5F6670; margin: 0 0 14px; }\n#MainContent .x4-flex { display: flex !important; flex-wrap: wrap; }\n#MainContent .x4-col, #MainContent .x4-card, #MainContent .x4-tile { display: block !important; box-sizing: border-box; }\n#MainContent .x4-sw { display: flex !important; flex-wrap: nowrap !important; align-items: center; gap: 10px; box-sizing: border-box; }\n#MainContent .x4-card, #MainContent .x4-tile, #MainContent .x4-sw { transition: all .2s ease; }\n#MainContent .x4-card:hover, #MainContent .x4-tile:hover, #MainContent .x4-sw:hover { border-color: #FFB300 !important; box-shadow: 0 6px 18px rgba(28,32,38,.10); }\n#MainContent .x4-chip { display: inline-block !important; background: #FFF6E0; color: #1C2026; border: 1px solid #FFE1A0; border-radius: 12px; padding: 5px 11px; font-size: 12.5px; font-weight: 700; margin: 0 5px 6px 0; }\n#MainContent .x4-dot { display: inline-block !important; width: 28px; height: 28px; border-radius: 50%; flex: 0 0 28px; box-shadow: inset 0 0 0 1px rgba(0,0,0,.10); }\n#MainContent .x4-hero-img { text-align: center; }\n#MainContent .x4-hero-img img { max-width: 100% !important; max-height: 260px; width: auto; height: auto !important; border-radius: 14px; display: inline-block !important; }\n#MainContent .x4-tiw { display: flex !important; align-items: center; flex-wrap: wrap; gap: 18px; margin: 0 0 8px; background: #fff; border: 2px solid #E5E7EB; border-radius: 16px; padding: 10px; box-sizing: border-box; transition: all .2s ease; }\n#MainContent .x4-tiw:hover { border-color: #FFB300; box-shadow: 0 6px 18px rgba(28,32,38,.10); }\n#MainContent .x4-tiw.x4-rev { flex-direction: row-reverse; }\n#MainContent .x4-tiw-img { flex: 0 1 340px; max-width: 340px; display: block !important; border-radius: 12px; overflow: hidden; }\n#MainContent .description .x4-tiw-img img, #MainContent .x4-tiw .x4-tiw-img img { width: 100% !important; height: 170px !important; max-height: 170px !important; object-fit: contain; background: #fff; border-radius: 12px; display: block !important; }\n@media (max-width: 749px) { #MainContent .x4-tiw-img { flex: 1 1 100%; max-width: 100%; } }\n#MainContent .x4-tiw-txt { flex: 1 1 280px; min-width: 260px; display: block !important; }\n#MainContent .x4-tiw-txt a, #MainContent details .content a { color: #C27C00; font-weight: 700; }\n#MainContent .x4-fig img { max-width: 100% !important; max-height: 280px; width: auto; height: auto !important; border-radius: 12px; display: inline-block !important; }\n#MainContent details { border: 2px solid #E5E7EB; border-radius: 12px; margin-bottom: 8px; overflow: hidden; background: #fff; display: block; }\n#MainContent details summary { display: flex; justify-content: space-between; align-items: center; cursor: pointer; padding: 12px 18px; font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif; font-weight: 700; font-size: 16px; color: #1C2026; list-style: none; background: #fff; border-bottom: 0; }\n#MainContent details summary:hover, #MainContent details[open] summary { background: #FFF6E0; }\n#MainContent details[open] summary { border-bottom: 1px solid #FFE1A0; }\n#MainContent details summary::-webkit-details-marker { display: none; }\n#MainContent details summary::after { content: '+'; font-size: 22px; font-weight: 400; color: #C27C00; }\n#MainContent details[open] summary::after { content: '\\2212'; }\n#MainContent details .content { padding: 6px 18px 12px; font-size: 15px; line-height: 1.55; display: block; }\n#MainContent table.x4-spec { width: 100%; border-collapse: collapse; margin: 0; font-size: 14.5px; }\n#MainContent table.x4-spec th, #MainContent table.x4-spec td { border: 1px solid #E5E7EB; padding: 8px 10px; text-align: left; }\n#MainContent table.x4-spec th { background: #F6F6F4; font-weight: 600; color: #1C2026; width: 42%; }\n#MainContent table.x4-spec tr:hover td, #MainContent table.x4-spec tr:hover th { background: #FFF6E0; }\n#MainContent .description img { max-width: 100% !important; height: auto !important; }\n@media (max-width: 749px) {\n  #MainContent .x4-h1 { font-size: 27px !important; }\n  #MainContent .x4-h2 { font-size: 22px !important; }\n  #MainContent .x4-pad { padding: 20px 16px !important; }\n}\n\u003c\/style\u003e\n\u003cdiv class=\"x4-pad x4-flex\" style=\"display: flex; flex-wrap: wrap; align-items: center; gap: 22px; background: linear-gradient(165deg,#FFF6E0 0%,#ffffff 72%); border: 2px solid #E5E7EB; border-radius: 18px; padding: 26px; margin: 0 0 12px;\"\u003e\n\u003cdiv class=\"x4-col\" style=\"flex: 1 1 340px; min-width: 260px;\"\u003e\n\u003cp style=\"display: inline-block; background: #1C2026; color: #FFB300; font-size: 11px; font-weight: 700; letter-spacing: 1.4px; text-transform: uppercase; padding: 5px 11px; border-radius: 6px; margin: 0 0 10px;\"\u003eSAE J595 · IP69K · 13 Flash Patterns\u003c\/p\u003e\n\u003ch2 class=\"x4-h1\"\u003eXDR-4 Emergency Strobe Light\u003c\/h2\u003e\n\u003cp class=\"x4-sub\"\u003eA compact 4\" LED warning light for tow trucks, utility, construction, and emergency response vehicles. Four high-intensity LEDs throw a 120° wide warning pattern, the ultra-low-profile housing fits where bigger strobes won't, and it's sealed to IP69K for pressure washing and all-weather use.\u003c\/p\u003e\n\u003cp style=\"margin: 0; line-height: 2;\"\u003e\u003cspan class=\"x4-chip\"\u003eSAE J595\u003c\/span\u003e\u003cspan class=\"x4-chip\"\u003eIP69K Waterproof\u003c\/span\u003e\u003cspan class=\"x4-chip\"\u003e10–30V DC\u003c\/span\u003e\u003cspan class=\"x4-chip\"\u003eSync Capable\u003c\/span\u003e\u003cspan class=\"x4-chip\"\u003eLimited Lifetime Warranty\u003c\/span\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-col x4-hero-img\" style=\"flex: 1 1 260px;\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-4Red_White_Blue_Amber.png?v=1768577056\" alt=\"XDR-4 LED emergency strobe lights in red, white, blue and amber\" width=\"500\" height=\"500\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-flex\" style=\"display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 22px;\"\u003e\n\u003cdiv class=\"x4-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003e13\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eFlash Patterns\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003e120°\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eWide Angle\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003eIP69K\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eWaterproof\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-tile\" style=\"flex: 1 1 120px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 12px 10px; text-align: center;\"\u003e\n\u003cspan style=\"display: block; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; font-weight: 800; color: #1C2026; line-height: 1.1;\"\u003e3-7\/8\"\u003c\/span\u003e\u003cspan style=\"display: block; font-size: 11px; font-weight: 700; letter-spacing: .8px; text-transform: uppercase; color: #5F6670;\"\u003eLong\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cspan class=\"x4-eyebrow\"\u003ePick Your Colors\u003c\/span\u003e\n\u003ch2 class=\"x4-h2\"\u003e7 single and dual-color options\u003c\/h2\u003e\n\u003cp class=\"x4-sub\"\u003eRun one color or split two in the same head. Dual-color models alternate between both colors for maximum attention.\u003c\/p\u003e\n\u003cdiv class=\"x4-flex\" style=\"display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 22px;\"\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: #FFB300;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eAmber\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: #1C6FE0;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eBlue\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: #E23B3B;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eRed\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: linear-gradient(135deg,#FFB300 0 50%,#F4F6F8 50% 100%); box-shadow: inset 0 0 0 2px #E5E7EB;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eAmber \u0026amp; White\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: linear-gradient(135deg,#1C6FE0 0 50%,#F4F6F8 50% 100%); box-shadow: inset 0 0 0 2px #E5E7EB;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eBlue \u0026amp; White\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: linear-gradient(135deg,#E23B3B 0 50%,#1C6FE0 50% 100%);\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eRed \u0026amp; Blue\u003c\/b\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-sw\" style=\"flex: 1 1 170px; background: #fff; border: 2px solid #E5E7EB; border-radius: 12px; padding: 8px 12px;\"\u003e\n\u003cspan class=\"x4-dot\" style=\"background: linear-gradient(135deg,#E23B3B 0 50%,#F4F6F8 50% 100%); box-shadow: inset 0 0 0 2px #E5E7EB;\"\u003e\u003c\/span\u003e\u003cb style=\"color: #1C2026;\"\u003eRed \u0026amp; White\u003c\/b\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cspan class=\"x4-eyebrow\"\u003eBuilt For The Job\u003c\/span\u003e\n\u003ch2 class=\"x4-h2\"\u003eCompact strobe, full warning power\u003c\/h2\u003e\n\u003cdiv class=\"x4-flex\" style=\"display: flex; flex-wrap: wrap; gap: 10px; margin: 8px 0 22px;\"\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 220px; background: #fff; border: 2px solid #E5E7EB; border-radius: 14px; padding: 14px 16px;\"\u003e\n\u003ch3 class=\"x4-h3\"\u003eSAE J595 Approved\u003c\/h3\u003e\n\u003cp style=\"font-size: 14.5px; line-height: 1.5; color: #5F6670; margin: 0;\"\u003eMeets the SAE standard for directional flashing warning lamps on emergency and service vehicles.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 220px; background: #fff; border: 2px solid #E5E7EB; border-radius: 14px; padding: 14px 16px;\"\u003e\n\u003ch3 class=\"x4-h3\"\u003e13 Patterns + Sync\u003c\/h3\u003e\n\u003cp style=\"font-size: 14.5px; line-height: 1.5; color: #5F6670; margin: 0;\"\u003eSteady-on plus 13 strobe patterns. Sync multiple units to flash together or alternate side to side.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 220px; background: #fff; border: 2px solid #E5E7EB; border-radius: 14px; padding: 14px 16px;\"\u003e\n\u003ch3 class=\"x4-h3\"\u003e12V or 24V\u003c\/h3\u003e\n\u003cp style=\"font-size: 14.5px; line-height: 1.5; color: #5F6670; margin: 0;\"\u003eRuns on 10–30V DC, so it works on pickups, service bodies, and heavy trucks with no changes.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-tiw\"\u003e\n\u003cdiv class=\"x4-tiw-img\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-4Amber_White.png?v=1768577056\" alt=\"XDR-4 amber and white emergency strobe lights\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"x4-tiw-txt\"\u003e\n\u003ch3 class=\"x4-h3\" style=\"font-size: 20px !important;\"\u003eUltra Slim, Stealthy Design\u003c\/h3\u003e\n\u003cp style=\"font-size: 15.5px; line-height: 1.55; margin: 0;\"\u003eAt just 3-7\/8\" long, the XDR-4 fits the tightest spots in grilles, bumpers, deck lids, and headache racks, and gives you a clean, modern look. It surface mounts with two M4 bolts and a vibration foam pad. Need to mount it sideways? Add our \u003ca href=\"\/products\/xdr-4-5-90-degree-bracket\"\u003e90° mounting bracket\u003c\/a\u003e.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-tiw x4-rev\"\u003e\n\u003cdiv class=\"x4-tiw-img\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-4Red_Blue.png?v=1768577056\" alt=\"XDR-4 red and blue emergency strobe lights\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"x4-tiw-txt\"\u003e\n\u003ch3 class=\"x4-h3\" style=\"font-size: 20px !important;\"\u003ePowerful Warning Output\u003c\/h3\u003e\n\u003cp style=\"font-size: 15.5px; line-height: 1.55; margin: 0;\"\u003eFour high-intensity LEDs push 20W through an ultra-wide 120° pattern that stays visible day and night. Choose from 13 flash patterns or steady-on, and sync multiple heads for a coordinated, professional warning setup on any vehicle.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-tiw\"\u003e\n\u003cdiv class=\"x4-tiw-img\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/IMG_5955_WithouutBracket.jpg?v=1768577056\" alt=\"XDR-4 emergency strobe light\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"x4-tiw-txt\"\u003e\n\u003ch3 class=\"x4-h3\" style=\"font-size: 20px !important;\"\u003eRugged \u0026amp; Waterproof\u003c\/h3\u003e\n\u003cp style=\"font-size: 15.5px; line-height: 1.55; margin: 0;\"\u003eSealed to IP69K and rated from -40° to 145° F, the XDR-4 shrugs off rain, road salt, dust, and the pressure washer. It's built to run shift after shift in the conditions work trucks actually see, and it's backed by our limited lifetime warranty.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003cdetails\u003e\n\u003csummary\u003ePower \u0026amp; Performance\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"x4-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWattage\u003c\/th\u003e\n\u003ctd\u003e20W\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eAmp Draw\u003c\/th\u003e\n\u003ctd\u003e1.6A\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10–30V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCertification\u003c\/th\u003e\n\u003ctd\u003eSAE J595\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLEDs\u003c\/th\u003e\n\u003ctd\u003e4 high-intensity\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBeam\u003c\/th\u003e\n\u003ctd\u003eUltra wide, 120°\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eModes\u003c\/th\u003e\n\u003ctd\u003eSteady on + 13 strobe patterns, sync capable\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eDurability \u0026amp; Warranty\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"x4-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eWaterproof Rating\u003c\/th\u003e\n\u003ctd\u003eIP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Temp\u003c\/th\u003e\n\u003ctd\u003e-40° to 145° F (-40° to 62° C)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLife Expectancy\u003c\/th\u003e\n\u003ctd\u003e50,000 hours\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003eLimited lifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGuarantee\u003c\/th\u003e\n\u003ctd\u003e30-day money back\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWiring \u0026amp; Installation\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"x4-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLead Length\u003c\/th\u003e\n\u003ctd\u003e12\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWire Gauge\u003c\/th\u003e\n\u003ctd\u003e24 AWG\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConnector\u003c\/th\u003e\n\u003ctd\u003eOpen-end pigtail\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHarness Included?\u003c\/th\u003e\n\u003ctd\u003eNo\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eRecommended Fuse\u003c\/th\u003e\n\u003ctd\u003e5A\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eMounting\u003c\/th\u003e\n\u003ctd\u003eSurface mount, 2× M4 bolts + foam pad (included)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eGeneral \u0026amp; SKUs\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003ctable class=\"x4-spec\"\u003e\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003eLength\u003c\/th\u003e\n\u003ctd\u003e3-7\/8\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWeight\u003c\/th\u003e\n\u003ctd\u003e0.1 lb\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSingle Color\u003c\/th\u003e\n\u003ctd\u003eXDR-4S-A · XDR-4S-B · XDR-4S-R\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDual Color\u003c\/th\u003e\n\u003ctd\u003eXDR-4S-AW · XDR-4S-BW · XDR-4S-RB · XDR-4S-RW\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdiv class=\"x4-flex\" style=\"display: flex; flex-wrap: wrap; gap: 14px; margin: 18px 0 0; align-items: flex-start;\"\u003e\n\u003cdiv class=\"x4-col\" style=\"flex: 1 1 300px;\"\u003e\n\u003ch5 style=\"margin-top: 0;\"\u003eIn The Box\u003c\/h5\u003e\n\u003cdiv class=\"x4-flex\" style=\"display: flex; flex-wrap: wrap; gap: 8px;\"\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003e1 × XDR-4 Emergency Strobe\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eWith 12\" 24 AWG pigtail\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003eVibration Foam Insert\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eCushions the light against the mount\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003e2 × 1-1\/2\" M4 Bolts\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eWith washers and nuts\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-card\" style=\"flex: 1 1 100%; background: #F6F6F4; border: 2px solid #E5E7EB; border-radius: 12px; padding: 10px 14px;\"\u003e\n\u003cb style=\"color: #1C2026;\"\u003eInstructions\u003c\/b\u003e\u003cbr\u003e\u003cspan style=\"font-size: 13.5px; color: #5F6670;\"\u003eWiring and setup steps\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"x4-col x4-fig\" style=\"flex: 1 1 300px;\"\u003e\n\u003ch5 style=\"margin-top: 0;\"\u003eDimensions\u003c\/h5\u003e\n\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-4_Strobe_Dimensions.png?v=1768577056\" alt=\"XDR-4 emergency strobe light dimensions\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003cdetails\u003e\n\u003csummary\u003eIs the XDR-4 SAE approved?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eYes. The XDR-4 is SAE J595 approved for directional flashing warning lamps. Rules on which colors you can run vary by state and vehicle type, so check your local regulations, especially for red and blue.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWill it work on a 24V truck?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eYes. It runs on anything from 10V to 30V DC, so 12V and 24V systems both work with no changes.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCan I sync multiple XDR-4 lights?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eYes. Wire multiple heads together to flash in unison or alternate.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eDoes it come with a harness or switch?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eNo. Each light has a 12\" open-end pigtail that you wire to your own switch and a 5A fuse.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eHow do I mount it?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eIt surface mounts on any flat spot with the included M4 bolts and vibration foam pad. To mount it at a right angle, add the \u003ca href=\"\/products\/xdr-4-5-90-degree-bracket\"\u003eXDR-4 \u0026amp; XDR-5 90° mounting bracket\u003c\/a\u003e.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eWhat does the warranty cover?\u003c\/summary\u003e\n\u003cdiv class=\"content\"\u003e\u003cp style=\"margin: 0;\"\u003eOur limited lifetime warranty covers workmanship and material failures. Send the light back and once we verify the issue, we'll repair or replace it free of charge. Every order also comes with a 30-day money-back guarantee.\u003c\/p\u003e\u003c\/div\u003e\n\u003c\/details\u003e","brand":"Black Oak LED","offers":[{"title":"Amber","offer_id":42918400262205,"sku":"XDR-4S-A","price":37.45,"currency_code":"USD","in_stock":true},{"title":"Blue","offer_id":42918400294973,"sku":"XDR-4S-B","price":37.45,"currency_code":"USD","in_stock":true},{"title":"Red","offer_id":42918400327741,"sku":"XDR-4S-R","price":37.45,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White","offer_id":42918400360509,"sku":"XDR-4S-AW","price":37.45,"currency_code":"USD","in_stock":true},{"title":"Blue \u0026 White","offer_id":43408882860093,"sku":"XDR-4S-BW","price":37.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 Blue","offer_id":42918400426045,"sku":"XDR-4S-RB","price":37.45,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White","offer_id":42918400458813,"sku":"XDR-4S-RW","price":37.45,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-4Red_White_Blue_Amber.png?v=1768577056"},{"product_id":"xdr-4-5-90-degree-bracket","title":"XDR-4 \u0026 XDR-5 90 Degree Mounting Bracket","description":"\u003cstyle\u003e\n#MainContent .xb-eyebrow { display: block; font-family: Helvetica, Arial, sans-serif; font-size: 11px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; color: #1A3D5E; margin: 0 0 8px; }\n#MainContent .xb-h { display: block; font-family: Helvetica, Arial, sans-serif; font-size: 22px; font-weight: 700; line-height: 1.25; color: #111111; margin: 0 0 14px; }\n#MainContent .xb-p { display: block; font-size: 16px; line-height: 1.65; color: #333333; max-width: 70ch; margin: 0 0 16px; }\n#MainContent .xb-row { display: flex; flex-wrap: wrap; gap: 10px; margin: 22px 0 4px; }\n#MainContent .xb-card { display: block; box-sizing: border-box; flex: 1 1 190px; border: 1px solid #E0E0E0; border-top: 3px solid #1A3D5E; border-radius: 8px; background: #F9F9F9; padding: 14px 16px; }\n#MainContent .xb-k { display: block; font-size: 10.5px; font-weight: 700; letter-spacing: 1.4px; text-transform: uppercase; color: #1A3D5E; margin: 0 0 4px; }\n#MainContent .xb-v { display: block; font-family: Helvetica, Arial, sans-serif; font-size: 15.5px; font-weight: 700; color: #111111; }\n@media (max-width: 749px) {\n  #MainContent .xb-h { font-size: 19px; }\n  #MainContent .xb-row { gap: 8px; }\n}\n@media (max-width: 599px) {\n  #MainContent .xb-card { flex: 1 1 100%; }\n}\n\u003c\/style\u003e\n\u003cp class=\"xb-eyebrow\"\u003eAccessory\u003c\/p\u003e\n\u003ch3 class=\"xb-h\"\u003eFor the spots a flat mount can't reach\u003c\/h3\u003e\n\u003cp class=\"xb-p\"\u003eNot every good mounting spot is flat and facing forward. This 90 degree bracket lets you mount an XDR-4 or XDR-5 strobe on a perpendicular surface — a headache rack upright, the inside of a bumper, a push bar, the wall of a tool box — and still aim the light where it needs to point.\u003c\/p\u003e\n\u003cp class=\"xb-p\"\u003eIt bolts to the XDR-4 and XDR-5 at their standard M4 mounting points, so the light keeps its low-profile footprint and nothing changes about the wiring or the flash patterns.\u003c\/p\u003e\n\u003cdiv class=\"xb-row\"\u003e\n\u003cdiv class=\"xb-card\"\u003e\n\u003cspan class=\"xb-k\"\u003eFits\u003c\/span\u003e\u003cspan class=\"xb-v\"\u003eXDR-4 \u0026amp; XDR-5\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xb-card\"\u003e\n\u003cspan class=\"xb-k\"\u003eMounting\u003c\/span\u003e\u003cspan class=\"xb-v\"\u003e90° offset\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"xb-card\"\u003e\n\u003cspan class=\"xb-k\"\u003eQuantity\u003c\/span\u003e\u003cspan class=\"xb-v\"\u003eOne per light\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e","brand":"Black Oak LED","offers":[{"title":"Default Title","offer_id":43066744668221,"sku":"XDR-B90","price":15.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR90-DegreeBracket.png?v=1790794036"},{"product_id":"low-pro-emergency-bar-15-ft-controller-extension","title":"Low Pro Emergency Bar 15 Ft Controller Extension Cable","description":"\u003cp\u003eUpgrade your installation flexibility with this 15-foot Controller Extension Cable for the Low Pro Emergency Bar. Designed for longer vehicles or custom mounting setups, this extension gives you the extra reach you need without sacrificing durability or performance. Built with rugged, weather-resistant materials and plug-and-play connectors, it ensures a secure connection and reliable control of your bar from virtually any mounting location. Perfect for trucks, service vehicles, utility rigs, or any setup that requires additional cable length.\u003c\/p\u003e\n\u003cp\u003eThis cable extends the controller lead on the \u003ca href=\"\/products\/low-pro-emergency-light-bar\"\u003eLow Pro Emergency Light Bar\u003c\/a\u003e. See every size and color in our \u003ca href=\"\/collections\/emergency-light-bars\"\u003eemergency light bars\u003c\/a\u003e.\u003c\/p\u003e","brand":"Black Oak LED","offers":[{"title":"Default Title","offer_id":43098690453565,"sku":"LPE-HE-15","price":25.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/extension.webp?v=1763499030"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/collections\/LPE-17-inch-emergency-light-bar_ff49bcdc-6cc9-43cd-abe5-b81ba2b2bbee.png?v=1793065047","url":"https:\/\/www.blackoakled.com\/collections\/volunteer-firefighter-lights.oembed","provider":"Black Oak LED","version":"1.0","type":"link"}