{"id":10379,"date":"2025-12-19T21:11:25","date_gmt":"2025-12-19T21:11:25","guid":{"rendered":"https:\/\/dev.smartplug.com\/staging\/?page_id=10379"},"modified":"2026-10-06T14:37:07","modified_gmt":"2026-10-06T14:37:07","slug":"commercial","status":"publish","type":"page","link":"https:\/\/dev.smartplug.com\/staging\/categories\/commercial\/","title":{"rendered":"Commercial"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"10379\" class=\"elementor elementor-10379\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3bca2de e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"3bca2de\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-a6fee19 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"a6fee19\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5bd7c62 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"5bd7c62\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f1844a3 elementor-widget elementor-widget-heading\" data-id=\"f1844a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Commercial<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8d6de6e elementor-hidden-desktop elementor-hidden-laptop elementor-hidden-tablet elementor-hidden-mobile e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"8d6de6e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d72c499 elementor-widget elementor-widget-html\" data-id=\"d72c499\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"custom-dock-wrapper\" id=\"custom-dock-wrapper\">\n\n    <div class=\"custom-dock-trigger\" id=\"custom-dock-trigger\">\n        \u2630\n        <span class=\"custom-dock-badge\" id=\"custom-dock-badge\">0<\/span>\n    <\/div>\n\n    <!-- Periodic hint bubble: nudges visitors who haven't opened the dock yet.\n         Pauses while the dock is open\/hovered, and restarts its 5s cycle\n         fresh the moment the dock is closed again. -->\n    <div class=\"custom-dock-hint\" id=\"custom-dock-hint\">\n        <small>Having trouble finding the right product?<\/small>\n        <strong>TRY PRODUCT FILTER<\/strong>\n    <\/div>\n\n    <div class=\"custom-dock-flyout\">\n\n        <div class=\"custom-dock-header-row\">\n            <span class=\"custom-dock-filter-label\">Product Filter<\/span>\n            <button type=\"button\" class=\"custom-dock-reset-btn\" id=\"custom-dock-reset-btn\">\n                Reset Filters\n            <\/button>\n        <\/div>\n\n        \n\n        <!-- Search box: lets someone jump straight to a product by name -->\n        <div class=\"custom-dock-search-row\">\n            <input\n                type=\"text\"\n                id=\"custom-dock-search\"\n                class=\"custom-dock-search-input\"\n                placeholder=\"Search products\u2026\"\n                autocomplete=\"off\"\n            >\n        <\/div>\n\n        <!-- Active filter chips: shows what's selected, removable at a glance -->\n        <div class=\"custom-dock-chips\" id=\"custom-dock-chips\"><\/div>\n\n        <!-- Application -->\n\n        <button class=\"custom-dock-cat-btn\">\n            Application\n        <\/button>\n\n        <div class=\"custom-dock-prod-list\">\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"application\" value=\"marine\">\n                Marine\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"application\" value=\"rv\">\n                RV\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"application\" value=\"dockside\">\n                Dockside\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"application\" value=\"specialty\">\n                Specialty\n            <\/label>\n\n        <\/div>\n\n        <!-- Product Type -->\n\n        <button class=\"custom-dock-cat-btn\">\n            Product Type\n        <\/button>\n\n        <div class=\"custom-dock-prod-list\">\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"connector\">\n                Connector\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"cordset\">\n                Cordset\n            <\/label>\n\n            <!-- Plain checkbox again \u2014 no nested panel here anymore.\n                 The color sub-filter now lives down in the results section,\n                 right under the \"Matching Products\" header. -->\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"inlet\">\n                Inlet\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"elci\">\n                ELCI\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"service-kits\">\n                Service Kits\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"combokit\">\n                Combokit\n            <\/label>\n\n            <label class=\"custom-dock-prod-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"type\" value=\"data-ports\">\n                Data Ports\n            <\/label>\n\n        <\/div>\n\n        <!-- Amperage -->\n\n        <button class=\"custom-dock-cat-btn\">\n            Amperage\n        <\/button>\n\n        <div class=\"custom-dock-prod-list custom-dock-prod-list-amp\">\n\n            <label class=\"custom-dock-prod-link custom-dock-amp-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"amp\" value=\"15\">\n                <span class=\"custom-dock-amp-text\">15A<small>Standard outlets<\/small><\/span>\n            <\/label>\n\n            <label class=\"custom-dock-prod-link custom-dock-amp-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"amp\" value=\"16\">\n                <span class=\"custom-dock-amp-text\">16A<small>Compact setups<\/small><\/span>\n            <\/label>\n\n            <label class=\"custom-dock-prod-link custom-dock-amp-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"amp\" value=\"30\">\n                <span class=\"custom-dock-amp-text\">30A<small>Most RVs<\/small><\/span>\n            <\/label>\n\n            <label class=\"custom-dock-prod-link custom-dock-amp-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"amp\" value=\"32\">\n                <span class=\"custom-dock-amp-text\">32A<small>Larger boats<\/small><\/span>\n            <\/label>\n\n            <label class=\"custom-dock-prod-link custom-dock-amp-link\">\n                <input type=\"checkbox\" class=\"product-filter\" data-filter=\"amp\" value=\"50\">\n                <span class=\"custom-dock-amp-text\">50A<small>Large RVs &amp; boats<\/small><\/span>\n            <\/label>\n\n        <\/div>\n\n        <div class=\"custom-dock-results\">\n\n            <h4>Matching Products <span id=\"match-count\" class=\"custom-dock-match-count\"><\/span><\/h4>\n\n            <!-- Compact horizontal checkbox row (e.g. Color), no heading text.\n                 Sits right under \"Matching Products\" and above the cards.\n                 Populated by renderSubFilters(). -->\n            <div id=\"sub-filters-section\"><\/div>\n\n            <div id=\"recommended-products\">\n                <p class=\"custom-dock-empty-msg\">Check an attribute above to see matching products.<\/p>\n                <a href=\"https:\/\/dev.smartplug.com\/staging\/product-catalog\/\" class=\"custom-dock-browse-all-btn\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\">\n                    Browse All Products \u2192\n                <\/a>\n            <\/div>\n\n            <div id=\"related-products\"><\/div>\n\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n<script>\n\n\/\/ Swap these image\/url values for your real product data.\nconst products = [\n    {\n        \"name\": \"28V DC Power\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/28v-dc-power\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/08\/2-Carousel.png\",\n        \"sku\": \"MR28VDC, RF28VDC\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [],\n            \"amp\": []\n        }\n    },\n    {\n        \"name\": \"SmartPlug Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Connector.avif\",\n        \"sku\": \"BF30, BF50\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\",\n                \"marine\"\n            ],\n            \"type\": [\n                \"connector\"\n            ],\n            \"amp\": []\n        }\n    },\n    {\n        \"name\": \"SmartPlug Inlet\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-inlet\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/Updated-Inlets.png\",\n        \"sku\": \"BM30NT, BM30PB, BM30PG, BM30PW\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"inlet\"\n            ],\n            \"amp\": [],\n            \"color\": [\n                \"stainless\",\n                \"white\",\n                \"grey\",\n                \"black\"\n            ]\n        }\n    },\n    {\n        \"name\": \"Angled RV Cordset 30 Amp\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/angled-rv-cordset-30-amp\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/Angled-RV-Cordset-30-Amp.avif\",\n        \"sku\": \"R30303A\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\"\n            ],\n            \"type\": [\n                \"cordset\"\n            ],\n            \"amp\": [\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"Angled RV Cordset 50 Amp\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/angled-rv-cordset-50-amp\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/Angled-RV-Cordset-50-Amp.avif\",\n        \"sku\": \"R50503A\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\"\n            ],\n            \"amp\": [\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Combo Kit\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-combokit\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Combo-Kit-2.avif\",\n        \"sku\": \"B30ASSYNT, B30ASSYPW, B30ASSYPB, B30ASSYPG, B50ASSYNT, B50ASSYPW, B50ASSYPB, B50ASSYPG\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"rv\",\n                \"specialty\"\n            ],\n            \"type\": [\n                \"combokit\"\n            ],\n            \"amp\": [\n                \"15\",\n                \"16\",\n                \"30\",\n                \"32\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug TV\/Phone\/Internet Inlets\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-tv-phone-internet-inlets\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/08\/Triple-Data-Port-2.png\",\n        \"sku\": \"BDBPB, BDBPB, BDBPW, BDBPG, BDBSS\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"rv\"\n            ],\n            \"type\": [\n                \"data-ports\"\n            ],\n            \"amp\": []\n        }\n    },\n    {\n        \"name\": \"SmartPlug Cordset With Push-Type Park Power Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-cordset-with-push-type-park-power-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Cordset-With-Push-Type-Park-Power-Connector.avif\",\n        \"sku\": \"R30304, R50304\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"push-type\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Dual Configuration Cordset w\/SmartPlug Connector Shore Power End\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-dual-configuration-smartplug-cordset-w-smartplug-connector-shore-power-end\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Dual-Configuration-Smartplug-Cordset-w_SmartPlug-Connector-Shore-Power-End.avif\",\n        \"sku\": \"CM30253, CM30503, CM50254, CM50504\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"rv\",\n                \"dockside\",\n                \"specialty\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"15 Amp 115V \/ 30 Amp 125V \u2013 25\u2019 and 50\u2032 Cordset\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/15-amp-115v-30-amp-125v-25-and-50%E2%80%B2-cordset\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/15-Amp-115V-_-30-Amp-125V-%E2%80%93-25-and-50%E2%80%B2-Cordset.avif\",\n        \"sku\": \"C15253, C15503\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\"\n            ],\n            \"amp\": [\n                \"15\",\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"15 Amp 115V \/ 30 Amp 125V \u2013 4\u2019 Cordset\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/15-amp-115v-30-amp-125v-4-cordset\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/15-Amp-115V-_-30-Amp-125V-%E2%80%93-4-Cordset.avif\",\n        \"sku\": \"C15043\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\",\n                \"dockside\",\n                \"marine\"\n            ],\n            \"type\": [\n                \"cordset\"\n            ],\n            \"amp\": [\n                \"15\",\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Dual Configuration Cordset w\/ Shore Power Twist-Type Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/dual-configuration-smartplug-cordset-w-shore-power-twist-type-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Dual-Configuration-Smartplug-Cordset-w_-Shore-Power-Twist-Type-Connector-2.avif\",\n        \"sku\": \"C30253, C30503W, C50254, C50504\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"specialty\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"twist-type\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Harmonized Cord w\/ SmartPlug Boat Side Connector w\/ Blunt End\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/harmonized-cord-w-smartplug-boat-side-connector-w-blunt-end\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Harmonized-Cord-w_-SmartPlug-Boat-Side-Connector-w_-Blunt-End.avif\",\n        \"sku\": \"C16123, C16253, C32153, C32253\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"specialty\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"16\",\n                \"32\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug ELCI Sensor & Breaker Combo Kit \u2013 WHITE\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/elci-sensor-breaker-combo-kit-white\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-ELCI-Sensor-Breaker-Combo-Kit-%E2%80%93-WHITE.avif\",\n        \"sku\": \"ELCISENSORNMW, ELCI30BRKERNMW, ELCI50BRKERNMW\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\"\n            ],\n            \"type\": [\n                \"elci\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ],\n            \"color\": [\n                \"white\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug ELCI Breakers \u2013 WHITE\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/elci-breakers-white\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-ELCI-Breakers-%E2%80%93-WHITE.avif\",\n        \"sku\": \"ELCIBRKR30PW, ELCIBRKR50PW\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\"\n            ],\n            \"type\": [\n                \"elci\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ],\n            \"color\": [\n                \"white\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Female Receptacle\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-female-receptacle\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Female-Receptacle.avif\",\n        \"sku\": \"RF30, RF50\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\",\n                \"marine\"\n            ],\n            \"type\": [\n                \"connector\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"30A SmartPlug Female Connector to 30A Twist-type Male Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/30a-smartplug-female-connector-to-30a-twist-type-male-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/30A-SmartPlug-Female-Connector-to-30A-Twist-type-Male-Connector.avif\",\n        \"sku\": \"C30043\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\",\n                \"marine\"\n            ],\n            \"type\": [\n                \"connector\"\n            ],\n            \"amp\": [\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"50A SmartPlug Female Connector to 15A STD Wall Plug Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/50a-smartplug-female-connector-to-15a-std-wall-plug-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/50A-SmartPlug-Female-Connector-to-15A-STD-Wall-Plug-Connector.avif\",\n        \"sku\": \"C50044L515P\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"15\"\n            ]\n        }\n    },\n    {\n        \"name\": \"50A SmartPlug Female Connector to 50A Male 4ft Twist-type Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/50a-smartplug-female-connector-to-50a-male-4ft-twist-type-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/50A-SmartPlug-Female-Connector-to-50A-Male-4ft-Twist-type-Connector.avif\",\n        \"sku\": \"C50044\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"50A SmartPlug Female Connector to 30A Male Twist-type Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/50a-smartplug-female-connector-to-30a-male-twist-type-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/04\/50A-SmartPlug-Female-Connector-to-30A-Male-Twist-type-Connector.webp\",\n        \"sku\": \"C50044L530P\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"30A Female Twist-type Connector to 30A SmartPlug Male Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/30a-female-twist-type-connector-to-30a-smartplug-male-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/30A-Female-Twist-type-Connector-to-30A-SmartPlug-Male-Connector.avif\",\n        \"sku\": \"CM30043L530R\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"50A SmartPlug Male Connector to 50A Female 4ft Twist-type Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/50a-smartplug-male-connector-to-50a-female-4ft-twist-type-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/50A-SmartPlug-Male-Connector-to-50A-Female-4ft-Twist-type-Connector.avif\",\n        \"sku\": \"CM5004460729R\",\n        \"attributes\": {\n            \"application\": [\n                \"rv\"\n            ],\n            \"type\": [\n                \"cordset\",\n                \"connector\"\n            ],\n            \"amp\": [\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Dock & Lift Kit\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/sp-dock-lifts\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Dock-Lift-Kit.avif\",\n        \"sku\": \"CB001, RDPWP, RDPWL, CM50254, CM50504, BM30NT, BM30PW, BM30PB, BM30PG, BM50NT, BM50PW, BM50PB, BM50PG\",\n        \"attributes\": {\n            \"application\": [\n                \"dockside\"\n            ],\n            \"type\": [\n                \"service-kits\"\n            ],\n            \"amp\": []\n        }\n    },\n    {\n        \"name\": \"LEGACY Lighthouse Pedestal Mounting Bracket\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/legacy-lighthouse-pedestal-mounting-bracket\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/LEGACY-Lighthouse-Pedestal-Mounting-Bracket.avif\",\n        \"sku\": \"LHRBRKTL530, LHRBRKT60729\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"dockside\"\n            ],\n            \"type\": [],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Cordset Storage Bag\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/cordset-storage-bag\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Cordset-Storage-Bag.avif\",\n        \"sku\": \"\",\n        \"attributes\": {\n            \"application\": [\n                \"specialty\"\n            ],\n            \"type\": [\n                \"cordset\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ],\n            \"color\": [\n                \"black\"\n            ]\n        }\n    },\n    {\n        \"name\": \"EATON Lighthouse Double Pedestal Retro-fit Conversion Kit\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/eaton-lighthouse-double-pedestal-retro-fit-conversion-kit\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/EATON-Lighthouse-Double-Pedestal-Retro-fit-Conversion-Kit.avif\",\n        \"sku\": \"LH2RF30ASSY, LH2RF50ASSY, LHRF3050ASSY\",\n        \"attributes\": {\n            \"application\": [\n                \"dockside\",\n                \"marine\"\n            ],\n            \"type\": [\n                \"service-kits\"\n            ],\n            \"amp\": [\n                \"15\",\n                \"30\"\n            ]\n        }\n    },\n    {\n        \"name\": \"EATON Lighthouse Pedestal Retro-fit Conversion Kit\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/lighthouse-pedestal-retro-fit-conversion-kit\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/EATON-Lighthouse-Pedestal-Retro-fit-Conversion-Kit.avif\",\n        \"sku\": \"LHRF30ASSY, LHRF50ASSY\",\n        \"attributes\": {\n            \"application\": [\n                \"dockside\",\n                \"marine\"\n            ],\n            \"type\": [\n                \"service-kits\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"EATON Lighthouse Pedestal Mounting Bracket\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/lighthouse-pedestal-mounting-bracket\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/EATON-Lighthouse-Pedestal-Mounting-Bracket.avif\",\n        \"sku\": \"LHRBRKT, LHRBRKT30, LHRBRKT50, LHRBRKTB\",\n        \"attributes\": {\n            \"application\": [\n                \"dockside\",\n                \"marine\"\n            ],\n            \"type\": [],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Weathercap\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-weathercap\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Weathercap.avif\",\n        \"sku\": \"A1001\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"inlet\"\n            ],\n            \"amp\": []\n        }\n    },\n    {\n        \"name\": \"SmartPlug Male Inlet Connector\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-male-inlet-connector\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Male-Inlet-Connector.avif\",\n        \"sku\": \"BM30, BM50\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"service-kits\",\n                \"inlet\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Female Connector Inlet\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-female-connector-inlet\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Female-Connector-Inlet.avif\",\n        \"sku\": \"PFK30\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"inlet\",\n                \"combokit\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Male Inlet Connector Strain Relief\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-male-inlet-connector-strain-relief\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Male-Inlet-Connector-Strain-Relief.avif\",\n        \"sku\": \"PKMGKT\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"connector\",\n                \"inlet\",\n                \"service-kits\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Female Connector Gasket\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-female-connector-gasket\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Female-Connector-Gasket.avif\",\n        \"sku\": \"PKF30G, PKF50G\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"connector\",\n                \"service-kits\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Male Connector Gasket\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-male-connector-gasket\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Male-Connector-Gasket.avif\",\n        \"sku\": \"PKMGKT\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"connector\",\n                \"service-kits\"\n            ],\n            \"amp\": [\n                \"30\",\n                \"50\"\n            ]\n        }\n    },\n    {\n        \"name\": \"SmartPlug Weather Door Receptacle\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-weather-door-receptacle\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Weather-Door-Receptacle.avif\",\n        \"sku\": \"RDPWP, RDPWL, RF30, RF50\",\n        \"attributes\": {\n            \"application\": [],\n            \"type\": [\n                \"service-kits\"\n            ],\n            \"amp\": []\n        }\n    },\n    {\n        \"name\": \"SmartPlug Side Lever Kit\",\n        \"url\": \"https:\/\/dev.smartplug.com\/staging\/smartplug-side-lever-kit\/\",\n        \"image\": \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Side-Lever-Kit.avif\",\n        \"sku\": \"PKFO1\",\n        \"attributes\": {\n            \"application\": [\n                \"marine\",\n                \"rv\"\n            ],\n            \"type\": [\n                \"service-kits\"\n            ],\n            \"amp\": [\n                \"16\",\n                \"30\",\n                \"32\",\n                \"50\"\n            ]\n        }\n    }\n];\n\n\nconst MAIN_FILTER_GROUPS = ['application', 'type', 'amp'];\n\nconst SUBFILTER_CONFIG = {\n    color: {\n        label: 'Color',\n        options: [\n            { value: 'stainless', label: 'Stainless' },\n            { value: 'white', label: 'White' },\n            { value: 'grey', label: 'Grey' },\n            { value: 'black', label: 'Black' },\n            { value: 'orange', label: 'Orange' },\n            { value: 'clear', label: 'Clear' }\n        ]\n    }\n    \n};\n\nconst VALUE_LABELS = {\n    marine: 'Marine',\n    rv: 'RV',\n    dockside: 'Dockside',\n    specialty: 'Specialty',\n    connector: 'Connector',\n    cordset: 'Cordset',\n    inlet: 'Inlet',\n    elci: 'ELCI',\n    'service-kits': 'Service Kits',\n    combokit: 'Combokit',\n    'data-ports': 'Data Ports',\n    '15': '15A',\n    '16': '16A',\n    '30': '30A',\n    '32': '32A',\n    '50': '50A',\n    stainless: 'Stainless',\n    white: 'White',\n    grey: 'Grey',\n    black: 'Black',\n    orange: 'Orange',\n    clear: 'Clear'\n};\n\nfunction labelFor(value) {\n    return VALUE_LABELS[value] || (value.charAt(0).toUpperCase() + value.slice(1));\n}\n\n\nlet activeSubFilters = {};\n\n\/\/ --- Accordion behaviour for the TOP-LEVEL category buttons ---\ndocument.querySelectorAll('.custom-dock-cat-btn').forEach(button => {\n    button.addEventListener('click', function () {\n        const list = this.nextElementSibling;\n\n        document.querySelectorAll('.custom-dock-prod-list').forEach(item => {\n            if (item !== list) item.style.display = \"none\";\n        });\n        document.querySelectorAll('.custom-dock-cat-btn').forEach(btn => {\n            if (btn !== this) btn.classList.remove(\"active\");\n        });\n\n        if (list.style.display === \"grid\") {\n            list.style.display = \"none\";\n            this.classList.remove(\"active\");\n        } else {\n            list.style.display = \"grid\";\n            this.classList.add(\"active\");\n        }\n    });\n});\n\n\/\/ --- Wire up the MAIN filter checkboxes ---\ndocument.querySelectorAll('.product-filter').forEach(filter => {\n    filter.addEventListener('change', updateRecommendations);\n});\n\n\/\/ --- Reset button ---\ndocument.getElementById('custom-dock-reset-btn').addEventListener('click', function () {\n    \/\/ Uncheck every main checkbox\n    document.querySelectorAll('.product-filter:checked').forEach(cb => {\n        cb.checked = false;\n    });\n\n    \/\/ Close every top-level accordion panel and clear active state\n    document.querySelectorAll('.custom-dock-prod-list').forEach(list => {\n        list.style.display = \"none\";\n    });\n    document.querySelectorAll('.custom-dock-cat-btn').forEach(btn => {\n        btn.classList.remove(\"active\");\n    });\n\n    \/\/ Clear sub-filter state and its rendered block entirely\n    activeSubFilters = {};\n    document.getElementById('sub-filters-section').innerHTML = '';\n\n    \/\/ Clear the search box too\n    const searchInput = document.getElementById('custom-dock-search');\n    if (searchInput) searchInput.value = '';\n\n    \/\/ Refresh the results back to the empty state\n    updateRecommendations();\n});\n\n\ndocument.querySelectorAll('.custom-dock-preset-btn').forEach(btn => {\n    btn.addEventListener('click', function () {\n        const appValue = this.dataset.app;\n        const target = document.querySelector(\n            `.product-filter[data-filter=\"application\"][value=\"${appValue}\"]`\n        );\n        if (!target) return;\n\n        target.checked = true;\n\n        \/\/ Open the Application panel so the person can see what got checked\n        const appList = target.closest('.custom-dock-prod-list');\n        const appBtn = appList ? appList.previousElementSibling : null;\n        document.querySelectorAll('.custom-dock-prod-list').forEach(list => {\n            list.style.display = (list === appList) ? \"grid\" : \"none\";\n        });\n        document.querySelectorAll('.custom-dock-cat-btn').forEach(b => {\n            b.classList.toggle('active', b === appBtn);\n        });\n\n        updateRecommendations();\n    });\n});\n\n\/\/ --- Search box: quick jump to a product by name, independent of filters ---\nconst searchInputEl = document.getElementById('custom-dock-search');\nif (searchInputEl) {\n    searchInputEl.addEventListener('input', updateRecommendations);\n}\n\n\n\nconst dockWrapper = document.getElementById('custom-dock-wrapper');\nconst dockTrigger = document.getElementById('custom-dock-trigger');\nconst dockHint = document.getElementById('custom-dock-hint');\n\n\/\/ How long the bubble stays visible per pulse, and how long it waits\n\/\/ (fully hidden) before showing again. Tweak these two numbers only.\nconst HINT_VISIBLE_MS = 20000; \/\/ stays on screen ~8s each time it appears\nconst HINT_HIDDEN_MS = 10000; \/\/ waits 10s after hiding before showing again\n\nlet dockHintShowTimer = null;  \/\/ timer that hides the bubble after it's shown\nlet dockHintWaitTimer = null;  \/\/ timer that re-shows the bubble after the gap\nlet isDockOpen = false; \/\/ tracks open state, whether via tap or hover\n\n\/\/ Shows the bubble, keeps it up for HINT_VISIBLE_MS, then hides it and\n\/\/ schedules the next appearance after HINT_HIDDEN_MS. Recursive by design\n\/\/ so \"visible time\" and \"gap time\" can differ (a plain setInterval can't\n\/\/ do that cleanly).\nfunction showDockHintOnce() {\n    if (!dockHint || isDockOpen) return;\n\n    dockHint.classList.add('custom-dock-hint-show');\n\n    dockHintShowTimer = setTimeout(() => {\n        dockHint.classList.remove('custom-dock-hint-show');\n        dockHintShowTimer = null;\n\n        dockHintWaitTimer = setTimeout(() => {\n            dockHintWaitTimer = null;\n            showDockHintOnce();\n        }, HINT_HIDDEN_MS);\n    }, HINT_VISIBLE_MS);\n}\n\n\/\/ Wipes any pending hint + timers. Called whenever the dock opens.\nfunction pauseDockHint() {\n    if (dockHintShowTimer) {\n        clearTimeout(dockHintShowTimer);\n        dockHintShowTimer = null;\n    }\n    if (dockHintWaitTimer) {\n        clearTimeout(dockHintWaitTimer);\n        dockHintWaitTimer = null;\n    }\n    if (dockHint) dockHint.classList.remove('custom-dock-hint-show');\n}\n\n\/\/ Starts the show\/wait cycle fresh. Called on page load, and again every\n\/\/ time the dock closes (so it \"starts again as it is\") \u2014 always beginning\n\/\/ with a fresh HINT_HIDDEN_MS wait before the next appearance, so closing\n\/\/ the dock never triggers an instant re-pop.\nfunction resumeDockHintCycle() {\n    pauseDockHint();\n    if (!dockHint) return;\n    dockHintWaitTimer = setTimeout(() => {\n        dockHintWaitTimer = null;\n        showDockHintOnce();\n    }, HINT_HIDDEN_MS);\n}\n\nif (dockTrigger && dockWrapper) {\n\n    dockTrigger.addEventListener('click', function (e) {\n        e.stopPropagation();\n        dockWrapper.classList.toggle('custom-dock-open');\n\n        if (dockWrapper.classList.contains('custom-dock-open')) {\n            isDockOpen = true;\n            pauseDockHint();\n        } else {\n            isDockOpen = false;\n            resumeDockHintCycle();\n        }\n    });\n\n    document.addEventListener('click', function (e) {\n        if (!dockWrapper.contains(e.target)) {\n            if (dockWrapper.classList.contains('custom-dock-open')) {\n                dockWrapper.classList.remove('custom-dock-open');\n                isDockOpen = false;\n                resumeDockHintCycle();\n            }\n        }\n    });\n\n    \/\/ Desktop hover: opens\/closes the flyout via CSS, but JS still needs to\n    \/\/ know about it so the hint pauses\/resumes at the right moments.\n    dockWrapper.addEventListener('mouseenter', function () {\n        isDockOpen = true;\n        pauseDockHint();\n    });\n\n    dockWrapper.addEventListener('mouseleave', function () {\n        \/\/ Only truly \"closed\" if it's not pinned open by a tap\n        if (!dockWrapper.classList.contains('custom-dock-open')) {\n            isDockOpen = false;\n            resumeDockHintCycle();\n        }\n    });\n\n    \/\/ First-visit attention pulse: draws the eye once, then stops so it\n    \/\/ never feels naggy on repeat visits.\n    setTimeout(() => dockTrigger.classList.add('custom-dock-pulse'), 800);\n    dockTrigger.addEventListener('click', () => dockTrigger.classList.remove('custom-dock-pulse'), { once: true });\n\n    \/\/ Kick off the hint cycle on load\n    resumeDockHintCycle();\n}\n\n\/\/ Reads only the MAIN checkboxes into { application: ['rv'], type: ['inlet'], ... }\nfunction getMainSelectedFilters() {\n    const selected = {};\n    document.querySelectorAll('.product-filter:checked').forEach(cb => {\n        const group = cb.dataset.filter;\n        if (!MAIN_FILTER_GROUPS.includes(group)) return; \/\/ sub-filter checkboxes are handled separately\n        if (!selected[group]) selected[group] = [];\n        selected[group].push(cb.value);\n    });\n    return selected;\n}\n\n\/\/ A product \"matches\" a filter group if it has at least one value in common with the checked\n\/\/ boxes for that group. It's a full match if it satisfies every group that has a selection.\n\/\/ Works the same whether \"selected\" contains main groups, sub-filter groups, or both.\nfunction matchScore(product, selected) {\n    const groups = Object.keys(selected);\n    if (groups.length === 0) return { full: false, partial: false, hits: 0 };\n\n    let hits = 0;\n    groups.forEach(group => {\n        const productValues = product.attributes[group] || [];\n        const overlap = productValues.some(v => selected[group].includes(v));\n        if (overlap) hits++;\n    });\n\n    return {\n        full: hits === groups.length,\n        partial: hits > 0,\n        hits\n    };\n}\n\nfunction renderProductCard(product, matchLabel) {\n    const link = document.createElement('a');\n    link.className = 'custom-dock-prod-link';\n    link.href = product.url;\n    link.target = '_blank';\n    link.rel = 'noopener noreferrer';\n\n    link.innerHTML = `\n        <img decoding=\"async\" src=\"${product.image}\" alt=\"${product.name}\">\n        <span>\n            ${product.name}\n            ${product.sku ? `<small class=\"custom-dock-sku\">SKU: ${product.sku}<\/small>` : ''}\n            ${matchLabel ? `<span class=\"custom-dock-match-tag\">${matchLabel}<\/span>` : ''}\n        <\/span>\n    `;\n    return link;\n}\n\n\/\/ Builds the dynamic sub-filter checkbox row(s) that sit right under\n\/\/ \"Matching Products\". baseMatches = whatever currently satisfies the\n\/\/ MAIN filters only (before any sub-filter is applied). A sub-filter\n\/\/ group shows up if at least one of those products actually has that\n\/\/ attribute defined \u2014 so it only appears when it'd be useful, e.g.\n\/\/ Color only shows once Inlet-type products are in the results.\n\/\/ Rendered as a compact horizontal row of pill checkboxes with no\n\/\/ heading text.\nfunction renderSubFilters(baseMatches) {\n    const container = document.getElementById('sub-filters-section');\n    container.innerHTML = '';\n\n    const relevantGroups = Object.keys(SUBFILTER_CONFIG).filter(key => {\n        return baseMatches.some(p => (p.attributes[key] || []).length > 0);\n    });\n\n    \/\/ Drop stale selections for sub-filters that are no longer relevant,\n    \/\/ so a hidden checkbox can never silently keep narrowing results.\n    Object.keys(activeSubFilters).forEach(key => {\n        if (!relevantGroups.includes(key)) delete activeSubFilters[key];\n    });\n\n    if (relevantGroups.length === 0) return;\n\n    relevantGroups.forEach(key => {\n        const config = SUBFILTER_CONFIG[key];\n\n        const block = document.createElement('div');\n        block.className = 'custom-dock-subfilter-block';\n\n        const list = document.createElement('div');\n        list.className = 'custom-dock-subfilter-list';\n\n        config.options.forEach(opt => {\n            const label = document.createElement('label');\n            label.className = 'custom-dock-subitem';\n\n            const input = document.createElement('input');\n            input.type = 'checkbox';\n            input.className = 'product-filter';\n            input.dataset.filter = key;\n            input.value = opt.value;\n            input.checked = (activeSubFilters[key] || []).includes(opt.value);\n\n            input.addEventListener('change', function () {\n                if (!activeSubFilters[key]) activeSubFilters[key] = [];\n                if (this.checked) {\n                    if (!activeSubFilters[key].includes(opt.value)) {\n                        activeSubFilters[key].push(opt.value);\n                    }\n                } else {\n                    activeSubFilters[key] = activeSubFilters[key].filter(v => v !== opt.value);\n                    if (activeSubFilters[key].length === 0) delete activeSubFilters[key];\n                }\n                updateRecommendations();\n            });\n\n            label.appendChild(input);\n            label.appendChild(document.createTextNode(opt.label));\n            list.appendChild(label);\n        });\n\n        block.appendChild(list);\n        container.appendChild(block);\n    });\n}\n\n\/\/ Renders removable chips for every active main + sub filter, and keeps\n\/\/ the trigger badge count in sync. Clicking a chip's \u00d7 unchecks the\n\/\/ matching checkbox and re-runs the filter \u2014 no need to reopen an accordion\n\/\/ just to undo one choice.\nfunction renderChipsAndBadge(mainSelected) {\n    const chipsEl = document.getElementById('custom-dock-chips');\n    const badgeEl = document.getElementById('custom-dock-badge');\n    chipsEl.innerHTML = '';\n\n    let totalCount = 0;\n\n    Object.keys(mainSelected).forEach(group => {\n        mainSelected[group].forEach(value => {\n            totalCount++;\n            chipsEl.appendChild(buildChip(group, value));\n        });\n    });\n\n    Object.keys(activeSubFilters).forEach(group => {\n        (activeSubFilters[group] || []).forEach(value => {\n            totalCount++;\n            chipsEl.appendChild(buildChip(group, value));\n        });\n    });\n\n    if (badgeEl) {\n        badgeEl.textContent = totalCount;\n        badgeEl.style.display = totalCount > 0 ? 'flex' : 'none';\n    }\n}\n\nfunction buildChip(group, value) {\n    const chip = document.createElement('span');\n    chip.className = 'custom-dock-chip';\n    chip.innerHTML = `${labelFor(value)} <button type=\"button\" aria-label=\"Remove ${labelFor(value)} filter\">\u2715<\/button>`;\n\n    chip.querySelector('button').addEventListener('click', () => {\n        const cb = document.querySelector(`.product-filter[data-filter=\"${group}\"][value=\"${value}\"]`);\n        if (cb) {\n            cb.checked = false;\n            cb.dispatchEvent(new Event('change'));\n        } else {\n            \/\/ Sub-filter checkbox may not currently be rendered \u2014 clear state directly\n            if (activeSubFilters[group]) {\n                activeSubFilters[group] = activeSubFilters[group].filter(v => v !== value);\n                if (activeSubFilters[group].length === 0) delete activeSubFilters[group];\n            }\n            updateRecommendations();\n        }\n    });\n\n    return chip;\n}\n\nfunction updateRecommendations() {\n    const mainSelected = getMainSelectedFilters();\n    const recommendedEl = document.getElementById('recommended-products');\n    const relatedEl = document.getElementById('related-products');\n    const matchCountEl = document.getElementById('match-count');\n    const searchTerm = (document.getElementById('custom-dock-search') || {}).value || '';\n    const trimmedSearch = searchTerm.trim().toLowerCase();\n\n    recommendedEl.innerHTML = '';\n    relatedEl.innerHTML = '';\n\n    \/\/ Search takes priority: if someone's typing, show name matches across\n    \/\/ the whole catalog immediately rather than making them also manage filters.\n    if (trimmedSearch.length > 0) {\n        renderChipsAndBadge(mainSelected);\n        const nameMatches = products.filter(p => {\n            const searchable = [p.name, p.sku]\n                .filter(Boolean)\n                .join(\" \")\n                .toLowerCase();\n\n            return searchable.includes(trimmedSearch);\n        });\n        matchCountEl.textContent = nameMatches.length > 0 ? `(${nameMatches.length})` : '';\n        if (nameMatches.length > 0) {\n            nameMatches.forEach(p => recommendedEl.appendChild(renderProductCard(p)));\n        } else {\n            recommendedEl.innerHTML = `<p class=\"custom-dock-empty-msg\">No products matched \"${searchTerm}\". Try a different term or check an attribute above.<\/p>`;\n        }\n        document.getElementById('sub-filters-section').innerHTML = '';\n        return;\n    }\n\n    if (Object.keys(mainSelected).length === 0) {\n        recommendedEl.innerHTML = `\n            <p class=\"custom-dock-empty-msg\">Check an attribute above to see matching products.<\/p>\n            <a href=\"https:\/\/dev.smartplug.com\/staging\/shop\/\" class=\"custom-dock-browse-all-btn\">Browse All Products \u2192<\/a>\n        `;\n        matchCountEl.textContent = '';\n        activeSubFilters = {};\n        document.getElementById('sub-filters-section').innerHTML = '';\n        renderChipsAndBadge(mainSelected);\n        return;\n    }\n\n    \/\/ What matches on MAIN filters alone \u2014 used to decide which sub-filters to show\n    const baseMatches = products.filter(p => matchScore(p, mainSelected).full);\n\n    \/\/ Sub-filters (e.g. Color) should only ever appear when EVERY main\n    \/\/ group currently has at most one box checked. The moment any single\n    \/\/ group (Application, Product Type, Amperage) has 2+ checked, we\n    \/\/ suppress sub-filters entirely \u2014 pass an empty array so\n    \/\/ renderSubFilters finds no relevant groups and clears any active\n    \/\/ sub-filter selections along with it.\n    const anyGroupHasMultiple = Object.values(mainSelected).some(vals => vals.length > 1);\n    renderSubFilters(anyGroupHasMultiple ? [] : baseMatches);\n\n    \/\/ Combine main + active sub-filters for the actual results shown\n    const fullSelected = { ...mainSelected };\n    Object.keys(activeSubFilters).forEach(key => {\n        if (activeSubFilters[key] && activeSubFilters[key].length > 0) {\n            fullSelected[key] = activeSubFilters[key];\n        }\n    });\n\n    renderChipsAndBadge(mainSelected);\n\n    \/\/ \"Matching Products\" must satisfy main filters AND any active sub-filter (e.g. Color).\n    const scoredFull = products.map(p => ({ product: p, score: matchScore(p, fullSelected) }));\n    const fullMatches = scoredFull.filter(s => s.score.full);\n\n    matchCountEl.textContent = fullMatches.length > 0 ? `(${fullMatches.length})` : '';\n\n    \/\/ \"You Might Also Like\" and its \"Shares N attribute(s)\" label are scored\n    \/\/ against MAIN filters ONLY. Sub-filters (Color, etc.) should never count\n    \/\/ as a \"shared attribute\" and should never by themselves decide whether\n    \/\/ something is related \u2014 only the top-level filter groups do.\n    const fullMatchProducts = new Set(fullMatches.map(s => s.product));\n    const mainScored = products.map(p => ({ product: p, score: matchScore(p, mainSelected) }));\n    const relatedMatches = mainScored\n        .filter(s => s.score.partial && !fullMatchProducts.has(s.product))\n        .sort((a, b) => b.score.hits - a.score.hits);\n\n    if (fullMatches.length > 0) {\n        fullMatches.forEach(s => {\n            recommendedEl.appendChild(renderProductCard(s.product));\n        });\n    } else {\n        recommendedEl.innerHTML = `\n            <p class=\"custom-dock-empty-msg\">No exact match yet \u2014 try fewer attributes, or see related products below.<\/p>\n        `;\n    }\n\n    if (relatedMatches.length > 0) {\n        const heading = document.createElement('h4');\n        heading.textContent = 'You Might Also Like';\n        relatedEl.appendChild(heading);\n\n        relatedMatches.slice(0, 4).forEach(s => {\n            const sharedLabel = `Shares ${s.score.hits} attribute${s.score.hits > 1 ? 's' : ''}`;\n            relatedEl.appendChild(renderProductCard(s.product, sharedLabel));\n        });\n    }\n}\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cb1f943 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"cb1f943\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-a697a51 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"a697a51\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7e70bd1 elementor-widget elementor-widget-html\" data-id=\"7e70bd1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- =========================================================\r\n     SMARTPLUG PRODUCT CATALOG\r\n     SELECTED PRODUCTS ONLY \u2014 NO FILTER\r\n     ========================================================= -->\r\n\r\n<style>\r\n\r\n\/* =========================================================\r\n   BASE\r\n   ========================================================= *\/\r\n\r\n.sp-catalog,\r\n.sp-catalog * {\r\n  box-sizing: border-box;\r\n}\r\n\r\n.sp-catalog {\r\n  width: 100%;\r\n  background: #ffffff;\r\n  color: #000000;\r\n  font-family: 'Montserrat', sans-serif;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/* =========================================================\r\n   PRODUCT GRID\r\n   ========================================================= *\/\r\n\r\n.sp-products {\r\n  width: 100%;\r\n  max-width: 1500px;\r\n\r\n  margin: 0 auto;\r\n\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    repeat(3, minmax(0, 1fr));\r\n\r\n  gap: 26px;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PRODUCT CARD\r\n   ========================================================= *\/\r\n\r\n.sp-card {\r\n  min-width: 0;\r\n\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  padding: 26px 26px 26px;\r\n\r\n  background: #F3F5F7;\r\n\r\n  border-radius: 16px;\r\n\r\n  overflow: hidden;\r\n\r\n  transition:\r\n    transform .2s ease,\r\n    box-shadow .2s ease;\r\n}\r\n\r\n.sp-card:hover {\r\n  transform: none;\r\n  box-shadow: none;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   PRODUCT IMAGE\r\n   ========================================================= *\/\r\n\r\n.sp-card-image {\r\n  width: 100%;\r\n  height: 220px;\r\n\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  margin: 0 0 18px;\r\n}\r\n\r\n.sp-card-image img {\r\n  display: block;\r\n  width: 100%;\r\n  height: 100%;\r\n  max-width: 360px;\r\n\r\n  object-fit: contain;\r\n\r\n  transition: transform .35s ease;\r\n  transform-origin: center center;\r\n}\r\n\r\n.sp-card-image img:hover {\r\n  transform: scale(1.24);\r\n}\r\n\r\n\/* =========================================================\r\n   TITLE\r\n   ========================================================= *\/\r\n\r\n\r\n\r\n.sp-card-title {\r\n  width: 100%;\r\n\r\n\r\n  margin: 0 0 4px;\r\n\r\n  color: #000000;\r\n\r\n  font-family: 'Bebas Neue', sans-serif;\r\n  font-size: 32px;\r\n  font-weight: 500;\r\n\r\n  line-height: 1;\r\n\r\n  letter-spacing: .35px;\r\n\r\n  text-transform: uppercase;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   DESCRIPTION\r\n   ========================================================= *\/\r\n\r\n.sp-card-description {\r\n  margin: 0 0 0px;\r\n\r\n  color: #000000;\r\n\r\n  font-family: 'Montserrat', sans-serif;\r\n  font-size: 14px;\r\n  font-weight: 400;\r\n\r\n  line-height: 1.5;\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BULLET LIST\r\n   ========================================================= *\/\r\n\r\n.sp-card-list {\r\n  list-style: none;\r\n\r\n  padding: 0;\r\n  margin: 0 0 22px;\r\n\r\n  flex: 1 1 auto;\r\n}\r\n\r\n.sp-card-list li {\r\n  position: relative;\r\n\r\n  padding-left: 20px;\r\n  margin-bottom: 0px;\r\n\r\n  color: #000000;\r\n\r\n  font-family: 'Montserrat', sans-serif;\r\n  font-size: 14px;\r\n  font-weight: 400;\r\n\r\n  line-height: 1.6;\r\n}\r\n\r\n.sp-card-list li:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n\r\n.sp-card-list li::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  left: 0;\r\n  top: 5px;\r\n  width: 15px;\r\n  height: 15px;\r\n  background-image: url(\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/08\/Check-Symbol-4.png\");\r\n  background-size: contain;\r\n  background-repeat: no-repeat;\r\n  filter: drop-shadow(0 0 0.5px currentColor) drop-shadow(0 0 0.5px currentColor);\r\n}\r\n\r\n\r\n\/* =========================================================\r\n   BUTTON\r\n   ========================================================= *\/\r\n\r\n.sp-card-button {\r\n  width: 100%;\r\n  min-height: 44px;\r\n\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  gap: 10px;\r\n\r\n  padding: 11px 18px;\r\n\r\n  border-radius: 6px;\r\n\r\n  background: #ED6D25;\r\n  color: #ffffff !important;\r\n\r\n  font-family: 'Montserrat', sans-serif;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  letter-spacing: 0.5px;\r\n\r\n  line-height: 1;\r\n\r\n  text-decoration: none !important;\r\n\r\n  transition:\r\n    background .18s ease;\r\n}\r\n\r\n.sp-card-button:hover {\r\n  background: #D95E1A;\r\n  color: #ffffff !important;\r\n\r\n}\r\n\r\n.sp-arrow {\r\n  position: relative;\r\n  display: inline-block;\r\n \r\n\r\n  font-size: 0;\r\n  line-height: 0;\r\n  margin-left: 1px;\r\n}\r\n\r\n.sp-arrow::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  left: 0;\r\n  top: 50%;\r\n  width: 16px;\r\n  height: 3.5px;\r\n  border-radius: 16px;\r\n  background: #ffffff;\r\n  transform: translateY(-50%);\r\n}\r\n\r\n.sp-arrow::after {\r\n  content: \"\";\r\n  position: absolute;\r\n  left: 5px;\r\n  top: 50%;\r\n  width: 12px;\r\n  height: 12px;\r\n\r\n  border-top: 3px solid #ffffff;\r\n  border-right: 3px solid #ffffff;\r\n\r\n  transform: translateY(-50%) rotate(45deg);\r\n  transform-origin: center;\r\n}\r\n\r\n\/* =========================================================\r\n   TABLET\r\n   ========================================================= *\/\r\n\r\n@media (max-width: 1100px) {\r\n\r\n  .sp-products {\r\n    grid-template-columns:\r\n      repeat(2, minmax(0, 1fr));\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\/* =========================================================\r\n   MOBILE\r\n   ========================================================= *\/\r\n\r\n@media (max-width: 680px) {\r\n\r\n  .sp-products {\r\n    grid-template-columns: 1fr;\r\n    gap: 20px;\r\n  }\r\n\r\n  .sp-card {\r\n    padding: 22px 20px 18px;\r\n  }\r\n\r\n  .sp-card-title {\r\n    min-height: auto;\r\n    margin-bottom: 18px;\r\n\r\n    font-size: 30px;\r\n  }\r\n\r\n  .sp-card-description {\r\n    font-size: 14px;\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\/* =========================================================\r\n   SMALL MOBILE\r\n   ========================================================= *\/\r\n\r\n@media (max-width: 400px) {\r\n\r\n  .sp-card-title {\r\n    font-size: 28px;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n<div class=\"sp-catalog\">\r\n\r\n  <div class=\"sp-products\" id=\"spProductGrid\">\r\n\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Combo Kits\"\r\n      data-applications=\"Boat RV Dockside\"\r\n      data-amperage=\"30-50\"\r\n      data-sku=\"B30ASSYNT, B30ASSYPW, B30ASSYPB, B30ASSYPG, B50ASSYNT, B50ASSYPW, B50ASSYPB, B50ASSYPG\"\r\n      data-search=\"smartplug combo kit smartplug combokit B30ASSYNT B30ASSYPW B30ASSYPB B30ASSYPG B50ASSYNT B50ASSYPW B50ASSYPB B50ASSYPG\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-combokit-commercial\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Combo-Kit-2.avif\"\r\n          alt=\"COMBO KIT\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        COMBO KIT\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        The SmartPlug Combo Kit combines a SmartPlug inlet and connector for a complete shore power connection.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Larger contact surface reduces overheating.<\/li>\r\n        <li>Weatherproof seals protect against moisture.<\/li>\r\n        <li>Installs quickly using standard mounting holes.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-combokit-commercial\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Connectors\"\r\n      data-applications=\"Boat RV Dockside Commercial\"\r\n      data-amperage=\"30-50\"\r\n      data-sku=\"BF30, BF50\"\r\n      data-search=\"smartplug connector BF30 BF50\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-connector-commercial\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Connector.avif\"\r\n          alt=\"CONNECTOR\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        CONNECTOR\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        The SmartPlug Connector delivers safer, hassle-free power with enhanced conductivity, secure locking, and weatherproof protection.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Twist-free push-in design.<\/li>\r\n        <li>Weatherproof seals block moisture.<\/li>\r\n        <li>Easier to store and coil.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-connector-commercial\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Inlets\"\r\n      data-applications=\"Boat RV Commercial\"\r\n      data-amperage=\"30-50\"\r\n      data-sku=\"BM30NT, BM30PB, BM30PG, BM30PW\"\r\n      data-search=\"smartplug inlet shore power inlet BM30NT BM30PB BM30PG BM30PW\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-inlet-commercial\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/Updated-Inlets.png\"\r\n          alt=\"INLET\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        INLET\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        Reduces overheating with increased pin and clip surface area for reliable high-amp shore power.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Marine-grade construction.<\/li>\r\n        <li>Hinged flip lid for easy access.<\/li>\r\n        <li>Matches standard mounting patterns.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-inlet-commercial\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Cordsets\"\r\n      data-applications=\"Boat RV Dockside\"\r\n      data-amperage=\"30-50\"\r\n      data-sku=\"CM30253, CM30503, CM50254, CM50504\"\r\n      data-search=\"smartplug dual configuration cordset connector shore power end CM30253 CM30503 CM50254 CM50504\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-dual-configuration-smartplug-cordset-w-smartplug-connector-shore-power-end-commercial\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Dual-Configuration-Smartplug-Cordset-w_SmartPlug-Connector-Shore-Power-End.avif\"\r\n          alt=\"DUAL CONFIGURATION CORDSET WITH CONNECTOR SHORE POWER END\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        DUAL CONFIGURATION CORDSET WITH CONNECTOR SHORE POWER END\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        Secure multi-point locking and weatherproof seals provide dependable shore power connections.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Multi-point clips secure the plug.<\/li>\r\n        <li>Locking system reduces cord stress.<\/li>\r\n        <li>Weatherproof protection.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-dual-configuration-smartplug-cordset-w-smartplug-connector-shore-power-end-commercial\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Connectors\"\r\n      data-applications=\"Boat RV Dockside\"\r\n      data-amperage=\"30-50\"\r\n      data-sku=\"C30253, C30503W, C50254, C50504\"\r\n      data-search=\"dual configuration smartplug cordset shore power twist type connector C30253 C30503W C50254 C50504\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-dual-configuration-smartplug-cordset-w-shore-power-twist-type-connector-commercial\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Dual-Configuration-Smartplug-Cordset-w_-Shore-Power-Twist-Type-Connector-2.avif\"\r\n          alt=\"DUAL CONFIGURATION CORDSET WITH SHORE POWER TWIST-TYPE CONNECTOR\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        DUAL CONFIGURATION CORDSET WITH SHORE POWER TWIST-TYPE CONNECTOR\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        A versatile shore power cordset combining SmartPlug connectivity with a twist-type shore power connector.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Secure locking connection.<\/li>\r\n        <li>Designed for dependable shore power.<\/li>\r\n        <li>Weather-resistant construction.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-dual-configuration-smartplug-cordset-w-shore-power-twist-type-connector-commercial\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Cordsets\"\r\n      data-applications=\"Boat RV\"\r\n      data-amperage=\"30-50\"\r\n      data-sku=\"C16123, C16253, C32153, C32253\"\r\n      data-search=\"smartplug harmonized cord boat side connector blunt end C16123 C16253 C32153 C32253\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-harmonized-cord-w-smartplug-boat-side-connector-w-blunt-end-commercial\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Harmonized-Cord-w_-SmartPlug-Boat-Side-Connector-w_-Blunt-End.avif\"\r\n          alt=\"HARMONIZED CORD WITH BOAT-SIDE CONNECTOR AND BLUNT END\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        HARMONIZED CORD WITH BOAT-SIDE CONNECTOR AND BLUNT END\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        A flexible harmonized cord configuration designed for SmartPlug boat-side shore power installations.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Flexible cord construction.<\/li>\r\n        <li>SmartPlug boat-side connection.<\/li>\r\n        <li>Blunt-end configuration for installation.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/smartplug-harmonized-cord-w-smartplug-boat-side-connector-w-blunt-end-commercial\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n<article\r\n      class=\"sp-card\"\r\n      data-type=\"Accessories\"\r\n      data-applications=\"Boat RV\"\r\n      data-amperage=\"other\"\r\n      data-sku=\"\"\r\n      data-search=\"smartplug cordset storage bag storage\"\r\n    >\r\n\r\n      <div class=\"sp-card-image\">\r\n        <a href=\"https:\/\/dev.smartplug.com\/staging\/cordset-storage-bag\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: contents;\">\r\n<img decoding=\"async\"\r\n          src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/07\/SmartPlug-Cordset-Storage-Bag.avif\"\r\n          alt=\"CORDSET STORAGE BAG\"\r\n          loading=\"lazy\"\r\n        >\r\n      <\/a>\r\n<\/div>\r\n\r\n\r\n      <h3 class=\"sp-card-title\">\r\n        CORDSET STORAGE BAG\r\n      <\/h3>\r\n\r\n      <p class=\"sp-card-description\">\r\n        A convenient storage solution for keeping SmartPlug cordsets organized, protected, and ready to use.\r\n      <\/p>\r\n\r\n      <ul class=\"sp-card-list\">\r\n        <li>Keeps cordsets clean and organized.<\/li>\r\n        <li>Helps prevent tangling during storage.<\/li>\r\n        <li>Easy to carry and store.<\/li>\r\n      <\/ul>\r\n\r\n      <a\r\n        class=\"sp-card-button\"\r\n        href=\"https:\/\/dev.smartplug.com\/staging\/cordset-storage-bag\/\"\r\n        target=\"_blank\"\r\n        rel=\"noopener noreferrer\"\r\n      >\r\n        Learn More\r\n\r\n      <\/a>\r\n\r\n    <\/article>\r\n\r\n  <\/div>\r\n\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Commercial \u2630 0 Having trouble finding the right product? TRY PRODUCT FILTER Product Filter Reset Filters Application Marine RV Dockside Specialty Product Type Connector Cordset Inlet ELCI Service Kits Combokit Data Ports Amperage 15AStandard outlets 16ACompact setups 30AMost RVs 32ALarger boats 50ALarge RVs &amp; boats Matching Products Check an attribute above to see matching products. Browse All Products \u2192 COMBO KIT The SmartPlug Combo Kit combines a SmartPlug inlet and connector for a complete shore power connection. Larger contact surface reduces overheating. Weatherproof seals protect against moisture. Installs quickly using standard mounting holes. Learn More CONNECTOR The SmartPlug Connector delivers safer, hassle-free power with enhanced conductivity, secure locking, and weatherproof protection. Twist-free push-in design. Weatherproof seals block moisture. Easier to store and coil. Learn More INLET Reduces overheating with increased pin and clip surface area for reliable high-amp shore power. Marine-grade construction. Hinged flip lid for easy access. Matches standard mounting patterns. Learn More DUAL CONFIGURATION CORDSET WITH CONNECTOR SHORE POWER END Secure multi-point locking and weatherproof seals provide dependable shore power connections. Multi-point clips secure the plug. Locking system reduces cord stress. Weatherproof protection. Learn More DUAL CONFIGURATION CORDSET WITH SHORE POWER TWIST-TYPE CONNECTOR A versatile shore power cordset combining SmartPlug connectivity with a twist-type shore power connector. Secure locking connection. Designed for dependable shore power. Weather-resistant construction. Learn More HARMONIZED CORD WITH BOAT-SIDE CONNECTOR AND BLUNT END A flexible harmonized cord configuration designed for SmartPlug boat-side shore power installations. Flexible cord construction. SmartPlug boat-side connection. Blunt-end configuration for installation. Learn More CORDSET STORAGE BAG A convenient storage solution for keeping SmartPlug cordsets organized, protected, and ready to use. Keeps cordsets clean and organized. Helps prevent tangling during storage. Easy to carry and store. Learn More<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":14240,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-10379","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/10379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/comments?post=10379"}],"version-history":[{"count":182,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/10379\/revisions"}],"predecessor-version":[{"id":20654,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/10379\/revisions\/20654"}],"up":[{"embeddable":true,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/14240"}],"wp:attachment":[{"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/media?parent=10379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}