← 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
M data/wear-templates.jsonA public/assets/garments/aop-camp-white.jpgA public/assets/garments/aop-longsleeve-white.jpgM public/wear.htmlA verification/live-aop-camp-shirt.jpgA verification/live-aop-longsleeve-shirt.jpgA verification/live-aop-sheet.jpgA verification/proof-aop-camp.jpgA verification/proof-aop-long.jpgA verification/proof-aop-sheet.jpg
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 →