{"product_id":"robot-arm-blueprints","title":"Robot Arm Blueprints","description":"\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n.sgpx{position:relative;isolation:isolate;container-type:inline-size;font-family:-apple-system,BlinkMacSystemFont,\"SF Pro Display\",\"SF Pro Text\",Inter,\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-feature-settings:\"cv05\",\"cv11\";font-size:17px;line-height:1.47;text-align:center;-webkit-font-smoothing:antialiased;color:#1d1d1f;background:#fff;border-radius:32px;overflow:hidden;margin:8px 0 0}\n.sgpx *{box-sizing:border-box;margin:0;padding:0}\n.sgpx .bg{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}\n.sgpx .bg i{position:absolute;display:block;width:74%;height:440px;background:#0b0d14;filter:blur(38px);border-radius:58% 42% 38% 62% \/ 55% 60% 40% 45%;animation:sgpx-lava var(--dur) var(--delay) ease-in-out infinite}\n.sgpx .bg i:nth-child(1){left:-12%;top:-2%;opacity:.3;--tx:22%;--ty:66%;--sc:1.24;--rot:10deg;--dur:11s;--delay:0s}\n.sgpx .bg i:nth-child(2){right:-10%;top:15%;opacity:.26;--tx:-20%;--ty:-70%;--sc:1.18;--rot:-11deg;--dur:15s;--delay:-4s}\n.sgpx .bg i:nth-child(3){left:-8%;top:32%;opacity:.3;--tx:19%;--ty:68%;--sc:1.22;--rot:9deg;--dur:13s;--delay:-8s}\n.sgpx .bg i:nth-child(4){right:-12%;top:49%;opacity:.26;--tx:-22%;--ty:-64%;--sc:1.2;--rot:-10deg;--dur:17s;--delay:-3s}\n.sgpx .bg i:nth-child(5){left:-10%;top:66%;opacity:.3;--tx:20%;--ty:70%;--sc:1.24;--rot:8deg;--dur:12s;--delay:-9s}\n.sgpx .bg i:nth-child(6){right:-8%;bottom:-2%;opacity:.26;--tx:-19%;--ty:-66%;--sc:1.18;--rot:-9deg;--dur:16s;--delay:-6s}\n@keyframes sgpx-lava{0%{transform:translate3d(0,0,0) scale(1) rotate(0deg);border-radius:58% 42% 38% 62% \/ 55% 60% 40% 45%}25%{transform:translate3d(var(--tx),calc(var(--ty) * .45),0) scale(var(--sc)) rotate(var(--rot));border-radius:38% 62% 64% 36% \/ 40% 44% 56% 60%}50%{transform:translate3d(calc(var(--tx) * .2),var(--ty),0) scale(calc(var(--sc) * .88)) rotate(0deg);border-radius:52% 48% 40% 60% \/ 66% 34% 66% 34%}75%{transform:translate3d(calc(var(--tx) * -.7),calc(var(--ty) * .5),0) scale(var(--sc)) rotate(calc(var(--rot) * -1));border-radius:66% 34% 58% 42% \/ 34% 62% 38% 66%}100%{transform:translate3d(0,0,0) scale(1) rotate(0deg);border-radius:58% 42% 38% 62% \/ 55% 60% 40% 45%}}\n.sgpx .bg span{position:absolute;inset:0;background-image:radial-gradient(rgba(0,0,0,.17) 1px,transparent 1px);background-size:18px 18px}\n.sgpx .s{position:relative;z-index:1;padding:0 24px 66px}\n.sgpx .s:first-of-type{padding-top:58px}\n.sgpx .s:last-of-type{padding-bottom:58px}\n.sgpx .glass{position:relative;background:linear-gradient(180deg,rgba(255,255,255,.8),rgba(255,255,255,.58) 46%,rgba(255,255,255,.68));backdrop-filter:blur(30px) saturate(150%) brightness(1.04);-webkit-backdrop-filter:blur(30px) saturate(150%) brightness(1.04);border-radius:26px;box-shadow:0 16px 38px rgba(90,100,125,.16),inset 0 1px 1px rgba(255,255,255,.95),inset 0 -10px 20px rgba(255,255,255,.3),inset 0 0 0 .5px rgba(255,255,255,.7)}\n@supports ((mask-composite:exclude) or (-webkit-mask-composite:xor)){.sgpx .glass::before{content:\"\";position:absolute;inset:0;border-radius:inherit;padding:1px;pointer-events:none;z-index:2;background:conic-gradient(from 200deg at 50% 50%,rgba(255,158,205,.9),rgba(160,233,255,.9) 22%,rgba(189,245,200,.85) 45%,rgba(255,230,160,.9) 66%,rgba(196,181,253,.9) 84%,rgba(255,158,205,.9));-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;opacity:.4}}\n.sgpx .glass-pill{position:relative;isolation:isolate;display:inline-flex;align-items:center;gap:9px;padding:12px 20px;border-radius:980px;font-size:13px;font-weight:600;letter-spacing:.02em;color:#1d1d1f;background:radial-gradient(118% 118% at 50% 50%,rgba(255,255,255,0) 48%,rgba(255,255,255,.38) 80%,rgba(255,255,255,.14) 100%),linear-gradient(180deg,rgba(255,255,255,.3),rgba(255,255,255,.02) 46%,rgba(255,255,255,.13));backdrop-filter:blur(5px) saturate(230%) brightness(1.06);-webkit-backdrop-filter:blur(5px) saturate(230%) brightness(1.06);box-shadow:0 14px 30px rgba(50,60,85,.26),inset 0 2px 2px rgba(255,255,255,.98),inset 0 -14px 22px -8px rgba(255,255,255,.6),inset 0 0 26px -6px rgba(255,255,255,.4),inset 0 0 0 1.2px rgba(255,255,255,.8);transition:transform .24s cubic-bezier(.28,.11,.32,1),box-shadow .24s cubic-bezier(.28,.11,.32,1)}\n.sgpx .glass-pill\u003e*{position:relative;z-index:1}\n.sgpx .glass-pill::after{content:\"\";position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:radial-gradient(125% 62% at 50% -26%,rgba(255,255,255,.45),rgba(255,255,255,0) 58%)}\n@supports ((mask-composite:exclude) or (-webkit-mask-composite:xor)){.sgpx .glass-pill::before{content:\"\";position:absolute;inset:0;border-radius:inherit;padding:1.6px;pointer-events:none;background:conic-gradient(from 200deg at 50% 50%,rgba(255,158,205,.95),rgba(160,233,255,.95) 22%,rgba(189,245,200,.9) 45%,rgba(255,230,160,.95) 66%,rgba(196,181,253,.95) 84%,rgba(255,158,205,.95));-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;opacity:.9}}\n.sgpx .glass-pill.tint{color:#fff;text-shadow:0 1px 2px rgba(0,60,120,.28);background:radial-gradient(118% 118% at 50% 50%,rgba(255,255,255,0) 48%,rgba(255,255,255,.4) 82%,rgba(255,255,255,.16) 100%),linear-gradient(180deg,rgba(255,255,255,.3),rgba(255,255,255,.02) 46%),radial-gradient(130% 140% at 50% -10%,rgba(100,206,255,.62),rgba(0,113,227,.5));box-shadow:0 10px 26px rgba(0,113,227,.3),inset 0 1px 1px rgba(255,255,255,.85),inset 0 -9px 16px rgba(255,255,255,.28),inset 0 0 0 .5px rgba(255,255,255,.55)}\n.sgpx .dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex:0 0 auto}\n.sgpx .ico{display:grid;place-items:center;width:38px;height:38px;border-radius:11px;flex:0 0 auto;background:linear-gradient(180deg,var(--c1),var(--c2));box-shadow:0 4px 12px rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.45)}\n.sgpx h1,.sgpx h2,.sgpx .eyebrow,.sgpx .sub,.sgpx .legal{text-shadow:0 0 16px rgba(255,255,255,.92),0 0 5px rgba(255,255,255,.85)}\n.sgpx .eyebrow{font-size:15px;font-weight:600;color:#6c6c73;margin-bottom:10px}\n.sgpx h1,.sgpx h2,.sgpx h3,.sgpx h4{font-family:inherit;color:inherit;text-transform:none}\n.sgpx h1{font-size:clamp(40px,10cqw,64px);font-weight:700;letter-spacing:-.024em;line-height:1.03;margin:18px 0 14px}\n.sgpx h2{font-size:clamp(28px,7cqw,44px);font-weight:700;letter-spacing:-.018em;line-height:1.08;margin-bottom:12px}\n.sgpx .sub{font-size:clamp(16px,2.9cqw,19px);line-height:1.45;color:#48484f;max-width:470px;margin:0 auto 30px}\n.sgpx .accent{color:#0071e3}\n.sgpx .film{padding:10px;border-radius:30px}\n.sgpx .film video{display:block;width:100%;height:auto;aspect-ratio:16\/9;object-fit:cover;background:#000;border-radius:20px}\n.sgpx .caption{font-size:13px;font-weight:500;color:#5a5a60;margin-top:10px}\n.sgpx .list{text-align:left;padding:4px 22px 12px}\n.sgpx .list details{position:relative}\n.sgpx .list summary{display:flex;gap:14px;align-items:center;cursor:pointer;list-style:none;-webkit-tap-highlight-color:transparent;transition:opacity .2s cubic-bezier(.28,.11,.32,1)}\n.sgpx .list summary::-webkit-details-marker{display:none}\n.sgpx .list summary:active{opacity:.55}\n.sgpx .list .hd{flex:1;min-width:0;display:flex;align-items:center;gap:12px;padding:13px 0;border-top:1px solid rgba(0,0,0,.13)}\n.sgpx .list details:first-of-type .hd{border-top:0}\n.sgpx .list .t{flex:1;min-width:0;font-size:16px;font-weight:600;letter-spacing:-.006em;line-height:1.3}\n.sgpx .list .val{font-size:17px;font-weight:600;color:#0071e3;white-space:nowrap}\n.sgpx .list .chev{width:13px;height:13px;flex:0 0 auto;fill:none;stroke:#adadb4;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;transition:transform .3s cubic-bezier(.28,.11,.32,1)}\n.sgpx .list details[open] .chev{transform:rotate(90deg)}\n.sgpx .list .body{padding:0 4px 15px 52px}\n.sgpx .list .body p{font-size:14px;line-height:1.45;color:#5a5a60}\n@supports (interpolate-size:allow-keywords){.sgpx .list{interpolate-size:allow-keywords}.sgpx .list details::details-content{block-size:0;overflow:clip;transition:block-size .32s cubic-bezier(.28,.11,.32,1),content-visibility .32s allow-discrete}.sgpx .list details[open]::details-content{block-size:auto}}\n.sgpx .list .grp{font-size:12.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:#8a8a91;padding:20px 0 4px}\n.sgpx .list .grp:first-child{padding-top:2px}\n.sgpx .list .grp + details .hd{border-top:0}\n.sgpx .panel{padding:8px 24px 24px;text-align:left}\n.sgpx .rows{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 28px}\n.sgpx .rows\u003ediv{display:flex;gap:14px;align-items:flex-start;padding:16px 0;border-top:1px solid rgba(0,0,0,.13)}\n.sgpx .rows h4{font-size:16px;font-weight:600;letter-spacing:-.005em;line-height:1.3;margin-bottom:3px}\n.sgpx .rows p{font-size:14px;line-height:1.45;color:#5a5a60}\n.sgpx .rows.one{grid-template-columns:1fr}\n.sgpx .chips{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}\n.sgpx .chips .glass-pill{font-size:14px;font-weight:500;letter-spacing:0;padding:13px 20px;text-align:left}\n.sgpx .legal{font-size:12px;line-height:1.6;color:#5f5f66;max-width:540px;margin:0 auto}\n.sgpx .legal b{display:block;color:#5a5a60;font-weight:600;font-size:11px;letter-spacing:.06em;margin-bottom:5px}\n@container (max-width:520px){.sgpx .s{padding:0 18px 54px}.sgpx .s:first-of-type{padding-top:48px}.sgpx .rows{grid-template-columns:1fr}.sgpx .list{padding:4px 16px 10px}.sgpx .list .body{padding-left:0}.sgpx .panel{padding:6px 20px 20px}.sgpx .chips .glass-pill{width:100%}}\n@media (prefers-reduced-motion:reduce){.sgpx .bg i{animation-duration:calc(var(--dur) * 2.5)}.sgpx .glass-pill,.sgpx .list summary,.sgpx .list .chev{transition:none!important}}\n.sgpx .v3d{padding:10px;border-radius:30px;text-align:left}\n.sgpx .ra-stage{position:relative;height:min(58vh,480px);min-height:320px;border-radius:20px;overflow:hidden;touch-action:none;background:radial-gradient(90% 80% at 50% 35%,#ffffff,#eef1f6 70%,#e4e8ef)}\n.sgpx .ra-stage canvas{display:block;width:100%!important;height:100%!important;outline:none}\n.sgpx .ra-load{position:absolute;inset:0;display:grid;place-items:center;color:#8a8a91;font-size:13px;font-weight:600;letter-spacing:.06em}\n.sgpx .ra-hint{position:absolute;left:0;right:0;bottom:12px;text-align:center;font-size:12px;font-weight:500;color:#8a8a91;pointer-events:none}\n.sgpx .ra-ui{display:grid;grid-template-columns:1.15fr 1fr;gap:18px;padding:16px 12px 8px}\n.sgpx .ra-lab{font-size:12.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:#8a8a91;margin:0 0 8px}\n.sgpx .ra-row{display:grid;grid-template-columns:74px 1fr 44px;align-items:center;gap:10px;padding:6px 0}\n.sgpx .ra-row label{font-size:14px;font-weight:600;color:#1d1d1f}\n.sgpx .ra-row output{font:600 13px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-align:right;color:#0071e3}\n.sgpx input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:9px;margin:0;background:linear-gradient(90deg,#0071e3 var(--p,50%),rgba(0,0,0,.12) var(--p,50%))}\n.sgpx input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;background:#fff;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.22),0 0 0 .5px rgba(0,0,0,.08)}\n.sgpx input[type=range]::-moz-range-thumb{width:22px;height:22px;border:0;border-radius:50%;background:#fff;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.22)}\n.sgpx .ra-btns{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}\n.sgpx .ra-btns button{all:unset;cursor:pointer;padding:9px 15px;border-radius:980px;font-size:13px;font-weight:600;color:#1d1d1f;background:rgba(255,255,255,.75);box-shadow:0 4px 12px rgba(50,60,85,.12),inset 0 0 0 .5px rgba(0,0,0,.12);transition:transform .2s,background .2s}\n.sgpx .ra-btns button:active{transform:scale(.95)}\n.sgpx .ra-btns button.ra-emo{font-size:21px;padding:7px 11px;line-height:1}\n.sgpx .ra-btns button.on{background:#0071e3;color:#fff;box-shadow:0 6px 16px rgba(0,113,227,.3)}\n.sgpx .amz{padding:26px 24px}\n.sgpx .amz .big{font-size:44px;line-height:1;margin-bottom:10px}\n@container (max-width:620px){.sgpx .ra-ui{grid-template-columns:1fr}}\n\u003c\/style\u003e\n\u003cdiv class=\"sgpx\"\u003e\n  \u003cdiv class=\"bg\" aria-hidden=\"true\"\u003e\n\u003ci\u003e\u003c\/i\u003e\u003ci\u003e\u003c\/i\u003e\u003ci\u003e\u003c\/i\u003e\u003ci\u003e\u003c\/i\u003e\u003ci\u003e\u003c\/i\u003e\u003ci\u003e\u003c\/i\u003e\u003cspan\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cspan class=\"glass-pill tint\"\u003e\u003cspan class=\"dot\"\u003e\u003c\/span\u003eDigital build pack\u003c\/span\u003e\n    \u003ch1\u003eRobot Arm Blueprints\u003c\/h1\u003e\n    \u003cp class=\"sub\"\u003ePrint it, build it and program it. A 4-axis robot arm with a gripper, explained step by step, screw by screw.\u003c\/p\u003e\n    \u003cdiv class=\"glass film\"\u003e\u003cvideo autoplay muted loop playsinline controls preload=\"metadata\" aria-label=\"The real robot arm, built and moving\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1057\/9807\/4700\/files\/preview_images\/e3a87ae857644455b9b64f85ee6a2417.thumbnail.0000000000.jpg?v=1793242699\"\u003e\u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/vp\/e3a87ae857644455b9b64f85ee6a2417\/e3a87ae857644455b9b64f85ee6a2417.HD-720p-2.1Mbps-99269038.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\u003c\/div\u003e\n    \u003cp class=\"caption\" style=\"margin-bottom:34px\"\u003eThe real arm: printed, built and moving.\u003c\/p\u003e\n    \u003cdiv class=\"glass v3d\" id=\"sgpra\"\u003e\n      \u003cdiv class=\"ra-stage\" id=\"ra-stage\"\u003e\n\u003cdiv class=\"ra-load\" id=\"ra-load\"\u003eLoading 3D model…\u003c\/div\u003e\n\u003cdiv class=\"ra-hint\"\u003eDrag to rotate · pinch to zoom\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv class=\"ra-ui\"\u003e\n        \u003cdiv\u003e\n\u003cp class=\"ra-lab\"\u003eMove each axis\u003c\/p\u003e\n\u003cdiv id=\"ra-sliders\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003cdiv\u003e\n\u003cp class=\"ra-lab\"\u003eGestures\u003c\/p\u003e\n\u003cdiv class=\"ra-btns\" id=\"ra-gest\"\u003e\u003c\/div\u003e\n          \u003cp class=\"ra-lab\"\u003eView\u003c\/p\u003e\n\u003cdiv class=\"ra-btns\"\u003e\n\u003cbutton id=\"ra-home\"\u003eRest\u003c\/button\u003e\u003cbutton id=\"ra-up\"\u003eUpright\u003c\/button\u003e\u003cbutton id=\"ra-exp\"\u003eExploded\u003c\/button\u003e\u003cbutton id=\"ra-spin\" class=\"on\"\u003eAuto-rotate\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cp class=\"caption\"\u003eThe real 3D model of the arm you will build. Try it.\u003c\/p\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cp class=\"eyebrow\"\u003eAssembly video\u003c\/p\u003e\n    \u003ch2\u003eWatch the full build.\u003c\/h2\u003e\n    \u003cp class=\"sub\"\u003eThe shopping list, the printing, every screw, the wiring and the programming, in one video.\u003c\/p\u003e\n    \u003cdiv class=\"glass film\"\u003e\u003cvideo controls playsinline preload=\"metadata\" aria-label=\"Robot arm assembly video\" poster=\"https:\/\/cdn.shopify.com\/s\/files\/1\/1057\/9807\/4700\/files\/preview_images\/1bff34a4f7b54d7f8085005029b9812e.thumbnail.0000000000.jpg?v=1793242082\"\u003e\u003csource src=\"https:\/\/cdn.shopify.com\/videos\/c\/vp\/1bff34a4f7b54d7f8085005029b9812e\/1bff34a4f7b54d7f8085005029b9812e.HD-720p-1.6Mbps-99267889.mp4\" type=\"video\/mp4\"\u003e\u003c\/video\u003e\u003c\/div\u003e\n    \u003cp class=\"caption\"\u003e10 minutes · English · The full version is included in the download.\u003c\/p\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cdiv class=\"glass amz\"\u003e\n      \u003cdiv class=\"big\"\u003e🛒\u003c\/div\u003e\n      \u003cp class=\"eyebrow\"\u003eNo hunting for parts\u003c\/p\u003e\n      \u003ch2\u003eEvery part is on \u003cspan class=\"accent\"\u003eAmazon\u003c\/span\u003e.\u003c\/h2\u003e\n      \u003cp class=\"sub\" style=\"margin-bottom:22px\"\u003eServos, bearings, screws, power supply and cables. The shopping list links every item, so you can order everything in a few minutes.\u003c\/p\u003e\n      \u003cdiv class=\"chips\"\u003e\n\u003cspan class=\"glass-pill\"\u003e5 servos\u003c\/span\u003e\u003cspan class=\"glass-pill\"\u003eBearings\u003c\/span\u003e\u003cspan class=\"glass-pill\"\u003eM3 \/ M2 screws\u003c\/span\u003e\u003cspan class=\"glass-pill\"\u003e6 V power supply\u003c\/span\u003e\u003cspan class=\"glass-pill\"\u003eCables\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cp class=\"eyebrow\"\u003eWhat is in the pack\u003c\/p\u003e\n    \u003ch2\u003eEverything you need.\u003cbr\u003eNothing to guess.\u003c\/h2\u003e\n    \u003cp class=\"sub\"\u003eTap any item to see what it includes.\u003c\/p\u003e\n    \u003cdiv class=\"glass list\"\u003e\n\u003cp class=\"grp\"\u003eLearn and build\u003c\/p\u003e\n\u003cdetails open\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#ff6b6b;--c2:#e0313a;font-size:19px\"\u003e🎬\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003eAssembly video\u003c\/span\u003e\u003cspan class=\"val\"\u003eStep by step\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003eThe full build on video: the shopping list, the 3D printing, every screw of the assembly, the wiring, programming the board and the first moves.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#37b7f5;--c2:#0060df;font-size:19px\"\u003e📘\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003eAssembly manual\u003c\/span\u003e\u003cspan class=\"val\"\u003ePDF\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003e13 illustrated pages: tools, every printed part, 6 assembly steps with every screw named, the wiring diagram, first power-on and troubleshooting.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#ffcc4d;--c2:#f59e0b;font-size:19px\"\u003e🛒\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003eShopping list\u003c\/span\u003e\u003cspan class=\"val\"\u003eAmazon\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003eEvery motor, bearing, screw and cable with its quantity and a direct Amazon search link. About $120 in parts. Opens in Excel or Google Sheets.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cp class=\"grp\"\u003ePrint\u003c\/p\u003e\n\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#34d399;--c2:#059669;font-size:19px\"\u003e🖨️\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003e3D files for any 3D printer\u003c\/span\u003e\u003cspan class=\"val\"\u003eSTL + 3MF\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003e11 parts already turned the right way up for printing, plus 6 ready-made print plates for 256 mm beds. About 630 g of PLA or PETG. Works on any FDM printer.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#a78bfa;--c2:#7c3aed;font-size:19px\"\u003e⚙️\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003ePrint guide\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003eLayer height, walls, infill, and exactly which parts need supports.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#94a3b8;--c2:#475569;font-size:19px\"\u003e🧩\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003e2 bonus heads\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003eA parallel gripper with steel guide rods and a camera mount for the DJI Osmo Pocket 3. Both swap at the wrist in seconds.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cp class=\"grp\"\u003eProgram and play\u003c\/p\u003e\n\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#4fc3f7;--c2:#1976d2;font-size:19px\"\u003e💻\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003eFirmware + control app\u003c\/span\u003e\u003cspan class=\"val\"\u003eMac \u0026amp; Windows\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003eReady-to-flash firmware for the SGP Card Joker or any ESP32-S3 with a PCA9685 servo board. The app shows the arm in live 3D: sliders, drag the tip, 9 gestures, a 30-second dance and calibration.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\u003cdetails\u003e\u003csummary\u003e\u003cspan class=\"ico\" style=\"--c1:#f472b6;--c2:#db2777;font-size:19px\"\u003e🔌\u003c\/span\u003e\u003cspan class=\"hd\"\u003e\u003cspan class=\"t\"\u003eWiring diagram\u003c\/span\u003e\u003csvg class=\"chev\" viewbox=\"0 0 24 24\" aria-hidden=\"true\"\u003e\u003cpolyline points=\"9 5 16 12 9 19\"\u003e\u003c\/polyline\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/summary\u003e\u003cdiv class=\"body\"\u003e\u003cp\u003eExactly which wire goes where: controller, servo driver, the five servos and the power supply.\u003c\/p\u003e\u003c\/div\u003e\u003c\/details\u003e\n\u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cp class=\"eyebrow\"\u003eThe arm\u003c\/p\u003e\n    \u003ch2\u003eBig enough to be useful.\u003c\/h2\u003e\n    \u003cdiv class=\"glass panel\"\u003e\u003cdiv class=\"rows\"\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#37b7f5;--c2:#0060df;font-size:19px\"\u003e📏\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003e≈ 350 mm reach\u003c\/h4\u003e\n\u003cp\u003eFrom the shoulder to the tip of the gripper.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#34d399;--c2:#059669;font-size:19px\"\u003e🏋️\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003e150 g payload\u003c\/h4\u003e\n\u003cp\u003eWith the arm fully stretched.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#a78bfa;--c2:#7c3aed;font-size:19px\"\u003e🦾\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003e4 axes + gripper\u003c\/h4\u003e\n\u003cp\u003eBase, shoulder, elbow, wrist and claw.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#ffcc4d;--c2:#f59e0b;font-size:19px\"\u003e⚙️\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003e5 metal-gear servos\u003c\/h4\u003e\n\u003cp\u003e20 kg on the shoulder and elbow.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#4fc3f7;--c2:#1976d2;font-size:19px\"\u003e🧠\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003eSGP Card Joker brain\u003c\/h4\u003e\n\u003cp\u003eOr any ESP32-S3 + PCA9685 board.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#f472b6;--c2:#db2777;font-size:19px\"\u003e🖨️\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003e≈ 630 g of filament\u003c\/h4\u003e\n\u003cp\u003ePLA or PETG, any FDM printer.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cp class=\"eyebrow\"\u003eBefore you buy\u003c\/p\u003e\n    \u003ch2\u003ePlease read.\u003c\/h2\u003e\n    \u003cdiv class=\"glass panel\"\u003e\u003cdiv class=\"rows one\"\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#37b7f5;--c2:#0060df;font-size:19px\"\u003e📄\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003eBuild files only. No commercial rights.\u003c\/h4\u003e\n\u003cp\u003eYou are buying the manufacturing files for your own personal use. Commercial rights are not included: you may not sell the files, printed parts or assembled arms, and you may not share or redistribute the files.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#ffcc4d;--c2:#f59e0b;font-size:19px\"\u003e🛠️\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003eSome experience is needed.\u003c\/h4\u003e\n\u003cp\u003eYou should be comfortable with 3D printing, small hand tools, fitting heat-set inserts with a soldering iron, wiring simple electronics and uploading a program to a microcontroller. The manual and the video guide you step by step, but they do not replace these basic skills.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n      \u003cdiv\u003e\n\u003cspan class=\"ico\" style=\"--c1:#ff6b6b;--c2:#e0313a;font-size:19px\"\u003e⚠️\u003c\/span\u003e\u003cdiv\u003e\n\u003ch4\u003eBuild and use at your own risk.\u003c\/h4\u003e\n\u003cp\u003eWe are not responsible for incorrect assembly, misuse or modifications, or for any damage or injury caused by building or using the arm. It has moving parts: keep fingers clear while it is powered and supervise minors.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\u003c\/div\u003e\n  \u003c\/section\u003e\n  \u003csection class=\"s\"\u003e\n    \u003cp class=\"legal\"\u003e\u003cb\u003eDIGITAL DOWNLOAD\u003c\/b\u003eYou receive the files (video, PDF manual, shopping list, 3D files and software), not a physical product. Servos, electronics, screws and filament are not included. Personal, non-commercial use only.\u003c\/p\u003e\n  \u003c\/section\u003e\n\u003c\/div\u003e\n\u003cscript src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"\u003e\u003c\/script\u003e\n\u003cscript src=\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.128.0\/examples\/js\/loaders\/GLTFLoader.js\"\u003e\u003c\/script\u003e\n\u003cscript src=\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.128.0\/examples\/js\/controls\/OrbitControls.js\"\u003e\u003c\/script\u003e\n\u003cscript\u003e\n(function () {\n  var GLB = \"https:\/\/cdn.shopify.com\/3d\/models\/o\/a95c1e994b21be59\/sgp_robot_arm.glb\";\n  var CFG = {\"joints\":[{\"id\":\"j1\",\"name\":\"Base\",\"min\":-86.0,\"max\":86.0,\"home\":0,\"dps\":300},{\"id\":\"j2\",\"name\":\"Shoulder\",\"min\":-76.0,\"max\":52.2,\"home\":0,\"dps\":300},{\"id\":\"j3\",\"name\":\"Elbow\",\"min\":-86.0,\"max\":56.0,\"home\":0,\"dps\":257},{\"id\":\"j4\",\"name\":\"Wrist\",\"min\":-86.0,\"max\":86.0,\"home\":0,\"dps\":300},{\"id\":\"j5\",\"name\":\"Gripper\",\"min\":0.0,\"max\":48.0,\"home\":0,\"dps\":300}],\"gestures\":[{\"id\":\"hello\",\"label\":\"Hello 👋\",\"frames\":[{\"ms\":500,\"a\":[0.0,-5.0,-45.0,-20.0,10.0]},{\"ms\":350,\"a\":[25.0,-5.0,-50.0,-35.0,40.0]},{\"ms\":350,\"a\":[-25.0,-5.0,-50.0,5.0,10.0]},{\"ms\":350,\"a\":[25.0,-5.0,-50.0,-35.0,40.0]},{\"ms\":350,\"a\":[-25.0,-5.0,-50.0,5.0,10.0]},{\"ms\":400,\"a\":[0.0,-5.0,-45.0,-20.0,30.0]},{\"ms\":600,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"yes\",\"label\":\"Yes 👍\",\"frames\":[{\"ms\":350,\"a\":[0.0,5.0,-10.0,35.0,2.0]},{\"ms\":300,\"a\":[0.0,0.0,-10.0,-15.0,2.0]},{\"ms\":300,\"a\":[0.0,5.0,-10.0,35.0,2.0]},{\"ms\":300,\"a\":[0.0,0.0,-10.0,-15.0,2.0]},{\"ms\":300,\"a\":[0.0,5.0,-10.0,30.0,2.0]},{\"ms\":500,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"no\",\"label\":\"No 🙅\",\"frames\":[{\"ms\":350,\"a\":[30.0,0.0,-10.0,10.0,2.0]},{\"ms\":300,\"a\":[-30.0,0.0,-10.0,10.0,2.0]},{\"ms\":300,\"a\":[30.0,0.0,-10.0,10.0,2.0]},{\"ms\":300,\"a\":[-30.0,0.0,-10.0,10.0,2.0]},{\"ms\":300,\"a\":[15.0,0.0,-5.0,5.0,2.0]},{\"ms\":500,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"angry\",\"label\":\"Angry 😠\",\"frames\":[{\"ms\":375,\"a\":[0.0,25.0,10.0,25.0,45.0]},{\"ms\":150,\"a\":[0.0,25.0,10.0,25.0,2.0]},{\"ms\":150,\"a\":[0.0,25.0,10.0,25.0,45.0]},{\"ms\":150,\"a\":[0.0,25.0,10.0,25.0,2.0]},{\"ms\":250,\"a\":[15.0,30.0,5.0,30.0,45.0]},{\"ms\":150,\"a\":[-15.0,30.0,5.0,30.0,2.0]},{\"ms\":150,\"a\":[15.0,30.0,5.0,30.0,45.0]},{\"ms\":150,\"a\":[-15.0,30.0,5.0,30.0,2.0]},{\"ms\":500,\"a\":[0.0,10.0,0.0,10.0,2.0]},{\"ms\":750,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"happy\",\"label\":\"Happy 😄\",\"frames\":[{\"ms\":400,\"a\":[20.0,-5.0,-30.0,-20.0,35.0]},{\"ms\":350,\"a\":[-20.0,5.0,-15.0,-5.0,15.0]},{\"ms\":350,\"a\":[20.0,-5.0,-30.0,-20.0,35.0]},{\"ms\":350,\"a\":[-20.0,5.0,-15.0,-5.0,15.0]},{\"ms\":350,\"a\":[0.0,-10.0,-40.0,-30.0,45.0]},{\"ms\":600,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"sad\",\"label\":\"Sad 😢\",\"frames\":[{\"ms\":1200,\"a\":[25.0,35.0,30.0,50.0,2.0]},{\"ms\":1000,\"a\":[30.0,40.0,35.0,60.0,2.0]},{\"ms\":1400,\"a\":[30.0,40.0,35.0,60.0,2.0]},{\"ms\":1200,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"surprised\",\"label\":\"Surprised 😮\",\"frames\":[{\"ms\":250,\"a\":[0.0,-20.0,-55.0,-40.0,46.0]},{\"ms\":1000,\"a\":[0.0,-20.0,-55.0,-40.0,46.0]},{\"ms\":600,\"a\":[0.0,-5.0,-20.0,-10.0,20.0]},{\"ms\":600,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"dance\",\"label\":\"Dance 💃\",\"frames\":[{\"ms\":450,\"a\":[35.0,10.0,-20.0,20.0,30.0]},{\"ms\":450,\"a\":[-35.0,-5.0,-35.0,-20.0,2.0]},{\"ms\":450,\"a\":[35.0,10.0,-20.0,20.0,30.0]},{\"ms\":450,\"a\":[-35.0,-5.0,-35.0,-20.0,2.0]},{\"ms\":400,\"a\":[0.0,15.0,-40.0,40.0,45.0]},{\"ms\":400,\"a\":[0.0,-10.0,-10.0,-30.0,2.0]},{\"ms\":400,\"a\":[0.0,15.0,-40.0,40.0,45.0]},{\"ms\":600,\"a\":[0.0,0.0,0.0,0.0,2.0]}]},{\"id\":\"think\",\"label\":\"Thinking 🤔\",\"frames\":[{\"ms\":1000,\"a\":[40.0,5.0,-20.0,25.0,2.0]},{\"ms\":800,\"a\":[40.0,5.0,-20.0,10.0,15.0]},{\"ms\":800,\"a\":[40.0,5.0,-20.0,25.0,2.0]},{\"ms\":1000,\"a\":[0.0,0.0,0.0,0.0,2.0]}]}]};\n  var AXES = { j1: [0, 1, 0], j2: [0, 0, -1], j3: [0, 0, -1], j4: [0, 0, -1], j5: [0, -1, 0] };\n  function boot() {\n    var root = document.getElementById(\"sgpra\"); if (!root || !window.THREE || !THREE.GLTFLoader) return setTimeout(boot, 120);\n    var stage = document.getElementById(\"ra-stage\");\n    var renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n    renderer.setPixelRatio(Math.min(2, window.devicePixelRatio || 1));\n    renderer.outputEncoding = THREE.sRGBEncoding; renderer.toneMapping = THREE.ACESFilmicToneMapping; renderer.toneMappingExposure = 1.0;\n    renderer.shadowMap.enabled = true; renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n    stage.appendChild(renderer.domElement);\n    var scene = new THREE.Scene();\n    var cam = new THREE.PerspectiveCamera(30, 1, 0.01, 20);\n    scene.add(new THREE.HemisphereLight(0xdfe8ff, 0x1a1c22, 0.45));\n    var key = new THREE.DirectionalLight(0xffffff, 1.5); key.position.set(0.6, 1.2, 0.8); key.castShadow = true;\n    key.shadow.mapSize.set(1024, 1024); key.shadow.camera.left = key.shadow.camera.bottom = -0.45; key.shadow.camera.right = key.shadow.camera.top = 0.45; key.shadow.bias = -0.0005;\n    scene.add(key);\n    var rim = new THREE.DirectionalLight(0x5aa8ff, 1.3); rim.position.set(-0.9, 0.6, -0.9); scene.add(rim);\n    var fill = new THREE.DirectionalLight(0xffe2c4, 0.35); fill.position.set(-0.8, 0.3, 0.9); scene.add(fill);\n    var floor = new THREE.Mesh(new THREE.CircleGeometry(0.45, 64), new THREE.ShadowMaterial({ opacity: 0.22 })); floor.rotation.x = -Math.PI \/ 2; floor.receiveShadow = true; scene.add(floor);\n    var ring = new THREE.Mesh(new THREE.RingGeometry(0.2, 0.202, 96), new THREE.MeshBasicMaterial({ color: 0x0071e3, transparent: true, opacity: 0.35 })); ring.rotation.x = -Math.PI \/ 2; ring.position.y = 0.0005; scene.add(ring);\n    var ctl = new THREE.OrbitControls(cam, renderer.domElement);\n    ctl.enableDamping = true; ctl.target.set(0.04, 0.14, 0); ctl.minDistance = 0.25; ctl.maxDistance = 1.6; ctl.maxPolarAngle = Math.PI * 0.53; ctl.enablePan = false;\n    ctl.autoRotate = true; ctl.autoRotateSpeed = 0.9;\n    cam.position.set(0.55, 0.36, 0.62);\n    function size() { var w = stage.clientWidth, h = stage.clientHeight; renderer.setSize(w, h, false); cam.aspect = w \/ h; cam.updateProjectionMatrix(); }\n    size(); window.addEventListener(\"resize\", size);\n\n    var J = {}, parts = [], q = {}, tgt = {}, exp = 0, expT = 0, play = null;\n    CFG.joints.forEach(function (j) { q[j.id] = 0; tgt[j.id] = 0; });\n    new THREE.GLTFLoader().load(GLB, function (g) {\n      var arm = g.scene; scene.add(arm);\n      arm.traverse(function (o) {\n        if (\/^joint_j\\d\/.test(o.name)) J[o.name.slice(6)] = o;\n        if (o.isMesh) { o.castShadow = true; o.receiveShadow = true; parts.push(o); o.userData.home = o.position.clone(); }\n      });\n      arm.updateMatrixWorld(true);\n      var c = new THREE.Vector3(0.03, 0.13, 0);\n      parts.forEach(function (o) {\n        var b = new THREE.Box3().setFromObject(o).getCenter(new THREE.Vector3()), d = b.sub(c); d.y *= 0.7;\n        var p0 = o.parent.worldToLocal(o.getWorldPosition(new THREE.Vector3()).clone());\n        var p1 = o.parent.worldToLocal(o.getWorldPosition(new THREE.Vector3()).add(d.multiplyScalar(0.6)));\n        o.userData.dir = p1.sub(p0);\n      });\n      document.getElementById(\"ra-load\").style.display = \"none\";\n      Object.keys(J).forEach(function (k) { J[k].userData.q0 = J[k].quaternion.clone(); });\n    }, undefined, function () { document.getElementById(\"ra-load\").textContent = \"3D model unavailable\"; });\n\n    var box = document.getElementById(\"ra-sliders\"), sl = {};\n    CFG.joints.forEach(function (j) {\n      var r = document.createElement(\"div\"); r.className = \"ra-row\";\n      r.innerHTML = '\u003clabel\u003e' + j.name + '\u003c\/label\u003e\u003cinput type=\"range\" min=\"' + j.min + '\" max=\"' + j.max + '\" step=\"1\" value=\"0\"\u003e\u003coutput\u003e0°\u003c\/output\u003e';\n      var inp = r.querySelector(\"input\"), out = r.querySelector(\"output\");\n      inp.addEventListener(\"input\", function () { stopPlay(); tgt[j.id] = +inp.value; });\n      sl[j.id] = { inp: inp, out: out, j: j }; box.appendChild(r);\n    });\n    function setAll(a) { CFG.joints.forEach(function (j, i) { tgt[j.id] = Math.max(j.min, Math.min(j.max, a[i])); }); }\n    var gb = document.getElementById(\"ra-gest\");\n    CFG.gestures.forEach(function (g) {\n      var b = document.createElement(\"button\"); var lb = g.label.split(\" \"); b.textContent = lb.pop(); b.title = lb.join(\" \"); b.setAttribute(\"aria-label\", b.title); b.className = \"ra-emo\"; b.addEventListener(\"click\", function () { runGesture(g, b); }); gb.appendChild(b);\n    });\n    function stopPlay() { if (play) { clearTimeout(play.t); play.btn.classList.remove(\"on\"); play = null; } }\n    function runGesture(g, btn) {\n      stopPlay(); setExp(0); play = { btn: btn, i: 0 }; btn.classList.add(\"on\");\n      (function step() { if (!play) return; var f = g.frames[play.i++]; if (!f) { stopPlay(); return; } setAll(f.a); play.t = setTimeout(step, f.ms); })();\n    }\n    function setExp(v) { exp = v; document.getElementById(\"ra-exp\").classList.toggle(\"on\", v \u003e 0); }\n    document.getElementById(\"ra-home\").onclick = function () { stopPlay(); setExp(0); setAll([0, 0, 0, 0, 0]); };\n    document.getElementById(\"ra-up\").onclick = function () { stopPlay(); setExp(0); setAll([0, 0, -60, -20, 10]); };\n    document.getElementById(\"ra-exp\").onclick = function () { stopPlay(); setAll([0, 0, 0, 0, 0]); setExp(exp ? 0 : 1); };\n    var spin = document.getElementById(\"ra-spin\"); spin.onclick = function () { ctl.autoRotate = !ctl.autoRotate; spin.classList.toggle(\"on\", ctl.autoRotate); };\n    renderer.domElement.addEventListener(\"pointerdown\", function () { ctl.autoRotate = false; spin.classList.remove(\"on\"); });\n\n    var last = performance.now(), visible = true;\n    if (\"IntersectionObserver\" in window) new IntersectionObserver(function (e) { visible = e[0].isIntersecting; }).observe(stage);\n    var tmp = new THREE.Quaternion();\n    (function loop(t) {\n      requestAnimationFrame(loop); if (!visible) return;\n      var dt = Math.min(0.05, (t - last) \/ 1000); last = t;\n      CFG.joints.forEach(function (j) {\n        var d = tgt[j.id] - q[j.id], m = (j.dps || 300) * 0.6 * dt;\n        q[j.id] += Math.abs(d) \u003c= m ? d : Math.sign(d) * m;\n        var s = sl[j.id]; s.inp.value = Math.round(q[j.id]); s.out.textContent = Math.round(q[j.id]) + \"°\";\n        s.inp.style.setProperty(\"--p\", ((q[j.id] - j.min) \/ (j.max - j.min) * 100) + \"%\");\n        var n = J[j.id]; if (n \u0026\u0026 n.userData.q0) { var a = AXES[j.id]; tmp.setFromAxisAngle(new THREE.Vector3(a[0], a[1], a[2]), q[j.id] * Math.PI \/ 180); n.quaternion.copy(n.userData.q0).multiply(tmp); }\n      });\n      expT += (exp - expT) * Math.min(1, dt * 4);\n      parts.forEach(function (o) { if (o.userData.dir) o.position.copy(o.userData.home).addScaledVector(o.userData.dir, expT); });\n      ctl.update(); renderer.render(scene, cam);\n    })(last);\n  }\n  boot();\n})();\n\u003c\/script\u003e","brand":"sgpstore","offers":[{"title":"Default Title","offer_id":59616207307084,"sku":null,"price":16.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1057\/9807\/4700\/files\/exec-e7e337b1-35a8-4a89-b772-fb54fc5e3390.png?v=1793241698","url":"https:\/\/sgpstore.net\/products\/robot-arm-blueprints","provider":"sgpstore","version":"1.0","type":"link"}