{"id":5520,"date":"2026-08-24T15:21:15","date_gmt":"2026-08-24T19:21:15","guid":{"rendered":"https:\/\/thespraymarket.com\/?page_id=5520"},"modified":"2026-10-07T14:41:06","modified_gmt":"2026-10-07T18:41:06","slug":"rigs","status":"publish","type":"page","link":"https:\/\/thespraymarket.com\/es\/rigs\/","title":{"rendered":"Rigs"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5520\" class=\"elementor elementor-5520\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-979e547 e-con e-atomic-element e-flexbox-base e-default-div e-979e547-70e52f3 \" data-id=\"979e547\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"979e547\" data-e-type=\"e-flexbox\" data-id=\"979e547\">\n    \t\t\t<img fetchpriority=\"high\" decoding=\"async\" class=\"e-image-base e-default-img e-a013bcf-logo\" data-interaction-id=\"a013bcf\" data-e-type=\"widget\" data-id=\"a013bcf\" id=\"6655\" src=\"https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-1024x209.jpg\" width=\"800\" height=\"163\" srcset=\"https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-1024x209.jpg 1024w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-300x61.jpg 300w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-768x157.jpg 768w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-1536x314.jpg 1536w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-2048x419.jpg 2048w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-600x123.jpg 600w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-64x13.jpg 64w\" alt=\"Custom spray system setup at The Spray Market for industrial use.\"\/>\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-01238c9 e-con e-atomic-element e-flexbox-base e-default-div e-786db06 \" data-id=\"01238c9\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"01238c9\" data-e-type=\"e-flexbox\" data-id=\"01238c9\">\n    \t\t<div class=\"elementor-element elementor-element-83cbd98 elementor-widget elementor-widget-html\" data-id=\"83cbd98\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Archivo:wght@500;700&family=Public+Sans:wght@300;400&family=IBM+Plex+Mono:wght@400&display=swap\" rel=\"stylesheet\">\n<style id=\"sm-rig-explorer-css\">\n#sm-rig-explorer, #sm-rig-explorer * { box-sizing: border-box; }\n#sm-rig-explorer [hidden] { display: none !important; }\n#sm-rig-explorer {\n  --sm-red: #E00000;\n  overflow-x: hidden;\n  --sm-red-dark: #B60000;\n  --sm-text: #292929;\n  --sm-text-secondary: #5D5D5D;\n  --sm-text-body: #3E3E3E;\n  --sm-text-muted: #71777C;\n  --sm-border: #E0E0E0;\n  --sm-surface: #FFFFFF;\n  --sm-bg: #F5F6F7;\n  font-family: 'Public Sans', -apple-system, sans-serif;\n  background: var(--sm-bg);\n  padding: 24px;\n  width: 100%;\n}\n#sm-rig-explorer .sm-rig-inner { max-width: 1180px; margin: 0 auto; display: flex; flex-direction: column; gap: 14px; }\n\n#sm-rig-explorer .sm-rig-topbar { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 20px; align-items: flex-end; }\n#sm-rig-explorer .sm-rig-heading { max-width: 640px; display: flex; flex-direction: column; gap: 6px; }\n#sm-rig-explorer .sm-rig-eyebrow { font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--sm-red); }\n#sm-rig-explorer .sm-rig-title { margin: 0; font-family: 'Archivo', sans-serif; font-weight: 700; font-size: clamp(22px, 2.6vw, 32px); line-height: 1.15; letter-spacing: -0.022em; color: var(--sm-text); }\n#sm-rig-explorer .sm-rig-sub { margin: 0; font-family: 'Public Sans', sans-serif; font-weight: 300; font-size: 15px; line-height: 1.5; color: var(--sm-text-muted); max-width: 62ch; }\n\n\/* Buttons *\/\n#sm-rig-explorer .sm-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 13px; letter-spacing: 0.06em; text-transform: uppercase; text-decoration: none; cursor: pointer; border: none; white-space: nowrap; transition: background-color .15s ease, border-color .15s ease, color .15s ease; }\n#sm-rig-explorer .sm-btn-primary { background: var(--sm-red); color: #fff; border-radius: 2px; padding: 13px 22px; }\n#sm-rig-explorer .sm-btn-primary:hover { background: var(--sm-red-dark); color: #fff; }\n#sm-rig-explorer .sm-btn-outline { background: transparent; color: var(--sm-text); border: 1px solid var(--sm-text); border-radius: 8px; padding: 9px 16px; }\n#sm-rig-explorer .sm-btn-outline:hover { border-color: var(--sm-red); color: var(--sm-red); }\n#sm-rig-explorer .sm-btn-outline.is-active { background: var(--sm-text); color: #fff; border-color: var(--sm-text); }\n#sm-rig-explorer .sm-btn-secondary { background: var(--sm-bg); color: var(--sm-text-muted); border-radius: 8px; padding: 9px 16px; cursor: not-allowed; }\n#sm-rig-explorer .sm-btn-cart { background: var(--sm-text); color: #fff; border-radius: 8px; padding: 9px 16px; }\n#sm-rig-explorer .sm-btn-cart:hover { background: var(--sm-red); }\n#sm-rig-explorer .sm-btn-ghost { background: transparent; color: var(--sm-text); border-radius: 8px; padding: 9px 16px; }\n#sm-rig-explorer .sm-btn-ghost:hover { color: var(--sm-red); }\n#sm-rig-explorer .sm-btn-inverse { background: #fff; color: var(--sm-text); border-radius: 2px; padding: 7px 14px; }\n#sm-rig-explorer .sm-btn:disabled, #sm-rig-explorer .sm-btn.is-disabled { opacity: .55; pointer-events: none; }\n\n\/* Controls row *\/\n#sm-rig-explorer .sm-rig-controlsrow { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 16px; }\n#sm-rig-explorer .sm-rig-toggletrack { display: inline-flex; background: #EDEEF0; border-radius: 999px; padding: 4px; gap: 4px; }\n#sm-rig-explorer .sm-rig-toggle-btn { padding: 10px 20px; font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; white-space: nowrap; cursor: pointer; border: none; border-radius: 999px; background: transparent; color: var(--sm-text-muted); transition: background-color .15s ease, color .15s ease; }\n#sm-rig-explorer .sm-rig-toggle-btn.is-active { background: var(--sm-text); color: #fff; }\n\n\/* Filter chips *\/\n#sm-rig-explorer .sm-rig-filterrow { display: none !important; }\n#sm-rig-explorer .sm-rig-chip { font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase; padding: 8px 14px; border-radius: 2px; border: 1px solid var(--sm-border); background: #fff; color: var(--sm-text-body); cursor: pointer; transition: border-color .15s ease, color .15s ease, background-color .15s ease; }\n#sm-rig-explorer .sm-rig-chip.is-active { background: var(--sm-text); border-color: var(--sm-text); color: #fff; }\n#sm-rig-explorer .sm-rig-chip:hover:not(.is-active) { border-color: var(--sm-text); }\n\n#sm-rig-explorer .sm-rig-hint { margin: 0; font-family: 'Public Sans', sans-serif; font-size: 13px; line-height: 1.5; color: var(--sm-text-muted); max-width: 68ch; min-height: 18px; }\n\n\/* Stage *\/\n#sm-rig-explorer .sm-rig-stage-wrap { width: 100%; }\n#sm-rig-explorer .sm-rig-stage { position: relative; width: 100%; aspect-ratio: 16 \/ 10; background: var(--sm-bg); border-radius: 2px; overflow: visible; }\n#sm-rig-explorer .sm-rig-truckimg { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); height: 92%; aspect-ratio: 800 \/ 1395; background-repeat: no-repeat; transition: background-position .4s cubic-bezier(.2,0,.3,1), background-size .4s cubic-bezier(.2,0,.3,1); }\n#sm-rig-explorer .sm-rig-svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }\n#sm-rig-explorer .sm-rig-svg line { transition: opacity .2s ease; }\n#sm-rig-explorer .sm-rig-svg circle { transition: opacity .2s ease; }\n\n\/* Dots *\/\n#sm-rig-explorer .sm-rig-dot-wrap { position: absolute; transform: translate(-50%,-50%); pointer-events: auto; cursor: pointer; z-index: 5; transition: left .4s cubic-bezier(.2,0,.3,1), top .4s cubic-bezier(.2,0,.3,1), opacity .2s ease; }\n#sm-rig-explorer .sm-rig-dot { width: 26px; height: 26px; border-radius: 50%; background: #fff; border: 1.5px solid var(--sm-text); display: flex; align-items: center; justify-content: center; font-family: 'IBM Plex Mono', monospace; font-size: 11px; color: var(--sm-text); box-shadow: 0 2px 8px rgba(41,41,41,0.14); transition: border-color .15s ease, color .15s ease; }\n#sm-rig-explorer .sm-rig-dot-wrap:hover .sm-rig-dot { border-color: var(--sm-red); color: var(--sm-red); }\n#sm-rig-explorer .sm-rig-dot-wrap.is-selected .sm-rig-dot { border-color: var(--sm-red); color: var(--sm-red); }\n#sm-rig-explorer .sm-rig-dot-wrap.in-flow .sm-rig-dot { border-color: var(--sm-red); color: var(--sm-red); }\n\n\/* Exploded chips *\/\n#sm-rig-explorer .sm-rig-chip-card-wrap { position: absolute; transform: translate(-50%,-50%); z-index: 6; transition: left .4s cubic-bezier(.2,0,.3,1), top .4s cubic-bezier(.2,0,.3,1), opacity .2s ease; }\n#sm-rig-explorer .sm-rig-chip-card { width: 122px; background: #fff; border: 1px solid var(--sm-border); border-radius: 2px; box-shadow: 0 2px 8px rgba(41,41,41,0.10); overflow: hidden; cursor: pointer; animation: smRigFadeIn .25s ease; }\n#sm-rig-explorer .sm-rig-chip-card-media { width: 100%; height: 76px; background-color: var(--sm-surface); background-repeat: no-repeat; background-position: center; background-size: contain; }\n#sm-rig-explorer .sm-rig-chip-card-body { padding: 7px 8px 9px; }\n#sm-rig-explorer .sm-rig-chip-card-num { font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--sm-text-muted); }\n#sm-rig-explorer .sm-rig-chip-card-label { font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 11.5px; line-height: 1.25; color: var(--sm-text); margin-top: 2px; }\n#sm-rig-explorer .sm-rig-chip-card-spec { font-family: 'IBM Plex Mono', monospace; font-size: 9.5px; color: var(--sm-text-muted); margin-top: 3px; line-height: 1.4; }\n\n@keyframes smRigFadeIn { from { opacity: 0; } to { opacity: 1; } }\n@keyframes smRigPopIn { from { opacity: 0; transform: scale(0.4); } to { opacity: 1; transform: scale(1); } }\n\n\/* Detail drawer *\/\n#sm-rig-explorer .sm-rig-drawer-wrap { position: absolute; z-index: 20; }\n#sm-rig-explorer .sm-rig-drawer { width: 272px; max-height: 78%; overflow-y: auto; background: #fff; border: 1px solid var(--sm-border); border-radius: 2px; box-shadow: 0 8px 28px rgba(41,41,41,0.18); animation: smRigPopIn .22s cubic-bezier(.2,0,.3,1); }\n#sm-rig-explorer .sm-rig-drawer-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; padding: 12px 12px 0; }\n#sm-rig-explorer .sm-rig-drawer-num { font-family: 'IBM Plex Mono', monospace; font-size: 10px; color: var(--sm-text-muted); padding-top: 2px; }\n#sm-rig-explorer .sm-rig-iconbtn { width: 24px; height: 24px; flex-shrink: 0; border-radius: 2px; border: none; background: transparent; color: var(--sm-text-muted); font-size: 18px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; }\n#sm-rig-explorer .sm-rig-iconbtn:hover { background: var(--sm-bg); color: var(--sm-text); }\n#sm-rig-explorer .sm-rig-drawer-media { width: 100%; height: 150px; margin-top: 10px; background-color: var(--sm-surface); background-repeat: no-repeat; background-position: center; background-size: contain; }\n#sm-rig-explorer .sm-rig-drawer-body { padding: 12px 14px 16px; display: flex; flex-direction: column; gap: 12px; }\n#sm-rig-explorer .sm-rig-drawer-label { font-family: 'Archivo', sans-serif; font-weight: 700; font-size: 15px; line-height: 1.25; color: var(--sm-text); }\n#sm-rig-explorer .sm-rig-verified-badge { display: inline-block; margin-top: 6px; padding: 3px 8px; border-radius: 2px; font-family: 'IBM Plex Mono', monospace; font-size: 9.5px; letter-spacing: 0.04em; text-transform: uppercase; }\n#sm-rig-explorer .sm-rig-verified-badge.is-verified { border: 1px solid var(--sm-text); color: var(--sm-text); }\n#sm-rig-explorer .sm-rig-verified-badge.is-pending { border: 1px solid var(--sm-border); color: var(--sm-text-muted); }\n#sm-rig-explorer .sm-rig-specrows { display: flex; flex-direction: column; gap: 6px; border-top: 1px solid var(--sm-border); border-bottom: 1px solid var(--sm-border); padding: 10px 0; font-size: 12px; }\n#sm-rig-explorer .sm-rig-specrow { display: flex; justify-content: space-between; gap: 8px; }\n#sm-rig-explorer .sm-rig-specrow-key { font-family: 'IBM Plex Mono', monospace; font-size: 9.5px; letter-spacing: 0.05em; text-transform: uppercase; color: var(--sm-text-muted); }\n#sm-rig-explorer .sm-rig-specrow-val { color: var(--sm-text); text-align: right; }\n#sm-rig-explorer .sm-rig-note { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--sm-text-muted); }\n#sm-rig-explorer .sm-rig-drawer-actions { display: flex; flex-wrap: wrap; gap: 6px; }\n#sm-rig-explorer .sm-rig-drawer-actions .sm-btn { flex: 1 1 auto; padding: 9px 12px; font-size: 11.5px; }\n#sm-rig-explorer .sm-rig-flowbtn { width: 100%; }\n#sm-rig-explorer .sm-rig-connected-label { font-family: 'IBM Plex Mono', monospace; font-size: 9.5px; letter-spacing: 0.05em; text-transform: uppercase; color: var(--sm-text-muted); margin-bottom: 6px; }\n#sm-rig-explorer .sm-rig-connected-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n#sm-rig-explorer .sm-rig-connected-chip { font-family: 'Public Sans', sans-serif; font-size: 11px; color: var(--sm-text); background: var(--sm-bg); border: 1px solid var(--sm-border); border-radius: 2px; padding: 5px 9px; cursor: pointer; }\n#sm-rig-explorer .sm-rig-connected-chip:hover { border-color: var(--sm-text); }\n\n\/* Flow bar *\/\n#sm-rig-explorer .sm-rig-flowbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 14px; background: var(--sm-text); color: #fff; border-radius: 2px; }\n#sm-rig-explorer .sm-rig-flowbar-label { font-family: 'IBM Plex Mono', monospace; font-size: 10.5px; letter-spacing: 0.06em; text-transform: uppercase; }\n\n\/* Build list button \u2014 anchored beside the truck, level with the rear tail lights *\/\n#sm-rig-explorer .sm-rig-bom-btn { position: absolute; left: 182%; top: 90%; transform: translate(-50%, -50%); z-index: 8; white-space: nowrap; background: #fff; }\n\n\/* Modal *\/\n#sm-rig-explorer .sm-rig-modal-overlay { position: fixed; inset: 0; background: rgba(41,41,41,0.5); z-index: 999999; display: flex; align-items: center; justify-content: center; padding: 24px; }\n#sm-rig-explorer .sm-rig-modal { width: 100%; max-width: 480px; background: #fff; border-radius: 8px; box-shadow: 0 12px 40px rgba(41,41,41,0.3); animation: smRigPopIn .2s ease; }\n#sm-rig-explorer .sm-rig-modal-wide { max-width: 640px; }\n#sm-rig-explorer .sm-rig-modal-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 20px 20px 0; }\n#sm-rig-explorer .sm-rig-modal-eyebrow { font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--sm-red); }\n#sm-rig-explorer .sm-rig-modal-title { font-family: 'Archivo', sans-serif; font-weight: 700; font-size: 19px; color: var(--sm-text); margin-top: 4px; }\n#sm-rig-explorer .sm-rig-modal-body { padding: 16px 20px 24px; max-height: 64vh; overflow-y: auto; display: flex; flex-direction: column; gap: 24px; }\n#sm-rig-explorer .sm-rig-bom-group-label { font-family: 'Archivo', sans-serif; font-weight: 500; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--sm-text); border-bottom: 1px solid var(--sm-text); padding-bottom: 6px; margin-bottom: 10px; }\n#sm-rig-explorer .sm-rig-bom-row { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--sm-border); font-size: 13px; }\n#sm-rig-explorer .sm-rig-bom-row span:first-child { color: var(--sm-text); }\n#sm-rig-explorer .sm-rig-bom-row span:last-child { color: var(--sm-text-muted); font-family: 'IBM Plex Mono', monospace; font-size: 11px; text-align: right; }\n\n@media (max-width: 780px) {\n  #sm-rig-explorer { padding: 16px; }\n  #sm-rig-explorer .sm-rig-stage { aspect-ratio: 4 \/ 5; }\n  #sm-rig-explorer .sm-rig-drawer { width: 240px; }\n  #sm-rig-explorer .sm-rig-chip-card { width: 96px; }\n  #sm-rig-explorer .sm-rig-chip-card-media { height: 60px; }\n  #sm-rig-explorer .sm-rig-topbar { align-items: flex-start; }\n}\n<\/style>\n<div id=\"sm-rig-explorer\" class=\"sm-rig-root\">\n  <div class=\"sm-rig-inner\">\n    <div class=\"sm-rig-topbar\">\n      <div class=\"sm-rig-heading\">\n        <div class=\"sm-rig-eyebrow\">The Spray Market &middot; Complete Rig Build<\/div>\n        <h2 class=\"sm-rig-title\">20-ft spray foam rig, built to run every day.<\/h2>\n        <p class=\"sm-rig-sub\">20-foot box truck outfitted end to end &mdash; proportioning unit, heated hose, 55 gal drum storage, and a dedicated generator room.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"sm-rig-controlsrow\">\n      <div class=\"sm-rig-toggletrack\" id=\"sm-rig-pagetoggle\">\n        <button type=\"button\" class=\"sm-rig-toggle-btn\" data-page=\"systems\">Rig Systems<\/button>\n        <button type=\"button\" class=\"sm-rig-toggle-btn\" data-page=\"construction\">Truck Construction<\/button>\n      <\/div>\n      <button type=\"button\" id=\"sm-rig-explode-btn\" class=\"sm-btn sm-btn-outline sm-rig-explode-btn\">Explode Truck<\/button>\n    <\/div>\n\n    <div class=\"sm-rig-filterrow\" id=\"sm-rig-filterrow\">\n      <button type=\"button\" class=\"sm-rig-chip is-active\" data-cat=\"all\">All Systems<\/button>\n      <button type=\"button\" class=\"sm-rig-chip\" data-cat=\"spray\">Spray Equipment<\/button>\n      <button type=\"button\" class=\"sm-rig-chip\" data-cat=\"storage\">Material Storage<\/button>\n      <button type=\"button\" class=\"sm-rig-chip\" data-cat=\"generator\">Generator Room<\/button>\n    <\/div>\n\n    <p class=\"sm-rig-hint\" id=\"sm-rig-hint\">Tap a marker for full component details, or explode the truck to see how each system separates.<\/p>\n\n    <div class=\"sm-rig-stage-wrap\">\n      <div class=\"sm-rig-stage\" id=\"sm-rig-stage\">\n        <div class=\"sm-rig-truckimg\" id=\"sm-rig-truckimg\">\n          <svg class=\"sm-rig-svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" id=\"sm-rig-svg\"><\/svg>\n          <div class=\"sm-rig-chips\" id=\"sm-rig-chips\"><\/div>\n          <div class=\"sm-rig-dots\" id=\"sm-rig-dots\"><\/div>\n          <div class=\"sm-rig-drawer-slot\" id=\"sm-rig-drawer-slot\"><\/div>\n          <button type=\"button\" class=\"sm-btn sm-btn-outline sm-rig-bom-btn\" id=\"sm-rig-openbom\">View Build List<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"sm-rig-flowbar\" id=\"sm-rig-flowbar\" hidden>\n      <span class=\"sm-rig-flowbar-label\" id=\"sm-rig-flowbar-label\"><\/span>\n      <button type=\"button\" class=\"sm-btn sm-btn-inverse\" id=\"sm-rig-exitflow\">Exit flow<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"sm-rig-modal-overlay\" id=\"sm-rig-bom-overlay\" hidden>\n    <div class=\"sm-rig-modal sm-rig-modal-wide\" role=\"dialog\" aria-label=\"Complete build list\">\n      <div class=\"sm-rig-modal-head\">\n        <div>\n          <div class=\"sm-rig-modal-eyebrow\">The Spray Market<\/div>\n          <div class=\"sm-rig-modal-title\">Complete build list<\/div>\n        <\/div>\n        <button type=\"button\" class=\"sm-rig-iconbtn\" id=\"sm-rig-bom-close\" aria-label=\"Close\">&times;<\/button>\n      <\/div>\n      <div class=\"sm-rig-modal-body\" id=\"sm-rig-bom-body\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n<script>\n(function () {\n  'use strict';\n\n  var IMG = {\n    hero: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-8.jpg',\n    generator: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-32.png',\n    aircompressor: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-30.png',\n    reactor: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-34.png',\n    hosereel: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-33.png',\n    pump: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-35.png',\n    drumA1: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-31.png',\n    drumB1: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-29.png',\n    extinguisher: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-37.png',\n    workbench: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-36.png',\n    liftgate: 'https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/09\/image-38.png'\n  };\n\n  var SYSTEMS_RAW = [\n    { id: 'generator', category: 'generator', num: 1, baseX: 30, baseY: 15, expX: -35, expY: 15, label: 'Compressed-air generator', spec: 'Compressed Air Systems \u00b7 diesel-driven generator', note: 'Front-left of the generator room; supplies power and compressed air to the rig.', verified: true, model: 'Compressed Air Systems diesel generator', quantity: 1, locationLabel: 'Front-left, generator room', connected: ['aircompressor'], productImage: IMG.generator },\n    { id: 'aircompressor', category: 'generator', num: 2, baseX: 70, baseY: 15, expX: 135, expY: 15, label: 'Air compressor', spec: 'Compressed Air Systems \u00b7 7.5HP open rotary screw, 30 gal', note: 'Front-right of the generator room, across from the generator.', verified: true, model: 'Compressed Air Systems 7.5HP, 208-230\/3\/60, Open Rotary Screw, 30gal, Hori', quantity: 1, locationLabel: 'Front-right, generator room', connected: ['generator', 'airdryer'], productImage: IMG.aircompressor, productUrl: 'https:\/\/thespraymarket.com\/product\/compressed-air-systems-7-5hp-208-230-3-60-open-rotary-screw-30gal-hori\/', productId: 884 },\n    { id: 'airdryer', category: 'generator', num: 3, baseX: 70, baseY: 8, expX: 135, expY: 8, label: 'Air dryer', spec: '35 CFM \u00b7 refrigerated, removes moisture from the line', note: 'Wall-mounted above the air compressor; dries compressed air before it reaches downstream equipment.', verified: true, model: 'Compressed Air Systems 35 CFM Refrigerated Dryer w\/ELEC', quantity: 1, locationLabel: 'Front-right, generator room', connected: ['aircompressor'], productUrl: 'https:\/\/thespraymarket.com\/product\/compressed-air-systems-35cfm-refrigerated-dryer-w-elec\/', productId: 2373 },\n    { id: 'reactor', category: 'spray', num: 4, baseX: 71, baseY: 42, expX: 135, expY: 42, label: 'Proportioner \/ Reactor \u2014 Graco H-30', spec: 'Graco Reactor H-30 \u00b7 heated plural-component processor', note: 'Reactor unit on the right, past the door; mixes and heats A- and B-side material.', verified: true, model: 'Graco Reactor H-30', quantity: 1, locationLabel: 'Right side, past the door', connected: ['pumpA', 'pumpB', 'hosereel'], flows: ['A', 'B'], productImage: IMG.reactor, productUrl: 'https:\/\/thespraymarket.com\/product\/graco-reactor-2-h-30-system-15kw-pc\/', productId: 4194 },\n    { id: 'hosereel', category: 'spray', num: 5, baseX: 27, baseY: 40, expX: -35, expY: 40, label: 'Graco heated hose supply reel', spec: 'Graco \u00b7 insulated heated hose, 3\/8\" x 50\\'', note: 'Mounted on the left, across from the proportioner; feeds the spray gun.', verified: true, model: 'Graco Htd w\/Scuff Hose, 2000 PSI, 3\/8\" x 50\\'', quantity: 1, locationLabel: 'Left side, across from the proportioner', connected: ['reactor'], productImage: IMG.hosereel, productUrl: 'https:\/\/thespraymarket.com\/product\/graco-htd-w-scuff-hose-2000-3-8-50\/', productId: 581 },\n    { id: 'pumpA', category: 'spray', num: 6, baseX: 27, baseY: 56, expX: -35, expY: 56, label: 'Transfer pump \u2014 A side', spec: 'Graco T3 ratio pump \u00b7 wall-harnessed', note: 'Strapped to the truck wall with a yellow harness; draws from the A-side drum.', verified: true, model: 'Graco T3', quantity: 1, locationLabel: 'Left wall, mid-truck', connected: ['drumA1', 'reactor'], flows: ['A'], productImage: IMG.pump, productUrl: 'https:\/\/thespraymarket.com\/product\/graco-t3-cs-pump\/', productId: 829 },\n    { id: 'pumpB', category: 'spray', num: 7, baseX: 73, baseY: 56, expX: 135, expY: 56, label: 'Transfer pump \u2014 B side', spec: 'Graco T3 ratio pump \u00b7 wall-harnessed', note: 'Strapped to the truck wall with a yellow harness; draws from the B-side drum.', verified: true, model: 'Graco T3', quantity: 1, locationLabel: 'Right wall, mid-truck', connected: ['drumB1', 'reactor'], flows: ['B'], productImage: IMG.pump, productUrl: 'https:\/\/thespraymarket.com\/product\/graco-t3-cs-pump\/', productId: 829 },\n    { id: 'drumA1', category: 'storage', num: 8, baseX: 26, baseY: 70, expX: -35, expY: 70, label: 'Isocyanate (A-side) drum', spec: '55 gal steel \u00b7 yellow strap', note: 'Strapped to the wall mount below its transfer pump.', verified: true, model: '55 gal steel drum', quantity: 1, locationLabel: 'Rear left', connected: ['pumpA'], flows: ['A'], productImage: IMG.drumA1, productUrl: 'https:\/\/thespraymarket.com\/product\/victory-polymers-vpc-50-open-cell\/', productId: 75 },\n    { id: 'drumB1', category: 'storage', num: 9, baseX: 74, baseY: 70, expX: 135, expY: 70, label: 'Resin (B-side) drum', spec: '55 gal steel \u00b7 yellow strap', note: 'Strapped to the wall mount below its transfer pump.', verified: true, model: '55 gal steel drum', quantity: 1, locationLabel: 'Rear right', connected: ['pumpB'], flows: ['B'], productImage: IMG.drumB1, productUrl: 'https:\/\/thespraymarket.com\/product\/victory-polymers-vpc-50-open-cell\/', productId: 75 },\n    { id: 'extinguisher', category: 'storage', num: 10, baseX: 84, baseY: 58, expX: 108, expY: 58, label: 'Fire extinguisher', spec: 'Kidde \u00b7 wall-mounted', note: 'Mounted within reach of the material storage bay.', verified: true, model: 'Kidde fire extinguisher', quantity: 1, locationLabel: 'Right wall, near drum storage', connected: [], productImage: IMG.extinguisher }\n  ];\n\n  var CONSTRUCTION_RAW = [\n    { id: 'floor', category: 'construction', num: 1, baseX: 50, baseY: 75, expX: -35, expY: 75, label: 'Cargo floor', spec: 'Diamond-plate metal flooring \u00b7 slip-resistant', note: 'Also called tread plate or checker plate; bolted over the subfloor, drains and cleans easily under drums.', verified: true, model: 'Diamond-plate (tread plate) metal flooring', quantity: 1, locationLabel: 'Full cargo floor', connected: [] },\n    { id: 'door', category: 'construction', num: 2, baseX: 58, baseY: 36, expX: -35, expY: 36, label: 'Interior access door', spec: 'Wooden interior access door', note: 'Separates the work\/storage bay from the generator room.', verified: true, model: 'Wooden interior access door', quantity: 1, locationLabel: 'Center, mid-truck', connected: ['partition'] },\n    { id: 'partition', category: 'construction', num: 3, baseX: 50, baseY: 24, expX: 135, expY: 24, label: 'Generator room partition wall', spec: 'Insulated and soundproof panel', note: 'Isolates generator noise and heat from the material storage bay.', verified: true, model: 'Insulated, soundproof partition panel', quantity: 1, locationLabel: 'Between generator room and work area', connected: ['door', 'wiring'] },\n    { id: 'wiring', category: 'construction', num: 4, baseX: 66, baseY: 10, expX: 135, expY: 10, label: 'Electrical conduit & wiring', spec: 'Routed ceiling run', note: 'Feeds power from the generator room to lighting and outlets throughout.', verified: false, model: 'Model verification pending', quantity: 1, locationLabel: 'Ceiling, generator-room side', connected: ['partition'] },\n    { id: 'skin', category: 'construction', num: 5, baseX: 12, baseY: 62, expX: -35, expY: 62, label: 'Exterior aluminum skin', spec: 'Riveted panel over wall framing', note: 'Outer shell over framing and insulation; the box body\u2019s weatherproof layer.', verified: false, model: 'Model verification pending', quantity: 1, locationLabel: 'Exterior, left wall', connected: [] },\n    { id: 'workbench', category: 'construction', num: 6, baseX: 42, baseY: 47, expX: -35, expY: 47, label: 'YUKON workbench', spec: 'Storage drawers \u00b7 mounted vise', note: 'First thing inside the door, opposite the proportioner.', verified: true, model: 'YUKON workbench', quantity: 1, locationLabel: 'Left side, just past the door', connected: [], productImage: IMG.workbench },\n    { id: 'liftgate', category: 'construction', num: 7, baseX: 50, baseY: 93, expX: -35, expY: 93, label: 'Liftgate', spec: 'MAXON \u00b7 tuck-under style', note: 'Folds up under the rear of the box when not in use.', verified: true, model: 'MAXON tuck-under liftgate', quantity: 1, locationLabel: 'Rear, tuck-under position', connected: [], productImage: IMG.liftgate }\n  ];\n\n  var ALL_ITEMS = SYSTEMS_RAW.concat(CONSTRUCTION_RAW);\n  function findItem(id) { return ALL_ITEMS.filter(function (v) { return v.id === id; })[0] || null; }\n\n  function computeCropStyle(xPct, yPct, chipPx) {\n    var IMG_W = 2100, IMG_H = 1500, CROP_PX = 280;\n    var BBOX_LEFT = 650, BBOX_TOP = 60, BBOX_W = 800, BBOX_H = 1395;\n    var scale = chipPx \/ CROP_PX;\n    var bgW = IMG_W * scale, bgH = IMG_H * scale;\n    var cx = BBOX_LEFT + (xPct \/ 100) * BBOX_W, cy = BBOX_TOP + (yPct \/ 100) * BBOX_H;\n    var posX = -(cx * scale - chipPx \/ 2);\n    var posY = -(cy * scale - chipPx \/ 2);\n    return 'background-image:url(\\'' + IMG.hero + '\\'); background-size:' + bgW + 'px ' + bgH + 'px; background-position:' + posX + 'px ' + posY + 'px; background-repeat:no-repeat;';\n  }\n\n  function categoryLabel(cat) {\n    return { spray: 'Spray Equipment', storage: 'Material Storage', generator: 'Generator Room', construction: 'Truck Construction' }[cat] || cat;\n  }\n\n  function pad2(n) { return (n < 10 ? '0' : '') + n; }\n  function esc(s) { return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; }); }\n\n  var state = {\n    pageView: 'systems',\n    activeSystem: 'all',\n    exploded: false,\n    selectedId: null,\n    flowActive: null,\n    bomOpen: false\n  };\n\n  var root = document.getElementById('sm-rig-explorer');\n  if (!root) return;\n  var els = {\n    truckimg: root.querySelector('#sm-rig-truckimg'),\n    svg: root.querySelector('#sm-rig-svg'),\n    chips: root.querySelector('#sm-rig-chips'),\n    dots: root.querySelector('#sm-rig-dots'),\n    drawerSlot: root.querySelector('#sm-rig-drawer-slot'),\n    stage: root.querySelector('#sm-rig-stage'),\n    hint: root.querySelector('#sm-rig-hint'),\n    filterRow: root.querySelector('#sm-rig-filterrow'),\n    pageToggle: root.querySelector('#sm-rig-pagetoggle'),\n    explodeBtn: root.querySelector('#sm-rig-explode-btn'),\n    flowbar: root.querySelector('#sm-rig-flowbar'),\n    flowbarLabel: root.querySelector('#sm-rig-flowbar-label'),\n    exitFlowBtn: root.querySelector('#sm-rig-exitflow'),\n    openBomBtn: root.querySelector('#sm-rig-openbom'),\n    bomOverlay: root.querySelector('#sm-rig-bom-overlay'),\n    bomBody: root.querySelector('#sm-rig-bom-body'),\n    bomClose: root.querySelector('#sm-rig-bom-close')\n  };\n\n  els.truckimg.style.cssText += ';background-image:url(\\'' + IMG.hero + '\\'); background-size:262.5% 107.5%; background-position:50% 57%;';\n\n  function activeList() { return state.pageView === 'systems' ? SYSTEMS_RAW : CONSTRUCTION_RAW; }\n\n  function visibleItems() {\n    var list = activeList();\n    return list.filter(function (it) {\n      return state.pageView !== 'systems' || state.activeSystem === 'all' || it.category === state.activeSystem;\n    }).map(function (it) {\n      var markerX = it.baseX + (it.expX - it.baseX) * 0.85;\n      var markerY = it.baseY + (it.expY - it.baseY) * 0.85;\n      var x = state.exploded ? it.expX : markerX;\n      var y = state.exploded ? it.expY : markerY;\n      var inFlow = !state.flowActive || (it.flows && it.flows.indexOf(state.flowActive) !== -1);\n      return Object.assign({}, it, { markerX: markerX, markerY: markerY, x: x, y: y, inFlow: inFlow });\n    });\n  }\n\n  function selectedItemData() {\n    if (!state.selectedId) return null;\n    var vis = visibleItems();\n    var it = vis.filter(function (v) { return v.id === state.selectedId; })[0];\n    if (!it) {\n      var raw = findItem(state.selectedId);\n      if (!raw) return null;\n      it = Object.assign({}, raw, { markerX: raw.baseX, markerY: raw.baseY });\n    }\n    var connected = (it.connected || []).map(findItem).filter(Boolean);\n    var anchorX = it.markerX != null ? it.markerX : it.baseX;\n    var anchorY = it.markerY != null ? it.markerY : it.baseY;\n    var flip = anchorX > 55;\n    return Object.assign({}, it, {\n      anchorX: anchorX, anchorY: anchorY, flip: flip,\n      connectedItems: connected\n    });\n  }\n\n  function render() {\n    renderControls();\n    renderHint();\n    renderSvgAndMarkers();\n    renderDrawer();\n    renderFlowbar();\n  }\n\n  function renderControls() {\n    var toggleBtns = els.pageToggle.querySelectorAll('.sm-rig-toggle-btn');\n    toggleBtns.forEach(function (b) {\n      b.classList.toggle('is-active', b.getAttribute('data-page') === state.pageView);\n    });\n    els.filterRow.style.display = state.pageView === 'systems' ? 'flex' : 'none';\n    var chipBtns = els.filterRow.querySelectorAll('.sm-rig-chip');\n    chipBtns.forEach(function (b) {\n      b.classList.toggle('is-active', b.getAttribute('data-cat') === state.activeSystem);\n    });\n    els.explodeBtn.style.display = state.pageView === 'systems' ? '' : 'none';\n    els.explodeBtn.textContent = state.exploded ? 'Reassemble' : 'Explode Truck';\n    els.explodeBtn.classList.toggle('is-active', state.exploded);\n  }\n\n  function renderHint() {\n    els.hint.textContent = state.pageView === 'systems'\n      ? 'Tap a marker for full component details, or explode the truck to see how each system separates.'\n      : 'How the box is actually built \u2014 floor, walls, door, and the wiring run between the generator room and the rest of the rig.';\n  }\n\n  function renderSvgAndMarkers() {\n    var vis = visibleItems();\n    var svgParts = [];\n    vis.forEach(function (it) {\n      var op = it.inFlow ? '1' : '0.3';\n      svgParts.push('<line x1=\"' + it.baseX + '\" y1=\"' + it.baseY + '\" x2=\"' + it.x + '\" y2=\"' + it.y + '\" stroke=\"#292929\" stroke-width=\"0.15\" opacity=\"' + (0.55 * (it.inFlow ? 1 : 0.5)) + '\" style=\"opacity:' + op + '\"><\/line>');\n      svgParts.push('<circle cx=\"' + it.baseX + '\" cy=\"' + it.baseY + '\" r=\"0.5\" fill=\"#292929\" style=\"opacity:' + op + '\"><\/circle>');\n    });\n    if (state.flowActive) {\n      var chain = state.flowActive === 'A' ? ['drumA1', 'pumpA', 'reactor'] : ['drumB1', 'pumpB', 'reactor'];\n      var pts = chain.map(findItem).filter(Boolean);\n      for (var i = 0; i < pts.length - 1; i++) {\n        var a = pts[i], b = pts[i + 1];\n        svgParts.push('<line x1=\"' + a.baseX + '\" y1=\"' + a.baseY + '\" x2=\"' + b.baseX + '\" y2=\"' + a.baseY + '\" stroke=\"#E00000\" stroke-width=\"0.35\" opacity=\"0.85\"><\/line>');\n        svgParts.push('<line x1=\"' + b.baseX + '\" y1=\"' + a.baseY + '\" x2=\"' + b.baseX + '\" y2=\"' + b.baseY + '\" stroke=\"#E00000\" stroke-width=\"0.35\" opacity=\"0.85\"><\/line>');\n      }\n    }\n    els.svg.innerHTML = svgParts.join('');\n\n    if (state.exploded) {\n      els.dots.innerHTML = '';\n      var chipParts = vis.map(function (it) {\n        var op = it.inFlow ? '1' : '0.3';\n        return '<div class=\"sm-rig-chip-card-wrap\" data-id=\"' + it.id + '\" style=\"left:' + it.x + '%; top:' + it.y + '%; opacity:' + op + ';\">' +\n          '<div class=\"sm-rig-chip-card\">' +\n          '<div class=\"sm-rig-chip-card-media\" style=\"' + (it.productImage ? (\"background-image:url('\" + it.productImage + \"'); background-size:contain;\") : computeCropStyle(it.baseX, it.baseY, 122)) + '\"><\/div>' +\n          '<div class=\"sm-rig-chip-card-body\">' +\n          '<div class=\"sm-rig-chip-card-num\">COMPONENT ' + pad2(it.num) + '<\/div>' +\n          '<div class=\"sm-rig-chip-card-label\">' + esc(it.label) + '<\/div>' +\n          '<div class=\"sm-rig-chip-card-spec\">' + esc(it.spec) + '<\/div>' +\n          '<\/div><\/div><\/div>';\n      });\n      els.chips.innerHTML = chipParts.join('');\n      els.chips.querySelectorAll('.sm-rig-chip-card-wrap').forEach(function (node) {\n        node.addEventListener('click', function () { selectItem(node.getAttribute('data-id')); });\n      });\n    } else {\n      els.chips.innerHTML = '';\n      var dotParts = vis.map(function (it) {\n        var cls = 'sm-rig-dot-wrap' + (state.selectedId === it.id ? ' is-selected' : '') + (state.flowActive && it.inFlow ? ' in-flow' : '');\n        var op = it.inFlow ? '1' : '0.3';\n        return '<div class=\"' + cls + '\" data-id=\"' + it.id + '\" style=\"left:' + it.x + '%; top:' + it.y + '%; opacity:' + op + ';\">' +\n          '<div class=\"sm-rig-dot\">' + it.num + '<\/div><\/div>';\n      });\n      els.dots.innerHTML = dotParts.join('');\n      els.dots.querySelectorAll('.sm-rig-dot-wrap').forEach(function (node) {\n        node.addEventListener('click', function () { selectItem(node.getAttribute('data-id')); });\n      });\n    }\n  }\n\n  function selectItem(id) {\n    state.selectedId = (state.selectedId === id) ? null : id;\n    render();\n  }\n\n  function renderDrawer() {\n    var it = selectedItemData();\n    if (!it) { els.drawerSlot.innerHTML = ''; return; }\n    var verifiedLabel = it.verified ? 'Verified from photo' : 'Model verification pending';\n    var verifiedCls = it.verified ? 'is-verified' : 'is-pending';\n    var mediaStyle = it.productImage\n      ? (\"background-image:url('\" + it.productImage + \"'); background-size:contain;\")\n      : computeCropStyle(it.baseX, it.baseY, 280);\n\n    var connectedHtml = '';\n    if (it.connectedItems && it.connectedItems.length) {\n      connectedHtml = '<div><div class=\"sm-rig-connected-label\">Connected to<\/div><div class=\"sm-rig-connected-chips\">' +\n        it.connectedItems.map(function (c) {\n          return '<button type=\"button\" class=\"sm-rig-connected-chip\" data-goto=\"' + c.id + '\">' + esc(c.label) + '<\/button>';\n        }).join('') + '<\/div><\/div>';\n    }\n\n    var flowBtnHtml = '';\n    if (it.flows && it.flows.length) {\n      flowBtnHtml = '<button type=\"button\" class=\"sm-btn sm-btn-outline sm-rig-flowbtn\" data-flow=\"' + it.flows[0] + '\">View Material Flow<\/button>';\n    }\n\n    var actionsHtml = '';\n    if (it.productUrl) {\n      actionsHtml =\n        '<div class=\"sm-rig-drawer-actions\">' +\n        '<a class=\"sm-btn sm-btn-outline\" href=\"' + it.productUrl + '\" target=\"_blank\" rel=\"noopener\">View Product<\/a>' +\n        '<a class=\"sm-btn sm-btn-cart\" href=\"' + it.productUrl + '?add-to-cart=' + it.productId + '\">Add to Cart<\/a>' +\n        '<a class=\"sm-btn sm-btn-ghost\" href=\"\/contact\/\">Ask an Expert<\/a>' +\n        '<\/div>';\n    }\n\n    var wrapStyle = 'left:' + it.anchorX + '%; top:' + it.anchorY + '%; transform:translate(' + (it.flip ? 'calc(-100% - 20px)' : '20px') + ', -50%);';\n\n    els.drawerSlot.innerHTML =\n      '<div class=\"sm-rig-drawer-wrap\" style=\"' + wrapStyle + '\">' +\n      '<div class=\"sm-rig-drawer\">' +\n      '<div class=\"sm-rig-drawer-top\">' +\n      '<div class=\"sm-rig-drawer-num\">COMPONENT ' + pad2(it.num) + ' \u00b7 ' + esc(categoryLabel(it.category)) + '<\/div>' +\n      '<button type=\"button\" class=\"sm-rig-iconbtn\" id=\"sm-rig-drawer-close\" aria-label=\"Close\">&times;<\/button>' +\n      '<\/div>' +\n      '<div class=\"sm-rig-drawer-media\" style=\"' + mediaStyle + '\"><\/div>' +\n      '<div class=\"sm-rig-drawer-body\">' +\n      '<div>' +\n      '<div class=\"sm-rig-drawer-label\">' + esc(it.label) + '<\/div>' +\n      '<div><span class=\"sm-rig-verified-badge ' + verifiedCls + '\">' + verifiedLabel + '<\/span><\/div>' +\n      '<\/div>' +\n      '<div class=\"sm-rig-specrows\">' +\n      '<div class=\"sm-rig-specrow\"><span class=\"sm-rig-specrow-key\">System<\/span><span class=\"sm-rig-specrow-val\">' + esc(categoryLabel(it.category)) + '<\/span><\/div>' +\n      '<div class=\"sm-rig-specrow\"><span class=\"sm-rig-specrow-key\">Location<\/span><span class=\"sm-rig-specrow-val\">' + esc(it.locationLabel) + '<\/span><\/div>' +\n      '<div class=\"sm-rig-specrow\"><span class=\"sm-rig-specrow-key\">Quantity<\/span><span class=\"sm-rig-specrow-val\">' + esc(it.quantity) + '<\/span><\/div>' +\n      '<div class=\"sm-rig-specrow\"><span class=\"sm-rig-specrow-key\">Model<\/span><span class=\"sm-rig-specrow-val\">' + esc(it.model) + '<\/span><\/div>' +\n      '<\/div>' +\n      '<p class=\"sm-rig-note\">' + esc(it.note) + '<\/p>' +\n      actionsHtml +\n      connectedHtml +\n      '<\/div><\/div><\/div>';\n\n    var closeBtn = els.drawerSlot.querySelector('#sm-rig-drawer-close');\n    if (closeBtn) closeBtn.addEventListener('click', function () { state.selectedId = null; render(); });\n    var flowBtn = els.drawerSlot.querySelector('[data-flow]');\n    if (flowBtn) flowBtn.addEventListener('click', function () { state.flowActive = flowBtn.getAttribute('data-flow'); render(); });\n    els.drawerSlot.querySelectorAll('[data-goto]').forEach(function (btn) {\n      btn.addEventListener('click', function () { state.selectedId = btn.getAttribute('data-goto'); render(); });\n    });\n  }\n\n  function renderFlowbar() {\n    if (state.flowActive) {\n      els.flowbar.hidden = false;\n      els.flowbarLabel.textContent = 'Viewing: ' + (state.flowActive === 'A' ? 'A-Side Material Flow' : 'B-Side Material Flow');\n    } else {\n      els.flowbar.hidden = true;\n    }\n  }\n\n  function renderBom() {\n    var groups = ['generator', 'spray', 'storage', 'construction'].map(function (cat) {\n      return { cat: cat, label: categoryLabel(cat), rows: ALL_ITEMS.filter(function (it) { return it.category === cat; }) };\n    });\n    els.bomBody.innerHTML = groups.map(function (grp) {\n      return '<div><div class=\"sm-rig-bom-group-label\">' + esc(grp.label) + '<\/div>' +\n        grp.rows.map(function (row) {\n          return '<div class=\"sm-rig-bom-row\"><span>' + esc(row.label) + '<\/span><span>Qty ' + esc(row.quantity) + ' \u00b7 ' + esc(row.locationLabel) + '<\/span><\/div>';\n        }).join('') + '<\/div>';\n    }).join('');\n  }\n\n  \/* Wire up static controls *\/\n  els.pageToggle.querySelectorAll('.sm-rig-toggle-btn').forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      state.pageView = btn.getAttribute('data-page');\n      state.activeSystem = 'all';\n      state.exploded = false;\n      state.selectedId = null;\n      state.flowActive = null;\n      render();\n    });\n  });\n\n  els.filterRow.querySelectorAll('.sm-rig-chip').forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      state.activeSystem = btn.getAttribute('data-cat');\n      state.selectedId = null;\n      render();\n    });\n  });\n\n  els.explodeBtn.addEventListener('click', function () {\n    state.exploded = !state.exploded;\n    state.selectedId = null;\n    render();\n  });\n\n  els.exitFlowBtn.addEventListener('click', function () { state.flowActive = null; render(); });\n\n  els.openBomBtn.addEventListener('click', function () { renderBom(); els.bomOverlay.hidden = false; });\n  els.bomClose.addEventListener('click', function () { els.bomOverlay.hidden = true; });\n  els.bomOverlay.addEventListener('click', function (e) { if (e.target === els.bomOverlay) els.bomOverlay.hidden = true; });\n\n  render();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-f605dac e-con e-atomic-element e-flexbox-base e-default-div e-fa25517 \" data-id=\"f605dac\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"f605dac\" data-e-type=\"e-flexbox\" data-id=\"f605dac\">\n    \t\t\t<p class=\"e-35dbe7c-1947d2f e-paragraph-base e-default-p\" data-interaction-id=\"35dbe7c\" data-e-type=\"widget\" data-id=\"35dbe7c\">After more than 10,000 combined spray foam installations, our team builds mobile rigs that match how you actually work \u2014 not a generic setup off a shelf. Tell us your trucks, your territory, and your volume, and we'll spec a rig around it.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-af01fad e-con e-atomic-element e-flexbox-base e-default-div e-878455a \" data-id=\"af01fad\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"af01fad\" data-e-type=\"e-flexbox\" data-id=\"af01fad\">\n    <div class=\"elementor-element elementor-element-501c9f4 e-con e-atomic-element e-flexbox-base e-default-div e-2ebbbf1 \" data-id=\"501c9f4\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"501c9f4\" data-e-type=\"e-flexbox\" data-id=\"501c9f4\">\n    \t\t\t<h3 data-interaction-id=\"0923e43\" class=\"e-5fcc662 e-heading-base e-default-h3\" data-e-type=\"widget\" data-id=\"0923e43\">Built to Perform. Built to Last. Built for You.<\/h3>\n\t\t\t\t\t<p class=\"e-7ab40c8 e-paragraph-base e-default-p\" data-interaction-id=\"5930dce\" data-e-type=\"widget\" data-id=\"5930dce\">Every rig is built with commercial-duty components, configured around your truck, crew, and specific jobs, then pressure-tested and calibrated so it's ready to spray from day one.<\/p>\n\t\t\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-d65a46e e-con e-atomic-element e-flexbox-base e-default-div e-a203e34 \" data-id=\"d65a46e\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"d65a46e\" data-e-type=\"e-flexbox\" data-id=\"d65a46e\">\n    \t\t\t<h2 data-interaction-id=\"2c75186\" class=\"e-heading-base e-default-h2\" data-e-type=\"widget\" data-id=\"2c75186\">Choose your rig setup<\/h2>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-64cbc96 e-con e-atomic-element e-flexbox-base e-default-div e-aa92079 \" data-id=\"64cbc96\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"64cbc96\" data-e-type=\"e-flexbox\" data-id=\"64cbc96\">\n    <div class=\"elementor-element elementor-element-7abfb3a e-con e-atomic-element e-flexbox-base e-default-div e-fdcb482 \" data-id=\"7abfb3a\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"7abfb3a\" data-e-type=\"e-flexbox\" data-id=\"7abfb3a\">\n    \t\t\t<img decoding=\"async\" class=\"e-image-base e-default-img \" data-interaction-id=\"70a55f1\" data-e-type=\"widget\" data-id=\"70a55f1\" id=\"6236\" src=\"https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018.png\" width=\"1535\" height=\"1024\" srcset=\"https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018.png 1535w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018-300x200.png 300w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018-1024x683.png 1024w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018-768x512.png 768w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018-600x400.png 600w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/0ffba579-af1c-4ed2-8df7-369b2fe88018-64x43.png 64w\" alt=\"Mobile spray equipment trailer with hoses, tanks, and control panel for industrial spraying.\"\/>\t\t\t\t\t<h3 data-interaction-id=\"93ee724\" class=\"e-heading-base e-default-h3\" data-e-type=\"widget\" data-id=\"93ee724\">Trailer-Mounted Rigs<\/h3>\n\t\t\t\t\t<p class=\"e-paragraph-base e-default-p\" data-interaction-id=\"adc8f02\" data-e-type=\"widget\" data-id=\"adc8f02\">Compact, road-ready trailer setups for teams that want the rig off the truck bed and easy to park on-site.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-af41ea9 e-con e-atomic-element e-flexbox-base e-default-div e-be1c64a \" data-id=\"af41ea9\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"af41ea9\" data-e-type=\"e-flexbox\" data-id=\"af41ea9\">\n    \t\t\t<img decoding=\"async\" class=\"e-image-base e-default-img \" data-interaction-id=\"b606e16\" data-e-type=\"widget\" data-id=\"b606e16\" id=\"6246\" src=\"https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l.png\" width=\"1537\" height=\"1023\" srcset=\"https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l.png 1537w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l-300x200.png 300w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l-1024x682.png 1024w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l-768x511.png 768w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l-600x399.png 600w, https:\/\/thespraymarket.com\/wp-content\/uploads\/2026\/08\/740742db-de8c-4722-bf17-646f4e827de1l-64x43.png 64w\" alt=\"Mobile spray truck with equipment for industrial and commercial applications.\"\/>\t\t\t\t\t<h3 data-interaction-id=\"0da9b6b\" class=\"e-heading-base e-default-h3\" data-e-type=\"widget\" data-id=\"0da9b6b\">Truck-Mounted Rigs<\/h3>\n\t\t\t\t\t<p class=\"e-paragraph-base e-default-p\" data-interaction-id=\"49a9059\" data-e-type=\"widget\" data-id=\"49a9059\">Higher-capacity setups built into the truck itself, for crews that run bigger jobs and want everything on one vehicle.<\/p>\n\t\t\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-81bf9f0 e-con-full e-flex e-con e-parent\" data-id=\"81bf9f0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-d6590cd e-con-full e-flex e-con e-child\" data-id=\"d6590cd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-d44dc6d e-con-full e-flex e-con e-child\" data-id=\"d44dc6d\" 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-b3fbea8 elementor-widget elementor-widget-heading\" data-id=\"b3fbea8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">What's Included<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4fe5a40 elementor-widget elementor-widget-text-editor\" data-id=\"4fe5a40\" 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>Every rig ships fully equipped with a pump, spray gun, and hose package \u2014 everything you need to start spraying the same day it arrives.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dae8fbb e-con-full e-flex e-con e-child\" data-id=\"dae8fbb\" 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-8cd55b8 elementor-widget elementor-widget-heading\" data-id=\"8cd55b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Setup &amp; Training<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0dcb118 elementor-widget elementor-widget-text-editor\" data-id=\"0dcb118\" 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>Every rig includes a full walkthrough covering setup, daily cleaning, and basic maintenance, so your crew is confident from day one.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c78e06c e-con-full e-flex e-con e-child\" data-id=\"c78e06c\" 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-814cec7 elementor-widget elementor-widget-heading\" data-id=\"814cec7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Add-Ons &amp; Customization<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a058566 elementor-widget elementor-widget-text-editor\" data-id=\"a058566\" 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>Tell us your trucks, territory, and volume \u2014 we&#8217;ll talk through upgrades, extra reels, and options beyond the standard package.<\/p>\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<\/div>\n\t\t<div class=\"elementor-element elementor-element-0e2533c e-con e-atomic-element e-flexbox-base e-default-div e-ce89ea0 \" data-id=\"0e2533c\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"0e2533c\" id=\"rig-quote\" data-e-type=\"e-flexbox\" data-id=\"0e2533c\">\n    \t\t\t<h2 data-interaction-id=\"ebcf214\" class=\"e-ebcf214-band e-heading-base e-default-h2\" data-e-type=\"widget\" data-id=\"ebcf214\">GET <span>YOUR<\/span> FREE CONSULTATION AND QUOTE<\/h2>\n\t\t\t\t\t<p class=\"e-153bc61-band e-paragraph-base e-default-p\" data-interaction-id=\"153bc61\" data-e-type=\"widget\" data-id=\"153bc61\">Tell us about your trucks, territory, and volume, and our team will put together a free, no-obligation quote for your rig.<\/p>\n\t\t\t\t\t<a href=\"\/contact\/\" target=\"_self\" class=\"e-38ae173-d14eabc e-button-base e-default-a\" data-interaction-id=\"38ae173\" data-e-type=\"widget\" data-id=\"38ae173\">\n\tSTART RIGGING\n<\/a>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>The Spray Market &middot; Complete Rig Build 20-ft spray foam rig, built to run every day. 20-foot box truck outfitted end to end &mdash; proportioning unit, heated hose, 55 gal drum storage, and a dedicated generator room. Rig Systems Truck Construction Explode Truck All Systems Spray Equipment Material Storage Generator Room Tap a marker for [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-5520","page","type-page","status-publish","hentry"],"acf":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/pages\/5520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/comments?post=5520"}],"version-history":[{"count":5,"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/pages\/5520\/revisions"}],"predecessor-version":[{"id":14274,"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/pages\/5520\/revisions\/14274"}],"wp:attachment":[{"href":"https:\/\/thespraymarket.com\/es\/wp-json\/wp\/v2\/media?parent=5520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}