[object Object]

← back to CelebritySignatures

wear: add all-over-print signature shirts (camp button-up + long-sleeve) — TK-10286

3693ec39dd4f92b55a72fb1982b20c818506b8e7 · 2026-09-09 10:52:09 -0700 · Steve

Steve's reference was a button-up covered edge-to-edge in tone-on-tone signature
script; add it as product options. POD reality: Printify AOP cut-and-sew,
sublimation (printed tone-on-tone, not woven jacquard). Two blueprints:
 - Signature Camp Shirt  = #1533 (MWW On Demand), short-sleeve button-up
 - Signature Long-Sleeve = #1261 (Miami Sublimation), pullover
New AOP render path in wear.html (paintAllover): tiles the selected signature
edge-to-edge, staggered + tone-on-tone, clipped to the garment silhouette via a
background-keyed mask (threshold 80 + 3px erode = no off-fabric bleed). Bases are
the official blank flat-lay front mockups. saleEnabled:false / priceUsd:null until
Printify config + go-live (TK-10286 Steve gate); real variant IDs recorded.
Verified live in-browser (verification/live-aop-*.jpg), zero console errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7

Files touched

Diff

commit 3693ec39dd4f92b55a72fb1982b20c818506b8e7
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Sep 9 10:52:09 2026 -0700

    wear: add all-over-print signature shirts (camp button-up + long-sleeve) — TK-10286
    
    Steve's reference was a button-up covered edge-to-edge in tone-on-tone signature
    script; add it as product options. POD reality: Printify AOP cut-and-sew,
    sublimation (printed tone-on-tone, not woven jacquard). Two blueprints:
     - Signature Camp Shirt  = #1533 (MWW On Demand), short-sleeve button-up
     - Signature Long-Sleeve = #1261 (Miami Sublimation), pullover
    New AOP render path in wear.html (paintAllover): tiles the selected signature
    edge-to-edge, staggered + tone-on-tone, clipped to the garment silhouette via a
    background-keyed mask (threshold 80 + 3px erode = no off-fabric bleed). Bases are
    the official blank flat-lay front mockups. saleEnabled:false / priceUsd:null until
    Printify config + go-live (TK-10286 Steve gate); real variant IDs recorded.
    Verified live in-browser (verification/live-aop-*.jpg), zero console errors.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
---
 data/wear-templates.json                        | 102 +++++++++++++++++++++++-
 public/assets/garments/aop-camp-white.jpg       | Bin 0 -> 190475 bytes
 public/assets/garments/aop-longsleeve-white.jpg | Bin 0 -> 114492 bytes
 public/wear.html                                |  56 ++++++++++++-
 verification/live-aop-camp-shirt.jpg            | Bin 0 -> 282245 bytes
 verification/live-aop-longsleeve-shirt.jpg      | Bin 0 -> 261253 bytes
 verification/live-aop-sheet.jpg                 | Bin 0 -> 32068 bytes
 verification/proof-aop-camp.jpg                 | Bin 0 -> 290440 bytes
 verification/proof-aop-long.jpg                 | Bin 0 -> 266344 bytes
 verification/proof-aop-sheet.jpg                | Bin 0 -> 32945 bytes
 10 files changed, 156 insertions(+), 2 deletions(-)

diff --git a/data/wear-templates.json b/data/wear-templates.json
index 74a2276..2e7359f 100644
--- a/data/wear-templates.json
+++ b/data/wear-templates.json
@@ -429,6 +429,106 @@
         }
       },
       "catalogVerifiedAt": "2026-09-09T15:37:19.327Z"
+    },
+    {
+      "id": "aop-camp-shirt",
+      "label": "Signature Camp Shirt",
+      "priceUsd": null,
+      "saleEnabled": false,
+      "placement": "all_over",
+      "placementLabel": "Signature printed all over the shirt.",
+      "sizes": [
+        "XS",
+        "S",
+        "M",
+        "L",
+        "XL",
+        "2XL"
+      ],
+      "photoWidth": 2048,
+      "photoHeight": 2048,
+      "allover": true,
+      "alloverScale": 0.185,
+      "alloverOpacity": 0.5,
+      "colors": [
+        {
+          "id": "print",
+          "label": "All-over signature",
+          "hex": "#f1efe8",
+          "photo": "/assets/garments/aop-camp-white.jpg"
+        }
+      ],
+      "_note": "TK-10286, 2026-09-09: all-over-print signature shirt added per Steve (reference = a button-up covered edge-to-edge in tone-on-tone script; \"include that in product options\", chose BOTH the camp button-up and the long-sleeve). POD reality: Printify AOP cut-and-sew, sublimation on 100%% polyester (a printed tone-on-tone script, not a woven jacquard). Base = official blank flat-lay front mockup. Preview tiles the selected signature edge-to-edge, clipped to the garment silhouette (paintAllover() in wear.html, allover:true). saleEnabled stays false + priceUsd null until real cost, Printify product config, and go-live approval are verified (TK-10286 Steve gate).",
+      "photoSource": "printify blueprint 1533 image#5 (flat blank front)",
+      "printify": {
+        "blueprintId": 1533,
+        "printProviderId": 10,
+        "printPosition": {
+          "placeholder": "front",
+          "allover": true
+        },
+        "variants": {
+          "XS": 110145,
+          "S": 110146,
+          "M": 110147,
+          "L": 110148,
+          "XL": 110149,
+          "2XL": 110150
+        }
+      },
+      "catalogVerifiedAt": "2026-09-09T18:10:00.000Z"
+    },
+    {
+      "id": "aop-longsleeve-shirt",
+      "label": "Signature Long-Sleeve",
+      "priceUsd": null,
+      "saleEnabled": false,
+      "placement": "all_over",
+      "placementLabel": "Signature printed all over the shirt (pullover).",
+      "sizes": [
+        "XS",
+        "S",
+        "M",
+        "L",
+        "XL",
+        "2XL",
+        "3XL",
+        "4XL"
+      ],
+      "photoWidth": 2048,
+      "photoHeight": 2048,
+      "allover": true,
+      "alloverScale": 0.17,
+      "alloverOpacity": 0.5,
+      "colors": [
+        {
+          "id": "print",
+          "label": "All-over signature",
+          "hex": "#f1efe8",
+          "photo": "/assets/garments/aop-longsleeve-white.jpg"
+        }
+      ],
+      "_note": "TK-10286, 2026-09-09: all-over-print signature shirt added per Steve (reference = a button-up covered edge-to-edge in tone-on-tone script; \"include that in product options\", chose BOTH the camp button-up and the long-sleeve). POD reality: Printify AOP cut-and-sew, sublimation on 100%% polyester (a printed tone-on-tone script, not a woven jacquard). Base = official blank flat-lay front mockup. Preview tiles the selected signature edge-to-edge, clipped to the garment silhouette (paintAllover() in wear.html, allover:true). saleEnabled stays false + priceUsd null until real cost, Printify product config, and go-live approval are verified (TK-10286 Steve gate).",
+      "photoSource": "printify blueprint 1261 image#0 (flat blank front)",
+      "printify": {
+        "blueprintId": 1261,
+        "printProviderId": 47,
+        "printPosition": {
+          "placeholder": "front",
+          "allover": true
+        },
+        "variants": {
+          "XS": 95121,
+          "S": 95122,
+          "M": 95123,
+          "L": 95124,
+          "XL": 95125,
+          "2XL": 95126,
+          "3XL": 95127,
+          "4XL": 95128
+        }
+      },
+      "catalogVerifiedAt": "2026-09-09T18:10:00.000Z"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/public/assets/garments/aop-camp-white.jpg b/public/assets/garments/aop-camp-white.jpg
new file mode 100644
index 0000000..4928db1
Binary files /dev/null and b/public/assets/garments/aop-camp-white.jpg differ
diff --git a/public/assets/garments/aop-longsleeve-white.jpg b/public/assets/garments/aop-longsleeve-white.jpg
new file mode 100644
index 0000000..f019358
Binary files /dev/null and b/public/assets/garments/aop-longsleeve-white.jpg differ
diff --git a/public/wear.html b/public/wear.html
index b5539c4..a3c7488 100644
--- a/public/wear.html
+++ b/public/wear.html
@@ -518,6 +518,59 @@ function paintSignatures(ctx, g, col, tx, ty, s){
   }
 }
 
+// ---- all-over-print (AOP) render ----
+// Cache of garment silhouette masks, keyed by photo URL. An AOP garment tiles
+// the signature edge-to-edge; we key out the flat photo's plain backdrop so the
+// tiled script lands ONLY on fabric (body + sleeves + collar), never the ground.
+const _maskCache = {};
+function garmentMask(photoImg, w, h, key){
+  if (_maskCache[key]) return _maskCache[key];
+  const oc = document.createElement('canvas'); oc.width = w; oc.height = h;
+  const octx = oc.getContext('2d'); octx.drawImage(photoImg, 0, 0, w, h);
+  const id = octx.getImageData(0, 0, w, h), d = id.data;
+  let br=0, bg=0, bb=0;                     // backdrop = mean of the 4 corners
+  for (const [cx,cy] of [[0,0],[w-1,0],[0,h-1],[w-1,h-1]]){ const o=(cy*w+cx)*4; br+=d[o]; bg+=d[o+1]; bb+=d[o+2]; }
+  br/=4; bg/=4; bb/=4;
+  // threshold well above the soft drop-shadow (shirt-vs-backdrop distance ~220)
+  let m = new Uint8Array(w*h);
+  for (let p=0,i=0;p<w*h;p++,i+=4){
+    m[p] = (Math.abs(d[i]-br)+Math.abs(d[i+1]-bg)+Math.abs(d[i+2]-bb)) > 80 ? 1 : 0;
+  }
+  // erode 3px to shave the anti-aliased halo so no ink lands off-fabric
+  for (let it=0; it<3; it++){
+    const e = m.slice();
+    for (let y=1;y<h-1;y++) for (let x=1;x<w-1;x++){ const o=y*w+x;
+      if (m[o] && !(m[o-1]&&m[o+1]&&m[o-w]&&m[o+w])) e[o]=0; }
+    m = e;
+  }
+  for (let p=0,i=0;p<w*h;p++,i+=4){ d[i]=d[i+1]=d[i+2]=0; d[i+3]=m[p]?255:0; }
+  octx.putImageData(id, 0, 0); _maskCache[key] = oc; return oc;
+}
+// Tiles the signature across the whole garment, tone-on-tone, clipped to the
+// silhouette. Shared by draw() (tx0/ty0/s1) and the zoom lens.
+function paintAllover(ctx, g, col, photoImg, tx, ty, s){
+  if (!(sigImg && sigImg.width) || !photoImg) return;
+  const W = ctx.canvas.width, H = ctx.canvas.height;
+  const dark = luminance(col.hex) < 0.4;
+  const src = dark ? recolorToLight(sigImg) : sigImg;
+  const tileW = Math.round(W * (g.alloverScale || 0.20));
+  const tileH = Math.round(tileW * (src.height / src.width));
+  const stepX = tileW + tileW*0.35, stepY = tileH + tileH*1.6;   // brick spacing
+  const layer = document.createElement('canvas'); layer.width = W; layer.height = H;
+  const lx = layer.getContext('2d');
+  lx.globalAlpha = g.alloverOpacity || 0.5;
+  let row = 0;
+  for (let y=-tileH; y<H+tileH; y+=stepY, row++){
+    const off = (row % 2) ? stepX/2 : 0;                          // staggered rows
+    for (let x=-tileW+off; x<W+tileW; x+=stepX) lx.drawImage(src, x, y, tileW, tileH);
+  }
+  lx.globalAlpha = 1; lx.globalCompositeOperation = 'destination-in';
+  lx.drawImage(garmentMask(photoImg, W, H, col.photo), 0, 0);     // clip to shirt
+  ctx.save(); ctx.translate(tx, ty); ctx.scale(s, s);
+  if (!dark) ctx.globalCompositeOperation = 'multiply';           // tone-on-tone
+  ctx.drawImage(layer, 0, 0); ctx.restore();
+}
+
 function draw(){
   const cv = document.getElementById('stage'), ctx = cv.getContext('2d');
   const g = state.garment, col = state.color;
@@ -539,7 +592,8 @@ function draw(){
     // photo (fabric shading still shows through, same as a real print).
     // Dark cloth: multiply would render invisible (it can only darken), so
     // recolor the signature to a light ink and composite normally instead.
-    paintSignatures(ctx, g, col, 0, 0, 1);
+    if (g.allover) paintAllover(ctx, g, col, photoImg, 0, 0, 1);   // AOP: tile edge-to-edge
+    else paintSignatures(ctx, g, col, 0, 0, 1);                    // single centered decal
   });
 }
 
diff --git a/verification/live-aop-camp-shirt.jpg b/verification/live-aop-camp-shirt.jpg
new file mode 100644
index 0000000..1d80137
Binary files /dev/null and b/verification/live-aop-camp-shirt.jpg differ
diff --git a/verification/live-aop-longsleeve-shirt.jpg b/verification/live-aop-longsleeve-shirt.jpg
new file mode 100644
index 0000000..fc4c060
Binary files /dev/null and b/verification/live-aop-longsleeve-shirt.jpg differ
diff --git a/verification/live-aop-sheet.jpg b/verification/live-aop-sheet.jpg
new file mode 100644
index 0000000..6ec3213
Binary files /dev/null and b/verification/live-aop-sheet.jpg differ
diff --git a/verification/proof-aop-camp.jpg b/verification/proof-aop-camp.jpg
new file mode 100644
index 0000000..6c34707
Binary files /dev/null and b/verification/proof-aop-camp.jpg differ
diff --git a/verification/proof-aop-long.jpg b/verification/proof-aop-long.jpg
new file mode 100644
index 0000000..d766fa8
Binary files /dev/null and b/verification/proof-aop-long.jpg differ
diff --git a/verification/proof-aop-sheet.jpg b/verification/proof-aop-sheet.jpg
new file mode 100644
index 0000000..b466caa
Binary files /dev/null and b/verification/proof-aop-sheet.jpg differ

← a70566c wear: add typeahead search across the top of the signature p  ·  back to CelebritySignatures  ·  front page: Gucci-style Signature Edit hero — No. 001 Abraha f4f8745 →