{"title":"Página de inicio","description":null,"products":[{"product_id":"sgp-card-mini","title":"SGP card mini","description":"\u003cbody\u003e\n\n\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003ctitle\u003eSGP CARD MINI - Premium Hub\u003c\/title\u003e\n    \n    \u003c!-- Google Fonts: Space Grotesk (Headers) and Inter (Body) --\u003e\n    \u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n    \u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n    \u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600\u0026amp;family=Space+Grotesk:wght@700;800\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\n    \u003cstyle\u003e\n        \/* =========================================\n           NEUMORPHIC SYSTEM VARIABLES\n           ========================================= *\/\n        :root {\n            \/* Color Palette *\/\n            --bg-color: #e0e5ec;\n            --text-main: #2d3748;\n            --text-muted: #718096;\n            --accent: #eab308; \/* Premium Amber\/Gold *\/\n            --success: #38a169;\n            --danger: #e53e3e;\n            \n            \/* Shadows (Extrusion\/Sunken Effects) *\/\n            --shadow-light: rgba(255, 255, 255, 0.8);\n            --shadow-dark: rgba(163, 177, 198, 0.6);\n            --neu-out: 9px 9px 16px var(--shadow-dark), -9px -9px 16px var(--shadow-light);\n            --neu-out-sm: 5px 5px 10px var(--shadow-dark), -5px -5px 10px var(--shadow-light);\n            --neu-in: inset 6px 6px 10px var(--shadow-dark), inset -6px -6px 10px var(--shadow-light);\n            \n            \/* Border Radii *\/\n            --radius-xl: 40px;\n            --radius-lg: 30px;\n            --radius-pill: 100px;\n            \n            \/* Transitions *\/\n            --transition: all 0.25s ease-in-out;\n        }\n\n        \/* =========================================\n           RESET \u0026 BASE STYLES\n           ========================================= *\/\n        * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n\n        body {\n            background-color: var(--bg-color);\n            color: var(--text-main);\n            font-family: 'Inter', sans-serif;\n            line-height: 1.6;\n            -webkit-font-smoothing: antialiased;\n            padding: 20px;\n            overflow-x: hidden;\n        }\n\n        h1, h2, h3, h4 {\n            font-family: 'Space Grotesk', sans-serif;\n            font-weight: 800;\n            color: var(--text-main);\n            margin-bottom: 15px;\n            letter-spacing: -0.5px;\n        }\n\n        \/* =========================================\n           NEUMORPHIC CONTAINERS\n           ========================================= *\/\n        .product-container { max-width: 1000px; margin: 0 auto; padding-bottom: 60px; }\n        .neu-card { background: var(--bg-color); border-radius: var(--radius-xl); box-shadow: var(--neu-out); padding: 40px; margin-bottom: 40px; }\n        .neu-card-sm { background: var(--bg-color); border-radius: var(--radius-lg); box-shadow: var(--neu-out); padding: 25px; display: flex; flex-direction: column; gap: 15px; }\n        .neu-sunken { background: var(--bg-color); border-radius: var(--radius-lg); box-shadow: var(--neu-in); padding: 25px; }\n        \n        .neu-icon { width: 60px; height: 60px; border-radius: 50%; background: var(--bg-color); box-shadow: var(--neu-out); display: flex; align-items: center; justify-content: center; color: var(--accent); font-size: 24px; margin-bottom: 10px; }\n        .svg-icon { width: 28px; height: 28px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\n\n        \/* =========================================\n           HEADER \u0026 HERO\n           ========================================= *\/\n        .header-section { text-align: center; margin-bottom: 50px; padding-top: 20px; }\n        .badge { display: inline-block; background: var(--bg-color); box-shadow: var(--neu-in); padding: 8px 20px; border-radius: var(--radius-pill); font-size: 13px; font-weight: 600; color: var(--accent); text-transform: uppercase; letter-spacing: 2px; margin-bottom: 20px; }\n        .main-title { font-size: clamp(36px, 6vw, 64px); background: linear-gradient(135deg, #2d3748 0%, #718096 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 10px; }\n        \n        .hero-image-wrapper { margin: 30px auto; max-width: 350px; border-radius: var(--radius-xl); padding: 15px; background: var(--bg-color); box-shadow: var(--neu-out); }\n        .hero-image-wrapper img { width: 100%; height: auto; border-radius: var(--radius-lg); display: block; }\n\n        \/* =========================================\n           INTERACTIVE 3D VIEWER\n           ========================================= *\/\n        .viewer-3d-container { \n            width: 100%; \n            height: 400px; \n            border-radius: var(--radius-xl); \n            box-shadow: var(--neu-in); \n            overflow: hidden; \n            position: relative; \n            cursor: grab; \n            display: flex; \n            flex-direction: column; \n            margin-bottom: 50px;\n        }\n        .viewer-3d-container:active { cursor: grabbing; }\n        .viewer-instructions { \n            position: absolute; \n            bottom: 20px; \n            left: 0; \n            right: 0; \n            text-align: center; \n            color: var(--text-muted); \n            font-size: 13px; \n            font-weight: 500; \n            pointer-events: none; \n            z-index: 10; \n        }\n        #three-canvas-container { flex: 1; width: 100%; height: 100%; outline: none; }\n\n        \/* =========================================\n           VIDEOS \u0026 MEDIA GRIDS\n           ========================================= *\/\n        .video-container { border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--neu-out); position: relative; background: var(--bg-color); padding: 10px; margin-bottom: 20px; }\n        .video-container video { width: 100%; aspect-ratio: 16\/9; object-fit: cover; border-radius: 20px; display: block; }\n        .video-square video { aspect-ratio: 1\/1; }\n        .video-label { text-align: center; font-size: 13px; font-weight: 600; color: var(--text-muted); margin-top: 15px; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 1px; }\n\n        .demo-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 30px; margin-bottom: 30px; }\n\n        \/* =========================================\n           FEATURES GRIDS\n           ========================================= *\/\n        .section-title { text-align: center; font-size: 28px; margin-bottom: 40px; margin-top: 60px; }\n        .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 30px; margin-bottom: 50px; }\n        .feature-title { font-size: 18px; margin-bottom: 5px; }\n        .feature-desc { color: var(--text-muted); font-size: 15px; }\n\n        \/* List Styling *\/\n        .neu-list { list-style: none; padding: 0; }\n        .neu-list li { display: flex; align-items: center; gap: 15px; padding: 12px 0; border-bottom: 1px solid rgba(163, 177, 198, 0.3); color: var(--text-muted); font-size: 15px; }\n        .neu-list li:last-child { border-bottom: none; }\n        .neu-list li strong { color: var(--text-main); }\n        .neu-list .check { color: var(--success); font-weight: bold; font-size: 18px; }\n\n        \/* AI Section Special *\/\n        .ai-box { text-align: center; }\n        .ai-prompt { display: inline-block; background: var(--bg-color); box-shadow: var(--neu-in); padding: 15px 30px; border-radius: var(--radius-pill); font-family: monospace; color: var(--text-muted); margin: 20px 0; }\n\n        \/* Disclaimer *\/\n        .disclaimer { margin-top: 60px; text-align: center; }\n        .disclaimer p { font-size: 12px; color: var(--text-muted); margin-top: 10px; }\n\n        \/* Animations *\/\n    @keyframes fadeUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }\n    .reveal { animation: fadeUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; }\n\u003c\/style\u003e\n\n\n\n\u003cdiv class=\"product-container reveal\"\u003e\n\n    \u003c!-- Header Section --\u003e\n    \u003cheader class=\"header-section\"\u003e\n        \u003ch1 class=\"main-title\"\u003eSGP CARD MINI\u003c\/h1\u003e\n        \n        \u003c!-- Call to Action \/ Urgency Badge --\u003e\n        \u003cdiv style=\"margin-bottom: 20px;\"\u003e\n            \u003cspan style=\"display: inline-block; background: var(--bg-color); box-shadow: var(--neu-out-sm); color: var(--danger); padding: 8px 20px; border-radius: var(--radius-pill); font-size: 14px; font-weight: 700; letter-spacing: 0.5px;\"\u003e\n                🔥 SECURE YOURS NOW, LIMITED UNITS AVAILABLE\n            \u003c\/span\u003e\n        \u003c\/div\u003e\n\n        \u003cp class=\"subtitle\" style=\"font-size: 18px; color: var(--text-muted); font-weight: 500; max-width: 600px; margin: 0 auto; margin-bottom: 40px;\"\u003eFull-spectrum engineering in a pocket format. Discover the ultimate portable diagnostic and research tool.\u003c\/p\u003e\n\n        \u003c!-- Trailer Section --\u003e\n        \u003cdiv class=\"neu-card\" style=\"padding: 10px; max-width: 800px; margin: 0 auto 30px auto;\"\u003e\n            \u003cdiv class=\"video-container\" style=\"margin-bottom: 0; box-shadow: none;\"\u003e\n                \u003cvideo poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1057\/9807\/4700\/files\/rn-image_picker_lib_temp_d122d386-d879-44d4-ba3e-0d906128942d.png?v=1778713734\" controls autoplay aria-label=\"SGP Card Mini Trailer\" style=\"border-radius: var(--radius-lg);\"\u003e\n                    \u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/o\/v\/6792e53f67ec4b1592e61448da0beb18.mp4\" type=\"video\/mp4\"\u003e\n                    Your browser does not support HTML5 video.\n                \u003c\/source\u003e\u003c\/video\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n        \n        \u003cdiv class=\"hero-image-wrapper\"\u003e\n            \u003cimg src=\"https:\/\/sgpcard.com\/wp-content\/uploads\/2025\/12\/47711.jpg\" alt=\"SGP Card Mini\" loading=\"lazy\"\u003e\n        \u003c\/div\u003e\n    \u003c\/header\u003e\n\n    \u003c!-- Interactive 3D Model --\u003e\n    \u003ch2 class=\"section-title\"\u003e🔍 Interactive 3D Preview\u003c\/h2\u003e\n    \u003cdiv class=\"viewer-3d-container\"\u003e\n        \u003cdiv id=\"three-canvas-container\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"viewer-instructions\"\u003eClick \u0026amp; drag to explore • Triple-click to reveal internals\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Overview Video --\u003e\n    \u003ch2 class=\"section-title\"\u003e🎬 Overview \u0026amp; Presentation\u003c\/h2\u003e\n    \u003cdiv class=\"neu-card\" style=\"padding: 20px;\"\u003e\n        \u003cdiv class=\"video-container\" style=\"margin-bottom: 0;\"\u003e\n            \u003cvideo preload=\"metadata\" controls aria-label=\"SGP Card Mini Technical Overview\"\u003e\n                \u003csource src=\"https:\/\/sgpcard.com\/wp-content\/uploads\/2026\/03\/SGPCARDMINI__Multi-Tool.mp4\" type=\"video\/mp4\"\u003e\n                Your browser does not support HTML5 video.\n            \u003c\/source\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hardware \u0026 Sensors --\u003e\n    \u003ch2 class=\"section-title\"\u003e🔧 Hardware \u0026amp; Senses\u003c\/h2\u003e\n    \n    \u003cdiv class=\"features-grid\"\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003cdiv class=\"neu-icon\"\u003e\u003csvg class=\"svg-icon\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M5 12.55a11 11 0 0 1 14.08 0\"\u003e\u003c\/path\u003e\u003cpath d=\"M1.42 9a16 16 0 0 1 21.16 0\"\u003e\u003c\/path\u003e\u003ccircle cx=\"12\" cy=\"20\" r=\"1\"\u003e\u003c\/circle\u003e\u003c\/svg\u003e\u003c\/div\u003e\n            \u003ch3 class=\"feature-title\"\u003eMulti-Protocol Core\u003c\/h3\u003e\n            \u003cul class=\"neu-list\" style=\"margin-top: 10px;\"\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e📶\u003c\/span\u003e Wi-Fi Capability\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🛜\u003c\/span\u003e Bluetooth Integrated\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e📡\u003c\/span\u003e LoRa \u0026amp; RF (Sub-GHz)\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🗼\u003c\/span\u003e High-Gain Antenna\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003cdiv class=\"neu-icon\"\u003e\u003csvg class=\"svg-icon\" viewbox=\"0 0 24 24\"\u003e\u003crect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" ry=\"2\"\u003e\u003c\/rect\u003e\u003crect x=\"9\" y=\"9\" width=\"6\" height=\"6\"\u003e\u003c\/rect\u003e\u003cline x1=\"9\" y1=\"1\" x2=\"9\" y2=\"4\"\u003e\u003c\/line\u003e\u003cline x1=\"15\" y1=\"1\" x2=\"15\" y2=\"4\"\u003e\u003c\/line\u003e\u003cline x1=\"9\" y1=\"20\" x2=\"9\" y2=\"23\"\u003e\u003c\/line\u003e\u003cline x1=\"15\" y1=\"20\" x2=\"15\" y2=\"23\"\u003e\u003c\/line\u003e\u003c\/svg\u003e\u003c\/div\u003e\n            \u003ch3 class=\"feature-title\"\u003ePhysical I\/O\u003c\/h3\u003e\n            \u003cul class=\"neu-list\" style=\"margin-top: 10px;\"\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🔌\u003c\/span\u003e USB-C Expansion\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🔗\u003c\/span\u003e USB OTG Support\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e💾\u003c\/span\u003e Integrated SD Slot\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003cdiv class=\"neu-icon\"\u003e\u003csvg class=\"svg-icon\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"\u003e\u003c\/path\u003e\u003cline x1=\"22\" y1=\"6\" x2=\"2\" y2=\"6\"\u003e\u003c\/line\u003e\u003cpath d=\"M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\u003c\/div\u003e\n            \u003ch3 class=\"feature-title\"\u003eRadio \u0026amp; Access\u003c\/h3\u003e\n            \u003cul class=\"neu-list\" style=\"margin-top: 10px;\"\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e📱\u003c\/span\u003e Built-in NFC\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🏷️\u003c\/span\u003e RFID Testing\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🕹️\u003c\/span\u003e Universal IR\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🚪\u003c\/span\u003e Access Control Eval\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003cdiv class=\"neu-icon\"\u003e\u003csvg class=\"svg-icon\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"\u003e\u003c\/path\u003e\u003cpath d=\"M19 10v2a7 7 0 0 1-14 0v-2\"\u003e\u003c\/path\u003e\u003cline x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"\u003e\u003c\/line\u003e\u003cline x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"\u003e\u003c\/line\u003e\u003c\/svg\u003e\u003c\/div\u003e\n            \u003ch3 class=\"feature-title\"\u003eEnvironmental\u003c\/h3\u003e\n            \u003cul class=\"neu-list\" style=\"margin-top: 10px;\"\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🎙️\u003c\/span\u003e Onboard Microphone\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e👁️\u003c\/span\u003e Wi-Fi CSI Tech\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🌍\u003c\/span\u003e Advanced Sensing\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n        \n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003cdiv class=\"neu-icon\"\u003e\u003csvg class=\"svg-icon\" viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\u003e\u003c\/path\u003e\u003cpolyline points=\"22 4 12 14.01 9 11.01\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/div\u003e\n            \u003ch3 class=\"feature-title\"\u003eDirect Feedback\u003c\/h3\u003e\n            \u003cul class=\"neu-list\" style=\"margin-top: 10px;\"\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e💡\u003c\/span\u003e Status LED\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🔊\u003c\/span\u003e Integrated Buzzer\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e⚡\u003c\/span\u003e Immediate Status\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003cdiv class=\"neu-icon\"\u003e\u003csvg class=\"svg-icon\" viewbox=\"0 0 24 24\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"10\"\u003e\u003c\/circle\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"6\"\u003e\u003c\/circle\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"2\"\u003e\u003c\/circle\u003e\u003c\/svg\u003e\u003c\/div\u003e\n            \u003ch3 class=\"feature-title\"\u003eRadar \u0026amp; Logic\u003c\/h3\u003e\n            \u003cul class=\"neu-list\" style=\"margin-top: 10px;\"\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e📡\u003c\/span\u003e Radar Functions\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e👤\u003c\/span\u003e People Detection\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e💻\u003c\/span\u003e Custom Codes\u003c\/li\u003e\n                \u003cli style=\"padding: 6px 0; border: none; font-size: 14px;\"\u003e\n\u003cspan style=\"font-size: 18px;\"\u003e🧩\u003c\/span\u003e Easy to Program\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- What can you do with it? --\u003e\n    \u003ch2 class=\"section-title\"\u003e⚡ What can you do with it?\u003c\/h2\u003e\n    \n    \u003cdiv class=\"features-grid\"\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003ch3 class=\"feature-title\" style=\"color: var(--accent);\"\u003e01. Wi-Fi Diagnostics\u003c\/h3\u003e\n            \u003cp class=\"feature-desc\"\u003ePerform advanced network scanning, rigorous connectivity testing, and access point simulation.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003ch3 class=\"feature-title\" style=\"color: var(--accent);\"\u003e02. RF Analysis\u003c\/h3\u003e\n            \u003cp class=\"feature-desc\"\u003eConduct precise signal testing and perform deep remote control synchronization studies.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003ch3 class=\"feature-title\" style=\"color: var(--accent);\"\u003e03. Off-Grid Comms\u003c\/h3\u003e\n            \u003cp class=\"feature-desc\"\u003eTest and deploy secure, decentralized local networks with an impressive +15km range.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003ch3 class=\"feature-title\" style=\"color: var(--accent);\"\u003e04. BT\/USB Testing\u003c\/h3\u003e\n            \u003cp class=\"feature-desc\"\u003eExecute Bluetooth peripheral emulation and perform comprehensive protocol analysis.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003ch3 class=\"feature-title\" style=\"color: var(--accent);\"\u003e05. Open Source\u003c\/h3\u003e\n            \u003cp class=\"feature-desc\"\u003eWith the vast amount of built-in functions, you have the absolute freedom to build and execute whatever project comes to your mind.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"neu-card-sm\"\u003e\n            \u003ch3 class=\"feature-title\" style=\"color: var(--accent);\"\u003e06. Learning \u0026amp; Coding\u003c\/h3\u003e\n            \u003cp class=\"feature-desc\"\u003eMaster new technologies and programming skills, all packed into a powerful device that fits right in your pocket.\u003c\/p\u003e\n        \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- In Action \/ Demos --\u003e\n    \u003ch2 class=\"section-title\"\u003e🎥 In Action \/ Demos\u003c\/h2\u003e\n\n    \u003c!-- Square Videos Grid --\u003e\n    \u003cdiv class=\"demo-grid\"\u003e\n        \u003cdiv\u003e\n            \u003cdiv class=\"video-container video-square\"\u003e\n                \u003cvideo preload=\"metadata\" controls aria-label=\"Network Diagnostic Demo 1\"\u003e\n                    \u003csource src=\"https:\/\/sgpcard.com\/wp-content\/uploads\/2026\/02\/AQMMB7J2fq_uO1V8y_cVOjS4_IT6RC_b38aKaYE5xdDBZ8q7E7MCUZH04gr_Feo0.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"video-label\"\u003eNetwork Diagnostics\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv\u003e\n            \u003cdiv class=\"video-container video-square\"\u003e\n                \u003cvideo preload=\"metadata\" controls aria-label=\"Signal Analysis Demo 2\"\u003e\n                    \u003csource src=\"https:\/\/sgpcard.com\/wp-content\/uploads\/2026\/02\/AQMBWaAYxmFglUfESVN1u5YVdL0KImOkz_uWeSP5K2jF84HUcmaTciYdPGfjedv00.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"video-label\"\u003eSignal Analysis\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv\u003e\n            \u003cdiv class=\"video-container video-square\"\u003e\n                \u003cvideo preload=\"metadata\" controls aria-label=\"System Diagnostics Demo 4\"\u003e\n                    \u003csource src=\"https:\/\/sgpcard.com\/wp-content\/uploads\/2026\/02\/AQMKoswfA7w_A4zcAO9EoCyFSip0DmG2pYm8F1cEqRLRAdl5iflUiIrad0ze0Ll.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"video-label\"\u003eSystem Diagnostics\u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Wide Demo Video --\u003e\n    \u003cdiv class=\"neu-card\" style=\"padding: 20px;\"\u003e\n        \u003cdiv class=\"video-container\" style=\"margin-bottom: 0;\"\u003e\n            \u003cvideo preload=\"metadata\" controls aria-label=\"Wi-Fi Spatial Analysis Demo\"\u003e\n                \u003csource src=\"https:\/\/sgpcard.com\/wp-content\/uploads\/2026\/03\/Seeing_Through_Walls_w__WiFi.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"video-label\" style=\"margin-bottom: 0;\"\u003eWi-Fi Spatial Analysis\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Setup \u0026 Package Grid --\u003e\n    \u003cdiv style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 40px; margin-bottom: 50px;\"\u003e\n        \n        \u003c!-- Easy to Use --\u003e\n        \u003cdiv class=\"neu-sunken\"\u003e\n            \u003ch3 style=\"display: flex; align-items: center; gap: 10px;\"\u003e\n\u003cspan style=\"font-size: 24px;\"\u003e📲\u003c\/span\u003e Easy to Use\u003c\/h3\u003e\n            \u003cp style=\"color: var(--text-muted); margin-bottom: 20px;\"\u003eTotal control from your Smartphone or PC.\u003c\/p\u003e\n            \u003cul class=\"neu-list\"\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e✓\u003c\/span\u003e \u003cspan\u003e\u003cstrong\u003eNo installation:\u003c\/strong\u003e Everything works directly from the browser.\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e✓\u003c\/span\u003e \u003cspan\u003e\u003cstrong\u003eVisual Interface:\u003c\/strong\u003e Professional dashboard control panel.\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e✓\u003c\/span\u003e \u003cspan\u003e\u003cstrong\u003eReady to use:\u003c\/strong\u003e Take it out of the box and start analyzing.\u003c\/span\u003e\n\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- The Package Includes --\u003e\n        \u003cdiv class=\"neu-sunken\"\u003e\n            \u003ch3 style=\"display: flex; align-items: center; gap: 10px;\"\u003e\n\u003cspan style=\"font-size: 24px;\"\u003e📦\u003c\/span\u003e The Package Includes\u003c\/h3\u003e\n            \u003cul class=\"neu-list\"\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e✔\u003c\/span\u003e \u003cspan\u003e1× \u003cstrong\u003eSGP Card Mini\u003c\/strong\u003e (Development edition)\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e✔\u003c\/span\u003e \u003cspan\u003e1× \u003cstrong\u003eShielded Case\u003c\/strong\u003e (Transport protection)\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e✔\u003c\/span\u003e \u003cspan\u003e1× \u003cstrong\u003eUSB-C Cable\u003c\/strong\u003e (High speed)\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e🎁\u003c\/span\u003e \u003cspan\u003e\u003cstrong\u003eBonus Gifts:\u003c\/strong\u003e Exclusive surprises included in your package.\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e💻\u003c\/span\u003e \u003cspan\u003e\u003cstrong\u003eFull Software Suite:\u003c\/strong\u003e Access to diagnostic programs and tools.\u003c\/span\u003e\n\u003c\/li\u003e\n                \u003cli\u003e\n\u003cspan class=\"check\"\u003e🔓\u003c\/span\u003e \u003cspan\u003e\u003cstrong\u003eLifetime Access:\u003c\/strong\u003e To source code and continuous updates.\u003c\/span\u003e\n\u003c\/li\u003e\n            \u003c\/ul\u003e\n        \u003c\/div\u003e\n\n    \u003c\/div\u003e\n\n    \u003c!-- Legal Disclaimer --\u003e\n    \u003cdiv class=\"disclaimer neu-sunken\"\u003e\n        \u003ch4 style=\"color: var(--danger); font-size: 14px; margin-bottom: 5px; text-transform: uppercase;\"\u003e🔒 Responsibility Protocol\u003c\/h4\u003e\n        \u003cp\u003eProfessional tool designed strictly for education, IT research, and authorized network diagnostics. The user is solely responsible for compliance with all local laws and regulations regarding electronic transmissions.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n\u003c\/div\u003e\n\n\u003c!-- Three.js Library --\u003e\n\u003cscript src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"\u003e\u003c\/script\u003e\n\u003cscript\u003e\n    window.addEventListener('load', function() {\n        const container = document.getElementById('three-canvas-container');\n        if (!container) return;\n        \n        \/\/ Setup scene\n        const scene = new THREE.Scene();\n        const camera = new THREE.PerspectiveCamera(45, container.clientWidth \/ container.clientHeight, 0.1, 100);\n        camera.position.z = 4.5; \n\n        const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n        renderer.setSize(container.clientWidth, container.clientHeight);\n        renderer.setPixelRatio(window.devicePixelRatio);\n        container.appendChild(renderer.domElement);\n\n        const deviceGroup = new THREE.Group();\n        scene.add(deviceGroup);\n\n        \/\/ Lighting\n        const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);\n        scene.add(ambientLight);\n        const dirLight = new THREE.DirectionalLight(0xffffff, 0.8);\n        dirLight.position.set(5, 5, 5);\n        scene.add(dirLight);\n        const fillLight = new THREE.DirectionalLight(0xffffff, 0.3);\n        fillLight.position.set(-5, 0, -5);\n        scene.add(fillLight);\n\n        \/\/ --- MODEL CONSTRUCTION ---\n        \n        \/\/ Dimensions based on photos (credit card proportions, but thicker)\n        const width = 1.3;\n        const height = 2.0;\n        const depth = 0.25;\n\n        \/\/ GRUPOS PARA LA VISTA EXPLOSIONADA (Transformer)\n        const frontPart = new THREE.Group();\n        const backPart = new THREE.Group();\n        const internalsPart = new THREE.Group();\n        \n        deviceGroup.add(frontPart);\n        deviceGroup.add(backPart);\n        deviceGroup.add(internalsPart);\n\n        \/\/ Material for main body (dark grey, slightly rough)\n        const bodyMat = new THREE.MeshStandardMaterial({ \n            color: 0x1a1a1a,\n            roughness: 0.8,\n            metalness: 0.1\n        });\n\n        \/\/ 1. Main Body (Divided in two halves)\n        const frontGeo = new THREE.BoxGeometry(width, height, depth\/2);\n        const frontCase = new THREE.Mesh(frontGeo, bodyMat);\n        frontCase.position.z = depth\/4; \/\/ Desplazado hacia adelante\n        frontPart.add(frontCase);\n\n        const backGeo = new THREE.BoxGeometry(width, height, depth\/2);\n        const backCase = new THREE.Mesh(backGeo, bodyMat);\n        backCase.position.z = -depth\/4; \/\/ Desplazado hacia atrás\n        backPart.add(backCase);\n\n        \/\/ 2. Solar Panel (Front Face)\n        const solarCanvas = document.createElement('canvas');\n        solarCanvas.width = 256;\n        solarCanvas.height = 512;\n        const sCtx = solarCanvas.getContext('2d');\n        \n        sCtx.fillStyle = '#2c3e50';\n        sCtx.fillRect(0, 0, 256, 512);\n        sCtx.strokeStyle = '#1a252f';\n        sCtx.lineWidth = 4;\n        for(let i=1; i\u003c12; i++) {\n            sCtx.beginPath();\n            sCtx.moveTo(0, i*(512\/12));\n            sCtx.lineTo(256, i*(512\/12));\n            sCtx.stroke();\n        }\n        sCtx.strokeStyle = '#bdc3c7';\n        sCtx.lineWidth = 2;\n        sCtx.beginPath();\n        sCtx.moveTo(128, 0);\n        sCtx.lineTo(128, 512);\n        sCtx.stroke();\n        sCtx.strokeStyle = '#000000';\n        sCtx.lineWidth = 8;\n        sCtx.strokeRect(0,0,256,512);\n\n        const solarTex = new THREE.CanvasTexture(solarCanvas);\n        const solarMat = new THREE.MeshStandardMaterial({ \n            map: solarTex, roughness: 0.2, metalness: 0.3\n        });\n        \n        const solarWidth = width - 0.1;\n        const solarHeight = height - 0.1;\n        const solarGeo = new THREE.PlaneGeometry(solarWidth, solarHeight);\n        const solarPanel = new THREE.Mesh(solarGeo, solarMat);\n        solarPanel.position.set(0, 0, (depth\/2) + 0.005);\n        frontPart.add(solarPanel); \/\/ Attach to FRONT\n\n        \/\/ 3. Back Face Details (LED hole and square button)\n        const ledGeo = new THREE.CircleGeometry(0.04, 32);\n        let isButtonPressed = false;\n        let blueOverrideTimer = null;\n\n        const ledMat = new THREE.MeshStandardMaterial({ \n            color: 0xffffff, emissive: 0xffffff, emissiveIntensity: 2\n        });\n        const ledHole = new THREE.Mesh(ledGeo, ledMat);\n        ledHole.position.set(0.3, 0.7, -(depth\/2) - 0.001);\n        ledHole.rotation.y = Math.PI;\n        backPart.add(ledHole); \/\/ Attach to BACK\n\n        \/\/ Square Button\n        const buttonWidth = 0.18;\n        const buttonHeight = 0.22;\n        const buttonDepth = 0.02;\n        const btnGeo = new THREE.BoxGeometry(buttonWidth, buttonHeight, buttonDepth);\n        const btnMat = new THREE.MeshStandardMaterial({ color: 0x111111, roughness: 0.9 });\n        const backButton = new THREE.Mesh(btnGeo, btnMat);\n        \n        const initialButtonZ = -(depth\/2) - (buttonDepth\/2) + 0.005;\n        backButton.position.set(0, 0.65, initialButtonZ);\n        backButton.userData = { originalZ: initialButtonZ };\n        backPart.add(backButton); \/\/ Attach to BACK\n\n        \/\/ Button Frame\n        const frameGeo = new THREE.RingGeometry(0.12, 0.14, 4);\n        const frameMat = new THREE.MeshBasicMaterial({ color: 0x000000 });\n        const buttonFrame = new THREE.Mesh(frameGeo, frameMat);\n        buttonFrame.position.set(0, 0.65, -(depth\/2) - 0.001);\n        buttonFrame.rotation.y = Math.PI;\n        buttonFrame.rotation.z = Math.PI \/ 4;\n        backPart.add(buttonFrame); \/\/ Attach to BACK\n\n        const holeMat = new THREE.MeshBasicMaterial({ color: 0x000000 });\n\n        \/\/ 4. Top Ports\n        const portsGroup = new THREE.Group();\n        portsGroup.position.set(0, height\/2 + 0.001, 0);\n        \n        const sdGeo = new THREE.BoxGeometry(0.3, 0.01, 0.05);\n        const sdSlot = new THREE.Mesh(sdGeo, holeMat);\n        sdSlot.position.set(-0.4, 0, 0);\n        portsGroup.add(sdSlot);\n\n        const roundPortGeo = new THREE.CylinderGeometry(0.03, 0.03, 0.02, 16);\n        const roundPort = new THREE.Mesh(roundPortGeo, holeMat);\n        roundPort.rotation.x = Math.PI \/ 2;\n        roundPort.position.set(0, 0, 0);\n        portsGroup.add(roundPort);\n\n        const usbcGeo = new THREE.BoxGeometry(0.25, 0.01, 0.08);\n        const usbcPort = new THREE.Mesh(usbcGeo, holeMat);\n        usbcPort.position.set(0.35, 0, 0);\n        portsGroup.add(usbcPort);\n\n        backPart.add(portsGroup); \/\/ Attach to BACK\n\n        \/\/ 5. Ranura MicroSD lateral\n        const sdY = -height\/2 + 0.4; \n        const sdZ = 0;\n        \n        const sideSdSlotGeo = new THREE.BoxGeometry(0.05, 0.22, 0.04);\n        const sideSdSlot = new THREE.Mesh(sideSdSlotGeo, holeMat);\n        sideSdSlot.position.set(-width\/2, sdY, sdZ);\n        backPart.add(sideSdSlot); \/\/ Attach to BACK\n\n        const sdCardGeo = new THREE.BoxGeometry(0.14, 0.18, 0.02);\n        const sdCardMat = new THREE.MeshStandardMaterial({ color: 0x111111, roughness: 0.5 });\n        const sdCard = new THREE.Mesh(sdCardGeo, sdCardMat);\n        \n        const sdStickerGeo = new THREE.PlaneGeometry(0.08, 0.12);\n        const sdStickerMat = new THREE.MeshBasicMaterial({ color: 0xcc0000 });\n        const sdSticker = new THREE.Mesh(sdStickerGeo, sdStickerMat);\n        sdSticker.position.set(0, 0, 0.011);\n        sdCard.add(sdSticker);\n\n        const sdInsertedX = -width\/2 + 0.05;\n        const sdEjectedX = -width\/2 - 0.08;\n        \n        let targetSdX = sdInsertedX;\n        let currentSdX = sdInsertedX;\n        sdCard.position.set(currentSdX, sdY, sdZ);\n        sdCard.userData = { isInserted: true };\n        backPart.add(sdCard); \/\/ Attach to BACK\n\n        \/\/ --- 6. INTERNALS (PCB, Batería, Antenas) ---\n        \n        \/\/ Placa Base (PCB Verde)\n        const pcbGeo = new THREE.BoxGeometry(width - 0.2, height - 0.2, 0.02);\n        const pcbMat = new THREE.MeshStandardMaterial({ \n            color: 0x225533, \/\/ Verde PCB\n            roughness: 0.7, \n            metalness: 0.2 \n        });\n        const pcb = new THREE.Mesh(pcbGeo, pcbMat);\n        \n        \/\/ Texto \"SGPCard Mini\" simulado en la PCB (Borde derecho)\n        const textCanvas = document.createElement('canvas');\n        textCanvas.width = 64; textCanvas.height = 256;\n        const ctxText = textCanvas.getContext('2d');\n        ctxText.fillStyle = '#225533'; ctxText.fillRect(0,0,64,256);\n        ctxText.fillStyle = '#ffffff'; ctxText.font = 'bold 30px Arial';\n        ctxText.translate(32, 128); ctxText.rotate(Math.PI \/ 2);\n        ctxText.fillText('SGPCard Mini', -90, 10);\n        const textTex = new THREE.CanvasTexture(textCanvas);\n        const textMat = new THREE.MeshBasicMaterial({ map: textTex, transparent: true });\n        const textMesh = new THREE.Mesh(new THREE.PlaneGeometry(0.2, 0.8), textMat);\n        textMesh.position.set(0.4, -0.4, 0.011);\n        pcb.add(textMesh);\n\n        \/\/ Componentes en la PCB\n        const metalMat = new THREE.MeshStandardMaterial({ color: 0xcccccc, roughness: 0.3, metalness: 0.8 }); \/\/ Plateado para escudos\n        const darkChipMat = new THREE.MeshStandardMaterial({ color: 0x111111, roughness: 0.6 }); \/\/ Negro mate para chips\n\n        \/\/ 1. ESP32 Module (Arriba Izquierda)\n        const espGroup = new THREE.Group();\n        espGroup.position.set(-0.25, 0.6, 0.02);\n        \n        const espShield = new THREE.Mesh(new THREE.BoxGeometry(0.35, 0.45, 0.04), metalMat);\n        espGroup.add(espShield);\n        \n        const espAntenna = new THREE.Mesh(new THREE.BoxGeometry(0.15, 0.45, 0.04), darkChipMat);\n        espAntenna.position.set(-0.25, 0, 0); \/\/ Antena PCB negra a la izquierda\n        espGroup.add(espAntenna);\n        pcb.add(espGroup);\n\n        \/\/ 2. LoRa Module (Ra-02) (Arriba Derecha)\n        const loraShield = new THREE.Mesh(new THREE.BoxGeometry(0.45, 0.4, 0.05), metalMat);\n        loraShield.position.set(0.25, 0.55, 0.025);\n        pcb.add(loraShield);\n\n        \/\/ 3. Buzzer (Debajo del ESP32)\n        const buzzer = new THREE.Mesh(new THREE.BoxGeometry(0.25, 0.25, 0.1), darkChipMat);\n        buzzer.position.set(-0.25, 0.2, 0.05);\n        pcb.add(buzzer);\n\n        \/\/ 4. Lector MicroSD (Abajo Izquierda)\n        const sdReaderMat = new THREE.MeshStandardMaterial({ color: 0xaaaaaa, roughness: 0.5, metalness: 0.6 });\n        const sdReader = new THREE.Mesh(new THREE.BoxGeometry(0.35, 0.4, 0.06), sdReaderMat);\n        sdReader.position.set(-0.25, -0.5, 0.03);\n        pcb.add(sdReader);\n\n        \/\/ 5. Pequeños componentes SMD y botones (Centro y Arriba)\n        const smdMat = new THREE.MeshStandardMaterial({ color: 0x888888, roughness: 0.4 });\n        const internalBtnGeo = new THREE.BoxGeometry(0.06, 0.06, 0.03);\n        \n        const btn1 = new THREE.Mesh(internalBtnGeo, metalMat); \/\/ Boot\/Reset\n        btn1.position.set(0, 0.6, 0.015);\n        pcb.add(btn1);\n        \n        const btn2 = new THREE.Mesh(internalBtnGeo, metalMat);\n        btn2.position.set(0, 0.45, 0.015);\n        pcb.add(btn2);\n\n        \/\/ Chip pequeño abajo en el centro\n        const centerChip = new THREE.Mesh(new THREE.BoxGeometry(0.15, 0.15, 0.02), darkChipMat);\n        centerChip.position.set(0.1, -0.5, 0.01);\n        pcb.add(centerChip);\n\n        internalsPart.add(pcb);\n\n        \/\/ Batería Lipo (Cubriendo la parte inferior)\n        const batteryGroup = new THREE.Group();\n        batteryGroup.position.set(0, -0.2, 0.08); \/\/ Elevada sobre la PCB\n        \n        \/\/ Cuerpo plateado\n        const batteryGeo = new THREE.BoxGeometry(0.9, 0.8, 0.08);\n        const batteryMat = new THREE.MeshStandardMaterial({ color: 0xdddddd, roughness: 0.4, metalness: 0.3 });\n        const batteryBody = new THREE.Mesh(batteryGeo, batteryMat);\n        batteryGroup.add(batteryBody);\n        \n        \/\/ Cinta Kapton Amarilla en el borde derecho\n        const kaptonGeo = new THREE.BoxGeometry(0.15, 0.81, 0.082);\n        const kaptonMat = new THREE.MeshStandardMaterial({ color: 0xcca800, roughness: 0.6, transparent: true, opacity: 0.9 });\n        const kaptonTape = new THREE.Mesh(kaptonGeo, kaptonMat);\n        kaptonTape.position.set(0.38, 0, 0);\n        batteryGroup.add(kaptonTape);\n\n        \/\/ Cables de la batería (Rojo y Negro simulados)\n        const wireMatRed = new THREE.LineBasicMaterial({ color: 0xff0000, linewidth: 2 });\n        const wireMatBlack = new THREE.LineBasicMaterial({ color: 0x000000, linewidth: 2 });\n        \n        const pointsRed = [];\n        pointsRed.push(new THREE.Vector3(0.4, -0.4, 0));\n        pointsRed.push(new THREE.Vector3(0.4, -0.6, 0.05));\n        pointsRed.push(new THREE.Vector3(0, -0.8, 0.1));\n        const geoRed = new THREE.BufferGeometry().setFromPoints(pointsRed);\n        const lineRed = new THREE.Line(geoRed, wireMatRed);\n        batteryGroup.add(lineRed);\n\n        const pointsBlack = [];\n        pointsBlack.push(new THREE.Vector3(0.3, -0.4, 0));\n        pointsBlack.push(new THREE.Vector3(0.2, -0.6, -0.02));\n        pointsBlack.push(new THREE.Vector3(-0.2, -0.7, -0.05));\n        const geoBlack = new THREE.BufferGeometry().setFromPoints(pointsBlack);\n        const lineBlack = new THREE.Line(geoBlack, wireMatBlack);\n        batteryGroup.add(lineBlack);\n\n        internalsPart.add(batteryGroup);\n\n        \/\/ Antena de cable (Negra, saliendo a la izquierda)\n        const antennaCurve = new THREE.QuadraticBezierCurve3(\n            new THREE.Vector3(0.2, 0.5, 0.03), \/\/ Empieza en el módulo LoRa\n            new THREE.Vector3(-0.5, 0.5, 0.1), \/\/ Punto de control\n            new THREE.Vector3(-0.8, -0.2, 0.2)  \/\/ Extremo\n        );\n        const antennaTubeGeo = new THREE.TubeGeometry(antennaCurve, 20, 0.015, 8, false);\n        const antennaTubeMat = new THREE.MeshStandardMaterial({ color: 0x111111, roughness: 0.8 });\n        const wireAntenna = new THREE.Mesh(antennaTubeGeo, antennaTubeMat);\n        internalsPart.add(wireAntenna);\n\n        \/\/ Initial rotation to show it's 3D\n        deviceGroup.rotation.y = Math.PI \/ 4;\n        deviceGroup.rotation.x = 0.1;\n\n        \/\/ --- INTERACTION LOGIC ---\n        let isDragging = false;\n        let previousMousePosition = { x: 0, y: 0 };\n        let time = 0;\n        let isExploded = false;\n        let clickCount = 0;\n        let clickTimer = null;\n\n        const getCoords = (e) =\u003e {\n            const rect = container.getBoundingClientRect();\n            let clientX, clientY;\n            if (e.touches \u0026\u0026 e.touches.length \u003e 0) {\n                clientX = e.touches[0].clientX;\n                clientY = e.touches[0].clientY;\n            } else {\n                clientX = e.clientX;\n                clientY = e.clientY;\n            }\n            return { x: clientX - rect.left, y: clientY - rect.top };\n        };\n\n        const startInteraction = (e) =\u003e {\n            isDragging = true;\n            previousMousePosition = getCoords(e);\n        };\n        \n        const doInteraction = (e) =\u003e {\n            if (isDragging) {\n                const coords = getCoords(e);\n                const deltaMove = { \n                    x: coords.x - previousMousePosition.x, \n                    y: coords.y - previousMousePosition.y \n                };\n                deviceGroup.rotation.y += deltaMove.x * 0.01;\n                deviceGroup.rotation.x += deltaMove.y * 0.01;\n                previousMousePosition = coords;\n            }\n        };\n        \n        const endInteraction = () =\u003e { isDragging = false; };\n\n        \/\/ Mouse events\n        container.addEventListener('mousedown', startInteraction);\n        document.addEventListener('mousemove', doInteraction);\n        document.addEventListener('mouseup', endInteraction);\n        \n        \/\/ Touch events\n        container.addEventListener('touchstart', startInteraction, {passive: true});\n        document.addEventListener('touchmove', doInteraction, {passive: true});\n        document.addEventListener('touchend', endInteraction);\n\n        \/\/ RAYCASTER FOR CLICKS\n        const raycaster = new THREE.Raycaster();\n        const mouse = new THREE.Vector2();\n\n        container.addEventListener('click', (e) =\u003e {\n            if (isDragging) return;\n\n            \/\/ Lógica de Triple Clic (Transformer)\n            clickCount++;\n            if (clickCount === 1) {\n                clickTimer = setTimeout(() =\u003e {\n                    clickCount = 0;\n                }, 400); \/\/ 400ms para hacer los 3 clics\n            } else if (clickCount === 3) {\n                isExploded = !isExploded; \/\/ Alternar estado\n                clickCount = 0;\n                clearTimeout(clickTimer);\n                return; \/\/ Evita activar el botón o la SD en el tercer clic\n            }\n\n            const rect = container.getBoundingClientRect();\n            mouse.x = ((e.clientX - rect.left) \/ container.clientWidth) * 2 - 1;\n            mouse.y = -((e.clientY - rect.top) \/ container.clientHeight) * 2 + 1;\n\n            raycaster.setFromCamera(mouse, camera);\n\n            \/\/ Interacción con Botón Trasero\n            const intersectsBtn = raycaster.intersectObject(backButton);\n            if (intersectsBtn.length \u003e 0) {\n                backButton.position.z = backButton.userData.originalZ + 0.015;\n                isButtonPressed = true;\n                if (blueOverrideTimer) clearTimeout(blueOverrideTimer);\n\n                setTimeout(() =\u003e {\n                    backButton.position.z = backButton.userData.originalZ;\n                }, 150);\n                \n                blueOverrideTimer = setTimeout(() =\u003e {\n                    isButtonPressed = false;\n                }, 800);\n            }\n\n            \/\/ Interacción con Tarjeta SD\n            const intersectsSd = raycaster.intersectObject(sdCard);\n            const intersectsSlot = raycaster.intersectObject(sideSdSlot);\n            if (intersectsSd.length \u003e 0 || intersectsSlot.length \u003e 0) {\n                sdCard.userData.isInserted = !sdCard.userData.isInserted;\n                targetSdX = sdCard.userData.isInserted ? sdInsertedX : sdEjectedX;\n            }\n        });\n\n        window.addEventListener('resize', () =\u003e {\n            camera.aspect = container.clientWidth \/ container.clientHeight;\n            camera.updateProjectionMatrix();\n            renderer.setSize(container.clientWidth, container.clientHeight);\n        });\n\n        \/\/ --- ANIMATION LOOP ---\n        function animate() {\n            requestAnimationFrame(animate);\n            time += 0.02;\n\n            \/\/ Animación Tarjeta SD\n            currentSdX += (targetSdX - currentSdX) * 0.15;\n            sdCard.position.x = currentSdX;\n\n            \/\/ Animación \"Transformer\"\n            const targetFrontZ = isExploded ? 0.6 : 0;\n            const targetBackZ = isExploded ? -0.6 : 0;\n            \n            frontPart.position.z += (targetFrontZ - frontPart.position.z) * 0.1;\n            backPart.position.z += (targetBackZ - backPart.position.z) * 0.1;\n\n            \/\/ Ocultar cables rojo\/negro y la antena cuando está cerrado para que no atraviesen la carcasa\n            const isOpening = isExploded || Math.abs(frontPart.position.z) \u003e 0.05;\n            lineRed.visible = isOpening;\n            lineBlack.visible = isOpening;\n            wireAntenna.visible = isOpening;\n\n            \/\/ Lógica LED\n            if (isButtonPressed) {\n                \/\/ Si el botón está pulsado, forzar color azul intenso\n                ledMat.color.setHex(0x0044ff);\n                ledMat.emissive.setHex(0x0044ff);\n            } else {\n                \/\/ Si no, hacer un ciclo de colores HSL continuo basado en el tiempo\n                const hue = (time * 0.15) % 1; \n                ledMat.color.setHSL(hue, 1, 0.5);\n                ledMat.emissive.setHSL(hue, 1, 0.5);\n            }\n\n            if (!isDragging) {\n                deviceGroup.rotation.y += 0.005;\n                deviceGroup.position.y = Math.sin(time) * 0.05;\n            }\n\n            renderer.render(scene, camera);\n        }\n        \n        animate();\n    });\n\u003c\/script\u003e\n\n\n\u003c\/body\u003e","brand":"sgpstore","offers":[{"title":"Default Title","offer_id":57533474963788,"sku":null,"price":247.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1057\/9807\/4700\/files\/rn-image_picker_lib_temp_1129ae51-3068-4596-9975-7357fc125814.png?v=1778713734"}],"url":"https:\/\/sgpstore.net\/collections\/frontpage.oembed","provider":"sgpstore","version":"1.0","type":"link"}