| 1 | export type MerchSizingProductCode = "DJCTX" | "3MTXVYM32" | "3MOTS" | "3MCSPL56" | "3PH" | "3TPH" | "3MHZDM16"; |
| 2 | export type MerchSizingUnit = "cm" | "in"; |
| 3 | export type MerchSizingWarning = "poloShoulderNote" | "hoodieSleeveNote" | "cottonHoodieMaterialNote"; |
| 4 | |
| 5 | export interface MerchSizeRow { |
| 6 | size: string; |
| 7 | lengthCm: number; |
| 8 | shoulderCm: number; |
| 9 | /** Supplier's Bust column; its measurement convention has not been confirmed. */ |
| 10 | bustCm: number; |
| 11 | sleeveCm: number | null; |
| 12 | } |
| 13 | |
| 14 | export interface MerchSizeChart { |
| 15 | code: MerchSizingProductCode; |
| 16 | sourceUrl: string; |
| 17 | toleranceCm: number; |
| 18 | rows: readonly MerchSizeRow[]; |
| 19 | confirmationNeededSizes: readonly string[]; |
| 20 | warning?: MerchSizingWarning; |
| 21 | } |
| 22 | |
| 23 | /** Public Yoycol charts captured 2026-10-04. Garment guidance, not body sizing or sample proof. */ |
| 24 | export const MERCH_SIZE_CHARTS: readonly MerchSizeChart[] = [ |
| 25 | { |
| 26 | code: "DJCTX", |
| 27 | sourceUrl: "https://www.yoycol.com/product_detail/DJCTX/Unisex-O-neck-Short-Sleeve-T-shirt-180GSM-Cotton-DTF", |
| 28 | toleranceCm: 3, |
| 29 | confirmationNeededSizes: [], |
| 30 | rows: [ |
| 31 | { size: "S", lengthCm: 67, shoulderCm: 42, bustCm: 94, sleeveCm: null }, |
| 32 | { size: "M", lengthCm: 70, shoulderCm: 44, bustCm: 100, sleeveCm: null }, |
| 33 | { size: "L", lengthCm: 73, shoulderCm: 46, bustCm: 106, sleeveCm: null }, |
| 34 | { size: "XL", lengthCm: 75, shoulderCm: 50, bustCm: 112, sleeveCm: null }, |
| 35 | { size: "2XL", lengthCm: 77, shoulderCm: 54, bustCm: 118, sleeveCm: null }, |
| 36 | { size: "3XL", lengthCm: 80, shoulderCm: 60, bustCm: 126, sleeveCm: null }, |
| 37 | ], |
| 38 | }, |
| 39 | { |
| 40 | code: "3MTXVYM32", |
| 41 | sourceUrl: "https://www.yoycol.com/product_detail/3MTXVYM32", |
| 42 | toleranceCm: 5, |
| 43 | confirmationNeededSizes: [], |
| 44 | rows: [ |
| 45 | { size: "XS", lengthCm: 68, shoulderCm: 37, bustCm: 82, sleeveCm: null }, |
| 46 | { size: "S", lengthCm: 71, shoulderCm: 40, bustCm: 92, sleeveCm: null }, |
| 47 | { size: "M", lengthCm: 74, shoulderCm: 43, bustCm: 102, sleeveCm: null }, |
| 48 | { size: "L", lengthCm: 76, shoulderCm: 46, bustCm: 112, sleeveCm: null }, |
| 49 | { size: "XL", lengthCm: 79, shoulderCm: 49, bustCm: 122, sleeveCm: null }, |
| 50 | { size: "2XL", lengthCm: 81, shoulderCm: 52, bustCm: 132, sleeveCm: null }, |
| 51 | { size: "3XL", lengthCm: 84, shoulderCm: 55, bustCm: 142, sleeveCm: null }, |
| 52 | { size: "4XL", lengthCm: 86, shoulderCm: 58, bustCm: 152, sleeveCm: null }, |
| 53 | { size: "5XL", lengthCm: 88, shoulderCm: 61, bustCm: 162, sleeveCm: null }, |
| 54 | ], |
| 55 | }, |
| 56 | { |
| 57 | code: "3MOTS", |
| 58 | sourceUrl: "https://www.yoycol.com/product_detail/3MOTS", |
| 59 | toleranceCm: 3, |
| 60 | confirmationNeededSizes: [], |
| 61 | rows: [ |
| 62 | { size: "XS", lengthCm: 68, shoulderCm: 37, bustCm: 82, sleeveCm: null }, |
| 63 | { size: "S", lengthCm: 71, shoulderCm: 40, bustCm: 92, sleeveCm: null }, |
| 64 | { size: "M", lengthCm: 74, shoulderCm: 43, bustCm: 102, sleeveCm: null }, |
| 65 | { size: "L", lengthCm: 76, shoulderCm: 46, bustCm: 112, sleeveCm: null }, |
| 66 | { size: "XL", lengthCm: 79, shoulderCm: 49, bustCm: 122, sleeveCm: null }, |
| 67 | { size: "2XL", lengthCm: 81, shoulderCm: 52, bustCm: 132, sleeveCm: null }, |
| 68 | { size: "3XL", lengthCm: 84, shoulderCm: 55, bustCm: 142, sleeveCm: null }, |
| 69 | { size: "4XL", lengthCm: 86, shoulderCm: 58, bustCm: 152, sleeveCm: null }, |
| 70 | { size: "5XL", lengthCm: 88, shoulderCm: 61, bustCm: 162, sleeveCm: null }, |
| 71 | { size: "6XL", lengthCm: 90, shoulderCm: 64, bustCm: 172, sleeveCm: null }, |
| 72 | ], |
| 73 | }, |
| 74 | { |
| 75 | code: "3MCSPL56", |
| 76 | sourceUrl: "https://www.yoycol.com/product_detail/3MCSPL56", |
| 77 | toleranceCm: 3, |
| 78 | confirmationNeededSizes: ["2XL", "3XL"], |
| 79 | warning: "poloShoulderNote", |
| 80 | rows: [ |
| 81 | { size: "S", lengthCm: 71, shoulderCm: 40, bustCm: 92, sleeveCm: 23 }, |
| 82 | { size: "M", lengthCm: 74, shoulderCm: 43, bustCm: 102, sleeveCm: 23.5 }, |
| 83 | { size: "L", lengthCm: 76, shoulderCm: 46, bustCm: 112, sleeveCm: 24 }, |
| 84 | { size: "XL", lengthCm: 79, shoulderCm: 49, bustCm: 122, sleeveCm: 24.5 }, |
| 85 | { size: "2XL", lengthCm: 81, shoulderCm: 55, bustCm: 132, sleeveCm: 25 }, |
| 86 | { size: "3XL", lengthCm: 84, shoulderCm: 55, bustCm: 142, sleeveCm: 25.5 }, |
| 87 | { size: "4XL", lengthCm: 86, shoulderCm: 58, bustCm: 152, sleeveCm: 26 }, |
| 88 | { size: "5XL", lengthCm: 88, shoulderCm: 61, bustCm: 162, sleeveCm: 26.5 }, |
| 89 | ], |
| 90 | }, |
| 91 | { |
| 92 | code: "3PH", |
| 93 | sourceUrl: "https://www.yoycol.com/product_detail/3PH", |
| 94 | toleranceCm: 3, |
| 95 | confirmationNeededSizes: ["7XL"], |
| 96 | warning: "hoodieSleeveNote", |
| 97 | rows: [ |
| 98 | { size: "XS", lengthCm: 65, shoulderCm: 39, bustCm: 92, sleeveCm: 66 }, |
| 99 | { size: "S", lengthCm: 67, shoulderCm: 42, bustCm: 102, sleeveCm: 67 }, |
| 100 | { size: "M", lengthCm: 70, shoulderCm: 45, bustCm: 112, sleeveCm: 68 }, |
| 101 | { size: "L", lengthCm: 72, shoulderCm: 48, bustCm: 122, sleeveCm: 69 }, |
| 102 | { size: "XL", lengthCm: 75, shoulderCm: 51, bustCm: 132, sleeveCm: 70.5 }, |
| 103 | { size: "2XL", lengthCm: 76.5, shoulderCm: 54, bustCm: 142, sleeveCm: 72 }, |
| 104 | { size: "3XL", lengthCm: 79.5, shoulderCm: 57, bustCm: 152, sleeveCm: 73 }, |
| 105 | { size: "4XL", lengthCm: 82, shoulderCm: 60, bustCm: 162, sleeveCm: 74 }, |
| 106 | { size: "5XL", lengthCm: 85, shoulderCm: 63, bustCm: 172, sleeveCm: 75 }, |
| 107 | { size: "6XL", lengthCm: 88, shoulderCm: 66, bustCm: 182, sleeveCm: 76 }, |
| 108 | { size: "7XL", lengthCm: 91, shoulderCm: 69, bustCm: 192, sleeveCm: 75 }, |
| 109 | ], |
| 110 | }, |
| 111 | { |
| 112 | code: "3TPH", |
| 113 | sourceUrl: "https://www.yoycol.com/product_detail/3TPH", |
| 114 | toleranceCm: 3, |
| 115 | confirmationNeededSizes: [], |
| 116 | rows: [ |
| 117 | { size: "XS", lengthCm: 65, shoulderCm: 39, bustCm: 92, sleeveCm: 66 }, |
| 118 | { size: "S", lengthCm: 67, shoulderCm: 42, bustCm: 102, sleeveCm: 67 }, |
| 119 | { size: "M", lengthCm: 70, shoulderCm: 45, bustCm: 112, sleeveCm: 68 }, |
| 120 | { size: "L", lengthCm: 72, shoulderCm: 48, bustCm: 122, sleeveCm: 69 }, |
| 121 | { size: "XL", lengthCm: 75, shoulderCm: 51, bustCm: 132, sleeveCm: 70 }, |
| 122 | { size: "2XL", lengthCm: 76, shoulderCm: 54, bustCm: 142, sleeveCm: 71 }, |
| 123 | { size: "3XL", lengthCm: 79, shoulderCm: 57, bustCm: 152, sleeveCm: 71 }, |
| 124 | { size: "4XL", lengthCm: 82, shoulderCm: 60, bustCm: 162, sleeveCm: 72 }, |
| 125 | { size: "5XL", lengthCm: 85, shoulderCm: 63, bustCm: 172, sleeveCm: 73 }, |
| 126 | { size: "6XL", lengthCm: 88, shoulderCm: 66, bustCm: 182, sleeveCm: 73.5 }, |
| 127 | ], |
| 128 | }, |
| 129 | { |
| 130 | code: "3MHZDM16", |
| 131 | sourceUrl: "https://www.yoycol.com/product_detail/3MHZDM16", |
| 132 | toleranceCm: 5, |
| 133 | confirmationNeededSizes: [], |
| 134 | warning: "cottonHoodieMaterialNote", |
| 135 | rows: [ |
| 136 | { size: "XS", lengthCm: 66, shoulderCm: 41, bustCm: 96, sleeveCm: 67 }, |
| 137 | { size: "S", lengthCm: 69, shoulderCm: 43, bustCm: 104, sleeveCm: 68 }, |
| 138 | { size: "M", lengthCm: 71, shoulderCm: 45, bustCm: 112, sleeveCm: 69 }, |
| 139 | { size: "L", lengthCm: 74, shoulderCm: 47, bustCm: 120, sleeveCm: 70 }, |
| 140 | { size: "XL", lengthCm: 76, shoulderCm: 49.5, bustCm: 130, sleeveCm: 71 }, |
| 141 | { size: "2XL", lengthCm: 79, shoulderCm: 52, bustCm: 140, sleeveCm: 72 }, |
| 142 | { size: "3XL", lengthCm: 81, shoulderCm: 54.5, bustCm: 150, sleeveCm: 73 }, |
| 143 | { size: "4XL", lengthCm: 84, shoulderCm: 57, bustCm: 160, sleeveCm: 74 }, |
| 144 | { size: "5XL", lengthCm: 86, shoulderCm: 59.5, bustCm: 170, sleeveCm: 75 }, |
| 145 | { size: "6XL", lengthCm: 89, shoulderCm: 62, bustCm: 180, sleeveCm: 76 }, |
| 146 | ], |
| 147 | }, |
| 148 | ]; |
| 149 | |
| 150 | /** Unit conversion only; never converts supplier Bust or regional letter sizes. */ |
| 151 | export function merchMeasurement(cm: number, unit: MerchSizingUnit): number { |
| 152 | return unit === "in" ? cm / 2.54 : cm; |
| 153 | } |
| 154 |