It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: http://104.245.35.100/

  1. <!DOCTYPE html>
  2.  
  3.  
  4. <html lang="en" itemscope itemtype="http://schema.org/WebPage">
  5. <head>
  6.  
  7.    <link rel="preconnect" href="https://d24bg2vhmgisg5.cloudfront.net" crossorigin>
  8.    <link rel="preconnect" href="https://d2zg6owwd9zpf3.cloudfront.net" crossorigin>
  9.    <style>
  10.        .cv-auto {
  11.            content-visibility: auto;
  12.            contain-intrinsic-size: 300px 800px
  13.        }
  14.    </style>
  15.    
  16.    <script rel="defer" type="application /ld+json">
  17.          "@context": "https://schema.org",
  18.          "@type": "ClothingStore",
  19.          "name": "Stitch America",
  20.          "image": "https://d2zg6owwd9zpf3.cloudfront.net/saflagphoneheader.webp",
  21.          "@id": "https://stitchamerica.com/#",
  22.          "url": "https://stitchamerica.com/",
  23.          "telephone": "770-537-4357",
  24.          "priceRange": "$$",
  25.          "address": {
  26.            "@type": "PostalAddress",
  27.            "streetAddress": "110 Cross Street",
  28.            "addressLocality": "Bremen",
  29.            "addressRegion": "GA",
  30.            "postalCode": "30110",
  31.            "addressCountry": "US"
  32.          },
  33.          "geo": {
  34.            "@type": "GeoCoordinates",
  35.            "latitude": 33.7243588,
  36.            "longitude": -85.126826
  37.          },
  38.          "openingHoursSpecification": {
  39.            "@type": "OpeningHoursSpecification",
  40.            "dayOfWeek": [
  41.              "Monday",
  42.              "Tuesday",
  43.              "Wednesday",
  44.              "Thursday",
  45.              "Friday"
  46.            ],
  47.            "opens": "08:30",
  48.            "closes": "17:30"
  49.          },
  50.          "sameAs": [
  51.            "https://www.facebook.com/stitchamerica/",
  52.            "https://www.linkedin.com/company/stitch-america",
  53.            "https://www.youtube.com/@StitchamericaEmbroidery",
  54.            "https://www.pinterest.com/stitchamerica/"
  55.          ]
  56.        }
  57.    </script>
  58.  
  59.    
  60.    <meta property="og:url" content="https://stitchamerica.com/">
  61.    <meta property="og:type" content="website">
  62.    <meta property="og:title" content="Stitch America | World Class Custom Embroidery Services">
  63.    <meta property="og:description" content="Stitch America is your quality source for custom embroidery on the web. Free custom embroidery is always included and we have the simplest pricing! For the best custom embroider service out there, choose Stitch America.">
  64.    <meta property="og:image" content="https://d2zg6owwd9zpf3.cloudfront.net/saflagphoneheader.webp">
  65.    <meta property="og:image:width" content="300">
  66.    <meta property="og:image:height" content="220">
  67.  
  68.    
  69.    <meta name="twitter:card" content="summary_large_image">
  70.    <meta property="twitter:domain" content="stitchamerica.com">
  71.    <meta property="twitter:url" content="https://stitchamerica.com/">
  72.    <meta name="twitter:title" content="Stitch America | World Class Custom Embroidery Services">
  73.    <meta name="twitter:description" content="Stitch America is your quality source for custom embroidery on the web. Free custom embroidery is always included and we have the simplest pricing! For the best custom embroider service out there, choose Stitch America.">
  74.    <meta name="twitter:image" content="https://d2zg6owwd9zpf3.cloudfront.net/saflagphoneheader.webp">
  75.  
  76.  
  77.    <meta http-equiv="X-UA-Compatible" content="IE=edge">
  78.    <meta charset="utf-8">
  79.    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
  80.    <meta name="application-name" content="Stitch America">
  81.  
  82.    
  83.    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" />
  84.    <link rel="canonical" href="https://stitchamerica.com" />
  85.    <meta name="google-site-verification" content="s4gEZWy9nZdxIVNePeu07U6S13WNRmVWCzJGrkuR8HI" />
  86.  
  87.  
  88.    
  89.    <meta name="description" content="Stitch America is your quality source for custom embroidery on the web. Free custom embroidery is always included and we have the simplest pricing! For the best custom embroider service out there, choose Stitch America." />
  90.  
  91.    <title>Stitch America | World Class Custom Embroidery Services</title>
  92.    <link rel="stylesheet" defer href="/content/sa-styling-2025.css">
  93.  
  94.    <link rel="stylesheet" defer href="/content/stitch-america.min.css">
  95.  
  96.    <link rel="stylesheet" href="https://cdn.scaleflex.it/plugins/js-cloudimage-responsive/latest/js-cloudimage-responsive.min.css?func=proxy">
  97.  
  98.    
  99.    <script>
  100.        (function (w, d, s, l, i) {
  101.            w[l] = w[l] || []; w[l].push({
  102.                'gtm.start':
  103.                    new Date().getTime(), event: 'gtm.js'
  104.            }); var f = d.getElementsByTagName(s)[0],
  105.                j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =
  106.                    'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);
  107.        })(window, document, 'script', 'dataLayer', 'GTM-MR9LFM');
  108.    </script>
  109.  
  110. </head>
  111.  
  112. <body>
  113.    
  114.    <noscript>
  115.        <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MR9LFM"
  116.                height="0" width="0" style="display:none;visibility:hidden"></iframe>
  117.    </noscript>
  118.  
  119.  
  120.    <div id="responsive_body">
  121.        <div class="body-content">
  122.            
  123.  
  124.  
  125.  
  126. <input id="sw" name="sw" type="hidden" value="0" />
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134. <div id="responsive_nav" class="sticky-top">
  135.  
  136.    
  137.    <div class="navbar navbar-expand-lg darkblue-bg navbar-dark p-2 shadow-sm pb-2 nav-dark">
  138.        <div class="container max-w-90">
  139.            <div class="sa-nav-grid">
  140.  
  141.                
  142.                <div class="sa-nav-left d-flex align-items-center">
  143.                    <div class="d-none d-md-flex me-3">
  144.                        <a class="sa-brand text-white" href="/" aria-label="Stitch America Home">
  145.                            <img class="img-fluid sa-brand-logo-md" src="https://d2zg6owwd9zpf3.cloudfront.net/saflagphoneheader.webp" alt="Stitch America logo" />
  146.                            <span class="sa-brand-text">
  147.                                <span class="sa-brand-title">Stitch America</span>
  148.                                <span class="sa-brand-sub d-none d-xl-flex">custom embroidery</span>
  149.                            </span>
  150.                        </a>
  151.                    </div>
  152.  
  153.                    <div class="d-flex d-md-none">
  154.                        <a class="sa-brand text-white" href="/" aria-label="Stitch America Home">
  155.                            <img class="img-fluid sa-brand-logo-sm" src="https://d2zg6owwd9zpf3.cloudfront.net/saflagphoneheader.webp" alt="Stitch America logo" />
  156.                        </a>
  157.                    </div>
  158.                </div>
  159.  
  160.                
  161.                <div class="sa-nav-center d-flex flex-column align-items-center w-100">
  162.                    <div class="d-none d-md-flex sa-search-lg">
  163.                        <form class="navbar-form w-100" role="search" data-stitch-search id="searchFormLg" aria-label="Site search">
  164.                            <div class="input-group">
  165.                                <input type="search" class="form-control" name="q" id="q_desktop" placeholder="Search" autocomplete="on" enterkeyhint="search" inputmode="search" aria-label="Search">
  166.                                <button type="submit" class="sa-btn d-inline-flex align-items-center justify-content-center" aria-label="Search">
  167.                                    <img src="https://d24bg2vhmgisg5.cloudfront.net/searchglass3.webp" width="27" height="27" alt="" class="search-icon" />
  168.                                    <div class="spinner-border spinner-border-sm text-light d-none" role="status" aria-hidden="true" style="width:20px;height:20px;"></div>
  169.                                </button>
  170.                            </div>
  171.                        </form>
  172.                    </div>
  173.  
  174.                    <div class="d-flex d-md-none sa-search-sm">
  175.                        <form class="navbar-form w-100" role="search" data-stitch-search id="searchFormSm" aria-label="Site search">
  176.                            <div class="input-group">
  177.                                <input type="search" class="form-control" name="q" id="q_phone" placeholder="Search"
  178.                                       autocomplete="on" enterkeyhint="search" inputmode="search" aria-label="Search">
  179.                                <button type="submit" class="sa-btn d-inline-flex align-items-center justify-content-center" aria-label="Search">
  180.                                    <img src="https://d24bg2vhmgisg5.cloudfront.net/searchglass3.webp" width="27" height="27" alt="" class="search-icon" />
  181.                                    <div class="spinner-border spinner-border-sm text-light d-none" role="status" aria-hidden="true"
  182.                                         style="width:20px;height:20px;"></div>
  183.                                </button>
  184.                            </div>
  185.                        </form>
  186.                    </div>
  187.                </div>
  188.  
  189.                
  190.                <div class="sa-nav-right">
  191.                    <ul class="navbar-nav ms-auto justify-content-end d-none d-lg-flex">
  192.                                
  193.                                    <li class="nav-item dropdown-styling">
  194.                                        <a id="loginHeaderLink" href="/account/login" class="nav-link sa-link-700">
  195.                                            <span class="text-nowrap">
  196.                                                <img src="https://d24bg2vhmgisg5.cloudfront.net/login.webp" height="21" width="21" alt="" />
  197.                                                Log In
  198.                                            </span>
  199.                                        </a>
  200.                                    </li>
  201.                                
  202.  
  203.  
  204.                        <li class="nav-item dropdown-styling">
  205.                            <a class="nav-link text-nowrap sa-link-700" id="cartHeaderLink" href="/account/cart">
  206.                                <img src="https://d24bg2vhmgisg5.cloudfront.net/cart.webp" height="21" width="21" alt="" />
  207.                                Cart
  208.                            </a>
  209.                        </li>
  210.                    </ul>
  211.  
  212.                    
  213.                    <button id="mobileMenuBtn" class="btn btn-primary d-lg-none d-flex" type="button"
  214.                            data-bs-toggle="offcanvas" data-bs-target="#offcanvasRight"
  215.                            aria-controls="offcanvasRight" aria-label="Toggle Mobile Menu">
  216.                        <img src="https://d24bg2vhmgisg5.cloudfront.net/mobile-menu.webp" height="31" width="31" alt="" />
  217.                    </button>
  218.                </div>
  219.  
  220.            </div>
  221.        </div>
  222.    </div>
  223.  
  224.    
  225.    <div class="navbar navbar-expand-lg navbar-dark py-1 lightblue-bg d-none d-md-block nav-light">
  226.        <div class="container max-w-90">
  227.            <div class="d-flex flex-row w-100 justify-content-start">
  228.  
  229.                <div class="collapse navbar-collapse d-md-flex" id="navbarNavDropdown">
  230.  
  231.                    
  232.                    <ul class="navbar-nav justify-content-start d-none d-lg-flex">
  233.                            
  234.        
  235.        <li class="nav-item dropdown mx-2">
  236.            <a id="ddHelp" class="nav-link active dropdown-toggle dropdown-styling"
  237.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Need Help?</a>
  238.            <ul class="dropdown-menu" aria-labelledby="ddHelp">
  239.                <li><a class="dropdown-item" href="/service">Help Index</a></li>
  240.                <li><a class="dropdown-item" href="/service/contact">Contact us</a></li>
  241.                <li><a class="dropdown-item" href="/account/uploadmylogo">Upload Logo</a></li>
  242.                <li><a class="dropdown-item" href="/service/faq">FAQ</a></li>
  243.                <li><a class="dropdown-item" href="/service/whyus">Why Stitch America?</a></li>
  244.                <li><a class="dropdown-item" href="/service/howlong">How long does it take?</a></li>
  245.                <li><a class="dropdown-item" href="/embroidery/embroideryguidelines">Embroidery guidelines</a></li>
  246.                <li><a class="dropdown-item" href="/embroiderydesigns">Embroidery designs</a></li>
  247.                <li><a class="dropdown-item" href="/embroiderydesigns/digitizing">Embroidery digitizing</a></li>
  248.                <li><a class="dropdown-item" href="/embroidery/colorpalette">Color palette</a></li>
  249.                <li><a class="dropdown-item" href="/embroidery/fonts">Fonts</a></li>
  250.                <li><a class="dropdown-item" href="/service/personalization">Personalization</a></li>
  251.                <li><a class="dropdown-item" href="/printed/">Screen printing</a></li>
  252.            </ul>
  253.        </li>
  254.  
  255.        
  256.        <li class="nav-item dropdown mx-2">
  257.            <a id="ddHeadwear" class="nav-link active dropdown-toggle dropdown-styling"
  258.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Headwear</a>
  259.            <ul class="dropdown-menu" aria-labelledby="ddHeadwear">
  260.                <li><a class="dropdown-item" href="/catalog/custom-embroidered-caps-hats"><strong>ALL HEADWEAR</strong></a></li>
  261.                <li><a class="dropdown-item" href="/catalog/category/headwear-adjustable">Adjustable</a></li>
  262.                <li><a class="dropdown-item" href="/catalog/category/headwear-snapback">Snapback</a></li>
  263.                <li><a class="dropdown-item" href="/catalog/category/headwear-trucker">Trucker</a></li>
  264.                <li><a class="dropdown-item" href="/catalog/category/headwear-leather-patches">Leather Patches</a></li>
  265.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-flat-bill">Flat Bill</a></li>
  266.                <li><a class="dropdown-item" href="/catalog/category/headwear-dad-hat">Dad Hats</a></li>
  267.                <li><a class="dropdown-item" href="/catalog/category/headwear-dry-fit">Dry Fit</a></li>
  268.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-flexfit">Flexfit</a></li>
  269.                <li><a class="dropdown-item" href="/catalog/category/headwear-beanies">Beanies</a></li>
  270.                <li><a class="dropdown-item" href="/catalog/category/headwear-visors">Visors</a></li>
  271.                <li><a class="dropdown-item" href="/catalog/category/headwear-headbands">Headbands</a></li>
  272.                <li><a class="dropdown-item" href="/catalog/category/headwear-other">Other</a></li>
  273.            </ul>
  274.        </li>
  275.  
  276.        
  277.        <li class="nav-item dropdown mx-2">
  278.            <a id="ddShirts" class="nav-link active dropdown-toggle dropdown-styling"
  279.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Shirts</a>
  280.            <ul class="dropdown-menu" aria-labelledby="ddShirts">
  281.                <li><a class="dropdown-item" href="/catalog/custom-embroidered-shirts"><strong>ALL SHIRTS</strong></a></li>
  282.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-polo-shirts">Polos</a></li>
  283.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-dry-fit">Dry Fit</a></li>
  284.                <li><a class="dropdown-item" href="/catalog/category/shirts-full-button">Button-Up</a></li>
  285.                <li><a class="dropdown-item" href="/catalog/category/shirts-denim">Denim</a></li>
  286.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-t-shirts">T-Shirts</a></li>
  287.                <li><a class="dropdown-item" href="/catalog/category/shirts-turtlenecks">Turtlenecks</a></li>
  288.                <li><a class="dropdown-item" href="/catalog/category/shirts-henley">Henley</a></li>
  289.                <li><a class="dropdown-item" href="/catalog/category/shirts-youth">Youth</a></li>
  290.                <li><a class="dropdown-item" href="/catalog/category/shirts-big-and-tall">Big &amp; Tall</a></li>
  291.            </ul>
  292.        </li>
  293.  
  294.        
  295.        <li class="nav-item dropdown mx-2">
  296.            <a id="ddOuterwear" class="nav-link active dropdown-toggle dropdown-styling"
  297.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Outerwear</a>
  298.            <ul class="dropdown-menu" aria-labelledby="ddOuterwear">
  299.                <li><a class="dropdown-item" href="/catalog/category/outerwear"><strong>ALL OUTERWEAR</strong></a></li>
  300.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-jackets">Jackets</a></li>
  301.                <li><a class="dropdown-item" href="/catalog/category/outerwear-dry-fit">Dry Fit</a></li>
  302.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-sweatshirts">Sweatshirts</a></li>
  303.                <li><a class="dropdown-item" href="/catalog/category/outerwear-pullovers">Pullovers</a></li>
  304.                <li><a class="dropdown-item" href="/catalog/category/outerwear-sweaters">Sweaters</a></li>
  305.                <li><a class="dropdown-item" href="/catalog/category/outerwear-vests">Vests</a></li>
  306.                <li><a class="dropdown-item" href="/catalog/category/outerwear-fleece">Fleece</a></li>
  307.                <li><a class="dropdown-item" href="/catalog/category/outerwear-youth">Youth</a></li>
  308.                <li><a class="dropdown-item" href="/catalog/category/outerwear-big-and-tall">Big &amp; Tall</a></li>
  309.            </ul>
  310.        </li>
  311.  
  312.        
  313.        <li class="nav-item dropdown d-none d-xxl-block mx-2">
  314.            <a id="ddWomens" class="nav-link active dropdown-toggle dropdown-styling"
  315.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Women's</a>
  316.            <ul class="dropdown-menu" aria-labelledby="ddWomens">
  317.                <li><a class="dropdown-item" href="/catalog/category/ladies"><strong>ALL WOMEN'S</strong></a></li>
  318.                <li><a class="dropdown-item" href="/catalog/category/ladies-polos">Polos</a></li>
  319.                <li><a class="dropdown-item" href="/catalog/category/ladies-dry-fit">Dry Fit</a></li>
  320.                <li><a class="dropdown-item" href="/catalog/category/ladies-full-button">Button-Up</a></li>
  321.                <li><a class="dropdown-item" href="/catalog/category/womens-embroidered-denim-shirts">Denim</a></li>
  322.                <li><a class="dropdown-item" href="/catalog/category/ladies-t-shirts">T-Shirts</a></li>
  323.                <li><a class="dropdown-item" href="/catalog/category/ladies-sleeveless">Sleeveless</a></li>
  324.            </ul>
  325.        </li>
  326.  
  327.        
  328.        <li class="nav-item dropdown mx-2">
  329.            <a id="ddWorkwear" class="nav-link active dropdown-toggle dropdown-styling"
  330.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Workwear</a>
  331.            <ul class="dropdown-menu" aria-labelledby="ddWorkwear">
  332.                <li><a class="dropdown-item" href="/catalog/custom-embroidered-workwear"><strong>ALL WORKWEAR</strong></a></li>
  333.                <li><a class="dropdown-item" href="/catalog/category/workwear-shirts">Shirts</a></li>
  334.                <li><a class="dropdown-item" href="/catalog/category/workwear-outerwear">Outerwear</a></li>
  335.                <li><a class="dropdown-item" href="/catalog/category/workwear-headwear">Headwear</a></li>
  336.                <li><a class="dropdown-item" href="/catalog/category/workwear-healthcare">Healthcare</a></li>
  337.                <li><a class="dropdown-item" href="/catalog/category/workwear-scrubs">Scrubs</a></li>
  338.                <li><a class="dropdown-item" href="/catalog/category/workwear-lab-coats">Lab Coats</a></li>
  339.                <li><a class="dropdown-item" href="/catalog/category/workwear-aprons">Aprons</a></li>
  340.                <li><a class="dropdown-item" href="/catalog/category/workwear-safety">Safety</a></li>
  341.                <li><a class="dropdown-item" href="/catalog/category/workwear-pants">Bottoms</a></li>
  342.                <li><a class="dropdown-item" href="/catalog/category/workwear-other">Miscellaneous</a></li>
  343.            </ul>
  344.        </li>
  345.  
  346.        
  347.        <li class="nav-item dropdown d-none d-xl-block mx-2">
  348.            <a id="ddAccessories" class="nav-link active dropdown-toggle dropdown-styling"
  349.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Accessories</a>
  350.            <ul class="dropdown-menu" aria-labelledby="ddAccessories">
  351.                <li><a class="dropdown-item" href="/catalog/category/more"><strong>ALL ACCESSORIES</strong></a></li>
  352.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-blankets">Blankets</a></li>
  353.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-bags">Bags</a></li>
  354.                <li><a class="dropdown-item" href="/catalog/category/more-scarves">Scarves</a></li>
  355.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-towels">Towels</a></li>
  356.                <li><a class="dropdown-item" href="/catalog/category/more-loungewear">Loungewear</a></li>
  357.                <li><a class="dropdown-item" href="/catalog/category/more-other">Other</a></li>
  358.            </ul>
  359.        </li>
  360.  
  361.        
  362.        <li class="nav-item dropdown mx-2">
  363.            <a id="ddBrands" class="nav-link active dropdown-toggle dropdown-styling"
  364.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">All Brands</a>
  365.            <ul class="dropdown-menu" aria-labelledby="ddBrands">
  366.                <li><a class="dropdown-item" href="/catalog/brands"><strong>ALL BRANDS</strong></a></li>
  367.                <li><a class="dropdown-item" href="/catalog/brand/richardson">Richardson</a></li>
  368.                <li><a class="dropdown-item" href="/catalog/brand/port-authority">Port Authority</a></li>
  369.                <li><a class="dropdown-item" href="/catalog/brand/charles-river">Charles River</a></li>
  370.                
  371.                <li><a class="dropdown-item" href="/catalog/brand/gildan">Gildan</a></li>
  372.                <li><a class="dropdown-item" href="/catalog/brand/carhartt">Carhartt</a></li>
  373.                <li><a class="dropdown-item" href="/catalog/brand/team365">TEAM365</a></li>
  374.            </ul>
  375.        </li>
  376.    
  377.  
  378.                    </ul>
  379.  
  380.                    
  381.                    <!--<ul class="navbar-nav justify-content-start d-flex d-lg-none sa-nav-item-md-links">
  382.                        <li class="nav-item dropdown">
  383.                            <a id="ddHeadwearMd" class="nav-link mx-2 active dropdown-toggle dropdown-styling" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Headwear</a>
  384.                            <ul class="dropdown-menu" aria-labelledby="ddHeadwearMd">
  385.                                <li><a class="dropdown-item" href="/catalog/custom-embroidered-caps-hats"><strong>ALL HEADWEAR</strong></a></li>
  386.                                <li><a class="dropdown-item" href="/catalog/category/headwear-adjustable">Adjustable</a></li>
  387.                                <li><a class="dropdown-item" href="/catalog/category/headwear-snapback">Snapback</a></li>
  388.                                <li><a class="dropdown-item" href="/catalog/category/headwear-trucker">Trucker</a></li>
  389.                                <li><a class="dropdown-item" href="/catalog/category/headwear-leather-patches">Leather Patches</a></li>
  390.                            </ul>
  391.                        </li>
  392.                        <li class="nav-item dropdown">
  393.                            <a id="ddShirtsMd" class="nav-link mx-2 active dropdown-toggle dropdown-styling" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Shirts</a>
  394.                            <ul class="dropdown-menu" aria-labelledby="ddShirtsMd">
  395.                                <li><a class="dropdown-item" href="/catalog/custom-embroidered-shirts"><strong>ALL SHIRTS</strong></a></li>
  396.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-polo-shirts">Polos</a></li>
  397.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-dry-fit">Dry Fit</a></li>
  398.                                <li><a class="dropdown-item" href="/catalog/category/shirts-full-button">Button-Up</a></li>
  399.                                <li><a class="dropdown-item" href="/catalog/category/shirts-denim">Denim</a></li>
  400.                            </ul>
  401.                        </li>
  402.                        <li class="nav-item dropdown">
  403.                            <a id="ddOuterwearMd" class="nav-link mx-2 active dropdown-toggle dropdown-styling" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Outerwear</a>
  404.                            <ul class="dropdown-menu" aria-labelledby="ddOuterwearMd">
  405.                                <li><a class="dropdown-item" href="/catalog/category/outerwear"><strong>ALL OUTERWEAR</strong></a></li>
  406.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-jackets">Jackets</a></li>
  407.                                <li><a class="dropdown-item" href="/catalog/category/outerwear-dry-fit">Dry Fit</a></li>
  408.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-sweatshirts">Sweatshirts</a></li>
  409.                                <li><a class="dropdown-item" href="/catalog/category/outerwear-pullovers">Pullovers</a></li>
  410.                            </ul>
  411.                        </li>
  412.                        <li class="nav-item dropdown">
  413.                            <a id="ddWomensMd" class="nav-link mx-2 active dropdown-toggle dropdown-styling" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Women</a>
  414.                            <ul class="dropdown-menu" aria-labelledby="ddWomensMd">
  415.                                <li><a class="dropdown-item" href="/catalog/category/ladies"><strong>ALL WOMEN'S</strong></a></li>
  416.                                <li><a class="dropdown-item" href="/catalog/category/ladies-polos">Polos</a></li>
  417.                                <li><a class="dropdown-item" href="/catalog/category/ladies-dry-fit">Dry Fit</a></li>
  418.                                <li><a class="dropdown-item" href="/catalog/category/ladies-full-button">Button-Up</a></li>
  419.                                <li><a class="dropdown-item" href="/catalog/category/womens-embroidered-denim-shirts">Denim</a></li>
  420.                            </ul>
  421.                        </li>
  422.                        <li class="nav-item dropdown">
  423.                            <a id="ddAccessoriesMd" class="nav-link mx-2 active dropdown-toggle dropdown-styling" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Accessories</a>
  424.                            <ul class="dropdown-menu" aria-labelledby="ddAccessoriesMd">
  425.                                <li><a class="dropdown-item" href="/catalog/category/more"><strong>ALL ACCESSORIES</strong></a></li>
  426.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-blankets">Blankets</a></li>
  427.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-bags">Bags</a></li>
  428.                                <li><a class="dropdown-item" href="/catalog/category/more-scarves">Scarves</a></li>
  429.                                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-towels">Towels</a></li>
  430.                                <li><a class="dropdown-item" href="/catalog/category/more-loungewear">Loungewear</a></li>
  431.                                <li><a class="dropdown-item" href="/catalog/category/more-other">Other</a></li>
  432.                            </ul>
  433.                        </li>-->
  434.  
  435.                        
  436.                        <!--<ul class="navbar-nav ms-auto d-flex align-items-center">
  437.                            <li class="nav-item">
  438.                                <a class="nav-link text-nowrap sa-link-700" id="cartHeaderLinkMd" href="/account/cart">
  439.                                    <img src="https://d24bg2vhmgisg5.cloudfront.net/cart.webp" height="21" width="21" alt="" />
  440.                                    Cart
  441.                                </a>
  442.                            </li>
  443.                                    
  444.                                        <li class="nav-item">
  445.                                            <a id="loginHeaderLinkMd" href="/account/login" class="nav-link sa-link-700">
  446.                                                <span class="text-nowrap text-white">
  447.                                                    <img src="https://d24bg2vhmgisg5.cloudfront.net/login.webp" height="21" width="21" alt="" />
  448.                                                    &nbsp;Log In
  449.                                                </span>
  450.                                            </a>
  451.                                        </li>
  452.                                    
  453.  
  454.                        </ul>-->
  455.                    
  456.                </div>
  457.  
  458.                
  459.                <div class="d-flex align-items-center ms-auto flex-shrink-0 d-none d-lg-flex">
  460.                    <div class="top-header-links d-flex align-items-center">
  461.                        <a class="top-header-styling ms-2" href="/account/uploadmylogo">
  462.                            <img src="https://d24bg2vhmgisg5.cloudfront.net/upload2.webp" alt="" />
  463.                            Free Logo Evaluation&nbsp;&nbsp;
  464.                        </a>
  465.                        <a class="top-header-styling ms-2 d-none d-xl-block" href="/service/contact">
  466.                            <img src="https://d24bg2vhmgisg5.cloudfront.net/email2.webp" alt="" />
  467.                            Email&nbsp;&nbsp;
  468.                        </a>
  469.                            <a class="top-header-styling ms-2" href="tel:+1-770-537-4357">
  470.                                <img src="https://d24bg2vhmgisg5.cloudfront.net/phone2.webp" alt="" />
  471.                                770-537-4357
  472.                            </a>
  473.                    </div>
  474.                </div>
  475.            </div>
  476.        </div>
  477.    </div>
  478.  
  479.    
  480.    <div class="d-block d-lg-none navbar-dark lightblue-bg p-1">
  481.        <div class="container max-w-90">
  482.            <div class="d-flex justify-content-between w-100 mobile-contact-bar">
  483.                <div class="d-flex align-items-center">
  484.                        <a class="sa-link-white-700 text-white" href="tel:+1-770-537-4357">
  485.                            <img src="https://d24bg2vhmgisg5.cloudfront.net/phone21.webp" height="21" width="21" alt="" />
  486.                            &nbsp;770-537-4357
  487.                        </a>
  488.                </div>
  489.  
  490.                <div class="d-flex align-items-center">
  491.                    <a class="sa-link-white-700 me-3 text-white" href="/account/cart">
  492.                        <img src="https://d24bg2vhmgisg5.cloudfront.net/cart.webp" height="21" width="21" alt="" />
  493.                        Cart
  494.                    </a>
  495.                </div>
  496.                <div class="d-flex align-items-center">
  497.                            <a class="sa-link-white-700 text-white" href="/account/login">
  498.                                <span class="text-nowrap">
  499.                                    <img src="https://d24bg2vhmgisg5.cloudfront.net/login.webp" height="21" width="21" alt="" />
  500.                                    &nbsp;Log In
  501.                                </span>
  502.                            </a>
  503.  
  504.                </div>
  505.            </div>
  506.        </div>
  507.    </div>
  508. </div>
  509.  
  510.  
  511. <template id="mobileOffcanvasTpl">
  512.    <div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel" aria-modal="true" role="dialog">
  513.        <div class="offcanvas-header darkblue-bg">
  514.            <img loading="lazy" class="img-fluid" style="max-width:17%;height:auto;"
  515.                 src="https://d2zg6owwd9zpf3.cloudfront.net/sapatchflag.webp" alt="Stitch America logo" />
  516.            <h5 id="offcanvasRightLabel" class="offcanvas-logo-text text-white">Stitch America</h5>
  517.            <button type="button" class="btn-close text-reset btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close"></button>
  518.        </div>
  519.  
  520.        <div class="offcanvas-body">
  521.            <ul class="navbar-nav ms-auto">
  522.                    
  523.        
  524.        <li class="nav-item dropdown ">
  525.            <a id="ddHelp" class="nav-link active dropdown-toggle offcanvas-styling"
  526.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Need Help?</a>
  527.            <ul class="dropdown-menu" aria-labelledby="ddHelp">
  528.                <li><a class="dropdown-item" href="/service">Help Index</a></li>
  529.                <li><a class="dropdown-item" href="/service/contact">Contact us</a></li>
  530.                <li><a class="dropdown-item" href="/account/uploadmylogo">Upload Logo</a></li>
  531.                <li><a class="dropdown-item" href="/service/faq">FAQ</a></li>
  532.                <li><a class="dropdown-item" href="/service/whyus">Why Stitch America?</a></li>
  533.                <li><a class="dropdown-item" href="/service/howlong">How long does it take?</a></li>
  534.                <li><a class="dropdown-item" href="/embroidery/embroideryguidelines">Embroidery guidelines</a></li>
  535.                <li><a class="dropdown-item" href="/embroiderydesigns">Embroidery designs</a></li>
  536.                <li><a class="dropdown-item" href="/embroiderydesigns/digitizing">Embroidery digitizing</a></li>
  537.                <li><a class="dropdown-item" href="/embroidery/colorpalette">Color palette</a></li>
  538.                <li><a class="dropdown-item" href="/embroidery/fonts">Fonts</a></li>
  539.                <li><a class="dropdown-item" href="/service/personalization">Personalization</a></li>
  540.                <li><a class="dropdown-item" href="/printed/">Screen printing</a></li>
  541.            </ul>
  542.        </li>
  543.  
  544.        
  545.        <li class="nav-item dropdown ">
  546.            <a id="ddHeadwear" class="nav-link active dropdown-toggle offcanvas-styling"
  547.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Headwear</a>
  548.            <ul class="dropdown-menu" aria-labelledby="ddHeadwear">
  549.                <li><a class="dropdown-item" href="/catalog/custom-embroidered-caps-hats"><strong>ALL HEADWEAR</strong></a></li>
  550.                <li><a class="dropdown-item" href="/catalog/category/headwear-adjustable">Adjustable</a></li>
  551.                <li><a class="dropdown-item" href="/catalog/category/headwear-snapback">Snapback</a></li>
  552.                <li><a class="dropdown-item" href="/catalog/category/headwear-trucker">Trucker</a></li>
  553.                <li><a class="dropdown-item" href="/catalog/category/headwear-leather-patches">Leather Patches</a></li>
  554.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-flat-bill">Flat Bill</a></li>
  555.                <li><a class="dropdown-item" href="/catalog/category/headwear-dad-hat">Dad Hats</a></li>
  556.                <li><a class="dropdown-item" href="/catalog/category/headwear-dry-fit">Dry Fit</a></li>
  557.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-flexfit">Flexfit</a></li>
  558.                <li><a class="dropdown-item" href="/catalog/category/headwear-beanies">Beanies</a></li>
  559.                <li><a class="dropdown-item" href="/catalog/category/headwear-visors">Visors</a></li>
  560.                <li><a class="dropdown-item" href="/catalog/category/headwear-headbands">Headbands</a></li>
  561.                <li><a class="dropdown-item" href="/catalog/category/headwear-other">Other</a></li>
  562.            </ul>
  563.        </li>
  564.  
  565.        
  566.        <li class="nav-item dropdown ">
  567.            <a id="ddShirts" class="nav-link active dropdown-toggle offcanvas-styling"
  568.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Shirts</a>
  569.            <ul class="dropdown-menu" aria-labelledby="ddShirts">
  570.                <li><a class="dropdown-item" href="/catalog/custom-embroidered-shirts"><strong>ALL SHIRTS</strong></a></li>
  571.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-polo-shirts">Polos</a></li>
  572.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-dry-fit">Dry Fit</a></li>
  573.                <li><a class="dropdown-item" href="/catalog/category/shirts-full-button">Button-Up</a></li>
  574.                <li><a class="dropdown-item" href="/catalog/category/shirts-denim">Denim</a></li>
  575.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-t-shirts">T-Shirts</a></li>
  576.                <li><a class="dropdown-item" href="/catalog/category/shirts-turtlenecks">Turtlenecks</a></li>
  577.                <li><a class="dropdown-item" href="/catalog/category/shirts-henley">Henley</a></li>
  578.                <li><a class="dropdown-item" href="/catalog/category/shirts-youth">Youth</a></li>
  579.                <li><a class="dropdown-item" href="/catalog/category/shirts-big-and-tall">Big &amp; Tall</a></li>
  580.            </ul>
  581.        </li>
  582.  
  583.        
  584.        <li class="nav-item dropdown ">
  585.            <a id="ddOuterwear" class="nav-link active dropdown-toggle offcanvas-styling"
  586.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Outerwear</a>
  587.            <ul class="dropdown-menu" aria-labelledby="ddOuterwear">
  588.                <li><a class="dropdown-item" href="/catalog/category/outerwear"><strong>ALL OUTERWEAR</strong></a></li>
  589.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-jackets">Jackets</a></li>
  590.                <li><a class="dropdown-item" href="/catalog/category/outerwear-dry-fit">Dry Fit</a></li>
  591.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-sweatshirts">Sweatshirts</a></li>
  592.                <li><a class="dropdown-item" href="/catalog/category/outerwear-pullovers">Pullovers</a></li>
  593.                <li><a class="dropdown-item" href="/catalog/category/outerwear-sweaters">Sweaters</a></li>
  594.                <li><a class="dropdown-item" href="/catalog/category/outerwear-vests">Vests</a></li>
  595.                <li><a class="dropdown-item" href="/catalog/category/outerwear-fleece">Fleece</a></li>
  596.                <li><a class="dropdown-item" href="/catalog/category/outerwear-youth">Youth</a></li>
  597.                <li><a class="dropdown-item" href="/catalog/category/outerwear-big-and-tall">Big &amp; Tall</a></li>
  598.            </ul>
  599.        </li>
  600.  
  601.        
  602.        <li class="nav-item dropdown d-none d-xxl-block ">
  603.            <a id="ddWomens" class="nav-link active dropdown-toggle offcanvas-styling"
  604.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Women's</a>
  605.            <ul class="dropdown-menu" aria-labelledby="ddWomens">
  606.                <li><a class="dropdown-item" href="/catalog/category/ladies"><strong>ALL WOMEN'S</strong></a></li>
  607.                <li><a class="dropdown-item" href="/catalog/category/ladies-polos">Polos</a></li>
  608.                <li><a class="dropdown-item" href="/catalog/category/ladies-dry-fit">Dry Fit</a></li>
  609.                <li><a class="dropdown-item" href="/catalog/category/ladies-full-button">Button-Up</a></li>
  610.                <li><a class="dropdown-item" href="/catalog/category/womens-embroidered-denim-shirts">Denim</a></li>
  611.                <li><a class="dropdown-item" href="/catalog/category/ladies-t-shirts">T-Shirts</a></li>
  612.                <li><a class="dropdown-item" href="/catalog/category/ladies-sleeveless">Sleeveless</a></li>
  613.            </ul>
  614.        </li>
  615.  
  616.        
  617.        <li class="nav-item dropdown ">
  618.            <a id="ddWorkwear" class="nav-link active dropdown-toggle offcanvas-styling"
  619.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Workwear</a>
  620.            <ul class="dropdown-menu" aria-labelledby="ddWorkwear">
  621.                <li><a class="dropdown-item" href="/catalog/custom-embroidered-workwear"><strong>ALL WORKWEAR</strong></a></li>
  622.                <li><a class="dropdown-item" href="/catalog/category/workwear-shirts">Shirts</a></li>
  623.                <li><a class="dropdown-item" href="/catalog/category/workwear-outerwear">Outerwear</a></li>
  624.                <li><a class="dropdown-item" href="/catalog/category/workwear-headwear">Headwear</a></li>
  625.                <li><a class="dropdown-item" href="/catalog/category/workwear-healthcare">Healthcare</a></li>
  626.                <li><a class="dropdown-item" href="/catalog/category/workwear-scrubs">Scrubs</a></li>
  627.                <li><a class="dropdown-item" href="/catalog/category/workwear-lab-coats">Lab Coats</a></li>
  628.                <li><a class="dropdown-item" href="/catalog/category/workwear-aprons">Aprons</a></li>
  629.                <li><a class="dropdown-item" href="/catalog/category/workwear-safety">Safety</a></li>
  630.                <li><a class="dropdown-item" href="/catalog/category/workwear-pants">Bottoms</a></li>
  631.                <li><a class="dropdown-item" href="/catalog/category/workwear-other">Miscellaneous</a></li>
  632.            </ul>
  633.        </li>
  634.  
  635.        
  636.        <li class="nav-item dropdown d-none d-xl-block ">
  637.            <a id="ddAccessories" class="nav-link active dropdown-toggle offcanvas-styling"
  638.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Accessories</a>
  639.            <ul class="dropdown-menu" aria-labelledby="ddAccessories">
  640.                <li><a class="dropdown-item" href="/catalog/category/more"><strong>ALL ACCESSORIES</strong></a></li>
  641.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-blankets">Blankets</a></li>
  642.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-bags">Bags</a></li>
  643.                <li><a class="dropdown-item" href="/catalog/category/more-scarves">Scarves</a></li>
  644.                <li><a class="dropdown-item" href="/catalog/category/custom-embroidered-towels">Towels</a></li>
  645.                <li><a class="dropdown-item" href="/catalog/category/more-loungewear">Loungewear</a></li>
  646.                <li><a class="dropdown-item" href="/catalog/category/more-other">Other</a></li>
  647.            </ul>
  648.        </li>
  649.  
  650.        
  651.        <li class="nav-item dropdown ">
  652.            <a id="ddBrands" class="nav-link active dropdown-toggle offcanvas-styling"
  653.               href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">All Brands</a>
  654.            <ul class="dropdown-menu" aria-labelledby="ddBrands">
  655.                <li><a class="dropdown-item" href="/catalog/brands"><strong>ALL BRANDS</strong></a></li>
  656.                <li><a class="dropdown-item" href="/catalog/brand/richardson">Richardson</a></li>
  657.                <li><a class="dropdown-item" href="/catalog/brand/port-authority">Port Authority</a></li>
  658.                <li><a class="dropdown-item" href="/catalog/brand/charles-river">Charles River</a></li>
  659.                
  660.                <li><a class="dropdown-item" href="/catalog/brand/gildan">Gildan</a></li>
  661.                <li><a class="dropdown-item" href="/catalog/brand/carhartt">Carhartt</a></li>
  662.                <li><a class="dropdown-item" href="/catalog/brand/team365">TEAM365</a></li>
  663.            </ul>
  664.        </li>
  665.    
  666.  
  667.  
  668.                <li class="nav-item">
  669.                    <a id="cartLinkOffcanvas" class="nav-link text-nowrap offcanvas-styling" href="/account/cart">
  670.                        <img src="https://d24bg2vhmgisg5.cloudfront.net/cart.webp" height="21" width="21" alt="" />
  671.                        &nbsp;&nbsp;Cart
  672.                    </a>
  673.                </li>
  674.  
  675.                <li class="nav-item">
  676.                    <a class="nav-link text-nowrap offcanvas-styling" href="/account/uploadmylogo">
  677.                        <img src="https://d24bg2vhmgisg5.cloudfront.net/upload2.webp" height="21" width="21" alt="" />
  678.                        &nbsp;&nbsp;Upload
  679.                    </a>
  680.                </li>
  681.  
  682.                        
  683.                            <li class="nav-item">
  684.                                <a href="/account/login" class="nav-link offcanvas-styling">
  685.                                    <span>
  686.                                        <img src="https://d24bg2vhmgisg5.cloudfront.net/login.webp" height="21" width="21" alt="" />
  687.                                        &nbsp;&nbsp;Login
  688.                                    </span>
  689.                                </a>
  690.                            </li>
  691.                        
  692.  
  693.            </ul>
  694.        </div>
  695.    </div>
  696. </template>
  697.  
  698.  
  699. <script>
  700.    (function () {
  701.        const forms = document.querySelectorAll('[data-stitch-search]');
  702.        if (!forms.length) return;
  703.  
  704.        forms.forEach(function (form) {
  705.            const isAjax = (form.dataset.ajax || "false").toLowerCase() === "true";
  706.            const button = form.querySelector('button[type="submit"]');
  707.            const icon = button ? button.querySelector('.search-icon') : null;
  708.            const spin = button ? button.querySelector('.spinner-border') : null;
  709.            if (!button || !icon || !spin) return;
  710.  
  711.            function start() { icon.classList.add('d-none'); spin.classList.remove('d-none'); button.disabled = true; }
  712.            function stop() { spin.classList.add('d-none'); icon.classList.remove('d-none'); button.disabled = false; }
  713.  
  714.            form.addEventListener('submit', async function (e) {
  715.                start();
  716.                if (isAjax) {
  717.                    e.preventDefault();
  718.                    await new Promise(function (r) { return setTimeout(r, 1200); });
  719.                    stop();
  720.                } else {
  721.                    setTimeout(function () { if (document.visibilityState === 'visible') stop(); }, 4000);
  722.                }
  723.            });
  724.  
  725.            window.addEventListener('pageshow', stop);
  726.            document.addEventListener('visibilitychange', function () {
  727.                if (document.visibilityState === 'visible') stop();
  728.            });
  729.        });
  730.    })();
  731. </script>
  732.  
  733. <script>
  734.    (function () {
  735.        var btn = document.getElementById('mobileMenuBtn');
  736.        if (!btn) return;
  737.  
  738.        var mounted = false;
  739.        var ocEl = null;
  740.  
  741.        function ensureBootstrap5() { return !!(window.bootstrap && window.bootstrap.Offcanvas); }
  742.  
  743.        function mountOffcanvas() {
  744.            if (mounted) return ocEl;
  745.            var tpl = document.getElementById('mobileOffcanvasTpl');
  746.            if (!tpl) return null;
  747.  
  748.            var frag;
  749.            if ('content' in tpl) {
  750.                frag = tpl.content.cloneNode(true);
  751.            } else {
  752.                var tmp = document.createElement('div');
  753.                tmp.innerHTML = tpl.innerHTML;
  754.                frag = document.createDocumentFragment();
  755.                while (tmp.firstChild) frag.appendChild(tmp.firstChild);
  756.            }
  757.  
  758.            document.body.appendChild(frag);
  759.            ocEl = document.getElementById('offcanvasRight');
  760.            if (!ocEl) return null;
  761.  
  762.            var title = ocEl.querySelector('#offcanvasRightLabel');
  763.            if (!title) {
  764.                var hdr = ocEl.querySelector('.offcanvas-header h5');
  765.                if (hdr) {
  766.                    hdr.id = 'offcanvasRightLabel';
  767.                    ocEl.setAttribute('aria-labelledby', 'offcanvasRightLabel');
  768.                }
  769.            }
  770.  
  771.            mounted = true;
  772.            return ocEl;
  773.        }
  774.  
  775.        btn.addEventListener('click', function (e) {
  776.            e.preventDefault();
  777.            var el = mountOffcanvas();
  778.            if (!el) return;
  779.  
  780.            try {
  781.                if (ensureBootstrap5()) {
  782.                    var oc = bootstrap.Offcanvas.getOrCreateInstance(el);
  783.                    oc.toggle();
  784.                    return;
  785.                }
  786.            } catch (err) {
  787.                /* fall through to basic toggle */
  788.            }
  789.            // Basic fallback (no focus trap/backdrop)
  790.            el.classList.toggle('show');
  791.            el.style.visibility = el.classList.contains('show') ? 'visible' : 'hidden';
  792.        });
  793.  
  794.        var idle = window.requestIdleCallback || function (fn) { return setTimeout(fn, 0); };
  795.        function hydrateIcons() {
  796.            document.querySelectorAll('img[data-defer-src]').forEach(function (img) {
  797.                var s = img.getAttribute('data-defer-src');
  798.                if (s) { img.src = s; img.removeAttribute('data-defer-src'); }
  799.                img.loading = 'lazy';
  800.                img.decoding = 'async';
  801.            });
  802.        }
  803.        if (document.readyState === 'loading') {
  804.            document.addEventListener('DOMContentLoaded', function () { idle(hydrateIcons); }, { once: true });
  805.        } else {
  806.            idle(hydrateIcons);
  807.        }
  808.    })();
  809. </script>
  810.  
  811.            
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819. <section id="sub-navigation" class="d-none d-md-none d-lg-block">
  820.    <div class="flex-row">
  821.        <div style="font-size:0.65vw !important; display:flex; align-items:center; justify-content:center; font-weight:700 !important;">
  822.            <div class="sub-nav d-flex">
  823.                <h1 class="store-title" style="font-size:1.7em !important; font-weight:700 !important; color:#033c73 !important;">Custom Embroidered Apparel</h1>
  824.            </div>
  825.            <div class="sub-nav d-flex">
  826.                <a href="#whats-next" class="page-scroll">
  827.                    <h4 style="font-size:1.7em !important; font-weight:700 !important;">How To Order</h4>
  828.                </a>
  829.            </div>
  830.            <div class="sub-nav d-flex">
  831.                <a href="#bestsellers" class="page-scroll">
  832.                    <h4 style="font-size:1.7em !important; font-weight:700 !important;">Best Sellers</h4>
  833.                </a>
  834.            </div>
  835.            <div class="sub-nav d-flex">
  836.                <a href="/catalog/newarrivals" class="page-scroll">
  837.                    <h4 style="font-size:1.7em !important; font-weight:700 !important;">New Arrivals</h4>
  838.                </a>
  839.            </div>
  840.            <div class="sub-nav d-flex">
  841.                <a href="/catalog/category/workwear-healthcare" class="page-scroll">
  842.                    <h4 style="font-size:1.7em !important; font-weight:700 !important;">Healthcare</h4>
  843.                </a>
  844.            </div>
  845.            <div class="sub-nav d-flex">
  846.                <a href="/printed" class="page-scroll">
  847.                    <h4 style="font-size:1.7em !important; font-weight:700 !important;">Screen Printing</h4>
  848.                </a>
  849.            </div>
  850.        </div>
  851.    </div>
  852. </section>
  853. <div class="clearfix"></div>
  854.  
  855.  
  856.  
  857.  
  858.  
  859. <!-- Bootstrap 5 (grid & buttons) -->
  860. <!-- Rotating two-slide hero (desktop only) -->
  861. <div class="d-none d-lg-block">
  862.    <section id="hero-rotator" class="desktop js-rotator">
  863.        <!-- ---------- Slide 1 ---------- -->
  864.        <div class="hero-slide active">
  865.            <div class="row">
  866.                <div class="col-xxl-6 col-xl-6 col-lg-6">
  867.                    <img ci-src="https://stitchamerica.com/home-images/jacketsale.webp" rel="defer" ci-ratio="1.4" alt="Jacket Sale" />
  868.                </div>
  869.                <div class="col-xxl-6 col-xl-6 col-lg-6 mt-2 d-flex flex-column justify-content-center">
  870.                    <div class="hero-text text-center w-100">
  871.                        <p class="responsive-hero-line3">ALL CUSTOM</p>
  872.                        <p class="responsive-hero-line2" style="text-align:center !important;">JACKETS</p>
  873.                        <p class="responsive-hero-title mt-4">are 10% Off</p>
  874.                        <p class="responsive-hero-line1 mb-5 mt-2">for a limited time.</p>
  875.                        <p class="mt-3">
  876.                            <a href="/catalog/category/custom-embroidered-jackets" class="sa-btn btn-lg">
  877.                                Shop Now &raquo;
  878.                            </a>
  879.                        </p>
  880.                    </div>
  881.                </div>
  882.            </div>
  883.        </div>
  884.  
  885.        <!-- ---------- Slide 2 ---------- -->
  886.        <div class="hero-slide">
  887.                <div class="row">
  888.                    <div class="col-xxl-6 col-xl-6 col-lg-6">
  889.                        <img ci-src="https://stitchamerica.com/home-images/newsweatsale4.webp" rel="defer" ci-ratio="1.4" alt="Sweatshirt Sale" />
  890.                    </div>
  891.                    <div class="col-xxl-6 col-xl-6 col-lg-6 mt-2 d-flex flex-column justify-content-center">
  892.                        <div class="hero-text text-center w-100">
  893.                            <p class="responsive-hero-line3 text-lg-center">ALL CUSTOM</p>
  894.                            <p class="responsive-hero-line2" style="text-align:center !important;">SWEATSHIRTS</p>
  895.                            <p class="responsive-hero-title text-lg-center mt-4">ARE 10% OFF</p>
  896.                            <p class="responsive-hero-line1 mb-5 mt-2">shipped in about 2 weeks.</p>
  897.                            <p class="mt-3">
  898.                                <a href="/catalog/category/custom-embroidered-sweatshirts" class="sa-btn">
  899.                                    Shop Now &raquo;
  900.                                </a>
  901.                            </p>
  902.                        </div>
  903.                    </div>
  904.                </div>
  905.            </div>
  906.  
  907.    </section>
  908. </div>
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917. <div class="d-block d-lg-none d-md-block">
  918.    <section id="mobile-hero-rotator" class="js-rotator">
  919.        <!-- ========== Slide 1 ========== -->
  920.        <div class="m-hero-slide active">
  921.            <div class="thebest" rel="preload" style="background-image: url('https://stitchamerica.com/home-images/jacketsale.webp?func=cover') !important;">
  922.                <div class="row justify-content-center text-center">
  923.                    <p class="phone-hero-text-style-1 justify-content-center text-nowrap" style="margin-top:5px !important;">CUSTOM</p>
  924.                    <p class="phone-hero-text-style-2 justify-content-center">JACKETS</p>
  925.                    <p class="phone-hero-text-style-3 ps-4 pe-4 justify-content-center" style="margin-bottom:6px !important;">10% off all brands/styles</p>
  926.  
  927.                    <a href="/catalog/category/custom-embroidered-jackets" class="sa-btn text-center mx-auto w-50 m-cta justify-content-center">
  928.                        Shop Now &raquo;<br />
  929.                    </a>
  930.                </div>
  931.            </div>
  932.        </div>
  933.  
  934.        <!-- ========== Slide 2 ========== -->
  935.        
  936.    </section>
  937. </div>
  938.  
  939.  
  940.  
  941.  
  942.  
  943. <section class="lightgray-bg">
  944.    <div class="container" id="testimonials">
  945.        <div id="customers-speak">
  946.            <h2 class="pt-3" style="color: #033C73 !important;">Customers Speak</h2>
  947.            <p class="inverse-default" style="background:#033C73 !important;">Read what real customers have to say</p>
  948.        </div>
  949.  
  950.        
  951. <div itemprop="sourceOrganization" itemscope itemtype="https://schema.org/Organization">
  952.    <meta itemprop="name" content="Stitch America" />
  953.    <meta itemprop="legalName" content="Stitch America Inc." />
  954.    <meta itemprop="url" content="https://stitchamerica.com" />
  955.    <div class=".d-none .d-sm-block mb-3 container" itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
  956.        <strong>Composite Rating:</strong>
  957.        <span itemprop="ratingValue"> 5.0</span> of <span itemprop="bestRating"> 5.0</span> (last <span itemprop="reviewCount">4</span> ratings)
  958.    </div>
  959.    <div class="clearfix"></div>
  960.    <div id="container">
  961.        <div class="d-flex flex-wrap justify-content-center">
  962.                    
  963.                        <div class="review" style="width:290px !important; margin-top:2% !important;" itemprop="review" itemscope itemtype="https://schema.org/Review">
  964.                            <div>
  965.                                <div class="twitter mb-3">
  966.                                    <div>
  967.                                        <img src="/home-images/quotes.webp" height="31" width="31" alt="quotes icon" />
  968.                                        <i itemprop="reviewBody"><em>Great!  No complaints!</em></i>
  969.                                    </div>
  970.                                </div>
  971.                                <div class="contrib float-right">
  972.                                    - <span itemprop="author" rel="author">"Steve N."</span><br />
  973.                                    <div itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
  974.                                        <meta itemprop="ratingValue" content="5.0" />
  975.                                        <meta itemprop="bestRating" content="5.0" />
  976.                                        <meta itemprop="worstRating" content="0" />
  977.                                    </div>
  978.                                    <div> rated <img src='/star-images/5stars.webp' alt='5 stars' width='80' height='16' /></div>
  979.                                    <i itemprop="datePublished">October 7, 2025</i>
  980.                                </div>
  981.                            </div>
  982.                        </div>
  983.                    
  984.                    
  985.                        <div class="review" style="width:290px !important; margin-top:2% !important;" itemprop="review" itemscope itemtype="https://schema.org/Review">
  986.                            <div>
  987.                                <div class="twitter mb-3">
  988.                                    <div>
  989.                                        <img src="/home-images/quotes.webp" height="31" width="31" alt="quotes icon" />
  990.                                        <i itemprop="reviewBody"><em>Mary is awesome!!!</em></i>
  991.                                    </div>
  992.                                </div>
  993.                                <div class="contrib float-right">
  994.                                    - <span itemprop="author" rel="author">"Patrick W."</span><br />
  995.                                    <div itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
  996.                                        <meta itemprop="ratingValue" content="5.0" />
  997.                                        <meta itemprop="bestRating" content="5.0" />
  998.                                        <meta itemprop="worstRating" content="0" />
  999.                                    </div>
  1000.                                    <div> rated <img src='/star-images/5stars.webp' alt='5 stars' width='80' height='16' /></div>
  1001.                                    <i itemprop="datePublished">October 7, 2025</i>
  1002.                                </div>
  1003.                            </div>
  1004.                        </div>
  1005.                    
  1006.                    
  1007.                        <div class="review" style="width:290px !important; margin-top:2% !important;" itemprop="review" itemscope itemtype="https://schema.org/Review">
  1008.                            <div>
  1009.                                <div class="twitter mb-3">
  1010.                                    <div>
  1011.                                        <img src="/home-images/quotes.webp" height="31" width="31" alt="quotes icon" />
  1012.                                        <i itemprop="reviewBody"><em>Could not be happier. Hats looked better than I expected </em></i>
  1013.                                    </div>
  1014.                                </div>
  1015.                                <div class="contrib float-right">
  1016.                                    - <span itemprop="author" rel="author">"Jeff H."</span><br />
  1017.                                    <div itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
  1018.                                        <meta itemprop="ratingValue" content="5.0" />
  1019.                                        <meta itemprop="bestRating" content="5.0" />
  1020.                                        <meta itemprop="worstRating" content="0" />
  1021.                                    </div>
  1022.                                    <div> rated <img src='/star-images/5stars.webp' alt='5 stars' width='80' height='16' /></div>
  1023.                                    <i itemprop="datePublished">October 7, 2025</i>
  1024.                                </div>
  1025.                            </div>
  1026.                        </div>
  1027.                    
  1028.                    
  1029.                        <div class="review" style="width:290px !important; margin-top:2% !important;" itemprop="review" itemscope itemtype="https://schema.org/Review">
  1030.                            <div>
  1031.                                <div class="twitter mb-3">
  1032.                                    <div>
  1033.                                        <img src="/home-images/quotes.webp" height="31" width="31" alt="quotes icon" />
  1034.                                        <i itemprop="reviewBody"><em>Great service! Communication was easy. We will definitely order with yall again. </em></i>
  1035.                                    </div>
  1036.                                </div>
  1037.                                <div class="contrib float-right">
  1038.                                    - <span itemprop="author" rel="author">"Mary Ashton B."</span><br />
  1039.                                    <div itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
  1040.                                        <meta itemprop="ratingValue" content="5.0" />
  1041.                                        <meta itemprop="bestRating" content="5.0" />
  1042.                                        <meta itemprop="worstRating" content="0" />
  1043.                                    </div>
  1044.                                    <div> rated <img src='/star-images/5stars.webp' alt='5 stars' width='80' height='16' /></div>
  1045.                                    <i itemprop="datePublished">October 7, 2025</i>
  1046.                                </div>
  1047.                            </div>
  1048.                        </div>
  1049.                    
  1050.  
  1051.        </div>
  1052.    </div>
  1053. </div>
  1054.  
  1055.        <div class="clearfix"></div>
  1056.        <div class="container">
  1057.            <div class="mt-2 mb-2">
  1058.                <p>When you need high-quality custom stitching on hats, shirts, workwear, or anything else, turn to us! Stitch America’s custom embroidery services cover a huge selection of products and we make the process so easy.</p>
  1059.            </div>
  1060.            <a href="/home/testimonials" class="sa-btn">View more testimonials &raquo;</a><br /><br />
  1061.        </div>
  1062.    </div>
  1063. </section>
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070. <section class="dark-bg" style="width:100% !important;">
  1071.    <div id="bestsellers">
  1072.        <div id="bestsellers" class="container">
  1073.            <h2 class="pt-2 text-white">Best Selling Products</h2>
  1074.            <p class="inverse-default" style="background:#033C73 !important;">Read what real customers have to say</p>
  1075.        </div>
  1076.  
  1077.        <div id="best-sellers-app" class="sa-bs-wrapper" data-endpoint="https://customcustomersupport.com/webhook/get-best-sellers/" aria-busy="true">
  1078.    
  1079.  
  1080.    <div class="sa-bs-grid" id="sa-bs-grid" aria-live="polite">
  1081.        <div class="sa-bs-card sa-skeleton">
  1082.            <div class="sa-badge"></div>
  1083.            <div class="sa-img sk"></div>
  1084.            <div class="sa-content">
  1085.                <div class="sk sk-line"></div>
  1086.                <div class="sk sk-line short"></div>
  1087.                <div class="sa-meta">
  1088.                    <span class="sk sk-pill"></span>
  1089.                    <span class="sk sk-pill"></span>
  1090.                </div>
  1091.                <div class="sk sa-btn"></div>
  1092.            </div>
  1093.        </div>
  1094.        <div class="sa-bs-card sa-skeleton">
  1095.            <div class="sa-badge"></div>
  1096.            <div class="sa-img sk"></div>
  1097.            <div class="sa-content">
  1098.                <div class="sk sk-line"></div>
  1099.                <div class="sk sk-line short"></div>
  1100.                <div class="sa-meta">
  1101.                    <span class="sk sk-pill"></span>
  1102.                    <span class="sk sk-pill"></span>
  1103.                </div>
  1104.                <div class="sk sa-btn"></div>
  1105.            </div>
  1106.        </div>
  1107.        <div class="sa-bs-card sa-skeleton">
  1108.            <div class="sa-badge"></div>
  1109.            <div class="sa-img sk"></div>
  1110.            <div class="sa-content">
  1111.                <div class="sk sk-line"></div>
  1112.                <div class="sk sk-line short"></div>
  1113.                <div class="sa-meta">
  1114.                    <span class="sk sk-pill"></span>
  1115.                    <span class="sk sk-pill"></span>
  1116.                </div>
  1117.                <div class="sk sa-btn"></div>
  1118.            </div>
  1119.        </div>
  1120.        <div class="sa-bs-card sa-skeleton">
  1121.            <div class="sa-badge"></div>
  1122.            <div class="sa-img sk"></div>
  1123.            <div class="sa-content">
  1124.                <div class="sk sk-line"></div>
  1125.                <div class="sk sk-line short"></div>
  1126.                <div class="sa-meta">
  1127.                    <span class="sk sk-pill"></span>
  1128.                    <span class="sk sk-pill"></span>
  1129.                </div>
  1130.                <div class="sk sa-btn"></div>
  1131.            </div>
  1132.        </div>
  1133.        <div class="sa-bs-card sa-skeleton">
  1134.            <div class="sa-badge"></div>
  1135.            <div class="sa-img sk"></div>
  1136.            <div class="sa-content">
  1137.                <div class="sk sk-line"></div>
  1138.                <div class="sk sk-line short"></div>
  1139.                <div class="sa-meta">
  1140.                    <span class="sk sk-pill"></span>
  1141.                    <span class="sk sk-pill"></span>
  1142.                </div>
  1143.                <div class="sk sk-btn"></div>
  1144.            </div>
  1145.        </div>
  1146.    </div>
  1147.  
  1148.    <div class="sa-bs-error" id="sa-bs-error" hidden>
  1149.        <div class="sa-error-card">
  1150.            <div class="sa-error-title">Couldn’t load bestsellers</div>
  1151.            <div class="sa-error-sub">Please refresh the page or try again later.</div>
  1152.            <button type="button" class="sa-btn" id="sa-retry">Retry</button>
  1153.        </div>
  1154.    </div>
  1155. </div>
  1156.  
  1157.  
  1158. <script>
  1159.    (function () {
  1160.        "use strict";
  1161.  
  1162.        const root = document.getElementById("best-sellers-app");
  1163.        if (!root) return;
  1164.  
  1165.        const grid = document.getElementById("sa-bs-grid");
  1166.        const err = document.getElementById("sa-bs-error");
  1167.        const retryBtn = document.getElementById("sa-retry");
  1168.        const endpoint = root.dataset.endpoint || "https://customcustomersupport.com/webhook/get-best-sellers/";
  1169.  
  1170.        /* Title Case + Brand removal */
  1171.        function toTitleCase(str) {
  1172.            return String(str).replace(/\w\S*/g, txt =>
  1173.                txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
  1174.            );
  1175.        }
  1176.  
  1177.        function cleanTitle(title, brand) {
  1178.            let t = String(title || "");
  1179.            if (brand) {
  1180.                const brandRegex = new RegExp("\\b" + brand + "\\b", "i");
  1181.                t = t.replace(brandRegex, "").trim();
  1182.            }
  1183.            return toTitleCase(t.replace(/\s{2,}/g, " "));
  1184.        }
  1185.  
  1186.        /* Strip HTML from LongDescription */
  1187.        function stripHtml(str) {
  1188.            if (!str) return "";
  1189.            return String(str).replace(/<\/?[^>]+(>|$)/g, "").replace(/\s+/g, " ").trim();
  1190.        }
  1191.  
  1192.        function productLink(prodNo, title) {
  1193.            const safeTitle = String(title || "").toLowerCase()
  1194.                .replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
  1195.            return "/catalog/product/" + encodeURIComponent(prodNo) + (safeTitle ? ("/" + safeTitle) : "");
  1196.        }
  1197.  
  1198.        // Corrected imageSrc function to use ProdNo for the image path
  1199.        function imageSrc(largePic, prodNo) {
  1200.            const v = String(largePic || "").trim();
  1201.  
  1202.            if (/^https?:\/\//i.test(v)) return v;
  1203.  
  1204.            if (!v || v.toLowerCase() === "largepic" || v.toLowerCase() === "placeholder") {
  1205.                if (prodNo) {
  1206.                    // Use product number as the filename.jpg
  1207.                    return `https://stitchamerica.com/images/${encodeURIComponent(prodNo)}.jpg`;
  1208.                }
  1209.                return "";
  1210.            }
  1211.  
  1212.            // Fallback for other file names
  1213.            return `https://stitchamerica.com/images/${encodeURIComponent(v)}`;
  1214.        }
  1215.  
  1216.        function render(products) {
  1217.            grid.innerHTML = "";
  1218.            products.forEach((p, i) => {
  1219.                const card = document.createElement("article");
  1220.                card.className = "sa-bs-card";
  1221.                card.setAttribute("data-prodno", p.ProdNo);
  1222.  
  1223.                // --- START LOGIC FOR ON SALE PILL (Overrides Rank) ---
  1224.                // Robust check for sale status (true, "true", or "1")
  1225.                const isOnSale = p.OnSale === true || String(p.OnSale).toLowerCase() === "true" || String(p.OnSale) === "1";
  1226.  
  1227.                if (isOnSale) {
  1228.                    // 1. Red "On Sale" Pill (Highest priority, now positioned top right in CSS)
  1229.                    const saleBadge = document.createElement("div");
  1230.                    saleBadge.className = "sa-badge on-sale";
  1231.                    saleBadge.textContent = "On Sale";
  1232.                    card.appendChild(saleBadge);
  1233.                } else {
  1234.                    // 2. Original Rank Badge (Only appears if NOT on sale, positioned top left by default CSS)
  1235.                    const badge = document.createElement("div");
  1236.                    badge.className = "sa-badge";
  1237.                    badge.textContent = "#" + (Number(p.rank) || i + 1);
  1238.                    card.appendChild(badge);
  1239.                }
  1240.                // --- END LOGIC FOR ON SALE PILL ---
  1241.  
  1242.                const imgWrap = document.createElement("a");
  1243.                imgWrap.className = "sa-img";
  1244.                imgWrap.href = productLink(p.ProdNo, p.Title);
  1245.                imgWrap.setAttribute("aria-label", p.Title || p.ProdNo);
  1246.  
  1247.                const image = document.createElement("img");
  1248.                image.loading = "lazy";
  1249.                image.alt = p.AltTag || (p.Brand ? (p.Brand + " " + p.ProdNo) : p.ProdNo);
  1250.                image.src = imageSrc(p.LargePic, p.ProdNo);
  1251.                imgWrap.appendChild(image);
  1252.                card.appendChild(imgWrap);
  1253.  
  1254.                const content = document.createElement("div");
  1255.                content.className = "sa-content";
  1256.  
  1257.                const brand = document.createElement("div");
  1258.                brand.className = "sa-brand";
  1259.                brand.textContent = (p.Brand || "").toUpperCase();
  1260.                content.appendChild(brand);
  1261.  
  1262.                const title = document.createElement("h3");
  1263.                title.className = "sa-title";
  1264.                title.textContent = cleanTitle(p.Title || p.ShortDescription || p.ProdNo, p.Brand);
  1265.                content.appendChild(title);
  1266.  
  1267.                if (p.LongDescription) {
  1268.                    const desc = document.createElement("div");
  1269.                    desc.className = "sa-desc";
  1270.                    desc.textContent = stripHtml(p.LongDescription);
  1271.                    content.appendChild(desc);
  1272.                }
  1273.  
  1274.                const meta = document.createElement("div");
  1275.                meta.className = "sa-meta";
  1276.                const price = document.createElement("span");
  1277.                price.className = "sa-chip sa-price";
  1278.  
  1279.                // --- LOGIC FOR ON SALE PRICE COLOR ---
  1280.                if (isOnSale) {
  1281.                    price.classList.add("on-sale-text"); // Add red color class
  1282.                }
  1283.                // --- END LOGIC FOR ON SALE PRICE COLOR ---
  1284.  
  1285.                /* >>> ONLY CHANGE HERE: ensure " ea." suffix without duplicating <<< */
  1286.                (function setEa(el, raw) {
  1287.                    const base = String(raw || "").replace(/\s*ea\.?$/i, "");
  1288.                    el.textContent = base ? (base + " ea.") : "ea.";
  1289.                })(price, p.Price);
  1290.                meta.appendChild(price);
  1291.  
  1292.                if (p.ColorCount != null) {
  1293.                    const colors = document.createElement("span");
  1294.                    colors.className = "sa-chip";
  1295.                    colors.textContent = (p.ColorCount + " colors");
  1296.                    meta.appendChild(colors);
  1297.                }
  1298.                if (p.SizeScale) {
  1299.                    const size = document.createElement("span");
  1300.                    size.className = "sa-chip";
  1301.                    size.textContent = String(p.SizeScale).toUpperCase();
  1302.                    meta.appendChild(size);
  1303.                }
  1304.                content.appendChild(meta);
  1305.  
  1306.                const actions = document.createElement("div");
  1307.                actions.className = "sa-actions";
  1308.  
  1309.                const viewBtn = document.createElement("a");
  1310.                viewBtn.className = "sa-btn"; /* uses --accent yellow */
  1311.                viewBtn.href = productLink(p.ProdNo, p.Title);
  1312.                viewBtn.textContent = "View Product";
  1313.                actions.appendChild(viewBtn);
  1314.  
  1315.                const skuBtn = document.createElement("button");
  1316.                skuBtn.type = "button";
  1317.                skuBtn.className = "sa-btn secondary";
  1318.                skuBtn.textContent = p.ProdNo || "SKU";
  1319.                skuBtn.title = "Copy ProdNo";
  1320.                skuBtn.addEventListener("click", async () => {
  1321.                    try {
  1322.                        await navigator.clipboard.writeText(p.ProdNo || "");
  1323.                        skuBtn.textContent = "Copied!";
  1324.                        setTimeout(() => skuBtn.textContent = p.ProdNo || "SKU", 1200);
  1325.                    } catch { }
  1326.                });
  1327.                actions.appendChild(skuBtn);
  1328.  
  1329.                content.appendChild(actions);
  1330.                card.appendChild(content);
  1331.                grid.appendChild(card);
  1332.            });
  1333.        }
  1334.  
  1335.        async function load() {
  1336.            root.setAttribute("aria-busy", "true");
  1337.            err.hidden = true;
  1338.            try {
  1339.                // --- UPDATED FETCH TO USE POST METHOD ---
  1340.                const res = await fetch(endpoint, {
  1341.                    method: "POST",
  1342.                    headers: {
  1343.                        "Accept": "application/json",
  1344.                        // Usually needed for POST requests expecting JSON in return
  1345.                        "Content-Type": "application/json"
  1346.                    },
  1347.                    // Add an empty JSON body if no specific data is required for the request
  1348.                    body: JSON.stringify({}),
  1349.                    cache: "no-store"
  1350.                });
  1351.                // ----------------------------------------
  1352.  
  1353.                if (!res.ok) throw new Error("HTTP " + res.status);
  1354.                const data = await res.json();
  1355.                const arr = Array.isArray(data) ? data : [];
  1356.                const sorted = arr.slice().sort((a, b) => (Number(a.rank) || 9999) - (Number(b.rank) || 9999));
  1357.  
  1358.                /* limit to 2 items on mobile (<=639px), else 5 */
  1359.                const isMobile = window.matchMedia && window.matchMedia("(max-width: 639px)").matches;
  1360.                const limit = isMobile ? 2 : 5;
  1361.  
  1362.                let top = sorted.slice(0, limit);
  1363.  
  1364.                /* PATCH: Removed the temporary test data injection block. */
  1365.  
  1366.                render(top);
  1367.            } catch (e) {
  1368.                console.error("Bestsellers fetch error:", e);
  1369.                err.hidden = false;
  1370.            } finally {
  1371.                root.setAttribute("aria-busy", "false");
  1372.            }
  1373.        }
  1374.  
  1375.        if (retryBtn) retryBtn.addEventListener("click", load);
  1376.        document.addEventListener("DOMContentLoaded", load);
  1377.    })();
  1378. </script>
  1379.        <div class="clearfix"></div>
  1380.        <div class="container" id="testimonials">
  1381.            <div class="mt-2 mb-2">
  1382.                <p></p>
  1383.            </div>
  1384.            <a href="/catalog/bestsellers" class="sa-btn">View more bestsellers &raquo;</a><br /><br />
  1385.        </div>
  1386.    </div>
  1387. </section>
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401. <section id="whats-next" class="whats-next lightgray-bg">
  1402.    <div class="container">
  1403.        
  1404.  
  1405.        <h2 class="pt-3" style="color: #033C73 !important;">How To Order</h2>
  1406.        <div>
  1407.            <p class="inverse-default" style="background:#033C73 !important;">Follow these steps<small class="d-none d-sm-block">&nbsp;&nbsp;to get started</small></p>
  1408.        </div>
  1409.        <br />
  1410.  
  1411.        <div class="flex-row d-none d-md-inline-flex justify-content-between">
  1412.  
  1413.            <div class="col-sm-3 d-block-flex m-2 p-1 justify-content-start">
  1414.                <div> <a href="/account/uploadmylogo"><h3 style="color: #033C73 !important;">1. Upload</h3></a></div>
  1415.                <div> <hr /></div>
  1416.                <div> <p class="larger p-1"><strong><a href="/account/uploadmylogo" style="color: #033C73 !important;">Upload</a> your graphic, art, or logo</strong> and we'll provide you a free evaluation within 1 business day.</p></div>
  1417.            </div>
  1418.  
  1419.            <div class="col-sm-3 d-block-flex m-2 p-1">
  1420.                <div> <h3 style="color: #033C73 !important;"><a style="color: #033C73 !important;" href="/catalog/bestsellers">2. Shop</a></h3></div>
  1421.                <div> <hr /></div>
  1422.                <div> <p class="larger p-1"><strong><a href="/catalog/bestsellers" style="color: #033C73 !important;">Select</a> from our extensive selection of products</strong> to have your art or logo custom embroidered on.</p></div>
  1423.            </div>
  1424.  
  1425.  
  1426.            <div class="col-sm-3 d-block-flex m-2 p-1">
  1427.                <div> <h3 style="color: #033C73 !important;">3. Order</h3></div>
  1428.                <div> <hr /></div>
  1429.                <div> <p class="larger p-1">Place your order And <strong>we'll send you a proof</strong> of your final design before we begin production of your items.</p></div>
  1430.            </div>
  1431.  
  1432.  
  1433.            <div class="col-sm-3 d-block-flex m-2 p-1">
  1434.                <div> <h3 style="color: #033C73 !important;">4. Proof</h3></div>
  1435.                <div> <hr /></div>
  1436.                <div> <p class="larger p-1">We'll send a final proof of your design within 4 business days. <strong>If it looks great simply approve it</strong> and we'll start production.</p></div>
  1437.            </div>
  1438.  
  1439.        </div>
  1440.        
  1441.        <div class="flex-row d-block d-md-none">
  1442.            <div class="col-sm-12 d-block-flex m-2 p-2">
  1443.                <div> <a href="/account/uploadmylogo"><h2 class="text-center" style="color: #033C73 !important;">1. Upload</h2></a></div>
  1444.                <div> <p class="larger p-1"><strong><a href="/account/uploadmylogo" style="color: #033C73 !important;">Upload</a> your graphic, art, or logo</strong> and we'll provide you a free evaluation within 1 business day.</p></div>
  1445.                <div> <hr /></div>
  1446.  
  1447.            </div>
  1448.  
  1449.            <div class="col-sm-12 d-block-flex m-2 p-2">
  1450.                <div> <h2 class="text-center"><a href="/catalog/bestsellers" style="color: #033C73 !important;">2. Shop</a></h2></div>
  1451.                <div> <p class="larger p-1"><strong><a href="/catalog/bestsellers" style="color: #033C73 !important;">Select</a> from our extensive selection of products</strong> to have your art or logo custom embroidered on.</p></div>
  1452.                <div> <hr /></div>
  1453.            </div>
  1454.  
  1455.  
  1456.            <div class="col-sm-12 d-block-flex m-2 p-2">
  1457.                <div> <h2 class="text-center" style="color: #033C73 !important;">3. Order</h2></div>
  1458.                <div> <p class="larger p-1">Place your order And <strong>we'll send you a proof</strong> of your final design before we begin production of your items.</p></div>
  1459.                <div> <hr /></div>
  1460.            </div>
  1461.  
  1462.  
  1463.            <div class="col-sm-12 d-block-flex m-2 p-2">
  1464.                <div> <h2 class="text-center" style="color: #033C73 !important;">4. Proof</h2></div>
  1465.                <div> <p class="larger p-1">We'll send a final proof of your design within 4 business days. <strong>If it looks great simply approve it</strong> and we'll start production.</p></div>
  1466.            </div>
  1467.  
  1468.        </div>
  1469.  
  1470.        <div>
  1471.            <p class="inverse-default" style="background:#033C73 !important;">We do the rest!</p>
  1472.        </div>
  1473.        <div class="row m-2">
  1474.            <div class="col-sm-12">
  1475.                <ul class="wn">
  1476.                    <li>*&nbsp;&nbsp;We send you a proof for approval</li>
  1477.                    <li>*&nbsp;&nbsp;We embroider your design to the highest standards</li>
  1478.                    <li>*&nbsp;&nbsp;We carefully inspect And package each item in a poly bag</li>
  1479.                    <li>*&nbsp;&nbsp;We keep you informed about your order via email</li>
  1480.                    <li>*&nbsp;&nbsp;We deliver your order on time And when you want it!</li>
  1481.                </ul>
  1482.            </div>
  1483.        </div>
  1484.        <div>
  1485.            <a href="#" id="upload" class="sa-btn upload-logo mt-3 mb-3" style="color:#000000 !important;">Upload your logo &raquo;</a>
  1486.        </div>
  1487.        <br />
  1488.    </div>
  1489. </section>
  1490.  
  1491.  
  1492.  
  1493.  
  1494. <section id="whats-included">
  1495.    <div class="container">
  1496.        <h2 class="pt-3" style="color: #033C73 !important;">Our Simple Pricing Promise</h2>
  1497.        <div>
  1498.            <p class="inverse-default" style="background:#033C73 !important;">Our Prices Include Everything</p>
  1499.        </div>
  1500.        <div class="row col-sm-12">
  1501.            <ul class="list-unstyled">
  1502.                <li>*&nbsp;&nbsp;<strong>Prices are per item and all-inclusive; no hidden charges</strong></li>
  1503.                <li>*&nbsp;&nbsp;Includes embroidery in one location when you order at least 12**</li>
  1504.                
  1505.                <li>*&nbsp;&nbsp;Includes preparation of your designs (no setup fees)</li>
  1506.                <li>*&nbsp;&nbsp;All items are packaged in a protective poly bag!</li>
  1507.                <li>*&nbsp;&nbsp;Delivered on-time and when you need it</li>
  1508.                <li class="indent small"><small>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**Up to 12,500 stitches</small></li>
  1509.            </ul>
  1510.        </div>
  1511.    </div>
  1512. </section>
  1513.  
  1514.  
  1515. <section id="why-stitch-america" class="bg-white">
  1516.    <div class="container">
  1517.        <div class="row">
  1518.            <div class="col-sm-12">
  1519.                <h2 class="pt-3" style="color: #033C73 !important;">Need the best embroidery?</h2>
  1520.                <p class="inverse-default" style="background:#033C73 !important;">Relax, you've found the source.</p>
  1521.                <p class="lg-text">Welcome to Stitch America, where world-class embroidery is our passion.  Not only are we obsessed with quality embroidery, but we also get rave reviews for our customer service.  Did you know our goal is to have <strong>the largest selection of embroidered products</strong> on the web?  If you're looking for the best value in custom embroidered shirts, headwear, outerwear, jackets, polos, bags and accessories, we've got good news.  You've found it.</p>
  1522.            </div>
  1523.            <div class="col-sm-6">
  1524.                <h3 style="color: #033C73 !important;">Quality. Service. Simple.</h3>
  1525.                <p class="md-text">Our customer service crew draws praise for helpful and thorough attention to our customers.  Our production crew has decades of experience in producing the highest quality.  We control the entire process from preparing your design all the way through packaging to ensure <strong>the highest quality embroidered products</strong> possible. You’ll be kept informed with updates all along. And best of all, we’ll make sure you have it when you need it.</p>
  1526.            </div>
  1527.            <div class="col-sm-6">
  1528.                <h3 style="color: #033C73 !important;">No surprises.</h3>
  1529.                <p class="md-text">Above all, we keep it simple and straight forward.  Don't you hate it when you get to the end and find there's a hidden charge?  Here, there’s <strong>one price that's all inclusive</strong> and it’s plainly displayed for every product.  There’s no setup charge when you order at least 12 (personalization not included). So give us a call, we think you’ll be impressed.</p>
  1530.            </div>
  1531.        </div>
  1532.    </div>
  1533. </section>
  1534.  
  1535. <script>
  1536.    /* Generic slide rotator: find every element with class `js-rotator`
  1537.       and cycle its children that match `.hero-slide, .m-hero-slide`.   */
  1538.    document.addEventListener("DOMContentLoaded", () => {
  1539.        document.querySelectorAll(".js-rotator").forEach((rotator) => {
  1540.            const slides = rotator.querySelectorAll(".hero-slide, .m-hero-slide");
  1541.            if (!slides.length) return;
  1542.  
  1543.            let i = 0;
  1544.            setInterval(() => {
  1545.                slides[i].classList.remove("active");
  1546.                i = (i + 1) % slides.length;
  1547.                slides[i].classList.add("active");
  1548.            }, 5000); // 5 000 ms = 5 s
  1549.        });
  1550.    });
  1551. </script>
  1552.  
  1553.  
  1554.  
  1555.  
  1556.  
  1557.            
  1558.  
  1559.  
  1560.  
  1561. <!--Beginning of Footer-->
  1562. <footer>
  1563.    <div class="bg-primary light-bg d-none d-sm-block">
  1564.        <div class="container">
  1565.            <div class="flex-row d-flex">
  1566.                <div class="d-flex col-lg-2 d-none d-lg-block pe-lg-5">
  1567.                    <a href="/">
  1568.                        <img rel="defer" style="max-width:146px;" width="146" height="107" loading="lazy" src="https://d2zg6owwd9zpf3.cloudfront.net/salogosmall.webp" ci-params="func=fit" alt="Stitch America Flag" ci-do-not-replace-url="true" />
  1569.                    </a>
  1570.                </div>
  1571.                <div class="d-flex col-lg-9 col-sm-12 col-xs-12 col-md-12 mt-2">
  1572.                    <div>
  1573.                        <p class="lightblue-headline">It's Quality. It's Service. It's Simple.</p>
  1574.                        <p class="lightblue-footer-text">
  1575.                            Our goal is to provide our customers with the best value on embroidered products.  We aim to please and we know that you'll love our friendly service, huge selection, great quality and low prices.
  1576.                        </p>
  1577.                    </div>
  1578.                </div>
  1579.            </div>
  1580.        </div>
  1581.    </div>
  1582.  
  1583.    <div class="dark-bg">
  1584.        <div class="container">
  1585.            <div class="flex-row d-none d-md-flex justify-content-between pt-3">
  1586.                <div class="d-flex d-none d-lg-block">
  1587.                    <ul>
  1588.                        <li><a href="/service/returns">Returns</a></li>
  1589.                        <li><a href="/service/guarantee">Guarantee</a></li>
  1590.                        <li><a href="/service/termsandconditions">Terms of Use</a></li>
  1591.                        <li><a href="/service/privacy">Privacy Policy</a></li>
  1592.                        <li><a href="/service/security">Security</a></li>
  1593.                    </ul>
  1594.                </div>
  1595.                <div class="d-flex d-none d-md-block">
  1596.                    <ul>
  1597.                        <li><a href="/account/myaccount">My Account</a></li>
  1598.                        <li><a href="/account/myproducts">My Products</a></li>
  1599.                        <li><a href="/account/myorders">My Orders</a></li>
  1600.                        <li><a href="/account/mydesigns">My Designs</a></li>
  1601.                        <li><a href="/account/myartwork">My Artwork</a></li>
  1602.                    </ul>
  1603.                </div>
  1604.  
  1605.                <div class="d-block">
  1606.                    <p class="headline text-center">
  1607.                        "Talk to an embroidery expert."<br />
  1608.                        <strong>8:30am - 5:30pm ET</strong><br />
  1609.                    <p class="phonenumber">
  1610.                        <a class="pt-2 align-content-center" href="tel:770-537-4357"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/phone2.webp" width="31" height="31" alt="phone icon" aria-label="phone number link" />  770-537-4357</a>
  1611.                    </p>
  1612.                </div>
  1613.                <div class="d-flex d-none d-lg-block">
  1614.                    <ul>
  1615.                        <li><a href="/catalog/category/shirts-polos">Polos</a></li>
  1616.                        <li><a href="/catalog/category/shirts-t-shirts">T Shirts</a></li>
  1617.                        <li><a href="/catalog/category/shirts-denim">Denim Shirts</a></li>
  1618.                        <li><a href="/catalog/ladiesshirts">Ladies Shirts</a></li>
  1619.                        <li><a href="/catalog/category/headwear-flexfit">Flexfit Hats</a></li>
  1620.                    </ul>
  1621.                </div>
  1622.                <div class="d-flex d-none d-md-block">
  1623.                    <ul>
  1624.  
  1625.                        <li><a href="/service">Help</a></li>
  1626.                        <li><a href="/blog">Blog</a></li>
  1627.                        <li><a href="/home/testimonials">Testimonials</a></li>
  1628.                        <li><a href="/service/sitemap">Site Map</a></li>
  1629.                    </ul>
  1630.                </div>
  1631.            </div>
  1632.  
  1633.            <div class="flex-row d-block d-md-none justify-content-center pt-3">
  1634.  
  1635.                <p class="headline text-center">
  1636.                    "Talk to an embroidery expert."<br />
  1637.                    <strong>8:00am - 5:00pm ET</strong><br />
  1638.                <p class="phonenumber">
  1639.                    <a class="pt-1" href="tel:770-537-4357"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/phone2.webp" width="31" height="31" alt="phone icon" aria-label="phone link" />  770-537-4357</a>
  1640.                </p>
  1641.            </div>
  1642.  
  1643.  
  1644.  
  1645.            <div class="d-flex flex-row justify-content-center">
  1646.                <div class="col-sm-12 credits">
  1647.                    <a href="https://www.facebook.com/stitchamerica" target="_blank" rel="noopener noreferrer"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/facebook.webp" width="21" height="21" alt="facebook icon" aria-label="fackebook link" /></a>&nbsp;&nbsp;
  1648.                    <a href="https://www.linkedin.com/company/stitch-america-inc/mycompany/" target="_blank" rel="noopener noreferrer"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/linkdin.webp" width="21" height="21" alt="linkdin icon" aria-label="linkdin link" /></a>&nbsp;&nbsp;
  1649.                    <a href="https://www.youtube.com/@StitchamericaEmbroidery" target="_blank" rel="noopener noreferrer"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/youtube.webp" width="21" height="21" alt="youtube icon" aria-label="youtube link" /></a>&nbsp;&nbsp;
  1650.                    <a href="https://www.pinterest.com/stitchamerica/" target="_blank" rel="noopener noreferrer"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/pinterest.webp" alt="pinterest icon" width="21" height="21" aria-label="pinterest link" /></a>
  1651.                    <a href="/service/contact" class="contact-us"><img rel="defer" loading="lazy" src="https://d24bg2vhmgisg5.cloudfront.net/email21.webp" width="21" height="21" alt="email icon" aria-label="email link" /></a>
  1652.  
  1653.                    <div class="justify-content-center pt-1">
  1654.                        &copy; Stitch America Inc., All rights reserved., Since 1996
  1655.                    </div>
  1656.                </div>
  1657.            </div>
  1658.  
  1659.        </div>
  1660.    </div>
  1661. </footer>
  1662.  
  1663.  
  1664.        </div>
  1665.    </div>
  1666.    <script rel="defer" src="https://cdn.scaleflex.it/plugins/js-cloudimage-responsive/latest/js-cloudimage-responsive.min.js?func=proxy"></script>
  1667.    <script>
  1668.        const ciResponsive = new window.CIResponsive({
  1669.            token: 'cdvvuizira',
  1670.            apiVersion: null
  1671.        });
  1672.    </script>
  1673.    <script src="/scripts/jquery-3.7.1.min.js"></script>
  1674.    <script src="/scripts/stitch-america.min.js"></script>
  1675.  
  1676.    <script src="/bundles/bootstrap?v=dJwGBhkA_dd-KrU850SP249NglVNFpT584TwoTrGVek1"></script>
  1677.  
  1678.  
  1679.    
  1680.    <script src="/bundles/home?v=L4TMFjF9CEPDrXLUhhqnG9f_50meZ4VlDGOyBMHLzjU1"></script>
  1681.  
  1682.  
  1683.  
  1684.  
  1685.            
  1686.                <script async src="/scripts/getwindowsize.min.js"></script>
  1687.            
  1688.  
  1689.  
  1690.    <img rel="defer" class="spinner" src="https://d24bg2vhmgisg5.cloudfront.net/spinner.gif" alt="working ..." />
  1691.  
  1692.  
  1693.  
  1694.  
  1695.    <script rel="defer">
  1696.        (() => {
  1697.            const WEBHOOK_URL = "https://customcustomersupport.com/webhook/stitch-search-results";
  1698.            const RESULTS_PATH = "/search/Index";
  1699.            const STORAGE_KEY = "stitchSearchResults";
  1700.            const META_KEY = STORAGE_KEY + ":meta";
  1701.            const MAX_AGE_MS = 30 * 1000; // cache window for instant handoff
  1702.  
  1703.            function buildResultsUrl(q) {
  1704.                const u = new URL(RESULTS_PATH, location.origin);
  1705.                if (q) u.searchParams.set("q", q);
  1706.                return u.toString();
  1707.            }
  1708.  
  1709.            function stripFence(s) {
  1710.                const m = String(s || '').match(/```(?:json)?\s*([\s\S]*?)\s*```/i);
  1711.                return m ? m[1] : s;
  1712.            }
  1713.  
  1714.            // Understands your webhook envelopes
  1715.            function extractItemsFromWebhook(json) {
  1716.                try {
  1717.                    if (Array.isArray(json) && json[0]?.response?.body) {
  1718.                        const body = json[0].response.body;
  1719.                        const first = Array.isArray(body) ? body[0] : body;
  1720.                        if (first && typeof first.output === 'string') {
  1721.                            return JSON.parse(stripFence(first.output));
  1722.                        }
  1723.                    }
  1724.                } catch { }
  1725.                if (Array.isArray(json)) return json;
  1726.                if (json && typeof json.output === 'string') {
  1727.                    try { return JSON.parse(stripFence(json.output)); } catch { }
  1728.                }
  1729.                if (Array.isArray(json?.items)) return json.items;
  1730.                if (Array.isArray(json?.data)) return json.data;
  1731.                return null;
  1732.            }
  1733.  
  1734.            async function parseAgentResponse(res) {
  1735.                if (!res || res.status === 204) return null;
  1736.                const text = await res.text().catch(() => "");
  1737.                if (!text.trim()) return null;
  1738.  
  1739.                // Try JSON → extract
  1740.                try {
  1741.                    const j = JSON.parse(text.replace(/^\uFEFF/, ''));
  1742.                    const items = extractItemsFromWebhook(j);
  1743.                    if (items) return items;
  1744.                } catch { }
  1745.  
  1746.                // Try fenced JSON string
  1747.                try { return JSON.parse(stripFence(text)); } catch { }
  1748.                return null;
  1749.            }
  1750.  
  1751.            // Prefer GET (no preflight); fallback to POST if needed
  1752.            async function callWebhook(query) {
  1753.                // GET first
  1754.                try {
  1755.                    const url = WEBHOOK_URL + "?q=" + encodeURIComponent(query);
  1756.                    const res = await fetch(url, { headers: { "Accept": "application/json" } });
  1757.                    const items = await parseAgentResponse(res);
  1758.                    if (items) return items;
  1759.                } catch { }
  1760.  
  1761.                // Fallback: POST (may trigger preflight)
  1762.                try {
  1763.                    const res = await fetch(WEBHOOK_URL, {
  1764.                        method: "POST",
  1765.                        headers: { "Content-Type": "application/json" },
  1766.                        body: JSON.stringify({ text: query })
  1767.                    });
  1768.                    return await parseAgentResponse(res);
  1769.                } catch {
  1770.                    return null;
  1771.                }
  1772.            }
  1773.  
  1774.            // Event delegation: bind once, no MutationObserver
  1775.            function onSubmit(e) {
  1776.                const form = e.target;
  1777.                if (!(form && form.matches && form.matches('form[data-stitch-search]'))) return;
  1778.                e.preventDefault();
  1779.                const input = form.querySelector('input[name="q"], input#q');
  1780.                const q = (input && input.value || "").trim();
  1781.  
  1782.                (async () => {
  1783.                    try {
  1784.                        const payload = q ? await callWebhook(q) : null;
  1785.                        if (payload != null) {
  1786.                            sessionStorage.setItem(STORAGE_KEY, JSON.stringify(payload));
  1787.                            sessionStorage.setItem(META_KEY, JSON.stringify({ q, ts: Date.now() }));
  1788.                        } else {
  1789.                            sessionStorage.removeItem(STORAGE_KEY);
  1790.                            sessionStorage.removeItem(META_KEY);
  1791.                        }
  1792.                    } finally {
  1793.                        location.href = buildResultsUrl(q);
  1794.                    }
  1795.                })();
  1796.            }
  1797.  
  1798.            function init() {
  1799.                document.addEventListener('submit', onSubmit, true);
  1800.            }
  1801.  
  1802.            (document.readyState === 'loading')
  1803.                ? document.addEventListener('DOMContentLoaded', init, { once: true })
  1804.                : init();
  1805.        })();
  1806.    </script>
  1807.  
  1808.  
  1809.  
  1810.  
  1811.    <script type="module" defer>
  1812.        import Chatbot from "https://cdn.n8nchatui.com/v1/pole-embed-yard.js";
  1813.  
  1814.        // ---------- config you already use ----------
  1815.        var CHAT_W = 400;
  1816.        var CHAT_H = 600;
  1817.        var LAUNCHER_LEFT = 20;
  1818.        var LAUNCHER_BOTTOM = 20;
  1819.  
  1820.        // ---------- localStorage helpers ----------
  1821.        var LS_KEY = "sa_chat_lead_v1";
  1822.        function getLead() { try { return JSON.parse(localStorage.getItem(LS_KEY) || "{}") || {}; } catch (e) { return {}; } }
  1823.        function setLead(v) { localStorage.setItem(LS_KEY, JSON.stringify(v || {})); }
  1824.  
  1825.        // ---------- styles ----------
  1826.        var css =
  1827.            ".sa-prechat-gate{position:fixed;z-index:2147483000;display:none;width:" + CHAT_W + "px;height:auto;max-width:calc(100vw - 40px);left:auto;right:" + (LAUNCHER_LEFT) + "px;bottom:" + (LAUNCHER_BOTTOM + 90) + "px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 8px 28px rgba(0,0,0,.15);font-family:system-ui,Segoe UI,Roboto,Arial,sans-serif}" +
  1828.            ".sa-prechat-head{padding:10px 12px;border-bottom:1px solid #eef2f7;background:#f9fafb;border-radius:12px 12px 0 0;font-weight:600}" +
  1829.            ".sa-prechat-body{padding:12px;display:flex;gap:10px;flex-wrap:wrap}" +
  1830.            ".sa-prechat-body .grp{display:flex;flex-direction:column;gap:6px;min-width:150px;flex:1 1 0}" +
  1831.            ".sa-prechat-body label{font-size:12px;color:#374151}" +
  1832.            ".sa-prechat-body input{height:38px;border:1px solid #e5e7eb;border-radius:8px;padding:8px 10px;outline:none}" +
  1833.            ".sa-prechat-body input:focus{border-color:#93c5fd;box-shadow:0 0 0 3px rgba(147,197,253,.35)}" +
  1834.            ".sa-prechat-foot{display:flex;justify-content:flex-end;gap:8px;padding:12px;border-top:1px solid #eef2f7}" +
  1835.            ".sa-btn{height:38px;border-radius:8px;border:1px solid #ddd;background:#f3f4f6;padding:0 12px;cursor:pointer}" +
  1836.            ".sa-btn.primary{background:#2c9ad9;border-color:#2c9ad9;color:#fff}" +
  1837.            ".sa-btn[disabled]{opacity:.5;cursor:not-allowed}" +
  1838.            ".sa-launcher-block{position:fixed;z-index:2147482000;right:" + (LAUNCHER_LEFT) + "px;bottom:" + (LAUNCHER_BOTTOM) + "px;width:75px;height:75px;border-radius:50%;background:transparent}" +
  1839.            "@media (max-width:480px){.sa-prechat-gate{right:10px;left:10px;width:auto;bottom:" + (LAUNCHER_BOTTOM + 80) + "px}}";
  1840.        var style = document.createElement("style");
  1841.        style.textContent = css;
  1842.        document.head.appendChild(style);
  1843.  
  1844.        // ---------- build pre-chat gate ----------
  1845.        var gate = document.createElement("div");
  1846.        gate.className = "sa-prechat-gate";
  1847.        gate.innerHTML =
  1848.            '<div class="sa-prechat-head">Before we start</div>' +
  1849.            '<div class="sa-prechat-body">' +
  1850.            '<div class="grp"><label for="saLeadName">Name</label><input id="saLeadName" type="text" placeholder="Your name"></div>' +
  1851.            '<div class="grp"><label for="saLeadPhone">Phone</label><input id="saLeadPhone" type="tel" placeholder="(555) 123-4567"></div>' +
  1852.            '</div>' +
  1853.            '<div class="sa-prechat-foot">' +
  1854.            '<button class="sa-btn" id="saGateCancel">Cancel</button>' +
  1855.            '<button class="sa-btn primary" id="saGateStart" disabled>Start Chat</button>' +
  1856.            '</div>';
  1857.        document.body.appendChild(gate);
  1858.  
  1859.        // An invisible blocker that sits on top of the real launcher until we’re ready
  1860.        var blocker = document.createElement("div");
  1861.        blocker.className = "sa-launcher-block";
  1862.        document.body.appendChild(blocker);
  1863.  
  1864.        // restore saved values
  1865.        var saved = getLead();
  1866.        var nameEl = gate.querySelector("#saLeadName");
  1867.        var phoneEl = gate.querySelector("#saLeadPhone");
  1868.        if (saved.name) nameEl.value = saved.name;
  1869.        if (saved.phone) phoneEl.value = saved.phone;
  1870.  
  1871.        // simple validators
  1872.        function ok() {
  1873.            var n = (nameEl.value || "").trim();
  1874.            var p = (phoneEl.value || "").trim();
  1875.            return n.length >= 2 && p.length >= 7;
  1876.        }
  1877.        function syncButtons() {
  1878.            gate.querySelector("#saGateStart").disabled = !ok();
  1879.        }
  1880.        nameEl.addEventListener("input", syncButtons);
  1881.        phoneEl.addEventListener("input", syncButtons);
  1882.        syncButtons();
  1883.  
  1884.        // show gate
  1885.        function openGate() { gate.style.display = "block"; }
  1886.        function closeGate() { gate.style.display = "none"; }
  1887.  
  1888.        // when the fake blocker is clicked, show the gate instead of opening chat
  1889.        blocker.addEventListener("click", function (e) {
  1890.            e.preventDefault(); e.stopPropagation();
  1891.            openGate();
  1892.        });
  1893.  
  1894.        // cancel -> hide gate, keep launcher blocked
  1895.        gate.querySelector("#saGateCancel").addEventListener("click", function () {
  1896.            closeGate();
  1897.        });
  1898.  
  1899.        // start -> save lead, set metadata, open chat, remove blocker
  1900.        gate.querySelector("#saGateStart").addEventListener("click", function () {
  1901.            var lead = { name: (nameEl.value || "").trim(), phone: (phoneEl.value || "").trim() };
  1902.            setLead(lead);
  1903.  
  1904.            try { Chatbot && Chatbot.setMetadata && Chatbot.setMetadata({ lead: lead }); } catch (e) { }
  1905.            closeGate();
  1906.  
  1907.            // try to open programmatically; fall back to clicking the real launcher
  1908.            var opened = false;
  1909.            try { if (Chatbot && Chatbot.open) { Chatbot.open(); opened = true; } } catch (e) { }
  1910.            if (!opened) {
  1911.                // Try to click the underlying launcher (may live in shadow)
  1912.                // We just remove our blocker and the user can click again if needed
  1913.            }
  1914.            // Allow real launcher to be clickable from now on
  1915.            blocker.parentNode && blocker.parentNode.removeChild(blocker);
  1916.        });
  1917.  
  1918.        // ---------- init chat (your config) ----------
  1919.        var initial = getLead();
  1920.        Chatbot.init({
  1921.            "n8nChatUrl": "https://customcustomersupport.com/webhook/6ee34599-87e0-46f4-9bbd-88cdd14a7d75/chat",
  1922.            "metadata": { lead: { name: initial.name || "", phone: initial.phone || "" } },
  1923.            "theme": {
  1924.                "button": {
  1925.                    "backgroundColor": "#033c73",
  1926.                    "left": LAUNCHER_LEFT,
  1927.                    "bottom": LAUNCHER_BOTTOM,
  1928.                    "size": 75,
  1929.                    "iconColor": "#ffffff",
  1930.                    "customIconSrc": "https://stitchamerica.com/home-images/chatagent.webp",
  1931.                    "customIconSize": 100,
  1932.                    "customIconBorderRadius": 17,
  1933.                    "autoWindowOpen": { "autoOpen": false, "openDelay": 2 },
  1934.                    "borderRadius": "rounded"
  1935.                },
  1936.                "tooltip": {
  1937.                    "showTooltip": true,
  1938.                    "tooltipMessage": "Custom embroidery is included in our prices. Let me know if you have any questions.",
  1939.                    "tooltipBackgroundColor": "#e9ecef",
  1940.                    "tooltipTextColor": "#1c1c1c",
  1941.                    "tooltipFontSize": 17
  1942.                },
  1943.                "chatWindow": {
  1944.                    "borderRadiusStyle": "rounded",
  1945.                    "avatarBorderRadius": 25,
  1946.                    "messageBorderRadius": 6,
  1947.                    "showTitle": true,
  1948.                    "title": "Stitch America Chat",
  1949.                    "titleAvatarSrc": "https://d2zg6owwd9zpf3.cloudfront.net/saflagphoneheader.webp",
  1950.                    "avatarSize": 40,
  1951.                    "welcomeMessage": "How can I help?",
  1952.                    "errorMessage": "Something is wrong. I can't chat right now, I'm sorry.",
  1953.                    "backgroundColor": "#ffffff",
  1954.                    "height": CHAT_H,
  1955.                    "width": CHAT_W,
  1956.                    "fontSize": 16,
  1957.                    "starterPrompts": ["What is your minimum?", "How long does it take?"],
  1958.                    "starterPromptFontSize": 14,
  1959.                    "renderHTML": false,
  1960.                    "clearChatOnReload": false,
  1961.                    "showScrollbar": false,
  1962.                    "botMessage": {
  1963.                        "backgroundColor": "#2c9ad9",
  1964.                        "textColor": "#fafafa",
  1965.                        "showAvatar": true,
  1966.                        "avatarSrc": "https://stitchamerica.com/home-images/chatagent.webp"
  1967.                    },
  1968.                    "userMessage": {
  1969.                        "backgroundColor": "#e9ecef",
  1970.                        "textColor": "#000000",
  1971.                        "showAvatar": true,
  1972.                        "avatarSrc": "https://stitchamerica.com/home-images/chatusericon.gif"
  1973.                    },
  1974.                    "textInput": {
  1975.                        "placeholder": "Enter your question here:",
  1976.                        "backgroundColor": "#ffffff",
  1977.                        "textColor": "#1e1e1f",
  1978.                        "sendButtonColor": "#2c9ad9",
  1979.                        "maxChars": 250,
  1980.                        "maxCharsWarningMessage": "You exceeded the characters limit. Please input less than 250 characters.",
  1981.                        "autoFocus": false,
  1982.                        "borderRadius": 6,
  1983.                        "sendButtonBorderRadius": 50
  1984.                    },
  1985.                    "footer": {
  1986.                        "text": "Powered By",
  1987.                        "company": "Stitch America",
  1988.                        "companyLink": "https://stitchamerica.com"
  1989.                    }
  1990.                }
  1991.            },
  1992.            "callbackRegistry": {
  1993.                "beforeSubmit": function (args) {
  1994.                    var md = (args && args.metadata) ? args.metadata : {};
  1995.                    var latest = getLead();
  1996.                    md.lead = { name: latest.name || "", phone: latest.phone || "" };
  1997.                    return { metadata: md };
  1998.                }
  1999.            }
  2000.        });
  2001.  
  2002.        // If the chat auto-opens anywhere, be sure metadata is current
  2003.        try {
  2004.            Chatbot && Chatbot.on && Chatbot.on("open", function () {
  2005.                try { Chatbot.setMetadata && Chatbot.setMetadata({ lead: getLead() }); } catch (e) { }
  2006.            });
  2007.        } catch (e) { }
  2008.    </script>
  2009.  
  2010.      
  2011.    
  2012.  
  2013. </body>
  2014. </html>
  2015.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda