{"title":"Build Your Kit","description":"\u003cp\u003eBuild your own MotoGlow Neon Lights kit — pick your strip pairs, add extension cables, and the controller base comes with every kit.\u003c\/p\u003e","products":[{"product_id":"motoglow-neon-lights-strip-pair","title":"MotoGlow Neon Lights — Strip Pair","description":"\u003cp\u003eA matched pair of MotoGlow Neon Lights — flexible, waterproof RGBIC neon strips that trace the body lines of your bike, one for the left side and one for the right. App-controlled color and effects. Pick the length that fits each body line run; mix lengths across your kit (up to 6 pairs \/ 12 lights per controller).\u003c\/p\u003e\u003cp\u003e\u003cem\u003eRequires the MotoGlow Kit Base (controller, splitters \u0026amp; kill-switch harness).\u003c\/em\u003e\u003c\/p\u003e","brand":"MotoGlow Lights LLC","offers":[{"title":"45 in","offer_id":46827506696391,"sku":"MG-PAIR-45","price":49.99,"currency_code":"USD","in_stock":true},{"title":"40 in","offer_id":46827506729159,"sku":"MG-PAIR-40","price":45.99,"currency_code":"USD","in_stock":true},{"title":"32 in","offer_id":46827506761927,"sku":"MG-PAIR-32","price":39.99,"currency_code":"USD","in_stock":true},{"title":"28 in","offer_id":46827506794695,"sku":"MG-PAIR-28","price":34.99,"currency_code":"USD","in_stock":true},{"title":"24 in","offer_id":46827506827463,"sku":"MG-PAIR-24","price":32.99,"currency_code":"USD","in_stock":true},{"title":"20 in","offer_id":46827506860231,"sku":"MG-PAIR-20","price":29.99,"currency_code":"USD","in_stock":true},{"title":"15 in","offer_id":46827506892999,"sku":"MG-PAIR-15","price":28.99,"currency_code":"USD","in_stock":true},{"title":"12 in","offer_id":46827506925767,"sku":"MG-PAIR-12","price":24.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0686\/1380\/0135\/files\/NEW.webp?v=1784421018"},{"product_id":"motoglow-kit-base-controller-splitters-kill-switch-harness","title":"Build Your Kit — MotoGlow Neon Lights","description":"\u003cp\u003eBuild your own MotoGlow Neon Lights kit. Pick your strip pairs by length, choose your colors, and watch them light up on the bike below — your kit starts with the app-controlled controller, splitters \u0026amp; kill-switch harness ($135, included once per kit), and you add the pairs that fit your bike's body lines.\u003c\/p\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Rajdhani:wght@500;600;700\u0026amp;family=Inter:wght@400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n  .product-form__buttons,.product-form__quantity,.product-form .quantity,.shopify-payment-button{display:none!important;}\n  #mg-builder{--bg:#08080d;--surface:#13131d;--surface-2:#1c1c29;--line:#2a2a3a;--text:#fff;--muted:#8a8a9c;\n    --spectrum:linear-gradient(90deg,#00e5ff,#3a86ff,#8b5cff,#ff2bd6,#ff6a3d,#00e5ff);--ok:#34d399;\n    all:initial;display:block;box-sizing:border-box;font-family:'Inter',system-ui,sans-serif;\n    color:var(--text);background:var(--bg);padding:clamp(14px,3vw,28px);line-height:1.5;border-radius:16px;margin-top:10px;}\n  #mg-builder *,#mg-builder *::before,#mg-builder *::after{box-sizing:border-box;}\n  #mg-builder .mg-wrap{max-width:1120px;margin:0 auto;display:grid;grid-template-columns:1fr;\n    gap:clamp(16px,3vw,28px);align-items:start;}\n  #mg-builder .mg-eyebrow{font-family:'Rajdhani',sans-serif;font-weight:600;letter-spacing:.28em;\n    text-transform:uppercase;font-size:12px;color:var(--muted);margin:0 0 6px;}\n  #mg-builder .mg-title{font-family:'Rajdhani',sans-serif;font-weight:700;font-size:clamp(26px,4vw,38px);\n    line-height:.98;margin:0 0 18px;text-transform:uppercase;}\n  #mg-builder .mg-title span{background:var(--spectrum);background-size:200% auto;-webkit-background-clip:text;\n    background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:mg-shift 6s linear infinite;}\n  @keyframes mg-shift{to{background-position:200% center;}}\n  #mg-builder .mg-stage{background:radial-gradient(120% 90% at 50% 8%,#141420 0%,#08080d 74%);\n    border:1px solid var(--line);border-radius:18px;padding:14px;overflow:hidden;}\n  #mg-builder .mg-photo{position:relative;width:100%;aspect-ratio:1731\/909;border-radius:12px;overflow:hidden;background:#000;}\n  #mg-builder .mg-photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;z-index:1;}\n  #mg-builder .mg-photo svg{position:absolute;inset:0;width:100%;height:100%;z-index:3;}\n  #mg-builder .mg-vig{position:absolute;inset:0;z-index:4;pointer-events:none;\n    box-shadow:inset 0 0 90px 30px rgba(0,0,0,.5);border-radius:12px;}\n  #mg-builder .mg-swatches{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:14px;}\n  #mg-builder .mg-swatches .lbl{font-family:'Rajdhani',sans-serif;font-weight:600;font-size:11px;letter-spacing:.16em;\n    text-transform:uppercase;color:var(--muted);margin-right:4px;}\n  #mg-builder .mg-sw{width:26px;height:26px;border-radius:50%;cursor:pointer;border:2px solid rgba(255,255,255,.15);\n    padding:0;transition:transform .1s,border-color .15s,box-shadow .15s;}\n  #mg-builder .mg-sw:hover{transform:scale(1.14);}\n  #mg-builder .mg-sw.on{border-color:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.12);}\n  #mg-builder .mg-sw:focus-visible{outline:2px solid #00e5ff;outline-offset:2px;}\n  #mg-builder .mg-cart{border-top:1px solid var(--line);margin-top:14px;padding-top:12px;}\n  #mg-builder .mg-cart .t{font-family:'Rajdhani',sans-serif;font-weight:600;font-size:11px;letter-spacing:.16em;\n    text-transform:uppercase;color:var(--muted);margin:0 0 8px;}\n  #mg-builder .mg-cart ul{list-style:none;margin:0;padding:0;display:grid;gap:5px;}\n  #mg-builder .mg-cart li{display:flex;justify-content:space-between;gap:10px;font-size:13px;}\n  #mg-builder .mg-cart li .q{font-family:'Rajdhani',sans-serif;font-weight:700;color:var(--text);}\n  #mg-builder .mg-cart li .nm{flex:1;color:var(--muted);}\n  #mg-builder .mg-cart .empty{font-size:13px;color:var(--muted);font-style:italic;}\n  #mg-builder .mg-readout{display:flex;justify-content:center;gap:56px;text-align:center;border-top:1px solid var(--line);\n    padding-top:14px;margin-top:14px;}\n  #mg-builder .mg-readout .k{font-family:'Rajdhani',sans-serif;font-weight:600;font-size:11px;letter-spacing:.16em;\n    text-transform:uppercase;color:var(--muted);margin:0 0 2px;}\n  #mg-builder .mg-readout .v{font-family:'Rajdhani',sans-serif;font-weight:700;font-size:20px;margin:0;}\n  #mg-builder .mg-step{margin-bottom:20px;}\n  #mg-builder .mg-label{display:flex;align-items:center;gap:10px;margin:0 0 4px;}\n  #mg-builder .mg-num{font-family:'Rajdhani',sans-serif;font-weight:700;font-size:13px;color:var(--bg);\n    background:var(--spectrum);background-size:200%;animation:mg-shift 6s linear infinite;width:22px;height:22px;\n    border-radius:6px;display:grid;place-items:center;flex:0 0 auto;}\n  #mg-builder .mg-label h3{font-family:'Rajdhani',sans-serif;font-weight:600;text-transform:uppercase;\n    letter-spacing:.06em;font-size:16px;margin:0;color:var(--text);}\n  #mg-builder .mg-hint{color:var(--muted);font-size:13px;margin:2px 0 14px 32px;}\n  #mg-builder .mg-cap{margin-left:auto;font-family:'Rajdhani',sans-serif;font-weight:700;font-size:13px;\n    letter-spacing:.08em;color:var(--muted);}\n  #mg-builder .mg-cap b{color:var(--text);}\n  #mg-builder .mg-list{display:grid;gap:8px;}\n  #mg-builder .mg-strip{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--line);\n    border-radius:12px;padding:10px 12px 10px 16px;transition:border-color .15s,background .15s;}\n  #mg-builder .mg-strip.has{border-color:transparent;\n    background:linear-gradient(var(--surface-2),var(--surface-2)) padding-box,var(--spectrum) border-box;\n    background-size:200%;box-shadow:0 0 0 1px rgba(0,229,255,.2),0 6px 18px rgba(139,92,255,.14);}\n  #mg-builder .mg-strip-info{flex:1;}\n  #mg-builder .mg-strip-len{font-family:'Rajdhani',sans-serif;font-weight:700;font-size:20px;display:block;line-height:1.05;color:var(--text);}\n  #mg-builder .mg-strip-sub{font-size:11px;color:var(--muted);letter-spacing:.04em;}\n  #mg-builder .mg-stepper{display:flex;align-items:center;gap:2px;background:var(--bg);border:1px solid var(--line);\n    border-radius:10px;padding:3px;}\n  #mg-builder .mg-btn{appearance:none;cursor:pointer;border:none;background:var(--surface-2);color:var(--text);\n    width:34px;height:34px;border-radius:8px;font-size:20px;font-weight:600;display:grid;place-items:center;line-height:1;\n    transition:background .12s,transform .08s;}\n  #mg-builder .mg-btn:hover:not([disabled]){background:#2b2b3d;}\n  #mg-builder .mg-btn:active:not([disabled]){transform:scale(.9);}\n  #mg-builder .mg-btn:focus-visible{outline:2px solid #00e5ff;outline-offset:2px;}\n  #mg-builder .mg-btn[disabled]{opacity:.3;cursor:not-allowed;}\n  #mg-builder .mg-qty{font-family:'Rajdhani',sans-serif;font-weight:700;font-size:18px;min-width:30px;text-align:center;color:var(--text);}\n  #mg-builder .mg-included{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted);margin:10px 0 0 2px;}\n  #mg-builder .mg-bar{position:sticky;bottom:0;margin-top:14px;background:var(--surface);border:1px solid var(--line);\n    border-radius:14px;padding:16px 18px;display:flex;align-items:center;gap:16px;backdrop-filter:blur(8px);z-index:5;}\n  #mg-builder .mg-total .k{font-family:'Rajdhani',sans-serif;font-weight:600;font-size:11px;letter-spacing:.18em;\n    text-transform:uppercase;color:var(--muted);margin:0;}\n  #mg-builder .mg-total .v{font-family:'Rajdhani',sans-serif;font-weight:700;font-size:30px;margin:0;line-height:1;color:var(--text);}\n  #mg-builder .mg-cta{margin-left:auto;appearance:none;cursor:pointer;border:none;font-family:'Rajdhani',sans-serif;\n    font-weight:700;font-size:16px;letter-spacing:.06em;text-transform:uppercase;color:#06060a;padding:15px 26px;\n    border-radius:11px;background:var(--spectrum);background-size:200%;animation:mg-shift 6s linear infinite;\n    transition:transform .1s,filter .15s;}\n  #mg-builder .mg-cta:hover:not([disabled]){filter:brightness(1.08);}\n  #mg-builder .mg-cta:active:not([disabled]){transform:scale(.97);}\n  #mg-builder .mg-cta:focus-visible{outline:2px solid #fff;outline-offset:3px;}\n  #mg-builder .mg-cta[disabled]{filter:grayscale(.7) brightness(.6);cursor:not-allowed;animation:none;}\n  #mg-builder .mg-toast{position:fixed;left:50%;bottom:26px;transform:translate(-50%,140%);background:var(--surface-2);\n    border:1px solid var(--line);border-radius:12px;padding:14px 18px;max-width:min(92vw,420px);\n    box-shadow:0 12px 40px rgba(0,0,0,.5);z-index:50;transition:transform .4s cubic-bezier(.2,.8,.2,1);}\n  #mg-builder .mg-toast.show{transform:translate(-50%,0);}\n  #mg-builder .mg-toast .head{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:6px;}\n  #mg-builder .mg-toast .dot{width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 8px var(--ok);}\n  #mg-builder .mg-toast p{margin:0;font-size:13px;color:var(--muted);}\n  @media(prefers-reduced-motion:reduce){#mg-builder *{animation:none!important;transition:none!important;}}\n\u003c\/style\u003e\n\u003cdiv id=\"mg-builder\"\u003e\n  \u003cp class=\"mg-eyebrow\"\u003eMotoGlow · Neon Body Trim\u003c\/p\u003e\n  \u003ch1 class=\"mg-title\"\u003eBuild your \u003cspan\u003ekit\u003c\/span\u003e\n\u003c\/h1\u003e\n  \u003cdiv class=\"mg-wrap\"\u003e\n    \u003csection class=\"mg-stage\" aria-label=\"Live preview\"\u003e\n      \u003cdiv class=\"mg-photo\"\u003e\n        \u003cimg id=\"mgImg\" alt=\"Your bike\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0686\/1380\/0135\/files\/bike-clean.jpg?v=1784415988\"\u003e\n        \u003cdiv id=\"mgSvgHost\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"mg-vig\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"mg-swatches\" id=\"mgSwatches\"\u003e\u003cspan class=\"lbl\"\u003eColor\u003c\/span\u003e\u003c\/div\u003e\n      \u003cdiv class=\"mg-readout\"\u003e\n        \u003cdiv\u003e\n\u003cp class=\"k\"\u003ePairs\u003c\/p\u003e\n\u003cp class=\"v\" id=\"roPairs\"\u003e0\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv\u003e\n\u003cp class=\"k\"\u003eLights\u003c\/p\u003e\n\u003cp class=\"v\" id=\"roLights\"\u003e0\u003c\/p\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"mg-cart\"\u003e\n        \u003cp class=\"t\"\u003eYour kit\u003c\/p\u003e\n        \u003cul id=\"mgCart\"\u003e\u003cli class=\"empty\"\u003eAdd a pair to start your kit\u003c\/li\u003e\u003c\/ul\u003e\n      \u003c\/div\u003e\n    \u003c\/section\u003e\n    \u003csection aria-label=\"Configure your kit\"\u003e\n      \u003cdiv class=\"mg-step\"\u003e\n        \u003cdiv class=\"mg-label\"\u003e\n\u003cspan class=\"mg-num\"\u003e1\u003c\/span\u003e\u003ch3\u003eChoose your strips\u003c\/h3\u003e\n          \u003cspan class=\"mg-cap\"\u003e\u003cb id=\"capNow\"\u003e0\u003c\/b\u003e\/6 pairs\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cp class=\"mg-hint\"\u003eEach pair is an individual strip for the left and right side. Mix any lengths, up to 6 pairs.\u003c\/p\u003e\n        \u003cdiv class=\"mg-list\" id=\"mgList\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"mg-step\"\u003e\n        \u003cdiv class=\"mg-label\"\u003e\n\u003cspan class=\"mg-num\"\u003e2\u003c\/span\u003e\u003ch3\u003eAdd-ons\u003c\/h3\u003e\n\u003c\/div\u003e\n        \u003cdiv id=\"mgAddons\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"mg-included\" id=\"mgIncluded\"\u003eEvery kit includes the controller, splitters \u0026amp; kill-switch harness.\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"mg-bar\"\u003e\n        \u003cdiv class=\"mg-total\"\u003e\n\u003cp class=\"k\"\u003eYour price\u003c\/p\u003e\n\u003cp class=\"v\" id=\"mgTotal\"\u003e$0.00\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cbutton type=\"button\" class=\"mg-cta\" id=\"mgAdd\" disabled\u003eAdd a pair\u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/section\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"mg-toast\" id=\"mgToast\" role=\"status\" aria-live=\"polite\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIG = {\n    maxPairs: 6,\n    basePrice: 135.00, baseVariantId: 46827507581127,\n    bikeImageUrl: \"https:\/\/cdn.shopify.com\/s\/files\/1\/0686\/1380\/0135\/files\/bike-clean.jpg?v=1784415988\",\n    colors: [\n      { id:'rgb', label:'RGB flow' },\n      { id:'#00e5ff', label:'Cyan' }, { id:'#2b6bff', label:'Blue' },\n      { id:'#8b5cff', label:'Purple' }, { id:'#ff2bd6', label:'Magenta' },\n      { id:'#ff2d2d', label:'Red' }, { id:'#ff8a3d', label:'Amber' },\n      { id:'#39ff14', label:'Green' }, { id:'#ffffff', label:'White' }\n    ],\n    strips: [\n      \"M1219 100 C1224.7 102.3 1241.8 109.0 1253 114 C1264.2 119.0 1274.8 124.2 1286 130 C1297.2 135.8 1308.7 141.7 1320 149 C1331.3 156.3 1342.7 164.8 1354 174 C1365.3 183.2 1376.7 192.8 1388 204 C1399.3 215.2 1410.8 227.2 1422 241 C1433.2 254.8 1443.8 270.2 1455 287 C1466.2 303.8 1483.3 332.8 1489 342\",\n      \"M789 446 C796.5 443.7 819.0 437.8 834 432 C849.0 426.2 864.0 418.7 879 411 C894.0 403.3 909.2 395.0 924 386 C938.8 377.0 953.2 366.5 968 357 C982.8 347.5 998.0 338.2 1013 329 C1028.0 319.8 1043.0 310.2 1058 302 C1073.0 293.8 1088.0 286.3 1103 280 C1118.0 273.7 1140.5 266.7 1148 264\",\n      \"M342 236 C347.5 240.5 364.0 254.0 375 263 C386.0 272.0 397.0 281.2 408 290 C419.0 298.8 430.0 307.2 441 316 C452.0 324.8 463.0 334.0 474 343 C485.0 352.0 496.0 361.2 507 370 C518.0 378.8 529.0 387.2 540 396 C551.0 404.8 562.0 414.0 573 423 C584.0 432.0 600.5 445.5 606 450\",\n      \"M1027 372 C1033.2 373.3 1051.8 377.8 1064 380 C1076.2 382.2 1088.0 383.7 1100 385 C1112.0 386.3 1123.8 387.3 1136 388 C1148.2 388.7 1160.7 389.2 1173 389 C1185.3 388.8 1197.8 388.0 1210 387 C1222.2 386.0 1234.0 384.7 1246 383 C1258.0 381.3 1269.8 379.5 1282 377 C1294.2 374.5 1312.8 369.5 1319 368\",\n      \"M1464 385 C1445.8 392.8 1385.7 416.2 1355 432 C1324.3 447.8 1300.3 464.0 1280 480 C1259.7 496.0 1245.0 512.2 1233 528 C1221.0 543.8 1213.7 559.3 1208 575 C1202.3 590.7 1200.5 606.2 1199 622 C1197.5 637.8 1198.3 654.0 1199 670 C1199.7 686.0 1202.2 702.2 1203 718 C1203.8 733.8 1203.8 757.2 1204 765\",\n      \"M666 541 C660.0 542.7 642.0 547.7 630 551 C618.0 554.3 606.0 557.7 594 561 C582.0 564.3 570.0 567.7 558 571 C546.0 574.3 533.8 577.5 522 581 C510.2 584.5 498.8 588.5 487 592 C475.2 595.5 463.0 598.7 451 602 C439.0 605.3 427.0 608.7 415 612 C403.0 615.3 385.0 620.3 379 622\"\n    ],\n    lengths: [\n      { id:'45in', label:'45 in', inches:45, pricePerPair:49.99, maxQty:2 },\n      { id:'40in', label:'40 in', inches:40, pricePerPair:45.99, maxQty:2 },\n      { id:'32in', label:'32 in', inches:32, pricePerPair:39.99 },\n      { id:'28in', label:'28 in', inches:28, pricePerPair:34.99 },\n      { id:'24in', label:'24 in', inches:24, pricePerPair:32.99 },\n      { id:'20in', label:'20 in', inches:20, pricePerPair:29.99 },\n      { id:'15in', label:'15 in', inches:15, pricePerPair:28.99 },\n      { id:'12in', label:'12 in', inches:12, pricePerPair:24.99 }\n    ],\n    extension: { label:'Extension cables', desc:'Pair of 12-inch cables for hard-to-reach runs', price:9.99 },\n    variantMap: {\n      '45in':46827506696391, '40in':46827506729159, '32in':46827506761927, '28in':46827506794695,\n      '24in':46827506827463, '20in':46827506860231, '15in':46827506892999, '12in':46827506925767\n    },\n    extensionVariantId: 46827508236487\n  };\n  var SVGNS=\"http:\/\/www.w3.org\/2000\/svg\";\n  var $=function(id){return document.getElementById(id);};\n  var money=function(n){return '$'+n.toFixed(2);};\n  var state={ qty:{}, extQty:0, color:'rgb' };\n  CONFIG.lengths.forEach(function(L){ state.qty[L.id]=0; });\n  function totalPairs(){ var t=0; CONFIG.lengths.forEach(function(L){t+=state.qty[L.id];}); return t; }\n  function price(){ if(totalPairs()===0) return 0; var p=CONFIG.basePrice;\n    CONFIG.lengths.forEach(function(L){ p+=state.qty[L.id]*L.pricePerPair; });\n    p+=state.extQty*CONFIG.extension.price; return p; }\n  if(CONFIG.bikeImageUrl) $('mgImg').src=CONFIG.bikeImageUrl;\n\n  function el(tag,attrs,parent){ var n=document.createElementNS(SVGNS,tag);\n    if(attrs) for(var k in attrs) n.setAttribute(k,attrs[k]);\n    if(parent) parent.appendChild(n); return n; }\n  var svg=el('svg',{id:'mgSvg',viewBox:'0 0 1731 909',fill:'none','aria-hidden':'true',preserveAspectRatio:'xMidYMid meet'});\n  $('mgSvgHost').parentNode.replaceChild(svg,$('mgSvgHost'));\n  var defs=el('defs',null,svg);\n  var lg=el('linearGradient',{id:'mgNeonGrad',gradientUnits:'userSpaceOnUse',x1:'0',y1:'0',x2:'360',y2:'0',spreadMethod:'repeat'},defs);\n  [['0','#00e5ff'],['.22','#3a86ff'],['.45','#8b5cff'],['.68','#ff2bd6'],['.85','#ff6a3d'],['1','#00e5ff']].forEach(function(s){ el('stop',{offset:s[0],'stop-color':s[1]},lg); });\n  el('animateTransform',{attributeName:'gradientTransform',type:'translate',from:'0 0',to:'360 0',dur:'4s',repeatCount:'indefinite'},lg);\n  var filt=el('filter',{id:'mgGlowF',x:'-30%',y:'-30%',width:'160%',height:'160%'},defs);\n  el('feGaussianBlur',{stdDeviation:'11'},filt);\n  var stripsG=el('g',{id:'mgStrips'},svg);\n  var inc=$('mgIncluded');\n  var icoSvg=el('svg',{viewBox:'0 0 12 12',width:'14',height:'14'});\n  el('path',{d:'M2 6.5L5 9.5L10 3',stroke:'#34d399','stroke-width':'2',fill:'none','stroke-linecap':'round','stroke-linejoin':'round'},icoSvg);\n  inc.insertBefore(icoSvg,inc.firstChild);\n\n  var stripEls=[];\n  function mkPath(d,w,stroke,extra){ var p=el('path');\n    p.setAttribute('d',d); p.setAttribute('fill','none'); p.setAttribute('stroke',stroke);\n    p.setAttribute('stroke-width',w); p.setAttribute('stroke-linecap','round');\n    if(extra) for(var k in extra) p.setAttribute(k,extra[k]); return p; }\n  CONFIG.strips.forEach(function(d){\n    var g=el('g'); g.style.opacity=0; g.style.transition='opacity .35s ease';\n    g.appendChild(mkPath(d,26,'url(#mgNeonGrad)',{filter:'url(#mgGlowF)'}));\n    g.appendChild(mkPath(d,8,'url(#mgNeonGrad)'));\n    g.appendChild(mkPath(d,2.5,'#ffffff',{opacity:'.55'}));\n    stripsG.appendChild(g); stripEls.push(g);\n  });\n\n  var swBox=$('mgSwatches');\n  CONFIG.colors.forEach(function(c){\n    var b=document.createElement('button'); b.className='mg-sw'; b.type='button';\n    b.title=c.label; b.setAttribute('aria-label',c.label); b.dataset.id=c.id;\n    b.style.background = c.id==='rgb' ? 'conic-gradient(from 0deg,#00e5ff,#3a86ff,#8b5cff,#ff2bd6,#ff6a3d,#00e5ff)' : c.id;\n    b.onclick=function(ev){ ev.preventDefault(); state.color=c.id; render(); };\n    swBox.appendChild(b);\n  });\n  function applyColor(){\n    var stroke = state.color==='rgb' ? 'url(#mgNeonGrad)' : state.color;\n    stripEls.forEach(function(g){ g.children[0].setAttribute('stroke',stroke); g.children[1].setAttribute('stroke',stroke); });\n    Array.prototype.forEach.call(swBox.querySelectorAll('.mg-sw'),function(b){ b.classList.toggle('on',b.dataset.id===state.color); });\n  }\n\n  var list=$('mgList');\n  CONFIG.lengths.forEach(function(L){\n    var row=document.createElement('div'); row.className='mg-strip'; row.dataset.id=L.id;\n    row.innerHTML='\u003cdiv class=\"mg-strip-info\"\u003e\u003cspan class=\"mg-strip-len\"\u003e'+L.label+'\u003c\/span\u003e'+\n      '\u003cspan class=\"mg-strip-sub\"\u003eMotoGlow Neon Lights \u0026middot; pair (L + R)'+(L.maxQty?' \u0026middot; max '+L.maxQty:'')+'\u003c\/span\u003e\u003c\/div\u003e'+\n      '\u003cdiv class=\"mg-stepper\"\u003e\u003cbutton class=\"mg-btn mg-minus\" type=\"button\" aria-label=\"Remove one '+L.label+' pair\"\u003e\u0026minus;\u003c\/button\u003e'+\n      '\u003cspan class=\"mg-qty\" aria-live=\"polite\"\u003e0\u003c\/span\u003e'+\n      '\u003cbutton class=\"mg-btn mg-plus\" type=\"button\" aria-label=\"Add one '+L.label+' pair\"\u003e+\u003c\/button\u003e\u003c\/div\u003e';\n    row.querySelector('.mg-minus').onclick=function(ev){ ev.preventDefault(); if(state.qty[L.id]\u003e0){state.qty[L.id]--;render();} };\n    row.querySelector('.mg-plus').onclick=function(ev){ ev.preventDefault(); if(totalPairs()\u003cCONFIG.maxPairs \u0026\u0026 state.qty[L.id]\u003c(L.maxQty||CONFIG.maxPairs)){state.qty[L.id]++;render();} };\n    list.appendChild(row);\n  });\n  var addBox=$('mgAddons');\n  var ext=document.createElement('div'); ext.className='mg-strip';\n  ext.innerHTML='\u003cdiv class=\"mg-strip-info\"\u003e\u003cspan class=\"mg-strip-len\" style=\"font-size:16px\"\u003e'+CONFIG.extension.label+'\u003c\/span\u003e'+\n    '\u003cspan class=\"mg-strip-sub\"\u003e'+CONFIG.extension.desc+'\u003c\/span\u003e\u003c\/div\u003e'+\n    '\u003cdiv class=\"mg-stepper\"\u003e\u003cbutton class=\"mg-btn\" id=\"extMinus\" type=\"button\" aria-label=\"Remove one extension pair\"\u003e\u0026minus;\u003c\/button\u003e'+\n    '\u003cspan class=\"mg-qty\" id=\"extQty\" aria-live=\"polite\"\u003e0\u003c\/span\u003e'+\n    '\u003cbutton class=\"mg-btn\" id=\"extPlus\" type=\"button\" aria-label=\"Add one extension pair\"\u003e+\u003c\/button\u003e\u003c\/div\u003e';\n  addBox.appendChild(ext);\n  ext.querySelector('#extMinus').onclick=function(ev){ ev.preventDefault(); if(state.extQty\u003e0){state.extQty--;render();} };\n  ext.querySelector('#extPlus').onclick=function(ev){ ev.preventDefault(); state.extQty++; render(); };\n\n  function render(){\n    var tp=totalPairs(), atMax=tp\u003e=CONFIG.maxPairs;\n    Array.prototype.forEach.call(list.children,function(row){\n      var id=row.dataset.id, q=state.qty[id];\n      row.querySelector('.mg-qty').textContent=q; row.classList.toggle('has',q\u003e0);\n      var Lc=null; CONFIG.lengths.forEach(function(x){ if(x.id===id) Lc=x; });\n      var perCap=Lc\u0026\u0026Lc.maxQty?q\u003e=Lc.maxQty:false;\n      row.querySelector('.mg-minus').disabled=(q===0); row.querySelector('.mg-plus').disabled=atMax||perCap;\n    });\n    ext.querySelector('#extQty').textContent=state.extQty; ext.classList.toggle('has',state.extQty\u003e0); ext.querySelector('#extMinus').disabled=(state.extQty===0);\n    $('capNow').textContent=tp; $('roPairs').textContent=tp; $('roLights').textContent=tp*2;\n    $('mgTotal').textContent=money(price());\n    var btn=$('mgAdd'); btn.disabled=(tp===0); btn.textContent=tp===0?'Add a pair':'Add to cart';\n    stripEls.forEach(function(g,i){ g.style.opacity = i\u003ctp ? 1 : 0; });\n    var cart=$('mgCart'), rows='';\n    if(tp\u003e0){\n      rows+='\u003cli\u003e\u003cspan class=\"q\"\u003e1\u0026times;\u003c\/span\u003e\u003cspan class=\"nm\"\u003eController, splitters \u0026amp; kill-switch harness\u003c\/span\u003e\u003c\/li\u003e';\n      CONFIG.lengths.forEach(function(L){ if(state.qty[L.id]\u003e0)\n        rows+='\u003cli\u003e\u003cspan class=\"q\"\u003e'+state.qty[L.id]+'\u0026times;\u003c\/span\u003e\u003cspan class=\"nm\"\u003e'+L.label+' MotoGlow Neon Lights pair\u003c\/span\u003e\u003c\/li\u003e'; });\n      if(state.extQty\u003e0) rows+='\u003cli\u003e\u003cspan class=\"q\"\u003e'+state.extQty+'\u0026times;\u003c\/span\u003e\u003cspan class=\"nm\"\u003e'+CONFIG.extension.label+'\u003c\/span\u003e\u003c\/li\u003e';\n    } else rows='\u003cli class=\"empty\"\u003eAdd a pair to start your kit\u003c\/li\u003e';\n    cart.innerHTML=rows;\n    applyColor();\n  }\n\n  var toast=$('mgToast');\n  function showToast(html,auto){ toast.innerHTML=html; toast.classList.add('show');\n    if(auto) setTimeout(function(){toast.classList.remove('show');},6000); }\n  $('mgAdd').onclick=function(ev){\n    if(ev){ ev.preventDefault(); ev.stopPropagation(); }\n    var items=[], missing=false;\n    if(CONFIG.baseVariantId) items.push({id:CONFIG.baseVariantId,quantity:1}); else missing=true;\n    CONFIG.lengths.forEach(function(L){ if(state.qty[L.id]\u003e0){\n      var vid=CONFIG.variantMap[L.id]; if(vid) items.push({id:vid,quantity:state.qty[L.id]}); else missing=true; } });\n    if(state.extQty\u003e0){ if(CONFIG.extensionVariantId) items.push({id:CONFIG.extensionVariantId,quantity:state.extQty}); else missing=true; }\n    if(missing || !items.length){\n      showToast('\u003cdiv class=\"head\"\u003e\u003cspan class=\"dot\"\u003e\u003c\/span\u003eKit configured \u0026mdash; '+money(price())+'\u003c\/div\u003e\u003cp style=\"margin-top:8px\"\u003eSetup incomplete: a variant ID is missing in CONFIG.\u003c\/p\u003e',true); return; }\n    var btn=$('mgAdd'); btn.disabled=true; btn.textContent='Adding\\u2026';\n    fetch('\/cart\/add.js',{method:'POST',headers:{'Content-Type':'application\/json','Accept':'application\/json'},body:JSON.stringify({items:items})})\n      .then(function(r){\n        if(!r.ok){ return r.json().then(function(j){ throw new Error(j.description||j.message||('HTTP '+r.status)); },function(){ throw new Error('HTTP '+r.status); }); }\n        return r.json(); })\n      .then(function(){ showToast('\u003cdiv class=\"head\"\u003e\u003cspan class=\"dot\"\u003e\u003c\/span\u003eAdded to cart\u003c\/div\u003e\u003cp\u003eTaking you to your cart\u0026hellip;\u003c\/p\u003e',true);\n        setTimeout(function(){window.location.href='\/cart';},700); })\n      .catch(function(err){ btn.disabled=false; btn.textContent='Add to cart';\n        showToast('\u003cdiv class=\"head\"\u003e\u003cspan class=\"dot\" style=\"background:#ff5a5a;box-shadow:0 0 8px #ff5a5a\"\u003e\u003c\/span\u003eCouldn\u0026rsquo;t add to cart\u003c\/div\u003e\u003cp\u003e'+(err\u0026\u0026err.message?err.message:'Unknown error')+'\u003c\/p\u003e',true); });\n  };\n  render();\n})();\n\u003c\/script\u003e","brand":"MotoGlow Lights LLC","offers":[{"title":"Default Title","offer_id":46827507581127,"sku":"MG-KIT-BASE","price":135.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0686\/1380\/0135\/files\/Screenshot_2026-07-18_184954.png?v=1784418627"},{"product_id":"motoglow-extension-cables-pair-12-in","title":"MotoGlow Extension Cables — Pair (12 in)","description":"\u003cp\u003eA pair of 12-inch extension cables for reaching hard-to-wire spots on your bike. Add as many as your routing needs.\u003c\/p\u003e","brand":"MotoGlow Lights LLC","offers":[{"title":"Default Title","offer_id":46827508236487,"sku":"MG-EXT-12","price":9.99,"currency_code":"USD","in_stock":true}]}],"url":"https:\/\/motoglowlights.com\/collections\/build-your-kit.oembed","provider":"MotoGlow Lights LLC","version":"1.0","type":"link"}