{"id":11431,"date":"2025-12-19T21:11:25","date_gmt":"2025-12-19T21:11:25","guid":{"rendered":"https:\/\/dev.smartplug.com\/staging\/?page_id=11431"},"modified":"2026-09-30T18:48:19","modified_gmt":"2026-09-30T18:48:19","slug":"smartplug-female-connector-inlet","status":"publish","type":"page","link":"https:\/\/dev.smartplug.com\/staging\/smartplug-female-connector-inlet\/","title":{"rendered":"SmartPlug Female Connector Inlet"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11431\" class=\"elementor elementor-11431\">\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-0037da4 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=\"0037da4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7fe139b elementor-widget elementor-widget-heading\" data-id=\"7fe139b\" 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\">\nSmartPlug Female Connector Inlet<\/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-88192ed 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=\"88192ed\" 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-4723124 e-grid e-con-full 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=\"4723124\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-75c0c77 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=\"75c0c77\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c0f1f6b sp-hotspot-image elementor-widget elementor-widget-html\" data-id=\"c0f1f6b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"sp-elci-gallery\">\n    <div class=\"sp-main-view\">\n\n        <!-- =========================================================\n             FEATURES\n             Product-specific content is editable here.\n             ========================================================= -->\n        <div class=\"sp-gallery-slide active\"\n            data-slide=\"0\"\n            data-title=\"Female Connector - Service Kit\"\n            data-subtitle=\"Click the numbered points to explore the Service Kit\"\n            data-part-number=\"\"\n        >\n            <div class=\"sp-product-image-wrap sp-main-product sp-hotspot-image\" style=\"\n                        --image-x-desktop:0px;\n                        --image-y-desktop:0px;\n                        --image-scale-desktop:1.5;\n                        --image-x-mobile:0px;\n                        --image-y-mobile:0px;\n                        --image-scale-mobile:1.6;\n                        \">\n                <div class=\"sp-main-image-clip\">\n                    <img decoding=\"async\" src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/06\/SmartPlug-Female-Connector-Inlet.png\" alt=\"Female Connector - Service Kit\">\n                <\/div>\n\n                <!-- HOTSPOT 1 -->\n                <div class=\"sp-hotspot\" tabindex=\"0\" style=\"\n                        --top:41%;\n                        --left:32%;\n                        --hotspot-x:0px;\n                        --hotspot-y:0px;\n                        --hotspot-scale-desktop:1;\n                        --hotspot-scale-mobile:.8;\n                        --hotspot-scale-tablet:.9;\n                        --hotspot-scale-laptop:1;\n                        --tooltip-x-desktop:0px;\n                        --tooltip-y-desktop:0px;\n                        --tooltip-scale-desktop:1;\n                        --tooltip-x-mobile:0px;\n                        --tooltip-y-mobile:0px;\n                        --tooltip-scale-mobile:1;\n                        --dot-color:#DF6B30;\n                        --number-color:#ffffff;\n                        --tooltip-bg:#DF6B30;\n                        --tooltip-width:220px;\n                        --dot-size:34px;\n                        --number-size:14px;\n                    \">\n                    <div class=\"sp-dot\"><span class=\"sp-number\">1<\/span><\/div>\n                    <div class=\"sp-tooltip\"><strong>30A Female Connector<\/strong><br>Replacement connector for SmartPlug 30A systems.<\/div>\n                <\/div>\n\n                <!-- HOTSPOT 2 -->\n                <div class=\"sp-hotspot\" tabindex=\"0\" style=\"\n                        --top:67%;\n                        --left:31%;\n                        --hotspot-x:0px;\n                        --hotspot-y:0px;\n                        --hotspot-scale-desktop:1;\n                        --hotspot-scale-mobile:.8;\n                        --hotspot-scale-tablet:.9;\n                        --hotspot-scale-laptop:1;\n                        --tooltip-x-desktop:0px;\n                        --tooltip-y-desktop:0px;\n                        --tooltip-scale-desktop:1;\n                        --tooltip-x-mobile:0px;\n                        --tooltip-y-mobile:0px;\n                        --tooltip-scale-mobile:1;\n                        --dot-color:#DF6B30;\n                        --number-color:#ffffff;\n                        --tooltip-bg:#DF6B30;\n                        --tooltip-width:240px;\n                        --dot-size:34px;\n                        --number-size:16px;\n                    \">\n                    <div class=\"sp-dot\"><span class=\"sp-number\">2<\/span><\/div>\n                    <div class=\"sp-tooltip\"><strong>Strain Relief Boot<\/strong><br>Protects the cable from bending and wear.<\/div>\n                <\/div>\n\n                <!-- HOTSPOT 3 -->\n                <div class=\"sp-hotspot\" tabindex=\"0\" style=\"\n                        --top:71%;\n                        --left:68%;\n                        --hotspot-x:0px;\n                        --hotspot-y:0px;\n                        --hotspot-scale-desktop:1;\n                        --hotspot-scale-mobile:.8;\n                        --hotspot-scale-tablet:.9;\n                        --hotspot-scale-laptop:1;\n                        --tooltip-x-desktop:0px;\n                        --tooltip-y-desktop:0px;\n                        --tooltip-scale-desktop:1;\n                        --tooltip-x-mobile:0px;\n                        --tooltip-y-mobile:0px;\n                        --tooltip-scale-mobile:1;\n                        --dot-color:#DF6B30;\n                        --number-color:#ffffff;\n                        --tooltip-bg:#DF6B30;\n                        --tooltip-width:240px;\n                        --dot-size:34px;\n                        --number-size:16px;\n                    \">\n                    <div class=\"sp-dot\"><span class=\"sp-number\">3<\/span><\/div>\n                    <div class=\"sp-tooltip\"><strong>Silicone Lubricant<\/strong><br>Helps ensure smooth assembly and sealing.<\/div>\n                <\/div>\n\n                <!-- HOTSPOT 4 -->\n                <div class=\"sp-hotspot\" tabindex=\"0\" style=\"\n                        --top:42%;\n                        --left:69%;\n                        --hotspot-x:0px;\n                        --hotspot-y:0px;\n                        --hotspot-scale-desktop:1;\n                        --hotspot-scale-mobile:.8;\n                        --hotspot-scale-tablet:.9;\n                        --hotspot-scale-laptop:1;\n                        --tooltip-x-desktop:0px;\n                        --tooltip-y-desktop:0px;\n                        --tooltip-scale-desktop:1;\n                        --tooltip-x-mobile:0px;\n                        --tooltip-y-mobile:0px;\n                        --tooltip-scale-mobile:1;\n                        --dot-color:#DF6B30;\n                        --number-color:#ffffff;\n                        --tooltip-bg:#DF6B30;\n                        --tooltip-width:220px;\n                        --dot-size:34px;\n                        --number-size:16px;\n                    \">\n                    <div class=\"sp-dot\"><span class=\"sp-number\">4<\/span><\/div>\n                    <div class=\"sp-tooltip\"><strong>Complete Repair Kit<\/strong><br>Includes the essential parts for connector maintenance.<\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"sp-slide-info\">\n                <div class=\"sp-slide-title\">Female Connector - Service Kit<\/div>\n                <div class=\"sp-slide-subtitle\"><\/div>\n            <\/div>\n        <\/div>\n\n        <!-- =========================================================\n             FIRST VARIATION\n             Female \/ Male toggle. Edit each view independently.\n             ========================================================= -->\n        <div class=\"sp-gallery-slide sp-variant-slide\"\n            data-slide=\"1\"\n            data-variant=\"first-variation\"\n            data-view=\"female\"\n            data-current-view=\"female\"\n\n            data-female=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/FEMALE-CONNECTOR-SERVICE-KITS.png\"\n            data-female-title=\"Female Connector\"\n            data-female-subtitle=\"Replacement Parts\"\n            data-female-part-number=\"PFK30G\"\n        >\n            <div class=\"sp-variant-layout\">\n                <div class=\"sp-mobile-variant-title\">\n                    <div class=\"sp-slide-title\">Female Connector - Service Kit<\/div>\n                    <div class=\"sp-slide-subtitle\">Replacement Parts<\/div>\n                <\/div>\n\n                <div class=\"sp-variant-image-wrap\">\n                    <img decoding=\"async\" class=\"sp-variant-image\"\n                         src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/FEMALE-CONNECTOR-SERVICE-KITS.png\"\n                         alt=\"Female Connector - Service Kit\"\n                         style=\"\n                            --image-x-desktop:0px;\n                            --image-y-desktop:0px;\n                            --image-scale-desktop:1;\n                            --image-x-mobile:0px;\n                            --image-y-mobile:0px;\n                            --image-scale-mobile:1;\n                         \">\n                <\/div>\n\n                <div class=\"sp-slide-info sp-side-info\">\n                    <div class=\"sp-slide-title\">Female Connector<\/div>\n                    <div class=\"sp-slide-subtitle\">Replacement Parts<\/div>\n<div class=\"sp-part-number\">\n                        PART NUMBER: <strong class=\"sp-part-number-value\"><\/strong>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- =========================================================\n             SECOND VARIATION\n             No toggle.\n             ========================================================= -->\n        <div class=\"sp-gallery-slide sp-variant-slide\"\n            data-slide=\"2\"\n            data-variant=\"second-variation\"\n            data-view=\"second-variation\"\n            data-current-view=\"second-variation\"\n\n            data-second-variation=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/30A-FEMALE-CONNECTOR-SERVICE-KIT-INSIDE.png\"\n            data-second-variation-title=\"Female Connector\"\n            data-second-variation-subtitle=\"Replacement Parts\"\n            data-second-variation-part-number=\"PKF30G\"\n        >\n            <div class=\"sp-variant-layout\">\n                <div class=\"sp-mobile-variant-title\">\n                    <div class=\"sp-slide-title\">Female Connector<\/div>\n                    <div class=\"sp-slide-subtitle\">Replacement Parts<\/div>\n                <\/div>\n\n                <div class=\"sp-variant-image-wrap\">\n                    <img decoding=\"async\" class=\"sp-variant-image\"\n                         src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/30A-FEMALE-CONNECTOR-SERVICE-KIT-INSIDE.png\"\n                         alt=\"Female Connector - Service Kit\"\n                         style=\"\n                            --image-x-desktop:0px;\n                            --image-y-desktop:0px;\n                            --image-scale-desktop:1;\n                            --image-x-mobile:0px;\n                            --image-y-mobile:0px;\n                            --image-scale-mobile:1;\n                         \">\n                <\/div>\n\n                <div class=\"sp-slide-info sp-side-info\">\n                    <div class=\"sp-slide-title\">Female Connector<\/div>\n                    <div class=\"sp-slide-subtitle\">Replacement Parts<\/div>\n\n                    <div class=\"sp-part-number\">\n                        PART NUMBER: <strong class=\"sp-part-number-value\"><\/strong>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <!-- EXACTLY THREE THUMBNAILS -->\n    <div class=\"sp-product-selector\">\n        <button type=\"button\" class=\"sp-thumb-nav sp-thumb-prev\" aria-label=\"Previous product image\">&#10094;<\/button>\n        <div class=\"sp-thumbnails\">\n            <button type=\"button\" class=\"sp-thumb sp-feature-thumb active\" data-target=\"0\" aria-label=\"View Female Connector - Service Kit features\">\n                <span class=\"sp-thumb-image\"><img decoding=\"async\" src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/FEMALE-CONNECTOR-SERVICE-KITS.png\" alt=\"Female Connector - Service Kit Features\"><\/span>\n                <span class=\"sp-thumb-label\">Features<\/span>\n            <\/button>\n            <button type=\"button\" class=\"sp-thumb\" data-target=\"1\" aria-label=\"View Female Connector - Service Kit\">\n                <span class=\"sp-thumb-image\"><img decoding=\"async\" src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/FEMALE-CONNECTOR-SERVICE-KITS.png\" alt=\"Female Connector - Service Kit\"><\/span>\n                <span class=\"sp-thumb-label\">Female Connector<\/span>\n            <\/button>\n            <button type=\"button\" class=\"sp-thumb\" data-target=\"2\" aria-label=\"View Female Connector - Service Kit Second Variation\">\n                <span class=\"sp-thumb-image\"><img decoding=\"async\" src=\"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/30A-FEMALE-CONNECTOR-SERVICE-KIT-INSIDE.png\" alt=\"Female Connector - Service Kit Second Variation\"><\/span>\n                <span class=\"sp-thumb-label\">Open Parts<\/span>\n            <\/button>\n        <\/div>\n        <button type=\"button\" class=\"sp-thumb-nav sp-thumb-next\" aria-label=\"Next product image\">&#10095;<\/button>\n    <\/div>\n\n    <!-- EXACTLY THREE PAGINATION DOTS -->\n    <div class=\"sp-gallery-pagination\" aria-label=\"Product gallery pagination\">\n        <button type=\"button\" class=\"sp-page-dot active\" data-page=\"0\" aria-label=\"Go to features\"><\/button>\n        <button type=\"button\" class=\"sp-page-dot\" data-page=\"1\" aria-label=\"Go to first variation\"><\/button>\n        <button type=\"button\" class=\"sp-page-dot\" data-page=\"2\" aria-label=\"Go to second variation\"><\/button>\n    <\/div>\n<\/div>\n\n<style>\n\/* =========================================================\nSMARTPLUG DUAL CORDSET GALLERY\nAmazon-inspired product selector\n========================================================= *\/\n\n#sp-elci-gallery {\n    --sp-orange: #DF6B30;\n    --sp-dark: #1c1c1c;\n    --sp-muted: #666;\n    --sp-border: #dedede;\n    --sp-soft: #f7f7f7;\n\n    width: 100%;\n    height: 560px;\n    margin: 0 auto;\n    font-family: \"Montserrat\", sans-serif;\n    box-sizing: border-box;\n    overflow: visible;\n}\n\n#sp-elci-gallery *,\n#sp-elci-gallery *::before,\n#sp-elci-gallery *::after {\n    box-sizing: border-box;\n}\n\n\/* =========================================================\nMAIN VIEW\n========================================================= *\/\n\n#sp-elci-gallery .sp-main-view {\n    position: relative;\n    width: 100%;\n    height: 430px;\n    overflow: visible;\n}\n\n#sp-elci-gallery .sp-gallery-slide {\n    display: none;\n    width: 100%;\n    height: 100%;\n    position: relative;\n    overflow: visible;\n    flex-direction: column;\n    align-items: center;\n    justify-content: flex-start;\n}\n\n#sp-elci-gallery .sp-gallery-slide.active {\n    display: flex;\n}\n\n\/* =========================================================\nFEATURE IMAGE\n========================================================= *\/\n\n#sp-elci-gallery .sp-main-product {\n    position: relative;\n    width: 100%;\n    height: 400px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n#sp-elci-gallery .sp-main-image-clip {\n    position: absolute;\n    inset: 0;\n    overflow: hidden;\n    pointer-events: none;\n    z-index: 1;\n}\n\n#sp-elci-gallery .sp-main-image-clip > img {\n    width: 100%;\n    height: 100%;\n    max-width: none;\n    object-fit: contain;\n    display: block;\n    transform:\n    translate(\n        var(--image-x-desktop),\n        var(--image-y-desktop)\n    )\n    scale(var(--image-scale-desktop));\n    transform-origin: center center;\n    transition: transform .18s ease;\n}\n\n\/* =========================================================\nVARIANT IMAGE\n========================================================= *\/\n\n#sp-elci-gallery .sp-variant-layout {\n    width: 100%;\n    height: 100%;\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) minmax(180px, .65fr);\n    align-items: center;\n    gap: 12px;\n}\n\n#sp-elci-gallery .sp-variant-image-wrap {\n    width: 100%;\n    height: 400px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    position: relative;\n    min-width: 0;\n}\n\n#sp-elci-gallery .sp-variant-image-wrap img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n    display: block;\n    transform:\n    translate(var(--image-x-desktop), var(--image-y-desktop))\n    scale(var(--image-scale-desktop));\n    transform-origin: center center;\n    transition: opacity .16s ease, transform .18s ease;\n}\n\n\/* =========================================================\nPRODUCT INFORMATION\n========================================================= *\/\n\n#sp-elci-gallery .sp-slide-info {\n    width: 100%;\n    max-width: 400px;\n    margin-top: -2px;\n    padding: 0 12px;\n    text-align: center;\n    transition: none;\n}\n\n#sp-elci-gallery .sp-side-info {\n    max-width: none;\n    margin: 0;\n    padding: 2px 2px 2px 2px;\n    text-align: left;\n}\n\n#sp-elci-gallery .sp-side-info .sp-slide-title {\n    font-size: 30px;\n    font-family: \"Bebas Neue\", sans-serif;\n    font-weight: 600;\n    letter-spacing: 1.5px;\n}\n\n#sp-elci-gallery .sp-side-info .sp-part-number { margin-top: 10px; }\n\n#sp-elci-gallery .sp-mobile-variant-title {\n    display: none;\n}\n\n\n#sp-elci-gallery .sp-slide-title {\n    margin-top: 3px;\n    color: var(--sp-dark);\n    font-family: \"Bebas Neue\", sans-serif;\n    font-size: 25px;\n    line-height: 1;\n    letter-spacing: .4px;\n}\n\n#sp-elci-gallery .sp-slide-subtitle {\n    margin-top: 3px;\n    margin-bottom: 3px;\n    color: var(--sp-muted);\n    font-size: 12px;\n    font-weight: 500;\n    line-height: 1.35;\n}\n\n#sp-elci-gallery .sp-variant-image.is-empty {\n    visibility: hidden;\n}\n\n#sp-elci-gallery .sp-part-number {\n    display: inline-block;\n    margin-top: 7px;\n    color: #555;\n    font-size: 12px;\n    font-weight: 600;\n    letter-spacing: .5px;\n}\n\n#sp-elci-gallery .sp-part-number strong {\n    color: var(--sp-dark);\n}\n\n\/* =========================================================\nHOTSPOTS\n========================================================= *\/\n\n#sp-elci-gallery .sp-hotspot {\n    position: absolute;\n    z-index: 1;\n    top: var(--sp-hotspot-top-px, var(--top));\n    left: var(--sp-hotspot-left-px, var(--left));\n    transform:\n        translate(-50%, -50%)\n        scale(var(--hotspot-scale-desktop));\n    transform-origin: center center;\n    outline: none;\n    transition: top .18s ease, left .18s ease, transform .18s ease;\n    will-change: top, left, transform;\n}\n\n\/* LAPTOP: keep the existing bubble scale; position remains JS-calculated. *\/\n@media (min-width: 1025px) and (max-width: 1366px) {\n    #sp-elci-gallery .sp-hotspot {\n        top: var(--sp-hotspot-top-px, var(--top));\n        left: var(--sp-hotspot-left-px, var(--left));\n        transform:\n            translate(-50%, -50%)\n            scale(var(--hotspot-scale-laptop));\n    }\n}\n\n\/* TABLET PORTRAIT: keep the existing bubble scale; position remains JS-calculated. *\/\n@media (min-width: 601px) and (max-width: 1024px) {\n    #sp-elci-gallery .sp-hotspot {\n        top: var(--sp-hotspot-top-px, var(--top));\n        left: var(--sp-hotspot-left-px, var(--left));\n        transform:\n            translate(-50%, -50%)\n            scale(var(--hotspot-scale-tablet));\n    }\n}\n\n#sp-elci-gallery .sp-dot {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    background: var(--dot-color);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    box-shadow: 0 2px 8px rgba(0,0,0,.18);\n}\n\n#sp-elci-gallery .sp-number {\n    color: var(--number-color);\n    font-size: 13px;\n    font-weight: 700;\n    line-height: 1;\n}\n\n#sp-elci-gallery .sp-tooltip {\n    position: absolute;\n    z-index: 81;\n    bottom: calc(100% + 7px - var(--tooltip-y-desktop));\n    left: calc(50% + var(--tooltip-x-desktop));\n    transform:\n    translateX(-50%)\n    scale(var(--tooltip-scale-desktop));\n    transform-origin: center bottom;\n    width: 230px;\n    padding: 10px;\n    border-radius: 7px;\n    background: var(--tooltip-bg);\n    color: #fff;\n    font-size: 10px;\n    line-height: 1.45;\n    text-align: left;\n    opacity: 0;\n    visibility: hidden;\n    transition:\n    opacity .18s ease,\n    visibility .18s ease,\n    left .18s ease,\n    bottom .18s ease,\n    transform .18s ease;\n    pointer-events: none;\n    z-index:10;\n    box-shadow: 0 4px 14px rgba(0,0,0,.14);\n}\n\n#sp-elci-gallery .sp-hotspot:hover .sp-tooltip,\n#sp-elci-gallery .sp-hotspot:focus-visible .sp-tooltip,\n#sp-elci-gallery .sp-hotspot.is-open .sp-tooltip {\n    opacity: 1;\n    visibility: visible;\n}\n\n\/* =========================================================\nAMAZON-STYLE PRODUCT SELECTOR\n========================================================= *\/\n\n#sp-elci-gallery .sp-product-selector {\n    width: 100%;\n    display: flex;\n    align-items: stretch;\n    gap: 6px;\n    margin-top: 4px;\n}\n\n#sp-elci-gallery .sp-thumbnails {\n    flex: 1 1 auto;\n    min-width: 0;\n    display: flex;\n    align-items: stretch;\n    justify-content: center;\n    gap: 7px;\n    overflow-x: auto;\n    overflow-y: hidden;\n    scroll-behavior: smooth;\n    scrollbar-width: none;\n    padding: 2px 0;\n}\n\n#sp-elci-gallery .sp-thumbnails::-webkit-scrollbar {\n    display: none;\n}\n\n#sp-elci-gallery .sp-thumb {\n    flex: 0 0 72px;\n    width: 72px;\n    min-height: 94px;\n    padding: 5px 5px 6px;\n    border: 1px solid var(--sp-border);\n    border-radius: 7px;\n    background: #fff;\n    cursor: pointer;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: flex-start;\n    gap: 3px;\n    appearance: none;\n    -webkit-appearance: none;\n    transition: border-color .18s ease, box-shadow .18s ease, transform .15s ease;\n}\n\n#sp-elci-gallery .sp-thumb:hover {\n    border-color: var(--sp-orange);\n    transform: translateY(-1px);\n}\n\n#sp-elci-gallery .sp-thumb.active {\n    border: 2px solid var(--sp-orange);\n    box-shadow: 0 2px 8px rgba(223,107,48,.13);\n}\n\n#sp-elci-gallery .sp-thumb:focus {\n    outline: none;\n}\n\n#sp-elci-gallery .sp-thumb:focus-visible {\n    border-color: var(--sp-orange);\n    box-shadow: 0 0 0 2px rgba(223,107,48,.18);\n}\n\n#sp-elci-gallery .sp-thumb-image {\n    width: 100%;\n    height: 57px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n    border-radius: 4px;\n    background: #fff;\n}\n\n#sp-elci-gallery .sp-thumb img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n    display: block;\n    pointer-events: none;\n}\n\n#sp-elci-gallery .sp-thumb-label {\n    display: block;\n    width: 100%;\n    color: var(--sp-dark);\n    font-size: 9px;\n    font-weight: 700;\n    line-height: 1.15;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n#sp-elci-gallery .sp-thumb-part {\n    display: block;\n    color: #777;\n    font-size: 8px;\n    font-weight: 600;\n    line-height: 1;\n}\n\n#sp-elci-gallery .sp-thumb-view {\n    display: block;\n    color: #777;\n    font-size: 8px;\n    font-weight: 600;\n    line-height: 1;\n}\n\n#sp-elci-gallery .sp-feature-thumb .sp-thumb-part {\n    visibility: hidden;\n}\n\n\/* =========================================================\nTHUMBNAIL ARROWS\n========================================================= *\/\n\n#sp-elci-gallery .sp-thumb-nav {\n    display: none;\n    width: 26px;\n    min-width: 26px;\n    height: 26px;\n    align-self: center;\n    padding: 0;\n    border: 0;\n    border-radius: 50%;\n    background: #fff;\n    color: #222;\n    font-family: Arial, sans-serif;\n    font-size: 16px;\n    line-height: 26px;\n    text-align: center;\n    cursor: pointer;\n    appearance: none;\n    -webkit-appearance: none;\n}\n\n\/* =========================================================\nPAGINATION\n========================================================= *\/\n\n#sp-elci-gallery .sp-gallery-pagination {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    gap: 6px;\n    margin-top: 7px;\n}\n\n#sp-elci-gallery .sp-page-dot {\n    width: 6px;\n    height: 6px;\n    padding: 0;\n    border: 0;\n    border-radius: 50%;\n    background: #c7c7c7;\n    cursor: pointer;\n    appearance: none;\n    -webkit-appearance: none;\n    transition: background .2s ease, transform .2s ease;\n}\n\n#sp-elci-gallery .sp-page-dot:hover,\n#sp-elci-gallery .sp-page-dot.active {\n    background: var(--sp-orange);\n}\n\n#sp-elci-gallery .sp-page-dot.active {\n    transform: scale(1.25);\n}\n\n\/* =========================================================\nFULL SCREEN VIEW + HOVER ZOOM\n========================================================= *\/\n\n#sp-elci-gallery .sp-fullscreen-trigger {\n    position: static;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    margin-top: 7px;\n    transform: none;\n    border: 1px solid #d7d7d7;\n    border-radius: 4px;\n    background: #fff;\n    color: #333;\n    padding: 6px 11px;\n    font-family: \"Montserrat\", sans-serif;\n    font-size: 9px;\n    font-weight: 700;\n    letter-spacing: .2px;\n    line-height: 1;\n    cursor: pointer;\n    white-space: nowrap;\n    appearance: none;\n    -webkit-appearance: none;\n    box-shadow: 0 1px 4px rgba(0,0,0,.08);\n    transition: border-color .18s ease, color .18s ease, background .18s ease;\n}\n\n#sp-elci-gallery .sp-mobile-variant-title .sp-fullscreen-trigger {\n    display: none;\n}\n\n#sp-elci-gallery .sp-fullscreen-trigger:hover {\n    border-color: var(--sp-orange);\n    color: var(--sp-orange);\n}\n\n#sp-elci-gallery .sp-zoom-preview {\n    position:absolute;\n    top:0;\n    left:calc(100% + 12px);\n    width:78%;\n    height:100%;\n    background:#fff;\n    border:1px solid #e3e3e3;\n    border-radius:8px;\n    box-shadow:0 6px 20px rgba(0,0,0,.18);\n    overflow:hidden;\n    opacity:0;\n    visibility:hidden;\n    pointer-events:none;\n    z-index:1000;\n    transition:opacity .12s ease, visibility .12s ease;\n    isolation:isolate;\n}\n\n#sp-elci-gallery .sp-zoom-preview img {\n    position:absolute;\n    left:0;\n    top:0;\n    width:200%;\n    height:200%;\n    max-width:none;\n    max-height:none;\n    object-fit:fill;\n    display:block;\n    pointer-events:none;\n    transform:none;\n    will-change:left,top,width,height;\n}\n\n#sp-elci-gallery .sp-variant-image-wrap.sp-zoom-active .sp-zoom-preview {\n    opacity: 1;\n    visibility: visible;\n}\n\n\/* Full-screen product popup *\/\n#sp-elci-gallery .sp-fullscreen-modal {\n    position: fixed;\n    inset: 0;\n    z-index: 999999;\n    display: none;\n    align-items: center;\n    justify-content: center;\n    padding: 20px;\n    background: rgba(0,0,0,.38);\n}\n\n#sp-elci-gallery .sp-fullscreen-modal.is-open {\n    display: flex;\n}\n\n#sp-elci-gallery .sp-fullscreen-dialog {\n    position: relative;\n\n    \/* =====================================================\n       FULL SCREEN POPUP SIZE \u2014 EDIT HERE\n       Change these values for the desktop popup size.\n       ===================================================== *\/\n    width: var(--sp-popup-width-desktop, 1100px);\n    height: var(--sp-popup-height-desktop, 520px);\n    max-width: calc(100vw - 30px);\n    max-height: calc(100vh - 40px);\n\n    display: grid;\n    grid-template-columns: minmax(0, 1.55fr) minmax(260px, .75fr);\n    gap: 28px;\n    padding: 24px 28px;\n    background: #fff;\n    border-radius: 7px;\n    box-shadow: 0 8px 35px rgba(0,0,0,.25);\n    overflow: hidden;\n}\n\n#sp-elci-gallery .sp-fullscreen-close {\n    position: absolute;\n    top: 8px;\n    right: 10px;\n    width: 28px;\n    height: 28px;\n    padding: 0;\n    border: 0;\n    background: transparent;\n    color: #222;\n    font-family: Arial, sans-serif;\n    font-size: 24px;\n    line-height: 28px;\n    cursor: pointer;\n    z-index: 5;\n}\n\n#sp-elci-gallery .sp-fullscreen-image-area {\n    min-width: 0;\n    min-height: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n}\n\n#sp-elci-gallery .sp-fullscreen-image {\n    \/*\n     * Popup image size and position are controlled by the\n     * FULLSCREEN_CONTENT settings below.\n     *\/\n    width: var(--sp-popup-image-width-desktop, 100%);\n    height: var(--sp-popup-image-height-desktop, 100%);\n    max-width: none;\n    max-height: none;\n    object-fit: contain;\n    display: block;\n    transform: translate(\n        var(--sp-popup-image-x-desktop, 0px),\n        var(--sp-popup-image-y-desktop, 0px)\n    );\n}\n\n#sp-elci-gallery .sp-fullscreen-info {\n    min-width: 0;\n    padding: 8px 8px 8px 0;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    overflow-y: auto;\n}\n\n\n#sp-elci-gallery .sp-fullscreen-title {\n    margin-top: 5px;\n    color: var(--sp-dark);\n    font-family: \"Bebas Neue\", sans-serif;\n    font-size: 31px;\n    line-height: 1;\n    letter-spacing: 1.5px;\n    font-weight: 700;\n}\n\n#sp-elci-gallery .sp-fullscreen-description {\n    margin-top: 8px;\n    color: #666;\n    font-size: 12px;\n    line-height: 1.45;\n}\n\n#sp-elci-gallery .sp-fullscreen-part-number {\n    margin-top: 8px;\n    color: #555;\n    font-size: 11px;\n    font-weight: 600;\n    letter-spacing: .5px;\n}\n\n#sp-elci-gallery .sp-fullscreen-part-number strong {\n    color: var(--sp-dark);\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-wrap {\n    display: none;\n    margin-top: 14px;\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-wrap.is-visible {\n    display: block;\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-label {\n    margin-bottom: 5px;\n    color: #777;\n    font-size: 10px;\n    font-weight: 700;\n    letter-spacing: .5px;\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-toggle {\n    display: flex;\n    width: 250px;\n    max-width: 100%;\n    border: 1px solid #d8d8d8;\n    border-radius: 6px;\n    overflow: hidden;\n    background: #fff;\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-btn {\n    flex: 1 1 50%;\n    min-height: 32px;\n    padding: 7px 10px;\n    border: 0;\n    background: #fff;\n    color: #333;\n    font-family: \"Montserrat\", sans-serif;\n    font-size: 11px;\n    font-weight: 700;\n    cursor: pointer;\n    appearance: none;\n    -webkit-appearance: none;\n    transition: background .18s ease, color .18s ease;\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-btn.active {\n    background: var(--sp-orange);\n    color: #fff;\n}\n\n#sp-elci-gallery .sp-fullscreen-amp-btn:disabled {\n    background: #f2f2f2;\n    color: #aaa;\n    cursor: not-allowed;\n}\n\n#sp-elci-gallery .sp-fullscreen-thumbnails {\n    width: 100%;\n    max-width: 320px;\n    margin-top: 18px;\n    display: grid;\n    grid-template-columns: repeat(4, 72px);\n    grid-template-rows: 72px;\n    grid-auto-flow: row;\n    gap: 12px;\n    align-items: stretch;\n    justify-content: start;\n    overflow: visible;\n}\n\n#sp-elci-gallery .sp-fullscreen-thumb {\n    width: 72px;\n    height: 72px;\n    min-width: 0;\n    padding: 4px;\n    border: 1px solid var(--sp-border);\n    border-radius: 4px;\n    background: #fff;\n    cursor: pointer;\n    overflow: hidden;\n    grid-row: 1;\n}\n\n#sp-elci-gallery .sp-fullscreen-thumb.active {\n    border: 2px solid var(--sp-orange);\n}\n\n#sp-elci-gallery .sp-fullscreen-thumb img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n    display: block;\n}\n\n\/* =========================================================\nMOBILE\n========================================================= *\/\n\n@media (max-width: 600px) {\n\n    #sp-elci-gallery .sp-fullscreen-trigger {\n        position: static;\n        display: inline-flex;\n        margin-top: 6px;\n        transform: none;\n        font-size: 8px;\n        padding: 6px 10px;\n    }\n\n    #sp-elci-gallery .sp-zoom-preview {\n        display: none;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-modal {\n        padding: 8px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-dialog {\n        \/*\n         * FULL SCREEN POPUP SIZE \u2014 MOBILE EDIT HERE\n         *\/\n        width: var(--sp-popup-width-mobile, calc(100vw - 16px));\n        height: var(--sp-popup-height-mobile, 90vh);\n        max-width: calc(100vw - 16px);\n        max-height: calc(100vh - 16px);\n        min-height: 0;\n        grid-template-columns: 1fr;\n        gap: 8px;\n        padding: 18px 12px 12px;\n        border-radius: 8px;\n        box-shadow: 0 8px 30px rgba(0,0,0,.22);\n        overflow-y: auto;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-image-area {\n        height: var(--sp-popup-image-area-height-mobile, 54vh);\n        min-height: 260px;\n        overflow: hidden;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-image {\n        width: var(--sp-popup-image-width-mobile, 100%);\n        height: var(--sp-popup-image-height-mobile, 100%);\n        transform: translate(\n            var(--sp-popup-image-x-mobile, 0px),\n            var(--sp-popup-image-y-mobile, 0px)\n        );\n    }\n\n    #sp-elci-gallery .sp-fullscreen-info {\n        padding: 0 4px 4px;\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-title {\n        font-size: 25px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-description {\n        font-size: 10px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-part-number {\n        font-size: 9px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-amp-wrap {\n        margin-top: 8px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-amp-label {\n        font-size: 9px;\n        margin-bottom: 4px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-amp-toggle {\n        width: 250px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-amp-btn {\n        min-height: 30px;\n        padding: 6px 8px;\n        font-size: 10px;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-thumbnails {\n        width: 100%;\n        max-width: 100%;\n        margin-top: 10px;\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        grid-template-rows: 58px;\n        grid-auto-flow: row;\n        gap: 10px;\n        justify-content: start;\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-fullscreen-thumb {\n        width: 100%;\n        height: 58px;\n        min-width: 0;\n        grid-row: 1;\n    }\n\n    \/* =====================================================\n       MOBILE PRODUCT GALLERY\n       Compact Amazon-style vertical product layout\n       ===================================================== *\/\n\n    #sp-elci-gallery {\n        width: 100%;\n        max-width: 100%;\n        height: auto;\n        min-height: 0;\n        margin: 0 auto;\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-main-view {\n        width: 100%;\n        height: auto;\n        min-height: 0;\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide {\n        width: 100%;\n        height: auto;\n        min-height: 0;\n        display: none;\n        position: relative;\n        overflow: visible;\n        flex-direction: column;\n        align-items: center;\n        justify-content: flex-start;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide.active {\n        display: flex;\n    }\n\n    \/* FEATURE IMAGE\n       The main\/features image uses the same responsive viewing frame. *\/\n    #sp-elci-gallery .sp-main-product {\n        width: 100%;\n        height: auto;\n        aspect-ratio: 2.9 \/ 3;\n        min-height: 0;\n        flex: 0 0 auto;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        order: 1;\n        position: relative;\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-main-image-clip {\n        inset: 0;\n    }\n\n    #sp-elci-gallery .sp-main-image-clip > img {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        transform:\n            translate(\n                var(--image-x-mobile),\n                var(--image-y-mobile)\n            )\n            scale(var(--image-scale-mobile));\n    }\n\n    \/* VARIANT LAYOUT *\/\n    #sp-elci-gallery .sp-variant-layout {\n        width: 100%;\n        height: auto;\n        min-height: 0;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: flex-start;\n        gap: 0;\n    }\n\n    \/* Title at the top *\/\n    #sp-elci-gallery .sp-mobile-variant-title {\n        display: block;\n        width: 100%;\n        min-height: 46px;\n        padding: 0 8px;\n        text-align: center;\n        order: 1;\n        margin: 0;\n        position: relative;\n        z-index: 2;\n    }\n\n    #sp-elci-gallery .sp-mobile-variant-title .sp-slide-title {\n        margin: 2px 0 0;\n        font-size: 23px;\n        line-height: .95;\n        letter-spacing: .8px;\n    }\n\n    #sp-elci-gallery .sp-mobile-variant-title .sp-slide-subtitle {\n        margin: 3px 0 0;\n        font-size: 10px;\n        line-height: 1.2;\n    }\n\n    #sp-elci-gallery .sp-side-info .sp-fullscreen-trigger {\n        display: inline-flex;\n        margin-left: auto;\n        margin-right: auto;\n    }\n\n    #sp-elci-gallery .sp-mobile-variant-title .sp-fullscreen-trigger {\n        display: none;\n    }\n\n    \/* PRODUCT IMAGEEvery variation uses the responsive viewing frame. *\/\n    #sp-elci-gallery .sp-variant-image-wrap {\n        width: 100%;\n        height: auto;\n        aspect-ratio: 5 \/ 3;\n        min-height: 0;\n        flex: 0 0 auto;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        order: 2;\n        position: relative;\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-variant-image-wrap img {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        display: block;\n        transform:\n            translate(var(--image-x-mobile), var(--image-y-mobile))\n            scale(var(--image-scale-mobile));\n        transform-origin: center center;\n        transition: opacity .16s ease, transform .18s ease;\n    }\n\n    #sp-elci-gallery .sp-slide-info .sp-fullscreen-trigger {\n        margin-left: auto;\n        margin-right: auto;\n    }\n\n    \/* PRODUCT INFORMATION \/ CONTROLS *\/\n    #sp-elci-gallery .sp-side-info {\n        width: 100%;\n        max-width: 100%;\n        height: auto;\n        min-height: 0;\n        padding: 0;\n        margin: 0;\n        text-align: center;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: flex-start;\n        gap: 0;\n        order: 3;\n    }\n\n    \/* Hide duplicate desktop title. *\/\n    #sp-elci-gallery .sp-side-info .sp-slide-title,\n    #sp-elci-gallery .sp-side-info .sp-slide-subtitle {\n        display: none;\n    }\n\n    \/* Part number *\/\n    #sp-elci-gallery .sp-side-info .sp-part-number {\n        display: inline-block;\n        margin: 5px auto 0;\n        padding: 0;\n        color: #555;\n        font-size: 8px;\n        letter-spacing: .4px;\n        text-align: center;\n    }\n\n    #sp-elci-gallery .sp-part-number strong {\n        color: var(--sp-dark);\n    }\n\n    #sp-elci-gallery .sp-variant-image.is-empty {\n        visibility: hidden;\n    }\n\n    \/* HOTSPOTS \u2014 MOBILE *\/\n    #sp-elci-gallery .sp-hotspot {\n        top: var(--sp-hotspot-top-px, var(--top));\n        left: var(--sp-hotspot-left-px, var(--left));\n        transform:\n            translate(-50%, -50%)\n            scale(var(--hotspot-scale-mobile));\n    }\n\n    #sp-elci-gallery .sp-tooltip {\n        bottom: calc(100% + 7px - var(--tooltip-y-mobile));\n        left: calc(50% + var(--tooltip-x-mobile));\n        transform:\n            translateX(-50%)\n            scale(var(--tooltip-scale-mobile));\n        width: min(190px, calc(100vw - 22px));\n        padding: 8px;\n        font-size: 9px;\n    }\n\n    \/* MOBILE THUMBNAIL STRIP *\/\n    #sp-elci-gallery .sp-product-selector {\n        width: 100%;\n        display: flex;\n        align-items: center;\n        gap: 3px;\n        margin-top: 7px;\n    }\n\n    #sp-elci-gallery .sp-thumb-nav {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        flex: 0 0 26px;\n        width: 26px;\n        min-width: 26px;\n        height: 26px;\n        min-height: 26px;\n        padding: 0;\n        border: 0;\n        border-radius: 50%;\n        background: #fff;\n        color: #222;\n        font-size: 16px;\n        line-height: 26px;\n        cursor: pointer;\n        z-index: 3;\n    }\n\n    #sp-elci-gallery .sp-thumbnails {\n        flex: 1 1 auto;\n        width: auto;\n        max-width: calc(100% - 58px);\n        min-width: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 4px;\n        overflow-x: auto;\n        overflow-y: hidden;\n        scroll-behavior: smooth;\n        scrollbar-width: none;\n        padding: 1px 0;\n    }\n\n    #sp-elci-gallery .sp-thumbnails::-webkit-scrollbar {\n        display: none;\n    }\n\n    #sp-elci-gallery .sp-thumb {\n        flex: 0 0 62px;\n        width: 62px;\n        min-width: 62px;\n        min-height: 75px;\n        height: 75px;\n        padding: 3px;\n        border: 1px solid var(--sp-border);\n        border-radius: 5px;\n        gap: 2px;\n    }\n\n    #sp-elci-gallery .sp-thumb.active {\n        border: 2px solid var(--sp-orange);\n    }\n\n    #sp-elci-gallery .sp-thumb-image {\n        width: 100%;\n        height: 45px;\n        min-height: 45px;\n        border-radius: 3px;\n    }\n\n    #sp-elci-gallery .sp-thumb-label {\n        font-size: 8px;\n        line-height: 1.05;\n    }\n\n    #sp-elci-gallery .sp-thumb-part {\n        font-size: 7px;\n        line-height: 1;\n    }\n\n    #sp-elci-gallery .sp-thumb-view {\n        font-size: 7px;\n        line-height: 1;\n    }\n\n    \/* PAGINATION *\/\n    #sp-elci-gallery .sp-gallery-pagination {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 5px;\n        margin-top: 4px;\n        height: 7px;\n    }\n\n    #sp-elci-gallery .sp-page-dot {\n        width: 6px;\n        height: 6px;\n    }\n\n    \/* LOCKED RESPONSIVE VIEWING FRAME *\/\n    #sp-elci-gallery .sp-main-view {\n        overflow: visible;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide {\n        height: 100%;\n        min-height: 0;\n    }\n\n    #sp-elci-gallery .sp-main-product,\n    #sp-elci-gallery .sp-variant-image-wrap {\n        flex-shrink: 0;\n    }\n\n    \/* LOCKED IMAGE FRAME: image swaps never change the reserved viewing area *\/\n    #sp-elci-gallery .sp-variant-image-wrap img,\n    #sp-elci-gallery .sp-main-image-clip > img {\n        flex-shrink: 0;\n    }\n\n}\n\/* Elementor containers must not clip hotspot tooltips *\/\n.sp-gallery-overflow,\n.sp-gallery-overflow > .e-con,\n.sp-gallery-overflow > .elementor-widget-container {\n    overflow: visible !important;\n}\n\n\/* =========================================================\n   CHANGE LOG \u2014 MOBILE RESPONSIVE FIX\n   =========================================================\n   1. Removed the mobile side-info minimum height that created\n      excessive empty space above the thumbnail strip.\n   2. Added a fixed mobile title area so different title lengths\n      do not make the controls appear at different levels.\n   3. Added a compact, fixed mobile controls area so the\n      configuration, current selection, part number, and\n      Full Screen button stay evenly aligned between variations.\n   4. Reduced the spacing between the Full Screen button and\n      the thumbnail strip.\n   5. Kept the mobile image viewing frame fixed so image swaps\n      do not change the gallery layout.\n   ========================================================= *\/\n\n\/* DESKTOP \u2014 KEEP THE EXISTING FIXED VIEWING FRAME *\/\n#sp-elci-gallery .sp-main-view{height:430px;min-height:430px;}\n#sp-elci-gallery .sp-gallery-slide{height:100%;min-height:430px;}\n#sp-elci-gallery .sp-variant-layout{height:100%;min-height:0;}\n#sp-elci-gallery .sp-variant-image-wrap{height:400px;min-height:400px;flex:0 0 400px;}\n#sp-elci-gallery .sp-side-info{min-height:220px;}\n#sp-elci-gallery .sp-fullscreen-trigger{display:inline-flex;position:static;margin-top:7px;}\n\n\/* MOBILE (<=600px) \u2014 FIXED TITLE \/ IMAGE \/ CONTROLS SPACING *\/\n@media (max-width:600px){\n    #sp-elci-gallery .sp-main-view{\n        height:auto;\n        min-height:0;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide{\n        height:auto;\n        min-height:0;\n    }\n\n    #sp-elci-gallery .sp-variant-layout{\n        height:auto;\n        min-height:0;\n    }\n\n    \/* Keep every variation on the same image viewing frame. *\/\n    #sp-elci-gallery .sp-variant-image-wrap{\n        height:auto;\n        min-height:0;\n        flex:0 0 auto;\n    }\n\n    \/* Reserve the same title space for every variation. *\/\n    #sp-elci-gallery .sp-mobile-variant-title{\n        height:70px;\n        min-height:70px;\n        max-height:70px;\n        overflow:hidden;\n        display:block;\n    }\n\n    \/* Keep the product controls aligned at the same level. *\/\n    #sp-elci-gallery .sp-side-info{\n        height:112px;\n        min-height: 112px;\n        max-height: 112px;\n        overflow:visible;\n        justify-content:flex-start;\n    }\n\n    #sp-elci-gallery .sp-side-info .sp-part-number{\n        margin:3px auto 0;\n        line-height:1.05;\n    }\n\n    \/* Keep the Full Screen button directly below the part number. *\/\n    #sp-elci-gallery .sp-side-info .sp-fullscreen-trigger{\n        margin-top:5px;\n    }\n\n    \/* Reduce the gap between product details and thumbnails. *\/\n    #sp-elci-gallery .sp-product-selector{\n        margin-top:2px;\n    }\n\n    #sp-elci-gallery .sp-gallery-pagination{\n        margin-top:3px;\n    }\n\n    #sp-elci-gallery .sp-thumbnails{\n        justify-content:center;\n    }\n}\n\n\/* =========================================================\n   TABLET VARIATION PRODUCT INFORMATION\n   601px\u20131024px\n   Side-by-side layout matching the supplied tablet examples.\n   Feature product is intentionally NOT changed.\n   ========================================================= *\/\n@media (min-width:601px) and (max-width:1024px){\n\n    \/* Keep the same fixed gallery viewing area used by desktop. *\/\n    #sp-elci-gallery .sp-main-view:has(.sp-gallery-slide.sp-variant-slide.active){\n        height:430px;\n        min-height:430px;\n        overflow:visible;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide.sp-variant-slide.active{\n        height:100%;\n        min-height:430px;\n        overflow:visible;\n    }\n\n    \/*\n     * TABLET VARIANT:\n     * image on the left, product information on the right.\n     * This is the same visual structure as the supplied\n     * 30A Heyco tablet reference.\n     *\/\n    #sp-elci-gallery .sp-variant-slide .sp-variant-layout{\n        width:100%;\n        height:100%;\n        min-height:430px;\n        display:grid;\n        grid-template-columns:minmax(0, 1.62fr) minmax(220px, .95fr);\n        align-items:center;\n        gap:12px;\n        overflow:visible;\n    }\n\n    \/* The desktop\/mobile duplicate title is not used on tablet. *\/\n    #sp-elci-gallery .sp-variant-slide .sp-mobile-variant-title{\n        display:none !important;\n    }\n\n    \/* Product image frame \u2014 fixed so image swaps do not move the layout. *\/\n    #sp-elci-gallery .sp-variant-slide .sp-variant-image-wrap{\n        width:100%;\n        height:400px;\n        min-height:400px;\n        flex:0 0 400px;\n        display:flex;\n        align-items:center;\n        justify-content:center;\n        position:relative;\n        overflow:visible !important;\n        z-index:10;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-variant-image-wrap img.sp-variant-image{\n        width:100%;\n        height:100%;\n        object-fit:contain;\n        display:block;\n        transform:\n            translate(var(--image-x-desktop), var(--image-y-desktop))\n            scale(var(--image-scale-desktop));\n        transform-origin:center center;\n    }\n\n    \/*\n     * Product information sits to the right of the image,\n     * vertically centered like the reference tablet layout.\n     *\/\n    #sp-elci-gallery .sp-variant-slide .sp-side-info{\n        width:100%;\n        max-width:none;\n        height:auto;\n        min-height:220px;\n        padding:0 6px 0 0;\n        margin:0;\n        text-align:left;\n        display:flex;\n        flex-direction:column;\n        align-items:flex-start;\n        justify-content:center;\n        gap:0;\n        order:initial;\n        position:relative;\n        z-index:3;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-slide-title{\n        display:block;\n        margin:0;\n        font-size:30px;\n        line-height:.98;\n        letter-spacing:1.2px;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-slide-subtitle{\n        display:block;\n        margin:5px 0 0;\n        font-size:11px;\n        line-height:1.25;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-part-number{\n        display:inline-block;\n        margin:10px 0 0;\n        padding:0;\n        font-size:10px;\n        line-height:1.1;\n        letter-spacing:.4px;\n        text-align:left;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-fullscreen-trigger{\n        display:inline-flex;\n        align-self:flex-start;\n        margin:7px 0 0;\n        font-size:9px;\n        padding:6px 11px;\n    }\n\n    \/*\n     * The tablet hover preview sits immediately to the right of\n     * the image and above the product-info column, matching the\n     * supplied zoom reference. It is intentionally allowed to\n     * overflow the image column.\n     *\/\n    #sp-elci-gallery .sp-variant-slide .sp-zoom-preview{\n        top:0;\n        left:calc(100% + 10px);\n        width:min(280px, 66%);\n        height:400px;\n        z-index:1000;\n        border-radius:8px;\n        box-shadow:0 6px 20px rgba(0,0,0,.18);\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-zoom-preview img{\n        width:200%;\n        height:200%;\n        max-width:none;\n        max-height:none;\n        object-fit:cover;\n        object-position:center center;\n    }\n\n    \/* Keep tablet thumbnails centered underneath the gallery. *\/\n    #sp-elci-gallery .sp-product-selector{\n        margin-top:4px;\n    }\n\n    #sp-elci-gallery .sp-thumbnails{\n        justify-content:center;\n    }\n}\n\n\n\/* =========================================================\n   FEMALE \/ MALE VARIATION TOGGLE\n   Uses the existing toggle visual language.\n   ========================================================= *\/\n#sp-elci-gallery .sp-variant-toggle-label{\n    margin-bottom:5px;\n    color:#777;\n    font-size:10px;\n    font-weight:700;\n    letter-spacing:.5px;\n}\n#sp-elci-gallery .sp-variant-showing{\n    margin-top:6px;\n    color:#777;\n    font-size:10px;\n    line-height:1.2;\n}\n#sp-elci-gallery .sp-variant-showing strong{\n    color:#555;\n    font-weight:700;\n}\n\n#sp-elci-gallery .sp-variant-toggle-wrap{\n    display:block;\n    margin-top:10px;\n    width:250px;\n    max-width:100%;\n}\n#sp-elci-gallery .sp-variant-toggle{\n    display:flex;\n    width:250px;\n    max-width:100%;\n    border:1px solid #d8d8d8;\n    border-radius:6px;\n    overflow:hidden;\n    background:#fff;\n}\n#sp-elci-gallery .sp-variant-toggle-btn{\n    flex:1 1 50%;\n    min-height:32px;\n    padding:7px 10px;\n    border:0;\n    background:#fff;\n    color:#333;\n    font-family:\"Montserrat\",sans-serif;\n    font-size:11px;\n    font-weight:700;\n    cursor:pointer;\n    appearance:none;\n    -webkit-appearance:none;\n    transition:background .18s ease,color .18s ease;\n}\n#sp-elci-gallery .sp-variant-toggle-btn.active{\n    background:var(--sp-orange);\n    color:#fff;\n}\n#sp-elci-gallery .sp-variant-toggle-btn:focus-visible{\n    outline:2px solid var(--sp-orange);\n    outline-offset:-2px;\n}\n\n\/* Desktop: fullscreen stays directly below the part number. *\/\n@media (min-width:1025px){\n    #sp-elci-gallery .sp-side-info{\n        display:flex;\n        flex-direction:column;\n        align-items:flex-start;\n        min-height:220px;\n    }\n    #sp-elci-gallery .sp-side-info .sp-fullscreen-trigger{\n        align-self:flex-start;\n        margin-top:7px;\n    }\n}\n\n\/* Tablet\/mobile: keep the same fixed controls footprint. *\/\n@media (max-width:1024px){\n    #sp-elci-gallery .sp-variant-toggle-wrap{\n        width:250px;\n        max-width:100%;\n    }\n}\n@media (max-width:600px){\n    \/* Match the centered mobile product-information layout. *\/\n    #sp-elci-gallery .sp-variant-slide .sp-side-info{\n        align-items:center;\n        text-align:center;\n    }\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-part-number{\n        margin-left:auto;\n        margin-right:auto;\n        text-align:center;\n    }\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-fullscreen-trigger{\n        margin-left:auto;\n        margin-right:auto;\n        align-self:center;\n    }\n    #sp-elci-gallery .sp-variant-toggle-wrap{\n        width:100%;\n        max-width:250px;\n        margin-top:5px;\n    }\n    #sp-elci-gallery .sp-variant-toggle-label{\n        margin-bottom:4px;\n        font-size:9px;\n    }\n    #sp-elci-gallery .sp-variant-showing{\n        margin-top:6px;\n        font-size:10px;\n    }\n    #sp-elci-gallery .sp-variant-toggle{\n        width:100%;\n        max-width:250px;\n    }\n    #sp-elci-gallery .sp-variant-toggle-btn{\n        min-height:30px;\n        padding:6px 8px;\n        font-size:10px;\n    }\n    #sp-elci-gallery .sp-side-info{\n        height:140px;\n        min-height:140px;\n        max-height:140px;\n    }\n    #sp-elci-gallery .sp-side-info .sp-fullscreen-trigger{\n        margin-top:5px;\n    }\n}\n@media (min-width:601px) and (max-width:1024px){\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-fullscreen-trigger{\n        margin-top:7px;\n    }\n}\n\n\/* Fullscreen connector toggle \u2014 shown only for the first variation. *\/\n#sp-elci-gallery .sp-fullscreen-variant-toggle{\n    display:none;\n    width:250px;\n    max-width:100%;\n    margin-top:12px;\n}\n#sp-elci-gallery .sp-fullscreen-variant-toggle.is-visible{\n    display:flex;\n    border:1px solid #d8d8d8;\n    border-radius:6px;\n    overflow:hidden;\n    background:#fff;\n}\n#sp-elci-gallery .sp-fullscreen-variant-btn{\n    flex:1 1 50%;\n    min-height:32px;\n    padding:7px 10px;\n    border:0;\n    background:#fff;\n    color:#333;\n    font-family:\"Montserrat\",sans-serif;\n    font-size:11px;\n    font-weight:700;\n    cursor:pointer;\n    appearance:none;\n    -webkit-appearance:none;\n    transition:background .18s ease,color .18s ease;\n}\n#sp-elci-gallery .sp-fullscreen-variant-btn.active{\n    background:var(--sp-orange);\n    color:#fff;\n}\n@media (max-width:600px){\n    #sp-elci-gallery .sp-fullscreen-variant-toggle{\n        width:100%;\n        max-width:250px;\n        margin-top:8px;\n    }\n    #sp-elci-gallery .sp-fullscreen-variant-btn{\n        min-height:30px;\n        padding:6px 8px;\n        font-size:10px;\n    }\n}\n\n\/* =========================================================\n   USER REQUEST \u2014 CLEAN VARIATION UI + RESPONSIVE HOTSPOTS\n   ========================================================= *\/\n\n\/* The variant title remains compact and centered. *\/\n#sp-elci-gallery .sp-mobile-variant-title {\n    min-height: 42px !important;\n    height: auto !important;\n    max-height: 60px !important;\n}\n#sp-elci-gallery .sp-mobile-variant-title .sp-slide-title {\n    margin-top: 0 !important;\n}\n\n\/* =========================================================\n   HOTSPOTS FOLLOW THE ACTUAL RENDERED IMAGE\n   JS writes pixel coordinates relative to the image frame.\n   This prevents percentage drift caused by object-fit,\n   changing aspect ratios, browser widths, and image scaling.\n   ========================================================= *\/\n#sp-elci-gallery .sp-main-product .sp-hotspot {\n    transition: left .12s ease, top .12s ease, transform .12s ease;\n}\n\n\n\/* Keep hotspot tooltips usable on narrow screens. *\/\n#sp-elci-gallery .sp-hotspot {\n    contain: layout style;\n}\n#sp-elci-gallery .sp-tooltip {\n    max-width: min(240px, calc(100vw - 24px)) !important;\n    overflow-wrap: anywhere;\n}\n@media (max-width: 600px) {\n    #sp-elci-gallery .sp-tooltip {\n        width: min(190px, calc(100vw - 20px)) !important;\n    }\n}\n\n\n\n\/* =========================================================\n   MOBILE FINAL FIX \u2014 MAX-HEIGHT LAYOUT + BOTTOM CONTROLS\n   <=600px\n   - Feature and all variants share the same main-view height.\n   - Image gets the available middle space and is enlarged.\n   - Part number + Full Screen sit at the bottom immediately\n     before the thumbnail strip, with a controlled gap.\n   - Removes the previous unused vertical footprint.\n   ========================================================= *\/\n@media (max-width:600px){\n    \/* One fixed responsive height for feature + every variation. *\/\n    #sp-elci-gallery .sp-main-view{\n        height:min(400px, 108vw) !important;\n        min-height:0 !important;\n        max-height:400px !important;\n        overflow:visible !important;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide,\n    #sp-elci-gallery .sp-gallery-slide.active{\n        height:100% !important;\n        min-height:0 !important;\n        max-height:100% !important;\n        overflow:visible !important;\n    }\n\n    \/* ---------------- FEATURE ---------------- *\/\n    #sp-elci-gallery .sp-main-product{\n        width:100% !important;\n        height:calc(100% - 46px) !important;\n        min-height:0 !important;\n        max-height:none !important;\n        flex:1 1 auto !important;\n        order:1 !important;\n    }\n\n    #sp-elci-gallery .sp-main-image-clip{\n        inset:0 !important;\n    }\n\n    #sp-elci-gallery .sp-main-image-clip > img{\n        width:100% !important;\n        height:100% !important;\n        object-fit:contain !important;\n        transform:\n            translate(var(--image-x-mobile),var(--image-y-mobile))\n            scale(var(--image-scale-mobile)) !important;\n        transform-origin:center center !important;\n    }\n\n    \/* Feature title\/info stays at the bottom, matching variants. *\/\n    #sp-elci-gallery .sp-main-product + .sp-slide-info{\n        width:100% !important;\n        height:46px !important;\n        min-height:46px !important;\n        max-height:46px !important;\n        flex:0 0 46px !important;\n        margin:0 !important;\n        padding:0 8px !important;\n        display:flex !important;\n        flex-direction:column !important;\n        align-items:center !important;\n        justify-content:flex-end !important;\n        overflow:hidden !important;\n        order:2 !important;\n    }\n\n    \/* ---------------- VARIATIONS ---------------- *\/\n    #sp-elci-gallery .sp-variant-layout{\n        width:100% !important;\n        height:100% !important;\n        min-height:0 !important;\n        max-height:100% !important;\n        display:grid !important;\n        grid-template-columns:minmax(0,1fr) !important;\n        grid-template-rows:46px minmax(0,1fr) 46px !important;\n        align-items:stretch !important;\n        gap:0 !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-mobile-variant-title{\n        width:100% !important;\n        height:46px !important;\n        min-height:46px !important;\n        max-height:46px !important;\n        padding:0 8px !important;\n        margin:0 !important;\n        display:flex !important;\n        flex-direction:column !important;\n        align-items:center !important;\n        justify-content:flex-start !important;\n        overflow:hidden !important;\n        grid-row:1 !important;\n        order:initial !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-mobile-variant-title .sp-slide-title{\n        margin:2px 0 0 !important;\n        font-size:23px !important;\n        line-height:.95 !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-mobile-variant-title .sp-slide-subtitle{\n        margin:3px 0 0 !important;\n        font-size:10px !important;\n        line-height:1.2 !important;\n    }\n\n    \/* Larger image area \u2014 no unnecessary reserved height. *\/\n    #sp-elci-gallery .sp-variant-slide .sp-variant-image-wrap{\n        width:100% !important;\n        height:100% !important;\n        min-height:0 !important;\n        max-height:none !important;\n        flex:0 0 auto !important;\n        display:flex !important;\n        align-items:center !important;\n        justify-content:center !important;\n        position:relative !important;\n        overflow:visible !important;\n        grid-row:2 !important;\n        order:initial !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-variant-image-wrap img.sp-variant-image{\n        width:100% !important;\n        height:100% !important;\n        max-width:100% !important;\n        max-height:100% !important;\n        object-fit:contain !important;\n        transform:\n            translate(var(--image-x-mobile),var(--image-y-mobile))\n            scale(var(--image-scale-mobile)) !important;\n        transform-origin:center center !important;\n    }\n\n    \/* Part number + Full Screen are locked to the bottom row. *\/\n    #sp-elci-gallery .sp-variant-slide .sp-side-info{\n        width:100% !important;\n        height:46px !important;\n        min-height:46px !important;\n        max-height:46px !important;\n        padding:0 !important;\n        margin:0 !important;\n        display:flex !important;\n        flex-direction:column !important;\n        align-items:center !important;\n        justify-content:flex-end !important;\n        gap:0 !important;\n        overflow:visible !important;\n        grid-row:3 !important;\n        order:initial !important;\n        text-align:center !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-part-number{\n        display:block !important;\n        margin:0 !important;\n        padding:0 !important;\n        height:auto !important;\n        line-height:1.05 !important;\n        font-size:8px !important;\n        text-align:center !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-fullscreen-trigger{\n        display:inline-flex !important;\n        align-self:center !important;\n        margin:5px auto 0 !important;\n        padding:6px 11px !important;\n        font-size:9px !important;\n        line-height:1 !important;\n    }\n\n    \/* Feature\/variant control row ends before thumbnails with a gap. *\/\n    #sp-elci-gallery .sp-product-selector{\n        width:100% !important;\n        margin-top:10px !important;\n    }\n\n    #sp-elci-gallery .sp-gallery-pagination{\n        margin-top:4px !important;\n    }\n\n    \/* Do not let the old fixed side-info rule recreate the blank area. *\/\n    #sp-elci-gallery .sp-side-info{\n        box-sizing:border-box !important;\n    }\n}\n\n\n\n\/* =========================================================\n   MOBILE PATCH \u2014 FIX FEATURE TITLE CLIPPING \/ KEEP ALL SLIDES\n   IN THE SAME MAX-HEIGHT FRAME\n   ========================================================= *\/\n@media (max-width:600px){\n    #sp-elci-gallery .sp-main-view{\n        height:min(400px,108vw) !important;\n        min-height:min(400px,108vw) !important;\n        max-height:400px !important;\n        overflow:visible !important;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide,\n    #sp-elci-gallery .sp-gallery-slide.active{\n        height:100% !important;\n        min-height:100% !important;\n        max-height:100% !important;\n        overflow:visible !important;\n        position:relative !important;\n    }\n\n    \/* FEATURE: reserve a clean bottom title strip so the title\n       can never be cut off by the image frame. *\/\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-main-product{\n        position:absolute !important;\n        top:0 !important;\n        left:0 !important;\n        width:100% !important;\n        height:calc(100% - 42px) !important;\n        max-height:calc(100% - 42px) !important;\n        min-height:0 !important;\n        margin:0 !important;\n        aspect-ratio:auto !important;\n        z-index:1 !important;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info{\n        position:absolute !important;\n        left:0 !important;\n        bottom:0 !important;\n        width:100% !important;\n        height:42px !important;\n        min-height:42px !important;\n        max-height:42px !important;\n        margin:0 !important;\n        padding:0 6px !important;\n        display:flex !important;\n        align-items:center !important;\n        justify-content:center !important;\n        overflow:visible !important;\n        z-index:5 !important;\n        text-align:center !important;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info .sp-slide-title{\n        display:block !important;\n        width:100% !important;\n        margin:0 !important;\n        padding:0 !important;\n        font-size:17px !important;\n        line-height:1.05 !important;\n        letter-spacing:.5px !important;\n        white-space:nowrap !important;\n        overflow:hidden !important;\n        text-overflow:clip !important;\n    }\n\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info .sp-slide-subtitle{\n        display:none !important;\n    }\n\n    \/* VARIATIONS: title at top, enlarged image in the middle,\n       part number + Full Screen locked to the bottom. *\/\n    #sp-elci-gallery .sp-variant-slide .sp-variant-layout{\n        height:100% !important;\n        min-height:0 !important;\n        max-height:100% !important;\n        display:grid !important;\n        grid-template-rows:46px minmax(0,1fr) 46px !important;\n        gap:0 !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-variant-image-wrap{\n        grid-row:2 !important;\n        height:100% !important;\n        min-height:0 !important;\n        max-height:none !important;\n        aspect-ratio:auto !important;\n        overflow:visible !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info{\n        grid-row:3 !important;\n        height:46px !important;\n        min-height:46px !important;\n        max-height:46px !important;\n        overflow:visible !important;\n        justify-content:flex-end !important;\n        padding:0 !important;\n        margin:0 !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-part-number{\n        margin:0 !important;\n        line-height:1.05 !important;\n        font-size:8px !important;\n    }\n\n    #sp-elci-gallery .sp-variant-slide .sp-side-info .sp-fullscreen-trigger{\n        margin:5px auto 0 !important;\n        align-self:center !important;\n    }\n\n    \/* Keep the thumbnails outside the fixed main frame with a\n       small, consistent gap. *\/\n    #sp-elci-gallery .sp-product-selector{\n        margin-top:8px !important;\n    }\n}\n\n\n\/* =========================================================\n   FINAL OVERRIDE \u2014 FEATURE SLIDE ONLY\n   MOBILE: TITLE + SUBTITLE + FULL SCREEN AT TOP\n   Variations are NOT touched.\n   ========================================================= *\/\n@media (max-width:600px){\n\n    \/* Move ONLY the Feature information block from bottom to top. *\/\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info{\n        top:0 !important;\n        bottom:auto !important;\n        left:0 !important;\n        right:auto !important;\n\n        height:70px !important;\n        min-height:70px !important;\n        max-height:70px !important;\n\n        margin:0 !important;\n        padding:2px 6px 0 !important;\n\n        display:flex !important;\n        flex-direction:column !important;\n        align-items:center !important;\n        justify-content:flex-start !important;\n\n        overflow:visible !important;\n        z-index:10 !important;\n    }\n\n    \/* Keep the Feature title at the very top. *\/\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info .sp-slide-title{\n        display:block !important;\n        width:100% !important;\n        margin:0 !important;\n        padding:0 !important;\n        font-size:17px !important;\n        line-height:1.05 !important;\n        white-space:nowrap !important;\n        overflow:hidden !important;\n        text-overflow:clip !important;\n    }\n\n    \/* Show the Feature subtitle directly under the title. *\/\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info .sp-slide-subtitle{\n        display:block !important;\n        width:100% !important;\n        margin:3px 0 0 !important;\n        padding:0 !important;\n        font-size:10px !important;\n        line-height:1.2 !important;\n    }\n\n    \/* Full Screen stays directly below the title\/subtitle. *\/\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-slide-info .sp-fullscreen-trigger{\n        display:inline-flex !important;\n        position:static !important;\n        align-self:center !important;\n        margin:5px auto 0 !important;\n        padding:6px 10px !important;\n        font-size:8px !important;\n        line-height:1 !important;\n        transform:none !important;\n    }\n\n    \/* Move ONLY the Feature image down so it starts below the top info. *\/\n    #sp-elci-gallery .sp-gallery-slide:not(.sp-variant-slide) .sp-main-product{\n        top:70px !important;\n        bottom:auto !important;\n        left:0 !important;\n\n        height:calc(100% - 70px) !important;\n        max-height:calc(100% - 70px) !important;\n    }\n}\n\n<\/style>\n\n<script>\n(function () {\n    function initSmartPlugELCIGallery() {\n        const gallery = document.getElementById(\"sp-elci-gallery\");\n        if (!gallery || gallery.dataset.initialized === \"true\") return;\n        gallery.dataset.initialized = \"true\";\n\n        const slides = gallery.querySelectorAll(\".sp-gallery-slide\");\n        const thumbs = gallery.querySelectorAll(\".sp-thumb\");\n        const hotspots = gallery.querySelectorAll(\".sp-hotspot\");\n        const pageDots = gallery.querySelectorAll(\".sp-page-dot\");\n        const variantSlides = gallery.querySelectorAll(\".sp-variant-slide\");\n\n        \/* Hotspots use CSS breakpoint-specific coordinates. *\/\n\n        const thumbnailContainer = gallery.querySelector(\".sp-thumbnails\");\n        const thumbPrev = gallery.querySelector(\".sp-thumb-prev\");\n        const thumbNext = gallery.querySelector(\".sp-thumb-next\");\n\n        if (!slides.length || !thumbs.length) return;\n\n        let currentIndex = 0;\n\n        function showSlide(index) {\n            if (index < 0) index = slides.length - 1;\n            if (index >= slides.length) index = 0;\n\n            slides.forEach(function (slide, i) {\n                slide.classList.toggle(\"active\", i === index);\n            });\n\n            thumbs.forEach(function (thumb) {\n                const target = parseInt(thumb.getAttribute(\"data-target\"), 10);\n                thumb.classList.toggle(\"active\", target === index);\n            });\n\n            pageDots.forEach(function (dot, i) {\n                dot.classList.toggle(\"active\", i === index);\n            });\n\n            currentIndex = index;\n\n            if (index === 0) {\n                updateFeatureText();\n            } else {\n                const activeVariant = slides[index];\n                if (activeVariant) {\n                    updateVariantText(activeVariant, activeVariant.dataset.currentView || activeVariant.dataset.view || activeVariant.dataset.variant || \"\");\n                }\n            }\n\n            const activeThumb = Array.from(thumbs).find(function (thumb) {\n                return parseInt(thumb.getAttribute(\"data-target\"), 10) === index;\n            });\n\n            if (activeThumb && thumbnailContainer) {\n                const left = activeThumb.offsetLeft;\n                const right = left + activeThumb.offsetWidth;\n                const viewLeft = thumbnailContainer.scrollLeft;\n                const viewRight = viewLeft + thumbnailContainer.clientWidth;\n\n                if (left < viewLeft || right > viewRight) {\n                    thumbnailContainer.scrollTo({\n                        left: left - (thumbnailContainer.clientWidth \/ 2) + (activeThumb.offsetWidth \/ 2),\n                        behavior: \"smooth\"\n                    });\n                }\n            }\n\n            hotspots.forEach(function (hotspot) {\n                hotspot.classList.remove(\"is-open\");\n            });\n\n            requestHotspotSync();\n        }\n\n        thumbs.forEach(function (thumb) {\n            thumb.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                event.stopPropagation();\n\n                const target = parseInt(thumb.getAttribute(\"data-target\"), 10);\n                if (!isNaN(target)) showSlide(target);\n            });\n        });\n\n        pageDots.forEach(function (dot) {\n            dot.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                event.stopPropagation();\n\n                const target = parseInt(dot.getAttribute(\"data-page\"), 10);\n                if (!isNaN(target)) showSlide(target);\n            });\n        });\n\n        function scrollThumbnailStrip(direction) {\n            if (!thumbnailContainer || !window.matchMedia(\"(max-width: 600px)\").matches) return;\n\n            const items = Array.from(thumbnailContainer.querySelectorAll(\".sp-thumb\"));\n            if (!items.length) return;\n\n            let activeIndex = items.findIndex(function (thumb) {\n                return thumb.classList.contains(\"active\");\n            });\n\n            if (activeIndex < 0) activeIndex = 0;\n\n            let targetIndex = activeIndex + (direction > 0 ? 1 : -1);\n            if (targetIndex < 0) targetIndex = items.length - 1;\n            if (targetIndex >= items.length) targetIndex = 0;\n\n            items[targetIndex].click();\n            items[targetIndex].scrollIntoView({\n                behavior: \"smooth\",\n                block: \"nearest\",\n                inline: \"center\"\n            });\n        }\n\n        if (thumbPrev) {\n            thumbPrev.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                event.stopPropagation();\n                scrollThumbnailStrip(-1);\n            });\n        }\n\n        if (thumbNext) {\n            thumbNext.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                event.stopPropagation();\n                scrollThumbnailStrip(1);\n            });\n        }\n\n        hotspots.forEach(function (hotspot) {\n            hotspot.addEventListener(\"click\", function (event) {\n                event.preventDefault();\n                event.stopPropagation();\n\n                const isOpen = hotspot.classList.contains(\"is-open\");\n\n                hotspots.forEach(function (item) {\n                    item.classList.remove(\"is-open\");\n                });\n\n                if (!isOpen) hotspot.classList.add(\"is-open\");\n            });\n        });\n\n        document.addEventListener(\"click\", function (event) {\n            if (!gallery.contains(event.target)) {\n                hotspots.forEach(function (hotspot) {\n                    hotspot.classList.remove(\"is-open\");\n                });\n            }\n        });\n\n        \/* =================================================\n           DYNAMIC EDITABLE TITLE \/ SUBTITLE \/ PART NUMBER\n           ================================================= *\/\n\n        function getViewDataAttributeName(view, field) {\n            if (!view) return \"data-\" + field;\n            return \"data-\" + view.replace(\/\\s+\/g, \"-\") + \"-\" + field;\n        }\n\n        function getViewCopy(slide, view) {\n            if (!slide) {\n                return {\n                    title: \"\",\n                    subtitle: \"\",\n                    partNumber: \"\"\n                };\n            }\n\n            const variationView = view || \"\";\n            const isVariation = slide.classList.contains(\"sp-variant-slide\");\n\n            if (isVariation && variationView) {\n                return {\n                    title: slide.getAttribute(getViewDataAttributeName(variationView, \"title\")) || \"\",\n                    subtitle: slide.getAttribute(getViewDataAttributeName(variationView, \"subtitle\")) || \"\",\n                    partNumber: slide.getAttribute(getViewDataAttributeName(variationView, \"part-number\")) || \"\"\n                };\n            }\n\n            return {\n                title: slide.getAttribute(\"data-title\") || \"\",\n                subtitle: slide.getAttribute(\"data-subtitle\") || \"\",\n                partNumber: slide.getAttribute(\"data-part-number\") || \"\"\n            };\n        }\n\n        function updateVariantText(slide, view) {\n            const copy = getViewCopy(slide, view);\n            const mobileTitle = slide.querySelector(\".sp-mobile-variant-title .sp-slide-title\");\n            const mobileSubtitle = slide.querySelector(\".sp-mobile-variant-title .sp-slide-subtitle\");\n            const desktopTitle = slide.querySelector(\".sp-side-info .sp-slide-title\");\n            const desktopSubtitle = slide.querySelector(\".sp-side-info .sp-slide-subtitle\");\n            const partNumber = slide.querySelector(\".sp-part-number-value\");\n\n            if (mobileTitle) mobileTitle.textContent = copy.title;\n            if (mobileSubtitle) mobileSubtitle.textContent = copy.subtitle;\n            if (desktopTitle) desktopTitle.textContent = copy.title;\n            if (desktopSubtitle) desktopSubtitle.textContent = copy.subtitle;\n            if (partNumber) partNumber.textContent = copy.partNumber;\n        }\n\n        function updateFeatureText() {\n            const featureSlide = slides[0];\n            if (!featureSlide) return;\n\n            const copy = getViewCopy(featureSlide, \"\");\n            const title = featureSlide.querySelector(\".sp-slide-info .sp-slide-title\");\n            const subtitle = featureSlide.querySelector(\".sp-slide-info .sp-slide-subtitle\");\n            const partNumber = featureSlide.querySelector(\".sp-part-number-value\");\n\n            if (title) title.textContent = copy.title;\n            if (subtitle) subtitle.textContent = copy.subtitle;\n            if (partNumber) partNumber.textContent = copy.partNumber;\n        }\n\n        \/* =================================================\n           VARIATION IMAGE \/ EDITABLE COPY\n           Each variation is controlled directly by its\n           thumbnail. No configuration toggle system.\n           ================================================= *\/\n\n        variantSlides.forEach(function (slide) {\n            const image = slide.querySelector(\".sp-variant-image\");\n            if (!image) return;\n\n            const initialView = slide.dataset.view || slide.dataset.variant || \"\";\n            slide.dataset.currentView = initialView;\n\n            function updateImage(selectedView) {\n                const view = selectedView || slide.dataset.currentView || initialView;\n                const source = slide.getAttribute(\"data-\" + view) || \"\";\n\n                slide.dataset.currentView = view;\n                updateVariantText(slide, view);\n                image.style.opacity = \"0\";\n\n                window.setTimeout(function () {\n                    if (source) {\n                        image.src = source;\n                        image.classList.remove(\"is-empty\");\n                    } else {\n                        image.removeAttribute(\"src\");\n                        image.classList.add(\"is-empty\");\n                    }\n\n                    image.style.opacity = \"1\";\n\n                    const existingModal = gallery.querySelector(\".sp-fullscreen-modal\");\n                    if (existingModal && existingModal.classList.contains(\"is-open\")) {\n                        refreshFullscreenModal();\n                    }\n                }, 90);\n            }\n\n            slide._setView = function (selectedView) {\n                slide.dataset.currentView = selectedView || initialView;\n                updateImage(slide.dataset.currentView);\n            };\n            slide._setView(initialView);\n        });\n\n        \/* =================================================\n           VIEW FULL SCREEN + HOVER ZOOM\n           ================================================= *\/\n           \n        const fullscreenModal = document.createElement(\"div\");\n        fullscreenModal.className = \"sp-fullscreen-modal\";\n        fullscreenModal.setAttribute(\"aria-hidden\", \"true\");\n        fullscreenModal.innerHTML = `\n            <div class=\"sp-fullscreen-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Product full screen view\">\n                <button type=\"button\" class=\"sp-fullscreen-close\" aria-label=\"Close full screen\">&times;<\/button>\n                <div class=\"sp-fullscreen-image-area\">\n                    <img class=\"sp-fullscreen-image\" alt=\"\">\n                <\/div>\n                <div class=\"sp-fullscreen-info\">\n                    <div class=\"sp-fullscreen-title\"><\/div>\n                    <div class=\"sp-fullscreen-description\"><\/div>\n                    <div class=\"sp-fullscreen-part-number\">PART NUMBER: <strong class=\"sp-fullscreen-part-number-value\"><\/strong><\/div>\n<div class=\"sp-fullscreen-thumbnails\"><\/div>\n                <\/div>\n            <\/div>\n        `;\n\n        gallery.appendChild(fullscreenModal);\n\n        const fullscreenImage = fullscreenModal.querySelector(\".sp-fullscreen-image\");\n        const fullscreenTitle = fullscreenModal.querySelector(\".sp-fullscreen-title\");\n        const fullscreenDescription = fullscreenModal.querySelector(\".sp-fullscreen-description\");\n        const fullscreenPartNumber = fullscreenModal.querySelector(\".sp-fullscreen-part-number-value\");\n        const fullscreenThumbs = fullscreenModal.querySelector(\".sp-fullscreen-thumbnails\");\n        const fullscreenClose = fullscreenModal.querySelector(\".sp-fullscreen-close\");\n\n        \/* =================================================\n           FEATURE IMAGE \u2014 NORMAL VIEW \/ FULL SCREEN VIEW\n           Normal view and full screen use separate images.\n           ================================================= *\/\n        const FEATURE_FULLSCREEN_IMAGE = \"https:\/\/dev.smartplug.com\/staging\/wp-content\/uploads\/2026\/09\/FEMALE-CONNECTOR-SERVICE-KITS.png\";\n\n        function getActiveGalleryImage() {\n            const activeSlide = slides[currentIndex];\n            if (!activeSlide) return null;\n\n            if (currentIndex === 0) {\n                return activeSlide.querySelector(\".sp-main-image-clip img\");\n            }\n\n            return activeSlide.querySelector(\".sp-variant-image\");\n        }\n\n        function getActiveGalleryCopy() {\n            const activeSlide = slides[currentIndex];\n\n            if (!activeSlide) {\n                return {\n                    title: \"\",\n                    description: \"\",\n                    partNumber: \"\"\n                };\n            }\n\n            const view = activeSlide.classList.contains(\"sp-variant-slide\")\n                ? (activeSlide.dataset.currentView || activeSlide.dataset.view || activeSlide.dataset.variant || \"\")\n                : \"\";\n\n            const copy = getViewCopy(activeSlide, view);\n\n            return {\n                title: copy.title,\n                description: copy.subtitle,\n                partNumber: copy.partNumber\n            };\n        }\n\n        function applyFullscreenSettings() {\n            const dialog = fullscreenModal.querySelector(\".sp-fullscreen-dialog\");\n            if (!dialog) return;\n\n            dialog.style.setProperty(\"--sp-popup-width-desktop\", \"1100px\");\n            dialog.style.setProperty(\"--sp-popup-height-desktop\", \"520px\");\n            dialog.style.setProperty(\"--sp-popup-width-mobile\", \"calc(100vw - 16px)\");\n            dialog.style.setProperty(\"--sp-popup-height-mobile\", \"90vh\");\n            dialog.style.setProperty(\"--sp-popup-image-area-height-mobile\", \"54vh\");\n\n            fullscreenImage.style.setProperty(\"--sp-popup-image-width-desktop\", \"100%\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-height-desktop\", \"100%\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-x-desktop\", \"0px\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-y-desktop\", \"0px\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-width-mobile\", \"100%\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-height-mobile\", \"100%\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-x-mobile\", \"0px\");\n            fullscreenImage.style.setProperty(\"--sp-popup-image-y-mobile\", \"0px\");\n        }\n\n        function refreshFullscreenModal() {\n            const activeImage = getActiveGalleryImage();\n            if (!activeImage || !activeImage.src) return;\n\n            const copy = getActiveGalleryCopy();\n            const activeSlide = slides[currentIndex];\n            const isVariation = currentIndex >= 1 && activeSlide;\n            const view = isVariation\n                ? (activeSlide.dataset.currentView || activeSlide.dataset.view || activeSlide.dataset.variant || \"\")\n                : \"\";\n\n            const viewImage = isVariation\n                ? (activeSlide.getAttribute(\"data-\" + view) || \"\")\n                : FEATURE_FULLSCREEN_IMAGE;\n\n            applyFullscreenSettings();\n\n            fullscreenImage.src = viewImage || activeImage.currentSrc || activeImage.src;\n            fullscreenImage.alt = copy.title || activeImage.alt || \"\";\n            fullscreenTitle.textContent = copy.title || \"\";\n            fullscreenDescription.textContent = copy.description || \"\";\n\n            if (fullscreenPartNumber) {\n                fullscreenPartNumber.textContent = isVariation ? (copy.partNumber || \"\") : \"\";\n                fullscreenPartNumber.parentElement.style.display = isVariation && copy.partNumber ? \"\" : \"none\";\n            }\n            fullscreenThumbs.innerHTML = \"\";\n\n            thumbs.forEach(function (thumb) {\n                const sourceImage = thumb.querySelector(\"img\");\n                if (!sourceImage) return;\n\n                const modalThumb = document.createElement(\"button\");\n                modalThumb.type = \"button\";\n                modalThumb.className = \"sp-fullscreen-thumb\";\n                modalThumb.setAttribute(\"aria-label\", thumb.getAttribute(\"aria-label\") || \"View product image\");\n\n                const modalThumbImage = document.createElement(\"img\");\n                modalThumbImage.src = sourceImage.currentSrc || sourceImage.src;\n                modalThumbImage.alt = sourceImage.alt || \"\";\n                modalThumb.appendChild(modalThumbImage);\n\n                const thumbTarget = parseInt(thumb.getAttribute(\"data-target\"), 10);\n                if (thumbTarget === currentIndex) modalThumb.classList.add(\"active\");\n\n                modalThumb.addEventListener(\"click\", function (event) {\n                    event.preventDefault();\n                    event.stopPropagation();\n                    showSlide(thumbTarget);\n                    window.setTimeout(refreshFullscreenModal, 110);\n                });\n\n                fullscreenThumbs.appendChild(modalThumb);\n            });\n        }\n\n        let fullscreenScrollTop = 0;\n        let fullscreenScrollLeft = 0;\n        let fullscreenBodyPaddingRight = \"\";\n\n        function openFullscreenModal() {\n            refreshFullscreenModal();\n\n            fullscreenScrollTop = window.scrollY || window.pageYOffset || 0;\n            fullscreenScrollLeft = window.scrollX || window.pageXOffset || 0;\n            fullscreenBodyPaddingRight = document.body.style.paddingRight;\n\n            const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n            if (scrollbarWidth > 0) {\n                document.body.style.paddingRight = scrollbarWidth + \"px\";\n            }\n\n            fullscreenModal.classList.add(\"is-open\");\n            fullscreenModal.setAttribute(\"aria-hidden\", \"false\");\n            document.body.style.overflow = \"hidden\";\n        }\n\n        function closeFullscreenModal() {\n            fullscreenModal.classList.remove(\"is-open\");\n            fullscreenModal.setAttribute(\"aria-hidden\", \"true\");\n            document.body.style.overflow = \"\";\n            document.body.style.paddingRight = fullscreenBodyPaddingRight;\n\n            window.scrollTo({\n                top: fullscreenScrollTop,\n                left: fullscreenScrollLeft,\n                behavior: \"auto\"\n            });\n        }\n\n        fullscreenClose.addEventListener(\"click\", function (event) {\n            event.preventDefault();\n            closeFullscreenModal();\n        });\n        fullscreenModal.addEventListener(\"click\", function (event) {\n            if (event.target === fullscreenModal) closeFullscreenModal();\n        });\n\n        document.addEventListener(\"keydown\", function (event) {\n            if (event.key === \"Escape\" && fullscreenModal.classList.contains(\"is-open\")) {\n                closeFullscreenModal();\n            }\n        });\n\n        function addFullscreenButtons() {\n            const featureWrap = gallery.querySelector(\".sp-main-product\");\n\n            if (featureWrap && !featureWrap.closest(\".sp-gallery-slide\").querySelector(\".sp-fullscreen-trigger\")) {\n                const button = document.createElement(\"button\");\n                button.type = \"button\";\n                button.className = \"sp-fullscreen-trigger\";\n                button.textContent = \"View Full Screen\";\n                button.addEventListener(\"click\", function (event) {\n                    event.preventDefault();\n                    event.stopPropagation();\n                    openFullscreenModal();\n                });\n\n                const featureInfo = featureWrap.closest(\".sp-gallery-slide\").querySelector(\".sp-slide-info\");\n                if (featureInfo) {\n                    featureInfo.appendChild(button);\n                } else {\n                    featureWrap.appendChild(button);\n                }\n            }\n\n            variantSlides.forEach(function (slide) {\n                const imageWrap = slide.querySelector(\".sp-variant-image-wrap\");\n                if (!imageWrap || slide.querySelector(\".sp-fullscreen-trigger\")) return;\n\n                const button = document.createElement(\"button\");\n                button.type = \"button\";\n                button.className = \"sp-fullscreen-trigger\";\n                button.textContent = \"View Full Screen\";\n                button.addEventListener(\"click\", function (event) {\n                    event.preventDefault();\n                    event.stopPropagation();\n                    openFullscreenModal();\n                });\n\n                const sideInfo = slide.querySelector(\".sp-side-info\");\n\n                if (sideInfo) {\n                    const partNumber = sideInfo.querySelector(\".sp-part-number\");\n                    if (partNumber) {\n                        partNumber.insertAdjacentElement(\"afterend\", button);\n                    } else {\n                        sideInfo.appendChild(button);\n                    }\n                } else {\n                    imageWrap.appendChild(button);\n                }\n            });\n        }\n\n        function setupHoverZoom() {\n            variantSlides.forEach(function (slide) {\n                const imageWrap = slide.querySelector(\".sp-variant-image-wrap\");\n                const image = slide.querySelector(\".sp-variant-image\");\n                if (!imageWrap || !image || imageWrap.dataset.zoomInitialized === \"true\") return;\n\n                imageWrap.dataset.zoomInitialized = \"true\";\n\n                const preview = document.createElement(\"div\");\n                preview.className = \"sp-zoom-preview\";\n\n                const previewImage = document.createElement(\"img\");\n                previewImage.alt = \"\";\n                preview.appendChild(previewImage);\n                imageWrap.appendChild(preview);\n\n                function syncPreviewImage() {\n                    const source = image.currentSrc || image.src;\n                    if (source && previewImage.src !== source) {\n                        previewImage.src = source;\n                    }\n                }\n\n                \/*\n                 * Calculate the actual visible image area created by\n                 * object-fit: contain. The cursor must be mapped to\n                 * that rendered image area, not the full image frame.\n                 *\/\n                function getRenderedImageBounds() {\n                    const rect = imageWrap.getBoundingClientRect();\n                    const naturalW = image.naturalWidth || 1;\n                    const naturalH = image.naturalHeight || 1;\n\n                    if (!rect.width || !rect.height) return null;\n\n                    const imageRatio = naturalW \/ naturalH;\n                    const frameRatio = rect.width \/ rect.height;\n\n                    let renderedW = rect.width;\n                    let renderedH = rect.height;\n                    let offsetX = 0;\n                    let offsetY = 0;\n\n                    if (imageRatio > frameRatio) {\n                        renderedH = rect.width \/ imageRatio;\n                        offsetY = (rect.height - renderedH) \/ 2;\n                    } else {\n                        renderedW = rect.height * imageRatio;\n                        offsetX = (rect.width - renderedW) \/ 2;\n                    }\n\n                    return {\n                        left: rect.left + offsetX,\n                        top: rect.top + offsetY,\n                        width: renderedW,\n                        height: renderedH\n                    };\n                }\n\n                function updateZoomPosition(event) {\n                    if (window.innerWidth <= 600) return;\n\n                    const bounds = getRenderedImageBounds();\n                    const previewRect = preview.getBoundingClientRect();\n\n                    if (!bounds || !previewRect.width || !previewRect.height) return;\n\n                    \/*\n                     * Normalize the cursor within the actual rendered\n                     * image. This keeps the zoom centered on the point\n                     * under the cursor instead of drifting when the\n                     * source image has contain-space around it.\n                     *\/\n                    const x = Math.max(\n                        0,\n                        Math.min(\n                            1,\n                            (event.clientX - bounds.left) \/ bounds.width\n                        )\n                    );\n\n                    const y = Math.max(\n                        0,\n                        Math.min(\n                            1,\n                            (event.clientY - bounds.top) \/ bounds.height\n                        )\n                    );\n\n                    \/*\n                     * The preview image is rendered at 2x. Calculate\n                     * the exact amount of overflow in each direction\n                     * so the preview pans through the entire source\n                     * without exposing blank edges.\n                     *\/\n                    const sourceRatio =\n                        (image.naturalWidth || 1) \/\n                        (image.naturalHeight || 1);\n\n                    const zoom = 2;\n                    const zoomFrameW = previewRect.width * zoom;\n                    const zoomFrameH = previewRect.height * zoom;\n\n                    let renderedZoomW = zoomFrameW;\n                    let renderedZoomH = zoomFrameH;\n\n                    if (sourceRatio > zoomFrameW \/ zoomFrameH) {\n                        renderedZoomH = zoomFrameW \/ sourceRatio;\n                    } else {\n                        renderedZoomW = zoomFrameH * sourceRatio;\n                    }\n\n                    const maxX = Math.max(0, renderedZoomW - previewRect.width);\n                    const maxY = Math.max(0, renderedZoomH - previewRect.height);\n\n                    \/* Match the source aspect ratio exactly inside the preview. *\/\n                    previewImage.style.width = renderedZoomW + \"px\";\n                    previewImage.style.height = renderedZoomH + \"px\";\n                    previewImage.style.left = (-x * maxX) + \"px\";\n                    previewImage.style.top = (-y * maxY) + \"px\";\n                }\n\n                image.addEventListener(\"load\", function () {\n                    syncPreviewImage();\n                });\n\n                syncPreviewImage();\n\n                imageWrap.addEventListener(\"mouseenter\", function (event) {\n                    syncPreviewImage();\n                    imageWrap.classList.add(\"sp-zoom-active\");\n                    updateZoomPosition(event);\n                });\n\n                imageWrap.addEventListener(\"mouseleave\", function () {\n                    imageWrap.classList.remove(\"sp-zoom-active\");\n                });\n\n                imageWrap.addEventListener(\"mousemove\", updateZoomPosition);\n            });\n        }\n\n        addFullscreenButtons();\n        setupHoverZoom();\n\n        \/* WooCommerce variation compatibility *\/\n        if (window.jQuery) {\n            jQuery(document).on(\n                \"found_variation.spELCIGallery\",\n                \"form.variations_form\",\n                function (event, variation) {\n                    if (!variation || !variation.image || !variation.image.src) return;\n\n                    const variationImage = variation.image.src;\n\n                    thumbs.forEach(function (thumb, index) {\n                        const image = thumb.querySelector(\"img\");\n                        if (!image) return;\n\n                        const thumbImage = image.currentSrc || image.src;\n\n                        if (\n                            thumbImage === variationImage ||\n                            thumbImage.includes(variationImage) ||\n                            variationImage.includes(thumbImage)\n                        ) {\n                            showSlide(index);\n                        }\n                    });\n                }\n            );\n        }\n\n\n        \/* =================================================\n           RESPONSIVE HOTSPOT ENGINE\n           Hotspots are anchored to the actual rendered\n           product image, not to breakpoint-specific\n           gallery coordinates.\n           ================================================= *\/\n\n        function getResponsiveMode() {\n            const width =\n                window.innerWidth ||\n                document.documentElement.clientWidth ||\n                0;\n\n            if (width <= 600) return \"mobile\";\n            if (width <= 1024) return \"tablet\";\n            if (width <= 1366) return \"laptop\";\n            return \"desktop\";\n        }\n\n        function readCssNumber(element, customProperty, fallback) {\n            if (!element) return fallback;\n\n            const inlineValue =\n                element.style &&\n                element.style.getPropertyValue(customProperty);\n\n            if (inlineValue && inlineValue.trim()) {\n                const parsedInline = parseFloat(inlineValue);\n                if (Number.isFinite(parsedInline)) {\n                    return parsedInline;\n                }\n            }\n\n            const computedValue =\n                window\n                    .getComputedStyle(element)\n                    .getPropertyValue(customProperty);\n\n            if (computedValue && computedValue.trim()) {\n                const parsedComputed = parseFloat(computedValue);\n                if (Number.isFinite(parsedComputed)) {\n                    return parsedComputed;\n                }\n            }\n\n            return fallback;\n        }\n\n        function readResponsiveImageSetting(\n            image,\n            baseName,\n            responsiveMode,\n            fallback\n        ) {\n            const responsiveProperty =\n                baseName + \"-\" + responsiveMode;\n\n            const desktopProperty =\n                baseName + \"-desktop\";\n\n            let value =\n                readCssNumber(\n                    image,\n                    responsiveProperty,\n                    NaN\n                );\n\n            if (Number.isFinite(value)) {\n                return value;\n            }\n\n            value =\n                readCssNumber(\n                    image,\n                    desktopProperty,\n                    NaN\n                );\n\n            if (Number.isFinite(value)) {\n                return value;\n            }\n\n            const imageWrap =\n                image.closest(\n                    \".sp-main-product, .sp-variant-image-wrap\"\n                );\n\n            value =\n                readCssNumber(\n                    imageWrap,\n                    responsiveProperty,\n                    NaN\n                );\n\n            if (Number.isFinite(value)) {\n                return value;\n            }\n\n            value =\n                readCssNumber(\n                    imageWrap,\n                    desktopProperty,\n                    NaN\n                );\n\n            if (Number.isFinite(value)) {\n                return value;\n            }\n\n            return fallback;\n        }\n\n        function syncResponsiveHotspots() {\n            const featureSlide =\n                slides[0];\n\n            if (!featureSlide) {\n                return;\n            }\n\n            const imageWrap =\n                featureSlide.querySelector(\n                    \".sp-main-product.sp-hotspot-image, .sp-main-product\"\n                );\n\n            const imageClip =\n                featureSlide.querySelector(\n                    \".sp-main-image-clip\"\n                );\n\n            const image =\n                featureSlide.querySelector(\n                    \".sp-main-image-clip > img\"\n                );\n\n            const hotspotItems =\n                featureSlide.querySelectorAll(\n                    \".sp-hotspot\"\n                );\n\n            if (\n                !imageWrap ||\n                !imageClip ||\n                !image ||\n                !hotspotItems.length\n            ) {\n                return;\n            }\n\n            if (\n                !image.naturalWidth ||\n                !image.naturalHeight\n            ) {\n                return;\n            }\n\n            const wrapRect =\n                imageWrap.getBoundingClientRect();\n\n            const clipRect =\n                imageClip.getBoundingClientRect();\n\n            if (\n                !wrapRect.width ||\n                !wrapRect.height ||\n                !clipRect.width ||\n                !clipRect.height\n            ) {\n                return;\n            }\n\n            const responsiveMode =\n                getResponsiveMode();\n\n            \/*\n             * Read the same responsive image settings used\n             * by the actual CSS image transform.\n             *\/\n            const imageScale =\n                Math.max(\n                    0,\n                    readResponsiveImageSetting(\n                        image,\n                        \"--image-scale\",\n                        responsiveMode,\n                        1\n                    )\n                );\n\n            const imageX =\n                readResponsiveImageSetting(\n                    image,\n                    \"--image-x\",\n                    responsiveMode,\n                    0\n                );\n\n            const imageY =\n                readResponsiveImageSetting(\n                    image,\n                    \"--image-y\",\n                    responsiveMode,\n                    0\n                );\n\n            \/*\n             * Match object-fit: contain from the image's\n             * natural dimensions and the actual clip size.\n             *\/\n            const imageRatio =\n                image.naturalWidth \/\n                image.naturalHeight;\n\n            const containerRatio =\n                clipRect.width \/\n                clipRect.height;\n\n            let renderedWidth;\n            let renderedHeight;\n\n            if (imageRatio > containerRatio) {\n                renderedWidth =\n                    clipRect.width;\n\n                renderedHeight =\n                    renderedWidth \/\n                    imageRatio;\n            } else {\n                renderedHeight =\n                    clipRect.height;\n\n                renderedWidth =\n                    renderedHeight *\n                    imageRatio;\n            }\n\n            \/*\n             * Match the CSS transform scale around\n             * the image center.\n             *\/\n            renderedWidth *= imageScale;\n            renderedHeight *= imageScale;\n\n            \/*\n             * Match the CSS translate() values used\n             * by the actual image.\n             *\/\n            const imageLeftInClip =\n                (clipRect.width - renderedWidth) \/ 2 +\n                imageX;\n\n            const imageTopInClip =\n                (clipRect.height - renderedHeight) \/ 2 +\n                imageY;\n\n            \/*\n             * Convert the image position from viewport\n             * coordinates into the hotspot parent coordinates.\n             *\/\n            const clipOffsetLeft =\n                clipRect.left -\n                wrapRect.left;\n\n            const clipOffsetTop =\n                clipRect.top -\n                wrapRect.top;\n\n            const imageLeft =\n                clipOffsetLeft +\n                imageLeftInClip;\n\n            const imageTop =\n                clipOffsetTop +\n                imageTopInClip;\n\n            hotspotItems.forEach(\n                function (hotspot) {\n                    \/*\n                     * ONE canonical hotspot anchor across\n                     * all viewport sizes.\n                     *\/\n                    const topPercent =\n                        readCssNumber(\n                            hotspot,\n                            \"--top\",\n                            50\n                        );\n\n                    const leftPercent =\n                        readCssNumber(\n                            hotspot,\n                            \"--left\",\n                            50\n                        );\n\n                    const hotspotX =\n                        readCssNumber(\n                            hotspot,\n                            \"--hotspot-x\",\n                            0\n                        );\n\n                    const hotspotY =\n                        readCssNumber(\n                            hotspot,\n                            \"--hotspot-y\",\n                            0\n                        );\n\n                    const leftPx =\n                        imageLeft +\n                        (\n                            renderedWidth *\n                            leftPercent \/\n                            100\n                        ) +\n                        hotspotX;\n\n                    const topPx =\n                        imageTop +\n                        (\n                            renderedHeight *\n                            topPercent \/\n                            100\n                        ) +\n                        hotspotY;\n\n                    hotspot.style.setProperty(\n                        \"--sp-hotspot-left-px\",\n                        leftPx + \"px\"\n                    );\n\n                    hotspot.style.setProperty(\n                        \"--sp-hotspot-top-px\",\n                        topPx + \"px\"\n                    );\n                }\n            );\n        }\n\n        let hotspotSyncFrame = 0;\n\n        function requestHotspotSync() {\n            cancelAnimationFrame(\n                hotspotSyncFrame\n            );\n\n            hotspotSyncFrame =\n                requestAnimationFrame(\n                    function () {\n                        hotspotSyncFrame = 0;\n                        syncResponsiveHotspots();\n                    }\n                );\n        }\n\n        \/*\n         * Resize \/ orientation changes.\n         *\/\n        window.addEventListener(\n            \"resize\",\n            requestHotspotSync,\n            { passive: true }\n        );\n\n        window.addEventListener(\n            \"orientationchange\",\n            function () {\n                setTimeout(\n                    requestHotspotSync,\n                    80\n                );\n            },\n            { passive: true }\n        );\n\n        \/*\n         * Recalculate after the feature image loads,\n         * including future source changes.\n         *\/\n        const featureImage =\n            slides[0]\n                ? slides[0].querySelector(\n                    \".sp-main-image-clip > img\"\n                )\n                : null;\n\n        if (featureImage) {\n            featureImage.addEventListener(\n                \"load\",\n                requestHotspotSync\n            );\n\n            if (featureImage.complete) {\n                requestHotspotSync();\n            }\n        }\n\n        \/*\n         * Observe the actual elements whose dimensions\n         * determine the rendered image geometry.\n         *\/\n        if (window.ResizeObserver) {\n            const hotspotObserver =\n                new ResizeObserver(\n                    function () {\n                        requestHotspotSync();\n                    }\n                );\n\n            const featureSlide =\n                slides[0];\n\n            const featureClip =\n                featureSlide\n                    ? featureSlide.querySelector(\n                        \".sp-main-image-clip\"\n                    )\n                    : null;\n\n            const featureWrap =\n                featureSlide\n                    ? featureSlide.querySelector(\n                        \".sp-main-product.sp-hotspot-image, .sp-main-product\"\n                    )\n                    : null;\n\n            const mainView =\n                gallery.querySelector(\n                    \".sp-main-view\"\n                );\n\n            if (featureSlide) {\n                hotspotObserver.observe(\n                    featureSlide\n                );\n            }\n\n            if (featureClip) {\n                hotspotObserver.observe(\n                    featureClip\n                );\n            }\n\n            if (featureWrap) {\n                hotspotObserver.observe(\n                    featureWrap\n                );\n            }\n\n            if (mainView) {\n                hotspotObserver.observe(\n                    mainView\n                );\n            }\n\n            if (featureImage) {\n                hotspotObserver.observe(\n                    featureImage\n                );\n            }\n        }\n\n        \/*\n         * Gallery\/variation and Elementor recalculation\n         * can change the layout without a window resize.\n         *\/\n        if (window.jQuery) {\n            jQuery(document).on(\n                \"found_variation.spELCIGallery reset_data.spELCIGallery\",\n                \"form.variations_form\",\n                function () {\n                    requestHotspotSync();\n                }\n            );\n        }\n\n        requestHotspotSync();\n\n        showSlide(0);\n    }\n\n    if (document.readyState === \"loading\") {\n        document.addEventListener(\"DOMContentLoaded\", initSmartPlugELCIGallery);\n    } else {\n        initSmartPlugELCIGallery();\n    }\n\n    if (window.jQuery) {\n        jQuery(window).on(\"elementor\/frontend\/init\", function () {\n            setTimeout(initSmartPlugELCIGallery, 150);\n        });\n    }\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8fd309a 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=\"8fd309a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f404ad elementor-widget elementor-widget-heading\" data-id=\"9f404ad\" 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\">\nFemale Connector Inlet<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b747897 elementor-widget elementor-widget-text-editor\" data-id=\"b747897\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The SmartPlug service kits are designed to provide a complete solution for repairing or restoring your connection, including all necessary electrical components, hardware, and sealing gaskets. Built with ease of use in mind, the kit allows for quick replacement of missing or damaged parts without complicated procedures. Color-coded wire guides in both the inlets and connectors simplify installation and help ensure accurate, secure connections. Designed for versatility, all components are fully interchangeable and compatible with all SmartPlug connectors, making maintenance straightforward and reliable.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f79334f elementor-widget elementor-widget-button\" data-id=\"f79334f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/dev.smartplug.com\/staging\/where-to-buy\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">WHERE TO BUY<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\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>SmartPlug Female Connector Inlet 1 30A Female ConnectorReplacement connector for SmartPlug 30A systems. 2 Strain Relief BootProtects the cable from bending and wear. 3 Silicone LubricantHelps ensure smooth assembly and sealing. 4 Complete Repair KitIncludes the essential parts for connector maintenance. Female Connector &#8211; Service Kit Female Connector &#8211; Service Kit Replacement Parts Female Connector Replacement Parts PART NUMBER: Female Connector Replacement Parts Female Connector Replacement Parts PART NUMBER: &#10094; Features Female Connector Open Parts &#10095; Female Connector Inlet The SmartPlug service kits are designed to provide a complete solution for repairing or restoring your connection, including all necessary electrical components, hardware, and sealing gaskets. Built with ease of use in mind, the kit allows for quick replacement of missing or damaged parts without complicated procedures. Color-coded wire guides in both the inlets and connectors simplify installation and help ensure accurate, secure connections. Designed for versatility, all components are fully interchangeable and compatible with all SmartPlug connectors, making maintenance straightforward and reliable. WHERE TO BUY<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-11431","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/11431","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=11431"}],"version-history":[{"count":61,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/11431\/revisions"}],"predecessor-version":[{"id":19867,"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/pages\/11431\/revisions\/19867"}],"wp:attachment":[{"href":"https:\/\/dev.smartplug.com\/staging\/wp-json\/wp\/v2\/media?parent=11431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}