{"title":"LED Warning Lights","description":"\u003cp\u003eA work truck does not have the right of way. That one fact decides everything about its lighting. A police car asks traffic to yield; a tow truck, a plow or a utility bucket asks traffic to notice it and go around, usually while it is stopped in or beside a live lane with a person working on the far side of it. Amber is the color every state assigns to that job, it needs no agency authorization, and it is what a DOT inspector, a tow dispatcher and a site safety officer expect to see. Black Oak builds amber warning lighting on the same Low Pro and XDR platform as its police and fire lines: amber and amber and white light bars from 11 to 68 inches, XDR surface mount strobes for the grille and the rear, and XDR amber beacons for plows, forklifts and trailers. The Low Pro is certified to SAE J845 and SAE J595 Class 1 and sealed to IP69K, which is the difference between a bar that survives brine and a pressure wash and one that fogs by February. Designed and engineered in Sarasota, Florida.\u003c\/p\u003e\n\u003cdiv data-lowpro-player hidden\u003e\u003c\/div\u003e\n\u003ch2\u003eShop warning lights by use\u003c\/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/tow-truck-light-bars\"\u003eTow truck light bars\u003c\/a\u003e: amber and amber and white bars from 11 to 68 inches, with the rear-facing tow package on the 55, 61 and 68 inch for rollbacks and wreckers.\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/amber-light-bars\"\u003eAmber light bars\u003c\/a\u003e: the full Low Pro range in solid amber for utility, construction, escort and municipal trucks.\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/snow-plow-lights\"\u003eSnow plow lights\u003c\/a\u003e: amber bars, strobes and beacons for plow trucks, with the flood lighting that shows the blade edge and the curb line.\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/construction-led-lights\"\u003eConstruction lights\u003c\/a\u003e: amber warning plus work and scene lighting for job site trucks and equipment.\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/security-vehicle-lights\"\u003eSecurity vehicle lights\u003c\/a\u003e: amber bars, mini bars and strobes for private security, campus and parking patrol, with the state rules on amber and blue.\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/led-beacon-lights\"\u003eBeacon lights\u003c\/a\u003e: XDR-2 and XDR-4 amber beacons, magnetic or bolt-down, for single-point 360 degree warning.\u003c\/li\u003e\n\u003cli\u003e\n\u003ca href=\"\/collections\/led-emergency-strobe-lights\"\u003eEmergency strobe lights\u003c\/a\u003e: XDR-5 and XDR-4 heads for the grille, the rear and the corners of a service body.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch2\u003eWhy amber, and why amber and white\u003c\/h2\u003e\n\u003cp\u003eAmber sits in the part of the spectrum that scatters least in fog, rain and snow, which is why it is the color of hazard lighting in every jurisdiction and the color plow and tow operators run in the worst weather. It also carries no legal meaning beyond caution, so a driver who sees it slows and passes rather than pulling over, which is exactly what a work truck wants. Amber and white is the most common tow and plow configuration because the two colors do different jobs: amber is the warning, white is the work light and the daylight punch. On a dual-color Low Pro every module can show either color, so the same bar flashes amber on the way to the scene, holds amber steady on the driver side while the passenger side flashes white in the steady-plus-flash patterns, and switches the full perimeter to the white Halo scene light when the hook goes on. Run the simulator above to see what each pattern does before you pick one for the fleet.\u003c\/p\u003e\n\u003ch2\u003eAmber warning light laws\u003c\/h2\u003e\n\u003cp\u003eAmber is permitted on vehicles doing work that requires warning in every state, and most states do not require a permit for it. The variation is in who may run it while moving on a public road: some states limit amber to named vehicle classes (tow, escort, utility, rural mail, plow), some allow amber on any vehicle while it is stopped and working, and a few issue permits for escort vehicles. A handful of states allow amber and blue on tow and plow trucks for rear visibility, and that is the one combination to check before ordering, because blue is a law enforcement color almost everywhere else. The \u003ca href=\"\/blogs\/black-oak-led-blog\/amber-warning-light-laws-by-state\"\u003eamber warning light laws by state\u003c\/a\u003e guide lists every state, and the \u003ca href=\"\/blogs\/black-oak-led-blog\/tow-truck-light-bar-requirements\"\u003etow truck light bar requirements\u003c\/a\u003e guide covers the recovery side.\u003c\/p\u003e\n\u003ch2\u003eWhich warning light for which truck\u003c\/h2\u003e\n\u003cp\u003eRollbacks and wreckers take the 55, 61 or 68 inch bar with the tow package, which adds rear-facing modules that light the deck and the hook-up and face the traffic coming up behind a stopped recovery. Plow trucks take the 43 or 49 inch on headache rack brackets, above the rack and the snow that packs behind it, or a magnetic XDR beacon where the truck plows part time and goes back to stock in spring. Utility and construction trucks take the 43 inch on the cab, or the 11 and 17 inch \u003ca href=\"\/collections\/led-mini-light-bars\"\u003emini bars\u003c\/a\u003e on the headache rack where a full bar would sit behind the boom. Pickups that need to be seen on a job site and clean on the weekend take a magnetic 17 or 30 inch. Equipment, forklifts and trailers take an XDR beacon, because a single point of 360 degree amber is all a slow machine needs. Measure the flat roof width between the rails and run the bar about two inches short of that on each side. Magnetic feet are offered only on the 11 to 43 inch bars; longer bars ship on door jamb or headache rack brackets.\u003c\/p\u003e\n\u003ch2\u003eStrobe, bar or beacon\u003c\/h2\u003e\n\u003cp\u003eThese are three different coverage shapes, not three grades of the same thing. A beacon is a single point of 360 degree light: enough for a forklift, a trailer or a tractor that moves slowly and is never on a highway shoulder. A light bar is a line of modules around the full perimeter of the housing, which gives presence at distance and the traffic advisor and scene light a stopped work truck uses. A strobe head is directional, 120 degrees wide, and goes where the bar cannot be seen: the grille for oncoming traffic, the rear of a service body for the car backing out of an aisle, the corners of a flatbed that hide the cab bar from the side. Most professional builds run a bar plus two to four strobes. The question is never which one; it is which angles the truck is blind from, and what fills them.\u003c\/p\u003e\n\u003ch2\u003eBrine, pressure washing and wiring\u003c\/h2\u003e\n\u003cp\u003eThe enemy of a work truck light is not the weather, it is the end of the shift: salt brine dried onto the lens, then a pressure washer at the yard. IP69K is the rating for close-range high-pressure, high-temperature washdown, and it is the seal on every Low Pro bar and XDR head. On the wiring side, a 49 inch Low Pro draws 30 amps at full output on 12 volts, a 43 inch 27, a 30 inch 20, and each XDR head adds 1.5 to 1.6 amps on its own 5 amp fuse; size the circuit for everything at once. The bar runs a 9 foot power lead and a 12 foot controller lead, with 22 and 27 foot controller leads selectable at checkout for a long wheelbase or a cab-to-body run. Every bar ships with its controller, wiring and the feet for the mount you choose, and a favorite pattern programmed into the controller comes back every time the truck starts.\u003c\/p\u003e\n\u003ch2\u003eComplete the work truck\u003c\/h2\u003e\n\u003cp\u003eWarning lighting gets a work truck noticed. The rest of the rig is forward and scene light: a \u003ca href=\"\/collections\/led-light-bars\"\u003eforward light bar\u003c\/a\u003e on the plow frame or bumper, \u003ca href=\"\/collections\/led-light-pods\"\u003editch lights\u003c\/a\u003e on the A-pillars, and rear-facing diffused pods on the headache rack for the bed and the hitch. Black Oak's off-road and work lines run on the same voltage and brackets as the warning line, so the whole truck comes from one catalog. Forward-emitting amber pods and bars for fog and dust are a different product from amber warning lights and live in the off-road range.\u003c\/p\u003e\n\u003ch2\u003eFleet orders\u003c\/h2\u003e\n\u003cp\u003eTow operators, municipal fleets, utilities and contractors get volume pricing, mixed configurations on one order, SAE certification documentation and installer referrals. Call 1-800-348-1287 or \u003ca href=\"\/pages\/fleet-pricing\"\u003erequest fleet pricing\u003c\/a\u003e. Warning lights are one part of the \u003ca href=\"\/collections\/led-emergency-lights\"\u003eBlack Oak emergency lighting\u003c\/a\u003e range, alongside \u003ca href=\"\/collections\/police-lights\"\u003epolice lights\u003c\/a\u003e and \u003ca href=\"\/collections\/fire-ems-lights\"\u003efire and EMS lights\u003c\/a\u003e. Backed by a limited lifetime warranty, see each product page for details.\u003c\/p\u003e\n\u003ch3\u003eDo I need a permit to run amber warning lights?\u003c\/h3\u003e\n\u003cp\u003eIn most states, no. Amber is the one warning color that needs no agency authorization, though some states limit its use while moving to named vehicle classes. The state guide lists each one.\u003c\/p\u003e\n\u003ch3\u003eShould a tow truck run amber or amber and white?\u003c\/h3\u003e\n\u003cp\u003eAmber and white for a truck that works roadsides in daylight: amber is the warning layer, white is the daylight punch in the flash itself, and a dual-color Low Pro runs both from one controller. Solid amber is right for utility and municipal trucks that only need to warn. The white Halo scene light is on every Low Pro in either colorway.\u003c\/p\u003e\n\u003ch3\u003eIs a beacon enough for a plow truck?\u003c\/h3\u003e\n\u003cp\u003eFor a part-time pickup that plows a lot at 5 mph, a magnetic XDR beacon is enough. A truck that plows a road at 20 mph with traffic behind it needs the bar, because the beacon has no traffic advisor and no rear reach at highway closing speeds.\u003c\/p\u003e\n\u003ch3\u003eCan I add strobes later to a truck that already has a bar?\u003c\/h3\u003e\n\u003cp\u003eYes. XDR heads wire to their own switch and fuse, mount with two screws, and share the pattern family with the Low Pro, so a grille pair or a rear pair can be added any time the truck picks up a new blind angle.\u003c\/p\u003e","products":[{"product_id":"new-xdr48-emergency-light-bar","title":"48 Inch XDR-48 Emergency Light Bar, Up to 3 Color","description":"\u003c!-- Intro Section --\u003e\n\u003cp data-start=\"70\" data-end=\"223\"\u003e\u003cspan class=\"relative -mx-px my-[-0.2rem] rounded px-px py-[0.2rem] transition-colors duration-100 ease-in-out\"\u003eThe\u003cstrong data-start=\"4\" data-end=\"27\"\u003e XDR-48 Emergency Light Bar\u003c\/strong\u003e is engineered for high-performance illumination in demanding environments. With streamlined, low-profile styling and rugged IP68-rated housing, it delivers brilliant visibility while resisting harsh outdoor conditions\u003c\/span\u003e. \u003cspan class=\"relative -mx-px my-[-0.2rem] rounded px-px py-[0.2rem] transition-colors duration-100 ease-in-out\"\u003eCompatible with 12 V to 24 V systems, this bar offers a powerful and energy-efficient solution for emergency lighting, construction work, and off-road safety applications.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003ePair it with matching XDR surface strobes from our \u003ca href=\"\/collections\/led-emergency-strobe-lights\"\u003eemergency strobe lights\u003c\/a\u003e collection, or compare every bar size in \u003ca href=\"\/collections\/emergency-light-bars\"\u003eemergency light bars\u003c\/a\u003e.\u003c\/p\u003e\n\u003cp data-start=\"70\" data-end=\"223\"\u003e \u003c\/p\u003e\n\u003cp data-start=\"70\" data-end=\"223\"\u003e\u003cspan class=\"relative -mx-px my-[-0.2rem] rounded px-px py-[0.2rem] transition-colors duration-100 ease-in-out\"\u003eFeaturing cutting-edge LED technology the XDR-48 Emergency Bar achieves exceptional brightness with minimal power draw. It meets SAE standards and comes with a robust 5‑year warranty—ideal for professional or fleet deployment.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp data-start=\"70\" data-end=\"223\"\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\u003e\n\u003cmeta charset=\"utf-8\"\u003e \u003cstrong data-is-only-node=\"\" data-end=\"24\" data-start=\"0\"\u003eHigh Efficiency LEDs\u003c\/strong\u003e — Advanced LEDs provide bright, uniform output with low amp draw\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e \u003cstrong data-is-only-node=\"\" data-end=\"27\" data-start=\"0\"\u003eFlexible Flash Patterns\u003c\/strong\u003e — 35+ different flash patterns modes\n\u003cul\u003e\n\u003cli\u003eHalf and Half\u003c\/li\u003e\n\u003cli\u003eAlternating colors\u003c\/li\u003e\n\u003cli\u003eEvery other alternating color\u003c\/li\u003e\n\u003cli\u003eAnd many more! \u003c\/li\u003e\n\u003cli\u003eAll Colors all the way around\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e \u003cstrong data-is-only-node=\"\" data-end=\"25\" data-start=\"0\"\u003eCertified Performance\u003c\/strong\u003e — SAE J845 Class 1 and ECE R65 compliance for emergency service use\u003c\/li\u003e\n\u003cli\u003e\n\u003cmeta charset=\"utf-8\"\u003e \u003cstrong data-end=\"730\" data-start=\"705\"\u003eDurability \u0026amp; Warranty\u003c\/strong\u003e — IP68 rated for water\/dust exposure; backed by a full 5‑year warranty and 30‑day satisfaction guarantee\u003cmeta charset=\"utf-8\"\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong data-end=\"730\" data-start=\"705\"\u003eVersatile Operating Range\u003c\/strong\u003e — Compatible with 12-28V DC operating range\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong data-end=\"730\" data-start=\"705\"\u003eNo Software, no unlock fees\u003c\/strong\u003e — All features are built into the controller\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\u003eEmergency Light Bar\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eWire Harness\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eController\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eJamb Mount Hardware\u003c\/b\u003e\u003c\/li\u003e\n\u003cli\u003e\u003cb\u003eStandard Mounting Feet\u003c\/b\u003e\u003c\/li\u003e\n\u003c\/ul\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\"\u003e\n\u003cdiv class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-48_Flash_Pattern_Graphic_Sep_14.jpg?v=1757950957\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eFully Customizable Flash Patterns\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003eTake control of your lighting with 35 different flash modes and controller settings—switch between \u003cstrong\u003esteady, strobe, half and half, or alternating\u003c\/strong\u003e patterns to match any situation. Run all these flash patters on 1, 2, or 3 colors!\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\/IMG_4160.jpg?v=1760102779\" alt=\"\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eBuilt for Daily Service\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eBuilt with marine-grade construction and a rugged housing, this light bar is designed to thrive in rain, mud, snow, or sun—no matter where you take it. IP-68 rated with a 5-year warranty, designed for duty.\u003cbr\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"text-image-wrap\"\u003e\n\u003cdiv style=\"text-align: start;\" class=\"image-wrap\"\u003e\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-48_Flash_GIF.gif?v=1757515648\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eSerious Light Output\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003ePacked with high-efficiency LEDs, the XDR-48 Emergency Bar delivers powerful, attention-grabbing flashes designed to maximize visibility and keep you seen. Whether alerting traffic, marking a roadside hazard, or patrolling in low-light conditions, its wide-angle illumination ensures you stand out and stay safe.\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\u003cimg alt=\"\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/IMG_4229.jpg?v=1760104697\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"text-wrap\"\u003e\n\u003ch3 class=\"text-title\"\u003e\n\u003cmeta charset=\"utf-8\"\u003eCertified \u003cmeta charset=\"utf-8\"\u003eSafety Standards\u003c\/h3\u003e\n\u003cp class=\"text-content\"\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cmeta charset=\"utf-8\"\u003eMeets strict SAE J845 Class 1 and ECE R65 standards, ensuring reliable, road-compliant performance trusted by professionals worldwide.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ch5\u003eSpecs\u003c\/h5\u003e\n\u003c!-- Specs chart Section --\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  }\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\u003e396\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eTotal Amp Draw\u003c\/th\u003e\n\u003ctd\u003e20A @ 12V\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eOperating Voltage\u003c\/th\u003e\n\u003ctd\u003e10–28V DC\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eLED Diode Quantity\u003c\/th\u003e\n\u003ctd\u003e132\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFlash Patterns\u003c\/th\u003e\n\u003ctd\u003e35\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\u003eIP68\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eWarranty\u003c\/th\u003e\n\u003ctd\u003e5 Year\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\u003eWire Harness Length\u003c\/th\u003e\n\u003ctd\u003e11' to Controller\u003cbr\u003e12' to Battery Terminal\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eFuse Size\u003c\/th\u003e\n\u003ctd\u003e15 Amp\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\u003e22.3\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eXDR-48\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\/XDR-48_Dimensions_31af96a1-62e2-4c5b-b2da-cbcda8088594.png?v=1757598377\"\u003e\u003c\/p\u003e\n\u003ch5\u003eFAQ\u003c\/h5\u003e\n\u003c!-- Specs chart Section --\u003e\n\u003cp data-end=\"948\" data-start=\"677\"\u003e\u003cstrong data-end=\"725\" data-start=\"677\"\u003eHow do I know your lights are top quality?\u003c\/strong\u003e\u003cbr data-end=\"728\" data-start=\"725\"\u003eOur lights are tested and certified with \u003cstrong\u003eIP 68 \u003c\/strong\u003e\u003cstrong data-end=\"808\" data-start=\"769\"\u003eratings\u003c\/strong\u003e — the highest standards in waterproofing, dust resistance, and impact durability. These ratings ensure your lights are protected against:\u003c\/p\u003e\n\u003cul data-end=\"1047\" data-start=\"949\"\u003e\n\u003cli data-end=\"974\" data-start=\"949\"\u003e\n\u003cp data-end=\"974\" data-start=\"951\"\u003eWater Intrusion\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli data-end=\"998\" data-start=\"975\"\u003e\n\u003cp data-end=\"998\" data-start=\"977\"\u003eHigh-pressure spray\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli data-end=\"1023\" data-start=\"999\"\u003e\n\u003cp data-end=\"1023\" data-start=\"1001\"\u003eExtreme temperatures\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli data-end=\"1047\" data-start=\"1024\"\u003e\n\u003cp data-end=\"1047\" data-start=\"1026\"\u003eShock and vibration\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp data-end=\"1129\" data-start=\"1049\"\u003eOnly the toughest gear passes these tests — and Black Oak lights do, every time.\u003c\/p\u003e\n\u003cp data-end=\"1129\" data-start=\"1049\"\u003e \u003c\/p\u003e\n\u003cp data-end=\"1427\" data-start=\"1136\"\u003e\u003cstrong data-end=\"1172\" data-start=\"1136\"\u003eWhat does your warranty cover?\u003c\/strong\u003e\u003cbr data-end=\"1175\" data-start=\"1172\"\u003eWe stand behind our products with a \u003cstrong data-end=\"1240\" data-start=\"1211\"\u003elimited 5-year warranty\u003c\/strong\u003e.\u003cbr data-end=\"1244\" data-start=\"1241\"\u003eIf your light fails due to a defect in \u003cstrong data-end=\"1311\" data-start=\"1283\"\u003ematerials or workmanship\u003c\/strong\u003e, just send it back. Once verified, we’ll \u003cstrong data-end=\"1392\" data-start=\"1353\"\u003erepair or replace it free of charge\u003c\/strong\u003e — no hassle, no hidden conditions.\u003c\/p\u003e\n\u003cp data-end=\"1561\" data-start=\"1434\"\u003e \u003c\/p\u003e\n\u003cp data-end=\"1561\" data-start=\"1434\"\u003e\u003cstrong data-end=\"1480\" data-start=\"1434\"\u003eHow long will my package take to arrive?\u003c\/strong\u003e\u003cbr data-end=\"1483\" data-start=\"1480\"\u003eMost orders ship directly from our facility within \u003cstrong data-end=\"1546\" data-start=\"1534\"\u003e1 business day\u003c\/strong\u003e of purchase.\u003c\/p\u003e\n\u003cul data-end=\"1811\" data-start=\"1562\"\u003e\n\u003cli data-end=\"1643\" data-start=\"1562\"\u003e\n\u003cp data-end=\"1643\" data-start=\"1564\"\u003e\u003cstrong data-end=\"1583\" data-start=\"1564\"\u003eCustom brackets\u003c\/strong\u003e may ship separately and could have additional lead times.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli data-end=\"1715\" data-start=\"1644\"\u003e\n\u003cp data-end=\"1715\" data-start=\"1646\"\u003eIf there’s ever a delay, we’ll contact you right away with options.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003cli data-end=\"1811\" data-start=\"1716\"\u003e\n\u003cp data-end=\"1811\" data-start=\"1718\"\u003e\u003cstrong data-end=\"1742\" data-start=\"1718\"\u003eInternational orders\u003c\/strong\u003e may be subject to additional shipping fees, especially for brackets.\u003c\/p\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Black Oak LED","offers":[{"title":"Amber","offer_id":42550125330493,"sku":"XDR-48-A","price":1248.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Blue","offer_id":42550125363261,"sku":"XDR-48-AB","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Green","offer_id":42557238771773,"sku":"XDR-48-AG","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Red","offer_id":42557238804541,"sku":"XDR-48-AR","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ White","offer_id":42557238837309,"sku":"XDR-48-AW","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"Red \/ Blue","offer_id":42557238870077,"sku":"XDR-48-RB","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"Red \/ White","offer_id":42557238902845,"sku":"XDR-48-RW","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"White \/ Green","offer_id":42557238935613,"sku":"XDR-48-WG","price":1373.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Red \/ Blue","offer_id":42557238968381,"sku":"XDR-48-ARB","price":1498.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Red \/ White","offer_id":42557239001149,"sku":"XDR-48-ARW","price":1498.75,"currency_code":"USD","in_stock":true},{"title":"Amber \/ White \/ Green","offer_id":42557239033917,"sku":"XDR-48-ARG","price":1498.75,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR48-Side-View-Emergency-Bar.jpg?v=1757598388"},{"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-68-low-pro-emergency-light-bar","title":"68\" 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; 68\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\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\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;\"\u003e68\"\u003c\/span\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=1761226007\"\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\u003e24 Lbs\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E68-\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\/68_Inch_Low_Pro_Dimensions.png?v=1762971701\"\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":42592586203197,"sku":"LP-E68-A","price":1621.25,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788978131005,"sku":"LP-E68-A","price":1647.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788978163773,"sku":"LP-E68-A","price":1651.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592586235965,"sku":"LP-E68-A","price":1671.25,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788978196541,"sku":"LP-E68-A","price":1697.2,"currency_code":"USD","in_stock":true},{"title":"Amber \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788978229309,"sku":"LP-E68-A","price":1701.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":43408885612605,"sku":"LP-E68-AB-T","price":1746.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":43408885645373,"sku":"LP-E68-AB-T","price":1772.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":43408885678141,"sku":"LP-E68-AB-T","price":1776.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":43408885710909,"sku":"LP-E68-AB-T","price":1796.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":43408885743677,"sku":"LP-E68-AB-T","price":1822.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Blue With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":43408885776445,"sku":"LP-E68-AB-T","price":1826.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42592586268733,"sku":"LP-E68-AR-T","price":1746.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788978262077,"sku":"LP-E68-AR-T","price":1772.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788978294845,"sku":"LP-E68-AR-T","price":1776.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592586301501,"sku":"LP-E68-AR-T","price":1796.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788978327613,"sku":"LP-E68-AR-T","price":1822.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 Red With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788978360381,"sku":"LP-E68-AR-T","price":1826.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42592586399805,"sku":"LP-E68-AW-T","price":1746.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42788978393149,"sku":"LP-E68-AW-T","price":1772.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42788978425917,"sku":"LP-E68-AW-T","price":1776.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42592586432573,"sku":"LP-E68-AW-T","price":1796.25,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42788978458685,"sku":"LP-E68-AW-T","price":1822.2,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42788978491453,"sku":"LP-E68-AW-T","price":1826.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ Standard - 12' Lead","offer_id":42988844384317,"sku":"LP-E68-RW-T","price":1746.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ 22' Total - (12' + 10' Extension)","offer_id":42988844417085,"sku":"LP-E68-RW-T","price":1772.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Door Jamb \/ 27' Total - (12' + 15' Extension)","offer_id":42988844449853,"sku":"LP-E68-RW-T","price":1776.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ Standard - 12' Lead","offer_id":42988844482621,"sku":"LP-E68-RW-T","price":1796.25,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ 22' Total - (12' + 10' Extension)","offer_id":42988844515389,"sku":"LP-E68-RW-T","price":1822.2,"currency_code":"USD","in_stock":true},{"title":"Red \u0026 White With Tow Package \/ Headache Rack (4x) \/ 27' Total - (12' + 15' Extension)","offer_id":42988844548157,"sku":"LP-E68-RW-T","price":1826.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":"xdr2_beacon","title":"XDR-2 Mini Amber Warning LED Beacon","description":"\u003cdiv class=\"bol-beacon\"\u003e\n\u003cstyle\u003e\n\/* Scoped to .bol-beacon — matches Black Oak LED site styling, won't collide with theme *\/\n.bol-beacon{--ink:#111;--ink2:#3a424e;--muted:#6a7482;--line:#e4e7ec;--bg:#f5f5f5;--soft:#f8f8f6;--yellow:#FEB902;--yellow2:#F5B31B;--navy:#1A3D5E;font-family:Roboto,\"Helvetica Neue\",Arial,sans-serif;color:var(--ink);line-height:1.6;font-size:16px;max-width:1000px;margin:0 auto;}\n.bol-beacon *{box-sizing:border-box;}\n.bol-beacon h2,.bol-beacon h3{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;line-height:1.2;margin:0;}\n.bol-beacon p{margin:0 0 14px;color:var(--ink2);}\n\n\/* Hero *\/\n.bol-beacon .bf-hero{background:linear-gradient(155deg,#0c0c0c 0%,#14171c 55%,#1A3D5E 130%);color:#fff;border-radius:12px;padding:34px 32px;position:relative;overflow:hidden;}\n.bol-beacon .bf-hero:after{content:\"\";position:absolute;right:-70px;top:-70px;width:280px;height:280px;background:radial-gradient(circle,rgba(254,185,2,.28),transparent 62%);}\n.bol-beacon .bf-kicker{display:inline-block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--yellow);font-weight:800;margin-bottom:10px;}\n.bol-beacon .bf-hero h2{font-size:30px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;}\n.bol-beacon .bf-hero .bf-sub{margin-top:12px;font-size:16px;color:#c7d0dc;max-width:640px;position:relative;}\n.bol-beacon .bf-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px;position:relative;}\n.bol-beacon .bf-chip{background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.16);color:#eaf0f7;font-size:13px;font-weight:600;padding:7px 13px;border-radius:999px;}\n.bol-beacon .bf-chip.is-y{background:var(--yellow);border-color:var(--yellow);color:var(--navy);font-weight:700;}\n\n\/* Spec strip *\/\n.bol-beacon .bf-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0;}\n.bol-beacon .bf-stat{background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:16px 14px;text-align:center;}\n.bol-beacon .bf-stat .bf-ic{width:30px;height:30px;margin:0 auto 8px;display:block;color:var(--yellow2);}\n.bol-beacon .bf-stat b{display:block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:20px;font-weight:800;color:var(--ink);}\n.bol-beacon .bf-stat span{font-size:12.5px;color:var(--muted);}\n\n\/* Section *\/\n.bol-beacon .bf-sec{margin:26px 0;}\n.bol-beacon .bf-sec h3{font-size:20px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;margin-bottom:12px;display:flex;align-items:center;gap:9px;}\n.bol-beacon .bf-sec h3:before{content:\"\";width:5px;height:20px;border-radius:3px;background:var(--yellow);display:inline-block;}\n\n\/* Accordion *\/\n.bol-beacon details{border:1px solid var(--line);border-radius:12px;margin-bottom:12px;background:#fff;overflow:hidden;}\n.bol-beacon details[open]{border-color:#cdd4dd;}\n.bol-beacon summary{list-style:none;cursor:pointer;padding:17px 20px;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:16.5px;font-weight:700;color:var(--ink);display:flex;align-items:center;justify-content:space-between;gap:12px;}\n.bol-beacon summary::-webkit-details-marker{display:none;}\n.bol-beacon summary .bf-lbl{display:flex;align-items:center;gap:11px;}\n.bol-beacon summary .bf-lbl svg{width:20px;height:20px;color:var(--yellow2);flex:none;}\n.bol-beacon .bf-plus{width:22px;height:22px;position:relative;flex:none;transition:transform .2s;}\n.bol-beacon .bf-plus:before,.bol-beacon .bf-plus:after{content:\"\";position:absolute;background:var(--muted);border-radius:2px;}\n.bol-beacon .bf-plus:before{left:4px;right:4px;top:10px;height:2px;}\n.bol-beacon .bf-plus:after{top:4px;bottom:4px;left:10px;width:2px;}\n.bol-beacon details[open] .bf-plus{transform:rotate(135deg);}\n.bol-beacon .bf-body{padding:2px 20px 20px;border-top:1px solid var(--line);}\n\n\/* Feature list *\/\n.bol-beacon .bf-list{list-style:none;margin:14px 0 0;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:12px 22px;}\n.bol-beacon .bf-list li{position:relative;padding-left:28px;font-size:14.5px;color:var(--ink2);}\n.bol-beacon .bf-list li b{color:var(--ink);}\n.bol-beacon .bf-list li:before{content:\"\";position:absolute;left:0;top:3px;width:17px;height:17px;border-radius:50%;background:var(--yellow);\n  -webkit-mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/12px no-repeat;\n  mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/12px no-repeat;}\n\n\/* In the box *\/\n.bol-beacon .bf-box{list-style:none;margin:14px 0 0;padding:0;}\n.bol-beacon .bf-box li{display:flex;align-items:center;gap:13px;padding:13px 0;border-bottom:1px dashed var(--line);font-size:15px;}\n.bol-beacon .bf-box li:last-child{border-bottom:none;}\n.bol-beacon .bf-qty{flex:none;min-width:40px;height:40px;border-radius:9px;background:var(--navy);border:1px solid var(--navy);display:flex;align-items:center;justify-content:center;font-weight:800;color:var(--yellow);font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;}\n.bol-beacon .bf-box b{color:var(--ink);}\n.bol-beacon .bf-box small{display:block;color:var(--muted);font-size:12.5px;}\n.bol-beacon .bf-note{margin-top:14px;font-size:13.5px;color:var(--muted);background:#fffaf0;border:1px solid #f6e2b8;border-radius:9px;padding:11px 14px;}\n\n\/* Specs table *\/\n.bol-beacon .bf-specs{width:100%;border-collapse:collapse;margin-top:14px;font-size:14.5px;}\n.bol-beacon .bf-specs tr{border-bottom:1px solid var(--line);}\n.bol-beacon .bf-specs td{padding:11px 6px;}\n.bol-beacon .bf-specs td:first-child{color:var(--muted);}\n.bol-beacon .bf-specs td:last-child{text-align:right;font-weight:700;color:var(--ink);}\n\n\/* Cert badges *\/\n.bol-beacon .bf-certs{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px;}\n.bol-beacon .bf-cert{background:var(--navy);color:#fff;border-radius:8px;padding:9px 14px;font-size:13px;font-weight:700;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;letter-spacing:.3px;}\n\n\/* Applications *\/\n.bol-beacon .bf-apps{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px;}\n.bol-beacon .bf-app{background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:8px 13px;font-size:13.5px;font-weight:600;color:var(--ink2);}\n\n\/* Also available note *\/\n.bol-beacon .bf-avail{margin:0 0 4px;padding:12px 16px;background:var(--soft);border:1px solid var(--line);border-left:4px solid var(--yellow);border-radius:10px;font-size:14.5px;color:var(--ink2);}\n.bol-beacon .bf-avail a{color:var(--navy);font-weight:800;text-decoration:none;}\n.bol-beacon .bf-avail a:hover{text-decoration:underline;}\n\n\/* Setup options *\/\n.bol-beacon .bf-opts{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px;}\n.bol-beacon .bf-opt{border:1px solid var(--line);border-radius:12px;padding:20px;background:#fff;}\n.bol-beacon .bf-opt.is-feature{border-color:var(--yellow);box-shadow:0 0 0 1px var(--yellow);}\n.bol-beacon .bf-opt-tag{display:inline-block;font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--navy);background:var(--bg);border:1px solid var(--line);border-radius:999px;padding:4px 11px;margin-bottom:10px;}\n.bol-beacon .bf-opt.is-feature .bf-opt-tag{background:var(--yellow);border-color:var(--yellow);}\n.bol-beacon .bf-opt-name{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;font-weight:800;color:var(--ink);margin-bottom:4px;}\n.bol-beacon .bf-opt-sub{font-size:13.5px;color:var(--muted);margin:0 0 12px;}\n.bol-beacon .bf-oplist{list-style:none;margin:0;padding:0;}\n.bol-beacon .bf-oplist li{position:relative;padding:7px 0 7px 26px;font-size:14px;color:var(--ink2);border-top:1px solid var(--line);}\n.bol-beacon .bf-oplist li:first-child{border-top:none;}\n.bol-beacon .bf-oplist li b{color:var(--ink);}\n.bol-beacon .bf-oplist li:before{content:\"\";position:absolute;left:0;top:10px;width:16px;height:16px;border-radius:50%;background:var(--yellow);\n  -webkit-mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/11px no-repeat;\n  mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/11px no-repeat;}\n\n\/* Trust *\/\n.bol-beacon .bf-trust{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:6px;}\n.bol-beacon .bf-tcard{border:1px solid var(--line);border-radius:12px;padding:18px;display:flex;gap:14px;align-items:flex-start;background:#fff;}\n.bol-beacon .bf-tcard svg{width:30px;height:30px;color:var(--navy);flex:none;}\n.bol-beacon .bf-tcard b{display:block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:15.5px;margin-bottom:3px;}\n.bol-beacon .bf-tcard span{font-size:13.5px;color:var(--muted);}\n\n@media(max-width:720px){\n  .bol-beacon .bf-hero{padding:26px 22px;}\n  .bol-beacon .bf-hero h2{font-size:23px;}\n  .bol-beacon .bf-strip{grid-template-columns:1fr 1fr;}\n  .bol-beacon .bf-list{grid-template-columns:1fr;}\n  .bol-beacon .bf-trust{grid-template-columns:1fr;}\n  .bol-beacon .bf-opts{grid-template-columns:1fr;}\n}\n\/* --- Shopify rich-text safety: the description editor converts \u003cdiv\u003e to inline \u003cspan\u003e; re-assert layout so nothing collapses --- *\/\n.bol-beacon,.bol-beacon .bf-hero,.bol-beacon .bf-sec,.bol-beacon .bf-body,.bol-beacon .bf-note,.bol-beacon .bf-stat,.bol-beacon .bf-avail,.bol-beacon .bf-opt,.bol-beacon .bf-opt-name,.bol-beacon .bf-opt-sub{display:block !important;}\n.bol-beacon .bf-strip,.bol-beacon .bf-list,.bol-beacon .bf-trust,.bol-beacon .bf-opts{display:grid !important;}\n.bol-beacon .bf-chips,.bol-beacon .bf-certs,.bol-beacon .bf-apps,.bol-beacon .bf-variant,.bol-beacon .bf-tcard,.bol-beacon .bf-box li,.bol-beacon summary,.bol-beacon summary .bf-lbl{display:flex !important;}\n.bol-beacon .bf-hero h2{color:#fff !important;font-size:30px !important;font-weight:800 !important;letter-spacing:.5px !important;text-transform:uppercase !important;line-height:1.2 !important;margin:0 !important;}\n.bol-beacon .bf-kicker{color:#FEB902 !important;}\n.bol-beacon .bf-hero .bf-sub{color:#c7d0dc !important;}\n\u003c\/style\u003e\n\n\u003c!-- HERO --\u003e\n\u003cdiv class=\"bf-hero\"\u003e\n  \u003cspan class=\"bf-kicker\"\u003eWarning \u0026amp; Safety Lighting\u003c\/span\u003e\n  \u003ch2\u003eXDR-2 Beacon\u003c\/h2\u003e\n  \u003cp class=\"bf-sub\"\u003eA low-profile 36W LED beacon built for the harshest work environments. 24 high-output LEDs, 12 selectable flash patterns, and full ECE + SAE certification — sealed to IP69K and backed by a lifetime warranty.\u003c\/p\u003e\n  \u003cdiv class=\"bf-chips\"\u003e\n    \u003cspan class=\"bf-chip is-y\"\u003eLifetime Warranty\u003c\/span\u003e\n    \u003cspan class=\"bf-chip\"\u003eIP67 \/ IP69K\u003c\/span\u003e\n    \u003cspan class=\"bf-chip\"\u003eECE R65 · SAE J845\u003c\/span\u003e\n    \u003cspan class=\"bf-chip\"\u003e12 Flash Patterns\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPEC STRIP --\u003e\n\u003cdiv class=\"bf-strip\"\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M13 2 3 14h7l-1 8 10-12h-7z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003e36W\u003c\/b\u003e\u003cspan\u003eLED Output\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003eIP69K\u003c\/b\u003e\u003cspan\u003eSealed \u0026amp; Rated\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"9\"\u003e\u003c\/circle\u003e\u003cpath d=\"M12 7v5l3 2\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003e12\u003c\/b\u003e\u003cspan\u003eFlash Patterns\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M4 12h16M12 4l8 8-8 8\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003e10–30V\u003c\/b\u003e\u003cspan\u003eMulti-Voltage\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ALSO AVAILABLE --\u003e\n\u003cdiv class=\"bf-avail\"\u003eAlso available in a heavy-duty \u003ca href=\"https:\/\/www.blackoakled.com\/products\/xdr-4-beacon\"\u003eXDR-4 version →\u003c\/a\u003e\n\u003c\/div\u003e\n\n\u003c!-- OVERVIEW --\u003e\n\u003cdiv class=\"bf-sec\"\u003e\n  \u003ch3\u003eOverview\u003c\/h3\u003e\n  \u003cp\u003eBuilt for emergency, utility, and off-road work vehicles, the XDR-2 Beacon packs 24 individual 1.5W LEDs — 36W total — into a rugged, low-profile housing that stands just 2.15 in tall. Twelve selectable flash patterns and both synchronized and asynchronized modes let you run a single beacon or a coordinated array across a whole fleet.\u003c\/p\u003e\n  \u003cp\u003eA \u003cb\u003erobust aluminium housing\u003c\/b\u003e and \u003cb\u003eUV-resistant polycarbonate lens\u003c\/b\u003e shrug off impact, weather, and years of sun. Sealed to \u003cb\u003eIP67 and IP69K\u003c\/b\u003e, rated to withstand \u003cb\u003e60G of shock\u003c\/b\u003e, and operating from \u003cb\u003e-45°C to +65°C\u003c\/b\u003e, it's certified to \u003cb\u003eECE R65, ECE R10, SAE J845, CE and CISPR 25\u003c\/b\u003e. Runs on any \u003cb\u003e10–30V\u003c\/b\u003e system and mounts with a simple bolt-down fixing.\u003c\/p\u003e\n\u003c\/div\u003e\n\n\u003c!-- CHOOSE SETUP --\u003e\n\u003cdiv class=\"bf-sec\"\u003e\n  \u003ch3\u003eChoose Your Setup\u003c\/h3\u003e\n  \u003cdiv class=\"bf-opts\"\u003e\n    \u003cdiv class=\"bf-opt\"\u003e\n      \u003cspan class=\"bf-opt-tag\"\u003eOption 1 · Base\u003c\/span\u003e\n      \u003cdiv class=\"bf-opt-name\"\u003ePermanent\u003c\/div\u003e\n      \u003cp class=\"bf-opt-sub\"\u003eHard-wired for a clean, permanent installation.\u003c\/p\u003e\n      \u003cul class=\"bf-oplist\"\u003e\n        \u003cli\u003e\u003cb\u003eOpen \/ bare-wire lead\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eBolt-on mounting\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003eWires into your own \u003cb\u003eswitch \u0026amp; power source\u003c\/b\u003e\n\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"bf-opt is-feature\"\u003e\n      \u003cspan class=\"bf-opt-tag\"\u003eOption 2 · Plug \u0026amp; Play\u003c\/span\u003e\n      \u003cdiv class=\"bf-opt-name\"\u003ePlug \u0026amp; Play\u003c\/div\u003e\n      \u003cp class=\"bf-opt-sub\"\u003eReady to run out of the box — no hard-wiring needed.\u003c\/p\u003e\n      \u003cul class=\"bf-oplist\"\u003e\n        \u003cli\u003e\n\u003cb\u003e9.5 ft of wiring\u003c\/b\u003e with a 12V cigarette-socket plug\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eControls built into the back of the plug\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eRocker 1\u003c\/b\u003e — power on \/ off\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eRocker 2\u003c\/b\u003e — cycle through the 12 flash patterns\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ACCORDIONS --\u003e\n\u003cdiv class=\"bf-sec\"\u003e\n  \u003ch3\u003eDetails\u003c\/h3\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 2 2 7l10 5 10-5z\"\u003e\u003c\/path\u003e\u003cpath d=\"M2 17l10 5 10-5M2 12l10 5 10-5\"\u003e\u003c\/path\u003e\u003c\/svg\u003eKey Features\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cul class=\"bf-list\"\u003e\n        \u003cli\u003e\n\u003cb\u003e36W total output\u003c\/b\u003e from 24× 1.5W LEDs\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003e12 selectable flash patterns\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eSync \u0026amp; async\u003c\/b\u003e multi-beacon operation\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eLow-profile\u003c\/b\u003e — only 2.15 in tall\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eIP67 \u0026amp; IP69K\u003c\/b\u003e waterproof sealing\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003e60G anti-shock\u003c\/b\u003e rating\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eRobust aluminium\u003c\/b\u003e housing\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eUV-resistant PC lens\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eAmber or Clear\u003c\/b\u003e lens options\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003e10–30V\u003c\/b\u003e multi-voltage input\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003e-45°C to +65°C\u003c\/b\u003e operating range\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eBolt-mount\u003c\/b\u003e installation\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M21 16V8a2 2 0 0 0-1-1.7l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"\u003e\u003c\/path\u003e\u003cpath d=\"m3.3 7 8.7 5 8.7-5M12 22V12\"\u003e\u003c\/path\u003e\u003c\/svg\u003eWhat's in the Box\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cp style=\"margin-top:14px;\"\u003e\u003cb\u003ePermanent (Base)\u003c\/b\u003e\u003c\/p\u003e\n      \u003cul class=\"bf-box\"\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eXDR-2 Low-Profile LED Beacon\u003c\/b\u003e\u003csmall\u003eAmber or Clear lens\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eBolt-Mount Hardware Kit\u003c\/b\u003e\u003csmall\u003eFixed bolt-down mounting\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eOpen-Wire Lead (~16 in)\u003c\/b\u003e\u003csmall\u003eHard-wire into your own switch \u0026amp; power\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n      \u003c\/ul\u003e\n      \u003cp style=\"margin-top:10px;\"\u003e\u003cb\u003ePlug \u0026amp; Play\u003c\/b\u003e\u003c\/p\u003e\n      \u003cul class=\"bf-box\"\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eXDR-2 Low-Profile LED Beacon\u003c\/b\u003e\u003csmall\u003eAmber or Clear lens\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eBolt-Mount Hardware Kit\u003c\/b\u003e\u003csmall\u003eFixed bolt-down mounting\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003e9.5 ft Plug Harness\u003c\/b\u003e\u003csmall\u003e12V cigarette-socket plug with built-in on\/off + pattern-cycle rocker controls\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n      \u003c\/ul\u003e\n      \u003cdiv class=\"bf-note\"\u003e\n\u003cb\u003eNote:\u003c\/b\u003e on the Permanent version, flash-pattern selection is set through the wiring; on the Plug \u0026amp; Play version it's handled by the rocker switches on the plug.\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M4 4h16v4H4zM4 10h16v4H4zM4 16h16v4H4z\"\u003e\u003c\/path\u003e\u003c\/svg\u003eFull Specifications\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003ctable class=\"bf-specs\"\u003e\n        \u003ctr\u003e\n\u003ctd\u003ePower\u003c\/td\u003e\n\u003ctd\u003e36W LED Chip\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eLight Source\u003c\/td\u003e\n\u003ctd\u003e24 × 1.5W LED\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eVoltage\u003c\/td\u003e\n\u003ctd\u003e10–30V\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eFlash Patterns\u003c\/td\u003e\n\u003ctd\u003e12\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eSynchronization\u003c\/td\u003e\n\u003ctd\u003eSync \u0026amp; Async available\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eWaterproof Rating\u003c\/td\u003e\n\u003ctd\u003eIP67 \/ IP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eAnti-Shock Rating\u003c\/td\u003e\n\u003ctd\u003e60G\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eHousing Material\u003c\/td\u003e\n\u003ctd\u003eRobust Aluminium\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eLens Material\u003c\/td\u003e\n\u003ctd\u003eUV-Resistant PC\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eLens Color\u003c\/td\u003e\n\u003ctd\u003eAmber or Clear\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eSize\u003c\/td\u003e\n\u003ctd\u003e4.4 × 4.4 × 2.15 in\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eMounting\u003c\/td\u003e\n\u003ctd\u003eBolt Mount\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eCable\u003c\/td\u003e\n\u003ctd\u003e~16 in lead wire\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eWorking Temperature\u003c\/td\u003e\n\u003ctd\u003e-45°C ~ +65°C (-49°F ~ +149°F)\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eWarranty\u003c\/td\u003e\n\u003ctd\u003eLifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n      \u003c\/table\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003cpath d=\"m9 12 2 2 4-4\"\u003e\u003c\/path\u003e\u003c\/svg\u003eCertifications \u0026amp; Approvals\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cp style=\"margin-top:14px;\"\u003eIndependently tested and approved to the standards that matter for on-road and fleet use:\u003c\/p\u003e\n      \u003cdiv class=\"bf-certs\"\u003e\n        \u003cspan class=\"bf-cert\"\u003eECE R65\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eECE R10\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eSAE J845\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eCE\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eCISPR 25\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ccircle cx=\"11\" cy=\"11\" r=\"8\"\u003e\u003c\/circle\u003e\u003cpath d=\"m21 21-4.3-4.3\"\u003e\u003c\/path\u003e\u003c\/svg\u003eApplications\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cdiv class=\"bf-apps\"\u003e\n        \u003cspan class=\"bf-app\"\u003eEmergency Vehicles\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eTow \u0026amp; Recovery\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eConstruction\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eAgriculture \u0026amp; Tractors\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eUtility Fleets\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eSnow Plows\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eForklifts\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eSecurity Patrol\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003cpath d=\"m9 12 2 2 4-4\"\u003e\u003c\/path\u003e\u003c\/svg\u003eWarranty\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cdiv class=\"bf-trust\"\u003e\n        \u003cdiv class=\"bf-tcard\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003cpath d=\"m9 12 2 2 4-4\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n          \u003cdiv\u003e\n\u003cb\u003eLifetime Warranty\u003c\/b\u003e\u003cspan\u003eCovers defects in workmanship and materials.\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"bf-tcard\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M20 6 9 17l-5-5\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n          \u003cdiv\u003e\n\u003cb\u003eBuilt to Endure\u003c\/b\u003e\u003cspan\u003e60G shock rated, IP69K sealed, -45°C to +65°C.\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\u003c\/div\u003e\n\n\u003c\/div\u003e","brand":"Black Oak LED","offers":[{"title":"Permanent","offer_id":43434015916093,"sku":"XDR-2B","price":85.94,"currency_code":"USD","in_stock":true},{"title":"Magnetic","offer_id":43434015948861,"sku":"XDR-2B-M","price":98.44,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/2Beacon.png?v=1785877565"},{"product_id":"xdr-4-beacon","title":"XDR-4 Amber Warning LED Beacon Light","description":"\u003cdiv class=\"bol-beacon\"\u003e\n\u003cstyle\u003e\n\/* Scoped to .bol-beacon — matches Black Oak LED site styling, won't collide with theme *\/\n.bol-beacon{--ink:#111;--ink2:#3a424e;--muted:#6a7482;--line:#e4e7ec;--bg:#f5f5f5;--soft:#f8f8f6;--yellow:#FEB902;--yellow2:#F5B31B;--navy:#1A3D5E;font-family:Roboto,\"Helvetica Neue\",Arial,sans-serif;color:var(--ink);line-height:1.6;font-size:16px;max-width:1000px;margin:0 auto;}\n.bol-beacon *{box-sizing:border-box;}\n.bol-beacon h2,.bol-beacon h3{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;line-height:1.2;margin:0;}\n.bol-beacon p{margin:0 0 14px;color:var(--ink2);}\n\n\/* Hero *\/\n.bol-beacon .bf-hero{background:linear-gradient(155deg,#0c0c0c 0%,#14171c 55%,#1A3D5E 130%);color:#fff;border-radius:12px;padding:34px 32px;position:relative;overflow:hidden;}\n.bol-beacon .bf-hero:after{content:\"\";position:absolute;right:-70px;top:-70px;width:280px;height:280px;background:radial-gradient(circle,rgba(254,185,2,.28),transparent 62%);}\n.bol-beacon .bf-kicker{display:inline-block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--yellow);font-weight:800;margin-bottom:10px;}\n.bol-beacon .bf-hero h2{font-size:30px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;}\n.bol-beacon .bf-hero .bf-sub{margin-top:12px;font-size:16px;color:#c7d0dc;max-width:640px;position:relative;}\n.bol-beacon .bf-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px;position:relative;}\n.bol-beacon .bf-chip{background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.16);color:#eaf0f7;font-size:13px;font-weight:600;padding:7px 13px;border-radius:999px;}\n.bol-beacon .bf-chip.is-y{background:var(--yellow);border-color:var(--yellow);color:var(--navy);font-weight:700;}\n\n\/* Spec strip *\/\n.bol-beacon .bf-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0;}\n.bol-beacon .bf-stat{background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:16px 14px;text-align:center;}\n.bol-beacon .bf-stat .bf-ic{width:30px;height:30px;margin:0 auto 8px;display:block;color:var(--yellow2);}\n.bol-beacon .bf-stat b{display:block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:20px;font-weight:800;color:var(--ink);}\n.bol-beacon .bf-stat span{font-size:12.5px;color:var(--muted);}\n\n\/* Section *\/\n.bol-beacon .bf-sec{margin:26px 0;}\n.bol-beacon .bf-sec h3{font-size:20px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;margin-bottom:12px;display:flex;align-items:center;gap:9px;}\n.bol-beacon .bf-sec h3:before{content:\"\";width:5px;height:20px;border-radius:3px;background:var(--yellow);display:inline-block;}\n\n\/* Accordion *\/\n.bol-beacon details{border:1px solid var(--line);border-radius:12px;margin-bottom:12px;background:#fff;overflow:hidden;}\n.bol-beacon details[open]{border-color:#cdd4dd;}\n.bol-beacon summary{list-style:none;cursor:pointer;padding:17px 20px;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:16.5px;font-weight:700;color:var(--ink);display:flex;align-items:center;justify-content:space-between;gap:12px;}\n.bol-beacon summary::-webkit-details-marker{display:none;}\n.bol-beacon summary .bf-lbl{display:flex;align-items:center;gap:11px;}\n.bol-beacon summary .bf-lbl svg{width:20px;height:20px;color:var(--yellow2);flex:none;}\n.bol-beacon .bf-plus{width:22px;height:22px;position:relative;flex:none;transition:transform .2s;}\n.bol-beacon .bf-plus:before,.bol-beacon .bf-plus:after{content:\"\";position:absolute;background:var(--muted);border-radius:2px;}\n.bol-beacon .bf-plus:before{left:4px;right:4px;top:10px;height:2px;}\n.bol-beacon .bf-plus:after{top:4px;bottom:4px;left:10px;width:2px;}\n.bol-beacon details[open] .bf-plus{transform:rotate(135deg);}\n.bol-beacon .bf-body{padding:2px 20px 20px;border-top:1px solid var(--line);}\n\n\/* Feature list *\/\n.bol-beacon .bf-list{list-style:none;margin:14px 0 0;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:12px 22px;}\n.bol-beacon .bf-list li{position:relative;padding-left:28px;font-size:14.5px;color:var(--ink2);}\n.bol-beacon .bf-list li b{color:var(--ink);}\n.bol-beacon .bf-list li:before{content:\"\";position:absolute;left:0;top:3px;width:17px;height:17px;border-radius:50%;background:var(--yellow);\n  -webkit-mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/12px no-repeat;\n  mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/12px no-repeat;}\n\n\/* In the box *\/\n.bol-beacon .bf-box{list-style:none;margin:14px 0 0;padding:0;}\n.bol-beacon .bf-box li{display:flex;align-items:center;gap:13px;padding:13px 0;border-bottom:1px dashed var(--line);font-size:15px;}\n.bol-beacon .bf-box li:last-child{border-bottom:none;}\n.bol-beacon .bf-qty{flex:none;min-width:40px;height:40px;border-radius:9px;background:var(--navy);border:1px solid var(--navy);display:flex;align-items:center;justify-content:center;font-weight:800;color:var(--yellow);font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;}\n.bol-beacon .bf-box b{color:var(--ink);}\n.bol-beacon .bf-box small{display:block;color:var(--muted);font-size:12.5px;}\n.bol-beacon .bf-note{margin-top:14px;font-size:13.5px;color:var(--muted);background:#fffaf0;border:1px solid #f6e2b8;border-radius:9px;padding:11px 14px;}\n\n\/* Specs table *\/\n.bol-beacon .bf-specs{width:100%;border-collapse:collapse;margin-top:14px;font-size:14.5px;}\n.bol-beacon .bf-specs tr{border-bottom:1px solid var(--line);}\n.bol-beacon .bf-specs td{padding:11px 6px;}\n.bol-beacon .bf-specs td:first-child{color:var(--muted);}\n.bol-beacon .bf-specs td:last-child{text-align:right;font-weight:700;color:var(--ink);}\n\n\/* Cert badges *\/\n.bol-beacon .bf-certs{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px;}\n.bol-beacon .bf-cert{background:var(--navy);color:#fff;border-radius:8px;padding:9px 14px;font-size:13px;font-weight:700;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;letter-spacing:.3px;}\n\n\/* Applications *\/\n.bol-beacon .bf-apps{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px;}\n.bol-beacon .bf-app{background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:8px 13px;font-size:13.5px;font-weight:600;color:var(--ink2);}\n\n\/* Also available note *\/\n.bol-beacon .bf-avail{margin:0 0 4px;padding:12px 16px;background:var(--soft);border:1px solid var(--line);border-left:4px solid var(--yellow);border-radius:10px;font-size:14.5px;color:var(--ink2);}\n.bol-beacon .bf-avail a{color:var(--navy);font-weight:800;text-decoration:none;}\n.bol-beacon .bf-avail a:hover{text-decoration:underline;}\n\n\/* Setup options *\/\n.bol-beacon .bf-opts{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px;}\n.bol-beacon .bf-opt{border:1px solid var(--line);border-radius:12px;padding:20px;background:#fff;}\n.bol-beacon .bf-opt.is-feature{border-color:var(--yellow);box-shadow:0 0 0 1px var(--yellow);}\n.bol-beacon .bf-opt-tag{display:inline-block;font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--navy);background:var(--bg);border:1px solid var(--line);border-radius:999px;padding:4px 11px;margin-bottom:10px;}\n.bol-beacon .bf-opt.is-feature .bf-opt-tag{background:var(--yellow);border-color:var(--yellow);}\n.bol-beacon .bf-opt-name{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:18px;font-weight:800;color:var(--ink);margin-bottom:4px;}\n.bol-beacon .bf-opt-sub{font-size:13.5px;color:var(--muted);margin:0 0 12px;}\n.bol-beacon .bf-oplist{list-style:none;margin:0;padding:0;}\n.bol-beacon .bf-oplist li{position:relative;padding:7px 0 7px 26px;font-size:14px;color:var(--ink2);border-top:1px solid var(--line);}\n.bol-beacon .bf-oplist li:first-child{border-top:none;}\n.bol-beacon .bf-oplist li b{color:var(--ink);}\n.bol-beacon .bf-oplist li:before{content:\"\";position:absolute;left:0;top:10px;width:16px;height:16px;border-radius:50%;background:var(--yellow);\n  -webkit-mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/11px no-repeat;\n  mask:url(\"data:image\/svg+xml;utf8,\u003csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'\u003e\u003cpath fill='white' d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'\/\u003e\u003c\/svg\u003e\") center\/11px no-repeat;}\n\n\/* Trust *\/\n.bol-beacon .bf-trust{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:6px;}\n.bol-beacon .bf-tcard{border:1px solid var(--line);border-radius:12px;padding:18px;display:flex;gap:14px;align-items:flex-start;background:#fff;}\n.bol-beacon .bf-tcard svg{width:30px;height:30px;color:var(--navy);flex:none;}\n.bol-beacon .bf-tcard b{display:block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:15.5px;margin-bottom:3px;}\n.bol-beacon .bf-tcard span{font-size:13.5px;color:var(--muted);}\n\n@media(max-width:720px){\n  .bol-beacon .bf-hero{padding:26px 22px;}\n  .bol-beacon .bf-hero h2{font-size:23px;}\n  .bol-beacon .bf-strip{grid-template-columns:1fr 1fr;}\n  .bol-beacon .bf-list{grid-template-columns:1fr;}\n  .bol-beacon .bf-trust{grid-template-columns:1fr;}\n  .bol-beacon .bf-opts{grid-template-columns:1fr;}\n}\n\/* --- Shopify rich-text safety: the description editor converts \u003cdiv\u003e to inline \u003cspan\u003e; re-assert layout so nothing collapses --- *\/\n.bol-beacon,.bol-beacon .bf-hero,.bol-beacon .bf-sec,.bol-beacon .bf-body,.bol-beacon .bf-note,.bol-beacon .bf-stat,.bol-beacon .bf-avail,.bol-beacon .bf-opt,.bol-beacon .bf-opt-name,.bol-beacon .bf-opt-sub{display:block !important;}\n.bol-beacon .bf-strip,.bol-beacon .bf-list,.bol-beacon .bf-trust,.bol-beacon .bf-opts{display:grid !important;}\n.bol-beacon .bf-chips,.bol-beacon .bf-certs,.bol-beacon .bf-apps,.bol-beacon .bf-tcard,.bol-beacon .bf-box li,.bol-beacon summary,.bol-beacon summary .bf-lbl{display:flex !important;}\n.bol-beacon .bf-hero h2{color:#fff !important;font-size:30px !important;font-weight:800 !important;letter-spacing:.5px !important;text-transform:uppercase !important;line-height:1.2 !important;margin:0 !important;}\n.bol-beacon .bf-kicker{color:#FEB902 !important;}\n.bol-beacon .bf-hero .bf-sub{color:#c7d0dc !important;}\n\u003c\/style\u003e\n\n\u003c!-- HERO --\u003e\n\u003cdiv class=\"bf-hero\"\u003e\n  \u003cspan class=\"bf-kicker\"\u003eWarning \u0026amp; Safety Lighting\u003c\/span\u003e\n  \u003ch2\u003eXDR-4 Beacon\u003c\/h2\u003e\n  \u003cp class=\"bf-sub\"\u003eA heavy-duty 72W LED beacon built to dominate the harshest work environments. 48 high-output LEDs, 12 selectable flash patterns, and full ECE R65 Class 2 + SAE J845 certification — sealed to IP69K and backed by a lifetime warranty.\u003c\/p\u003e\n  \u003cdiv class=\"bf-chips\"\u003e\n    \u003cspan class=\"bf-chip is-y\"\u003eLifetime Warranty\u003c\/span\u003e\n    \u003cspan class=\"bf-chip\"\u003eIP67 \/ IP69K\u003c\/span\u003e\n    \u003cspan class=\"bf-chip\"\u003eECE R65 Class 2 · SAE J845\u003c\/span\u003e\n    \u003cspan class=\"bf-chip\"\u003e12 Flash Patterns\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SPEC STRIP --\u003e\n\u003cdiv class=\"bf-strip\"\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M13 2 3 14h7l-1 8 10-12h-7z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003e72W\u003c\/b\u003e\u003cspan\u003eLED Output\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003eIP69K\u003c\/b\u003e\u003cspan\u003eSealed \u0026amp; Rated\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"9\"\u003e\u003c\/circle\u003e\u003cpath d=\"M12 7v5l3 2\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003e12\u003c\/b\u003e\u003cspan\u003eFlash Patterns\u003c\/span\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"bf-stat\"\u003e\n    \u003csvg class=\"bf-ic\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M4 12h16M12 4l8 8-8 8\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n    \u003cb\u003e10–30V\u003c\/b\u003e\u003cspan\u003eMulti-Voltage\u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ALSO AVAILABLE --\u003e\n\u003cdiv class=\"bf-avail\"\u003eAlso available in a compact, low-profile \u003ca href=\"https:\/\/www.blackoakled.com\/products\/xdr2-beacon\"\u003eXDR-2 version →\u003c\/a\u003e\n\u003c\/div\u003e\n\n\u003c!-- OVERVIEW --\u003e\n\u003cdiv class=\"bf-sec\"\u003e\n  \u003ch3\u003eOverview\u003c\/h3\u003e\n  \u003cp\u003eWhen you need maximum output and maximum presence, the XDR-4 Beacon delivers. Forty-eight high-output 1.5W LEDs — 72W total — pack into a rugged heavy-duty housing measuring 4.9 in across and 3.5 in tall, throwing a wall of amber warning light that cuts through daylight, dust, and weather. Twelve selectable flash patterns plus synchronized and asynchronized modes let you run a single beacon or a coordinated array across an entire fleet.\u003c\/p\u003e\n  \u003cp\u003eA \u003cb\u003erobust aluminium housing\u003c\/b\u003e and \u003cb\u003eUV-resistant polycarbonate lens\u003c\/b\u003e shrug off impact, weather, and years of sun. Sealed to \u003cb\u003eIP67 and IP69K\u003c\/b\u003e, rated to withstand \u003cb\u003e60G of shock\u003c\/b\u003e, and operating from \u003cb\u003e-45°C to +65°C\u003c\/b\u003e, it's certified to \u003cb\u003eECE R65 Amber Class 2, ECE R10, SAE J845, CE and CISPR 25 Class 5\u003c\/b\u003e. Runs on any \u003cb\u003e10–30V\u003c\/b\u003e system and mounts with a simple bolt-down fixing.\u003c\/p\u003e\n\u003c\/div\u003e\n\n\u003c!-- CHOOSE SETUP --\u003e\n\u003cdiv class=\"bf-sec\"\u003e\n  \u003ch3\u003eChoose Your Setup\u003c\/h3\u003e\n  \u003cdiv class=\"bf-opts\"\u003e\n    \u003cdiv class=\"bf-opt\"\u003e\n      \u003cspan class=\"bf-opt-tag\"\u003eOption 1 · Base\u003c\/span\u003e\n      \u003cdiv class=\"bf-opt-name\"\u003ePermanent\u003c\/div\u003e\n      \u003cp class=\"bf-opt-sub\"\u003eHard-wired for a clean, permanent installation.\u003c\/p\u003e\n      \u003cul class=\"bf-oplist\"\u003e\n        \u003cli\u003e\u003cb\u003eOpen \/ bare-wire lead\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eBolt-on mounting\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003eWires into your own \u003cb\u003eswitch \u0026amp; power source\u003c\/b\u003e\n\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"bf-opt is-feature\"\u003e\n      \u003cspan class=\"bf-opt-tag\"\u003eOption 2 · Magnetic Mount\u003c\/span\u003e\n      \u003cdiv class=\"bf-opt-name\"\u003eMagnetic Mount\u003c\/div\u003e\n      \u003cp class=\"bf-opt-sub\"\u003eTool-free — drop it on and move it between vehicles in seconds.\u003c\/p\u003e\n      \u003cul class=\"bf-oplist\"\u003e\n        \u003cli\u003e\n\u003cb\u003eStrong magnetic base\u003c\/b\u003e — no drilling\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eCigarette-socket power lead\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eControls built into the plug\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eRocker 1\u003c\/b\u003e — power on \/ off\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eRocker 2\u003c\/b\u003e — cycle through the 12 flash patterns\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ACCORDIONS --\u003e\n\u003cdiv class=\"bf-sec\"\u003e\n  \u003ch3\u003eDetails\u003c\/h3\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 2 2 7l10 5 10-5z\"\u003e\u003c\/path\u003e\u003cpath d=\"M2 17l10 5 10-5M2 12l10 5 10-5\"\u003e\u003c\/path\u003e\u003c\/svg\u003eKey Features\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cul class=\"bf-list\"\u003e\n        \u003cli\u003e\n\u003cb\u003e72W total output\u003c\/b\u003e from 48× 1.5W LEDs\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003e12 selectable flash patterns\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eSync \u0026amp; async\u003c\/b\u003e multi-beacon operation\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eHeavy-duty\u003c\/b\u003e aluminium build\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eIP67 \u0026amp; IP69K\u003c\/b\u003e waterproof sealing\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003e60G anti-shock\u003c\/b\u003e rating\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eECE R65 Amber Class 2\u003c\/b\u003e certified\u003c\/li\u003e\n        \u003cli\u003e\u003cb\u003eUV-resistant PC lens\u003c\/b\u003e\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eAmber or Clear\u003c\/b\u003e lens options\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003e10–30V\u003c\/b\u003e multi-voltage input\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003e-45°C to +65°C\u003c\/b\u003e operating range\u003c\/li\u003e\n        \u003cli\u003e\n\u003cb\u003eBolt-mount\u003c\/b\u003e installation\u003c\/li\u003e\n      \u003c\/ul\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M21 16V8a2 2 0 0 0-1-1.7l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"\u003e\u003c\/path\u003e\u003cpath d=\"m3.3 7 8.7 5 8.7-5M12 22V12\"\u003e\u003c\/path\u003e\u003c\/svg\u003eWhat's in the Box\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cp style=\"margin-top:14px;\"\u003e\u003cb\u003ePermanent (Base)\u003c\/b\u003e\u003c\/p\u003e\n      \u003cul class=\"bf-box\"\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eXDR-4 Heavy-Duty LED Beacon\u003c\/b\u003e\u003csmall\u003eAmber or Clear lens\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eBolt-Mount Hardware Kit\u003c\/b\u003e\u003csmall\u003eFixed bolt-down mounting\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eOpen-Wire Lead (~16 in)\u003c\/b\u003e\u003csmall\u003eHard-wire into your own switch \u0026amp; power\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n      \u003c\/ul\u003e\n      \u003cp style=\"margin-top:10px;\"\u003e\u003cb\u003eMagnetic Mount\u003c\/b\u003e\u003c\/p\u003e\n      \u003cul class=\"bf-box\"\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eXDR-4 Heavy-Duty LED Beacon\u003c\/b\u003e\u003csmall\u003eAmber or Clear lens\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eMagnetic Mount Base\u003c\/b\u003e\u003csmall\u003eStrong, tool-free hold — no drilling\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"bf-qty\"\u003e1×\u003c\/span\u003e\u003cspan\u003e\u003cb\u003eCigarette-Socket Power Lead\u003c\/b\u003e\u003csmall\u003eBuilt-in on\/off + pattern-cycle rocker controls\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n      \u003c\/ul\u003e\n      \u003cdiv class=\"bf-note\"\u003e\n\u003cb\u003eNote:\u003c\/b\u003e on the Permanent version, flash-pattern selection is set through the wiring; on the Magnetic Mount version it's handled by the rocker switches on the plug.\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M4 4h16v4H4zM4 10h16v4H4zM4 16h16v4H4z\"\u003e\u003c\/path\u003e\u003c\/svg\u003eFull Specifications\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003ctable class=\"bf-specs\"\u003e\n        \u003ctr\u003e\n\u003ctd\u003ePower\u003c\/td\u003e\n\u003ctd\u003e72W (48 × 1.5W LED)\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eLight Source\u003c\/td\u003e\n\u003ctd\u003e48 × 1.5W LED\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eVoltage\u003c\/td\u003e\n\u003ctd\u003e10–30V\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eFlash Patterns\u003c\/td\u003e\n\u003ctd\u003e12\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eSynchronization\u003c\/td\u003e\n\u003ctd\u003eSync \u0026amp; Async available\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eWaterproof Rating\u003c\/td\u003e\n\u003ctd\u003eIP67 \/ IP69K\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eAnti-Shock Rating\u003c\/td\u003e\n\u003ctd\u003e60G\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eHousing Material\u003c\/td\u003e\n\u003ctd\u003eRobust Aluminium\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eLens Material\u003c\/td\u003e\n\u003ctd\u003eUV-Resistant PC\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eLens Color\u003c\/td\u003e\n\u003ctd\u003eAmber or Clear\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eSize\u003c\/td\u003e\n\u003ctd\u003e4.9 × 4.9 × 3.5 in\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eMounting\u003c\/td\u003e\n\u003ctd\u003eBolt Mount \/ Magnetic\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eCable\u003c\/td\u003e\n\u003ctd\u003e~16 in lead wire\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eWorking Temperature\u003c\/td\u003e\n\u003ctd\u003e-45°C ~ +65°C (-49°F ~ +149°F)\u003c\/td\u003e\n\u003c\/tr\u003e\n        \u003ctr\u003e\n\u003ctd\u003eWarranty\u003c\/td\u003e\n\u003ctd\u003eLifetime\u003c\/td\u003e\n\u003c\/tr\u003e\n      \u003c\/table\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003cpath d=\"m9 12 2 2 4-4\"\u003e\u003c\/path\u003e\u003c\/svg\u003eCertifications \u0026amp; Approvals\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cp style=\"margin-top:14px;\"\u003eIndependently tested and approved to the standards that matter for on-road and fleet use:\u003c\/p\u003e\n      \u003cdiv class=\"bf-certs\"\u003e\n        \u003cspan class=\"bf-cert\"\u003eECE R65 Amber Class 2\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eECE R10\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eSAE J845\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eCE\u003c\/span\u003e\n        \u003cspan class=\"bf-cert\"\u003eCISPR 25 Class 5\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ccircle cx=\"11\" cy=\"11\" r=\"8\"\u003e\u003c\/circle\u003e\u003cpath d=\"m21 21-4.3-4.3\"\u003e\u003c\/path\u003e\u003c\/svg\u003eApplications\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cdiv class=\"bf-apps\"\u003e\n        \u003cspan class=\"bf-app\"\u003eEmergency Vehicles\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eTow \u0026amp; Recovery\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eConstruction\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eAgriculture \u0026amp; Tractors\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eUtility Fleets\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eSnow Plows\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eMining \u0026amp; Heavy Equipment\u003c\/span\u003e\n        \u003cspan class=\"bf-app\"\u003eSecurity Patrol\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\n  \u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cspan class=\"bf-lbl\"\u003e\u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003cpath d=\"m9 12 2 2 4-4\"\u003e\u003c\/path\u003e\u003c\/svg\u003eWarranty\u003c\/span\u003e\n      \u003cspan class=\"bf-plus\"\u003e\u003c\/span\u003e\n    \u003c\/summary\u003e\n    \u003cdiv class=\"bf-body\"\u003e\n      \u003cdiv class=\"bf-trust\"\u003e\n        \u003cdiv class=\"bf-tcard\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\u003e\u003c\/path\u003e\u003cpath d=\"m9 12 2 2 4-4\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n          \u003cdiv\u003e\n\u003cb\u003eLifetime Warranty\u003c\/b\u003e\u003cspan\u003eCovers defects in workmanship and materials.\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"bf-tcard\"\u003e\n          \u003csvg viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M20 6 9 17l-5-5\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n          \u003cdiv\u003e\n\u003cb\u003eBuilt to Endure\u003c\/b\u003e\u003cspan\u003e60G shock rated, IP69K sealed, -45°C to +65°C.\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/details\u003e\n\u003c\/div\u003e\n\n\u003c\/div\u003e","brand":"Black Oak LED","offers":[{"title":"Permanent","offer_id":43434015752253,"sku":"XDR-4B","price":106.24,"currency_code":"USD","in_stock":true},{"title":"Magnetic","offer_id":43434015785021,"sku":"XDR-4B-M","price":119.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/XDR-4.png?v=1786041954"},{"product_id":"11-mini-low-pro-emergency-light-bar","title":"11\" Mini 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:4, 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;11\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\u003cbr\u003e\u003c\/p\u003e\n\u003cp class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"\u003eThe \u003cstrong\u003eBlack Oak 11\" Mini Low Pro Emergency LED Light Bar\u003c\/strong\u003e is engineered for maximum visibility, reliability, and user control in a compact, low-profile footprint. With ultra-bright LEDs, multiple selectable flash and strobe patterns, and a rugged, weather-sealed housing, this mini light bar makes sure your presence is known in any emergency or warning situation—day or night, rain or shine.\u003c\/p\u003e\n\u003cp class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cp class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"\u003eBuilt to withstand the demands of high-speed response, off-road utility, and work-site visibility, this 11-inch low-profile bar features a streamlined, aerodynamic frame and a universal mounting system for quick, easy installation on virtually any vehicle. Whether you're outfitting a patrol car, fire or EMS unit, tow truck, or utility vehicle, this mini emergency light bar delivers dependable warning performance where it matters most.\u003c\/p\u003e\n\u003cp class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"\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\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;\"\u003e11\"\u003c\/span\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 \u003ca href=\"\/products\/new-55-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;\"\u003e55\"\u003c\/a\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#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\u003eMagnetic Feet\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\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\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\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\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\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\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\u003e—\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSKU\u003c\/th\u003e\n\u003ctd\u003eLP-E11-AW\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\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\u003cbr\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\u003cbr\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\u003cbr\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\u003cbr\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 \u0026 White \/ Magnetic","offer_id":43435872878653,"sku":"LP-E11-AW","price":299.37,"currency_code":"USD","in_stock":true},{"title":"Amber \u0026 White \/ Headache Rack (X2)","offer_id":43558460162109,"sku":"LP-E11-AW","price":324.37,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LowProEmergency-11-Side.png?v=1787078070"},{"product_id":"low-pro-emergency-light-bar-magnetic-feet-pair","title":"Low Pro Emergency Light Bar Magnetic Mount Feet (Pair)","description":"\u003cstyle\u003e\n#MainContent .mg-wrap { display: block !important; }\n#MainContent .mg-h { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 22px !important; font-weight: 800 !important; color: #1C2026 !important; text-transform: none !important; letter-spacing: -0.2px !important; margin: 0 0 6px !important; }\n#MainContent .mg-chips { display: block !important; margin: 0 0 12px; line-height: 2; }\n#MainContent .mg-chip { display: inline-block !important; background: #FFF6E0; color: #1C2026; border: 1px solid #FFE1A0; border-radius: 10px; padding: 4px 10px; font-size: 12.5px; font-weight: 700; margin: 0 5px 5px 0; }\n#MainContent table.mg-spec { width: 100%; border-collapse: collapse; margin: 12px 0 0; font-size: 14.5px; }\n#MainContent table.mg-spec th, #MainContent table.mg-spec td { border: 1px solid #E5E7EB; padding: 8px 10px; text-align: left; }\n#MainContent table.mg-spec thead th { background: #1C2026; color: #FFB300; font-weight: 700; }\n#MainContent table.mg-spec tbody th { background: #F6F6F4; font-weight: 600; color: #1C2026; }\n#MainContent table.mg-spec td.mg-no { color: #B71C1C; font-weight: 700; }\n#MainContent .mg-note { display: block !important; background: #FFF6E0; border-left: 4px solid #FFB300; border-radius: 0 8px 8px 0; padding: 10px 14px; margin: 12px 0 0; font-size: 14.5px; line-height: 1.5; }\n#MainContent .mg-wrap a { color: #C27C00; font-weight: 700; }\n\u003c\/style\u003e\n\u003cdiv class=\"mg-wrap\"\u003e\n\u003ch2 class=\"mg-h\"\u003eMagnetic Mounting Feet for Low Pro Emergency Light Bars\u003c\/h2\u003e\n\u003cp class=\"mg-chips\"\u003e\u003cspan class=\"mg-chip\"\u003eSold as a pair\u003c\/span\u003e\u003cspan class=\"mg-chip\"\u003eNo drilling\u003c\/span\u003e\u003cspan class=\"mg-chip\"\u003e65 lbs pull force per magnet\u003c\/span\u003e\u003cspan class=\"mg-chip\"\u003eRubber coated\u003c\/span\u003e\u003cspan class=\"mg-chip\"\u003eFits 17\", 30\" \u0026amp; 43\" bars\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003eMount your Low Pro Emergency Light Bar to any steel roof or panel without drilling a single hole. These magnetic feet replace the standard mounts so you can set the bar where you want it and move it between vehicles when you need to. Each magnet is rated for \u003cstrong\u003e65 lbs of pull force\u003c\/strong\u003e and is designed to be corrosion-resistant, with a protective rubber coating that prevents scratches on your vehicle's surface. Each order includes \u003cstrong\u003eone pair (2 magnetic feet) and mounting hardware.\u003c\/strong\u003e\u003c\/p\u003e\n\u003ctable class=\"mg-spec\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eSpecifications\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003ePull Force\u003c\/th\u003e\n\u003ctd\u003e65 lbs per magnet\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eConstruction\u003c\/th\u003e\n\u003ctd\u003eCorrosion-resistant\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCoating\u003c\/th\u003e\n\u003ctd\u003eProtective rubber coating – prevents scratches on vehicle surfaces\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eIncludes\u003c\/th\u003e\n\u003ctd\u003e1 pair (2 magnetic feet) with mounting hardware\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003ctable class=\"mg-spec\"\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eLight Bar Size\u003c\/th\u003e\n\u003cth\u003ePairs Needed\u003c\/th\u003e\n\u003cth\u003eMagnets Total\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\"\u003e17\" Low Pro Emergency\u003c\/a\u003e\u003c\/th\u003e\n\u003ctd\u003e\u003cstrong\u003e2 pairs\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e4\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\"\u003e30\" Low Pro Emergency\u003c\/a\u003e\u003c\/th\u003e\n\u003ctd\u003e\u003cstrong\u003e3 pairs\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e6\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\"\u003e43\" Low Pro Emergency\u003c\/a\u003e\u003c\/th\u003e\n\u003ctd\u003e\u003cstrong\u003e4 pairs\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e8\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003e49\" and larger\u003c\/th\u003e\n\u003ctd class=\"mg-no\" colspan=\"2\"\u003eNot recommended\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp class=\"mg-note\"\u003e\u003cstrong\u003eOrder the right quantity:\u003c\/strong\u003e this listing is for one pair. A 17\" bar needs a quantity of 2, a 30\" bar needs 3, and a 43\" bar needs 4. For 49\" and larger bars, we recommend permanent mounting instead of magnets.\u003c\/p\u003e\n\u003c\/div\u003e","brand":"Black Oak LED","offers":[{"title":"Default Title","offer_id":44336476356669,"sku":"LPE-M","price":30.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/LPE_-_Magnetic_Feet.png?v=1760383715"},{"product_id":"low-pro-emergency-light-bar-headache-rack-brackets-pair","title":"Low Pro Emergency Light Bar Headache Rack Brackets (Pair)","description":"\u003cstyle\u003e\n#MainContent .hr-wrap { display: block !important; }\n#MainContent .hr-h { font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important; font-size: 22px !important; font-weight: 800 !important; color: #1C2026 !important; text-transform: none !important; letter-spacing: -0.2px !important; margin: 0 0 6px !important; }\n#MainContent .hr-chips { display: block !important; margin: 0 0 12px; line-height: 2; }\n#MainContent .hr-chip { display: inline-block !important; background: #FFF6E0; color: #1C2026; border: 1px solid #FFE1A0; border-radius: 10px; padding: 4px 10px; font-size: 12.5px; font-weight: 700; margin: 0 5px 5px 0; }\n#MainContent table.hr-spec { width: 100%; border-collapse: collapse; margin: 12px 0 0; font-size: 14.5px; }\n#MainContent table.hr-spec th, #MainContent table.hr-spec td { border: 1px solid #E5E7EB; padding: 8px 10px; text-align: left; }\n#MainContent table.hr-spec thead th { background: #1C2026; color: #FFB300; font-weight: 700; }\n#MainContent table.hr-spec tbody th { background: #F6F6F4; font-weight: 600; color: #1C2026; }\n#MainContent .hr-note { display: block !important; background: #FFF6E0; border-left: 4px solid #FFB300; border-radius: 0 8px 8px 0; padding: 10px 14px; margin: 12px 0 0; font-size: 14.5px; line-height: 1.5; }\n#MainContent .hr-wrap a { color: #C27C00; font-weight: 700; }\n\u003c\/style\u003e\n\u003cdiv class=\"hr-wrap\"\u003e\n\u003ch2 class=\"hr-h\"\u003eHeadache Rack Brackets for Low Pro Emergency Light Bars\u003c\/h2\u003e\n\u003cp class=\"hr-chips\"\u003e\u003cspan class=\"hr-chip\"\u003eSold as a pair\u003c\/span\u003e\u003cspan class=\"hr-chip\"\u003eBolt-on mount\u003c\/span\u003e\u003cspan class=\"hr-chip\"\u003eFits 17\" to 68\" bars\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003eBolt your Low Pro Emergency Light Bar securely to a truck headache rack or similar crossbar. These brackets give you a solid, permanent mount for work trucks, tow rigs, and service vehicles. Each order includes \u003cstrong\u003eone pair (2 brackets)\u003c\/strong\u003e.\u003c\/p\u003e\n\u003ctable class=\"hr-spec\"\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003eLight Bar Size\u003c\/th\u003e\n\u003cth\u003ePairs Needed\u003c\/th\u003e\n\u003cth\u003eBrackets Total\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth\u003e\n\u003ca href=\"\/products\/new-17-low-pro-emergency-light-bar\"\u003e17\"\u003c\/a\u003e and \u003ca href=\"\/products\/new-30-low-pro-emergency-light-bar\"\u003e30\"\u003c\/a\u003e\n\u003c\/th\u003e\n\u003ctd\u003e\u003cstrong\u003e1 pair\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e2\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003e\n\u003ca href=\"\/products\/new-43-low-pro-emergency-light-bar\"\u003e43\"\u003c\/a\u003e, \u003ca href=\"\/products\/low-pro-emergency-light-bar\"\u003e49\"\u003c\/a\u003e, and \u003ca href=\"\/products\/new-55-low-pro-emergency-light-bar\"\u003e55\"\u003c\/a\u003e\n\u003c\/th\u003e\n\u003ctd\u003e\u003cstrong\u003e2 pairs\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e4\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003e\n\u003ca href=\"\/products\/new-61-low-pro-emergency-light-bar\"\u003e61\"\u003c\/a\u003e and \u003ca href=\"\/products\/new-68-low-pro-emergency-light-bar\"\u003e68\"\u003c\/a\u003e\n\u003c\/th\u003e\n\u003ctd\u003e\u003cstrong\u003e3 pairs\u003c\/strong\u003e\u003c\/td\u003e\n\u003ctd\u003e6\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp class=\"hr-note\"\u003e\u003cstrong\u003eOrder the right quantity:\u003c\/strong\u003e this listing is for one pair. 17\" and 30\" bars need a quantity of 1. 43\", 49\", and 55\" bars need 2. 61\" and 68\" bars need 3.\u003c\/p\u003e\n\u003c\/div\u003e","brand":"Black Oak LED","offers":[{"title":"Default Title","offer_id":44337403199549,"sku":"LPE-HB","price":25.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/files\/IMG_5558.png?v=1761226521"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0761\/3599\/collections\/warning-lights-black-oak-low-pro-49-inch-amber-xdr5-utility-service-truck-hero-v5c.jpg?v=1794346785","url":"https:\/\/www.blackoakled.com\/collections\/warning-lights.oembed","provider":"Black Oak LED","version":"1.0","type":"link"}