{"product_id":"stone-contrast-sweatshirt-custom-made","title":"Stone Contrast Sweatshirt-Custom Made","description":"\u003cp\u003eElevate your urban style with our premium Urban Luxe Sweatshirt, crafted from 360 gsm fabric (95% cotton, 5% elastane). This sophisticated piece features distinct grey patches on the shoulders, sleeves, and a front pocket, creating a striking contrast. The hidden magnet closure on the pocket and adjustable metal fasteners on the cuffs add both functionality and style. Part of our capsule collection, the Urban Luxe Sweatshirt embodies contemporary fashion with comfort. Experience refined elegance with Saint Issa.\u003c\/p\u003e\n\u003cp\u003eThis model is 6'2\" (188 cm) and wears a size M.\u003c\/p\u003e\n\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400;1,500;1,600\u0026amp;family=Jost:wght@200;300;400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\n\u003cstyle\u003e\n#si-cl-widget, #si-cl-widget *, #si-cl-widget *::before, #si-cl-widget *::after {\n  box-sizing: border-box !important;\n  font-family: 'Jost', -apple-system, sans-serif !important;\n}\n#si-cl-widget { margin: 24px 0 !important; width: 100% !important; }\n\n#si-cl-trigger {\n  width: 100% !important;\n  display: flex !important; align-items: center !important; justify-content: space-between !important;\n  padding: 14px 20px !important;\n  background: transparent !important;\n  border: 1.5px solid rgba(184,147,90,0.5) !important;\n  border-radius: 4px !important;\n  cursor: pointer !important;\n  transition: all 0.3s !important;\n}\n#si-cl-trigger:hover { background: rgba(184,147,90,0.04) !important; border-color: #B8935A !important; }\n#si-cl-trigger.active {\n  background: rgba(184,147,90,0.06) !important;\n  border-color: #B8935A !important;\n  border-bottom-left-radius: 0 !important; border-bottom-right-radius: 0 !important;\n  border-bottom: none !important;\n}\n.si-cl-trigger-left { display: flex !important; align-items: center !important; gap: 12px !important; }\n.si-cl-trigger-icon {\n  width: 32px !important; height: 32px !important;\n  background: rgba(184,147,90,0.1) !important;\n  border: 1px solid rgba(184,147,90,0.3) !important;\n  border-radius: 50% !important;\n  display: flex !important; align-items: center !important; justify-content: center !important;\n  color: #B8935A !important; font-size: 14px !important; flex-shrink: 0 !important;\n}\n.si-cl-trigger-text { text-align: left !important; }\n.si-cl-trigger-title {\n  font-size: 11px !important; letter-spacing: 0.2em !important; text-transform: uppercase !important;\n  color: #18181A !important; font-weight: 500 !important; display: block !important; margin-bottom: 1px !important;\n}\n.si-cl-trigger-sub { font-size: 11px !important; color: #7A7268 !important; font-weight: 300 !important; }\n.si-cl-trigger-fee {\n  font-family: 'Cormorant Garamond', serif !important; font-style: italic !important;\n  font-size: 1.1rem !important; color: #B8935A !important; font-weight: 500 !important;\n}\n.si-cl-trigger-arrow { color: #B8935A !important; font-size: 14px !important; transition: transform 0.3s !important; flex-shrink: 0 !important; }\n#si-cl-trigger.active .si-cl-trigger-arrow { transform: rotate(180deg) !important; }\n\n#si-cl-panel {\n  display: none !important;\n  border: 1.5px solid #B8935A !important;\n  border-top: none !important;\n  border-bottom-left-radius: 4px !important; border-bottom-right-radius: 4px !important;\n  padding: 20px !important;\n  background: #FAFAF7 !important;\n}\n#si-cl-panel.open { display: block !important; }\n\n.si-cl-unit-toggle {\n  display: flex !important; align-items: center !important; justify-content: flex-end !important;\n  gap: 8px !important; margin-bottom: 20px !important;\n}\n.si-cl-unit-label { font-size: 9px !important; letter-spacing: 0.3em !important; text-transform: uppercase !important; color: #7A7268 !important; }\n.si-cl-toggle-btn {\n  display: flex !important; background: rgba(26,26,24,0.06) !important;\n  border-radius: 100px !important; padding: 2px !important; gap: 2px !important;\n}\n.si-cl-toggle-opt {\n  padding: 5px 12px !important; border-radius: 100px !important;\n  font-size: 10px !important; letter-spacing: 0.15em !important; text-transform: uppercase !important;\n  color: #7A7268 !important; cursor: pointer !important; transition: all 0.2s !important;\n  font-weight: 400 !important; border: none !important; background: transparent !important;\n  font-family: 'Jost', sans-serif !important;\n}\n.si-cl-toggle-opt.active { background: #18181A !important; color: #FAFAF7 !important; }\n\n.si-cl-measure-block { margin-bottom: 22px !important; }\n.si-cl-measure-block:last-of-type { margin-bottom: 0 !important; }\n\n.si-cl-mblock-header {\n  display: flex !important; align-items: center !important; justify-content: space-between !important;\n  margin-bottom: 8px !important;\n}\n.si-cl-mblock-left { display: flex !important; align-items: center !important; gap: 8px !important; }\n.si-cl-mblock-num {\n  font-family: 'Cormorant Garamond', serif !important; font-style: italic !important;\n  font-size: 1rem !important; color: rgba(184,147,90,0.5) !important;\n  font-weight: 400 !important; min-width: 20px !important;\n}\n.si-cl-mblock-name {\n  font-size: 10px !important; letter-spacing: 0.18em !important; text-transform: uppercase !important;\n  color: #18181A !important; font-weight: 500 !important;\n}\n.si-cl-mblock-value {\n  font-family: 'Cormorant Garamond', serif !important; font-style: italic !important;\n  font-size: 1.2rem !important; color: #B8935A !important; font-weight: 500 !important;\n  min-width: 60px !important; text-align: right !important;\n}\n\n.si-cl-slider {\n  width: 100% !important; height: 4px !important;\n  -webkit-appearance: none !important; appearance: none !important;\n  background: linear-gradient(to right, #B8935A 0%, #B8935A var(--progress, 50%), rgba(26,26,24,0.1) var(--progress, 50%), rgba(26,26,24,0.1) 100%) !important;\n  outline: none !important; border-radius: 100px !important;\n  cursor: pointer !important; border: none !important; margin: 6px 0 10px !important;\n}\n.si-cl-slider::-webkit-slider-thumb {\n  -webkit-appearance: none !important; width: 22px !important; height: 22px !important;\n  background: #18181A !important; border: 3px solid #FAFAF7 !important;\n  border-radius: 50% !important; cursor: pointer !important;\n  box-shadow: 0 2px 8px rgba(0,0,0,0.2) !important;\n}\n.si-cl-slider::-moz-range-thumb {\n  width: 22px !important; height: 22px !important; background: #18181A !important;\n  border: 3px solid #FAFAF7 !important; border-radius: 50% !important; cursor: pointer !important;\n}\n\n\/* PRESETS - GRID FOR ALIGNMENT *\/\n.si-cl-presets {\n  display: grid !important;\n  grid-template-columns: repeat(4, 1fr) !important;\n  gap: 6px !important;\n  margin-top: 8px !important;\n}\n.si-cl-preset {\n  padding: 6px 10px !important;\n  font-size: 9px !important; letter-spacing: 0.15em !important; text-transform: uppercase !important;\n  border: 1px solid rgba(26,26,24,0.12) !important;\n  border-radius: 100px !important; cursor: pointer !important;\n  color: #7A7268 !important; background: transparent !important;\n  transition: all 0.2s !important;\n  font-family: 'Jost', sans-serif !important; font-weight: 400 !important;\n  text-align: center !important;\n}\n.si-cl-preset:hover { border-color: #B8935A !important; color: #B8935A !important; }\n.si-cl-preset.active { background: #18181A !important; border-color: #18181A !important; color: #FAFAF7 !important; }\n\n.si-cl-divider { height: 1px !important; background: rgba(26,26,24,0.08) !important; margin: 18px 0 !important; }\n\n.si-cl-optional-title {\n  font-size: 9px !important; letter-spacing: 0.35em !important; text-transform: uppercase !important;\n  color: #C4BAB0 !important; margin-bottom: 14px !important;\n  display: flex !important; align-items: center !important; gap: 8px !important;\n}\n.si-cl-optional-title::after {\n  content: '' !important; flex: 1 !important; height: 1px !important;\n  background: rgba(26,26,24,0.06) !important;\n}\n\n.si-cl-opt-row { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 12px !important; align-items: start !important; }\n.si-cl-opt-field { display: flex !important; flex-direction: column !important; }\n.si-cl-opt-label {\n  font-size: 9px !important; letter-spacing: 0.2em !important; text-transform: uppercase !important;\n  color: #7A7268 !important; margin-bottom: 6px !important; display: block !important; height: 14px !important;\n}\n.si-cl-opt-input {\n  width: 100% !important;\n  border: 1px solid rgba(26,26,24,0.12) !important;\n  border-radius: 4px !important; padding: 8px 12px !important;\n  font-size: 13px !important; font-family: 'Jost', sans-serif !important;\n  color: #18181A !important; background: #FFFFFF !important;\n  outline: none !important; -webkit-appearance: none !important;\n}\n.si-cl-opt-input:focus { border-color: #B8935A !important; }\n\n.si-cl-price-box {\n  display: flex !important; align-items: center !important; justify-content: space-between !important;\n  background: rgba(184,147,90,0.06) !important;\n  border: 1px solid rgba(184,147,90,0.2) !important;\n  border-radius: 4px !important;\n  padding: 12px 16px !important;\n  margin: 18px 0 12px !important;\n}\n.si-cl-price-label {\n  font-size: 9px !important; letter-spacing: 0.3em !important; text-transform: uppercase !important;\n  color: #7A7268 !important; margin-bottom: 2px !important; display: block !important;\n}\n.si-cl-price-total {\n  font-family: 'Cormorant Garamond', serif !important;\n  font-size: 1.6rem !important; font-weight: 500 !important; color: #18181A !important; line-height: 1 !important;\n}\n.si-cl-price-breakdown { font-size: 10px !important; color: #7A7268 !important; margin-top: 3px !important; }\n.si-cl-price-fee {\n  font-family: 'Cormorant Garamond', serif !important; font-style: italic !important;\n  font-size: 1.1rem !important; color: #B8935A !important; text-align: right !important;\n}\n\n\/* DELIVERY NOTE *\/\n.si-cl-delivery {\n  background: rgba(184,147,90,0.06) !important;\n  border-left: 3px solid #B8935A !important;\n  border-radius: 0 4px 4px 0 !important;\n  padding: 12px 14px !important;\n  margin-bottom: 12px !important;\n}\n.si-cl-delivery-title {\n  font-family: 'Cormorant Garamond', serif !important;\n  font-style: italic !important;\n  font-size: 0.95rem !important;\n  color: #18181A !important;\n  margin-bottom: 4px !important;\n  font-weight: 500 !important;\n}\n.si-cl-delivery-text {\n  font-size: 10px !important;\n  line-height: 1.6 !important;\n  color: #7A7268 !important;\n}\n\n\/* WARNING *\/\n.si-cl-warning {\n  display: flex !important; gap: 8px !important; padding: 10px 12px !important;\n  background: rgba(26,26,24,0.04) !important;\n  border-left: 2px solid rgba(184,147,90,0.4) !important;\n  border-radius: 0 4px 4px 0 !important;\n  margin-bottom: 14px !important;\n}\n.si-cl-warning-icon { color: #B8935A !important; font-size: 12px !important; flex-shrink: 0 !important; margin-top: 1px !important; }\n.si-cl-warning-text { font-size: 10px !important; line-height: 1.55 !important; color: #7A7268 !important; }\n.si-cl-warning-text strong { color: #18181A !important; font-weight: 500 !important; }\n\n.si-cl-add-btn {\n  width: 100% !important;\n  padding: 14px !important;\n  background: #18181A !important;\n  color: #FAFAF7 !important;\n  border: none !important;\n  border-radius: 4px !important;\n  font-size: 10px !important; letter-spacing: 0.32em !important; text-transform: uppercase !important;\n  font-family: 'Jost', sans-serif !important; font-weight: 500 !important;\n  cursor: pointer !important; transition: all 0.3s !important;\n}\n.si-cl-add-btn:hover { background: #B8935A !important; }\n\n.si-cl-success {\n  display: none !important;\n  text-align: center !important;\n  padding: 16px !important;\n  background: rgba(184,147,90,0.06) !important;\n  border: 1px solid rgba(184,147,90,0.3) !important;\n  border-radius: 4px !important;\n  margin-top: 12px !important;\n}\n.si-cl-success.show { display: block !important; }\n.si-cl-success-title {\n  font-family: 'Cormorant Garamond', serif !important; font-style: italic !important;\n  font-size: 1.1rem !important; color: #18181A !important; margin-bottom: 4px !important;\n}\n.si-cl-success-sub { font-size: 11px !important; color: #7A7268 !important; }\n\n@media (max-width: 480px) {\n  .si-cl-opt-row { grid-template-columns: 1fr !important; }\n  .si-cl-trigger-sub { display: none !important; }\n}\n\u003c\/style\u003e\n\n\u003cdiv id=\"si-cl-widget\" data-product-type=\"top\" data-base-price=\"85\" data-currency=\"£\" data-tailoring-variant=\"52898519974224\"\u003e\n\n  \u003cbutton id=\"si-cl-trigger\" onclick=\"siClToggle()\" type=\"button\"\u003e\n    \u003cdiv class=\"si-cl-trigger-left\"\u003e\n      \u003cdiv class=\"si-cl-trigger-icon\"\u003e+\u003c\/div\u003e\n      \u003cdiv class=\"si-cl-trigger-text\"\u003e\n        \u003cspan class=\"si-cl-trigger-title\"\u003eCustomize Length\u003c\/span\u003e\n        \u003cspan class=\"si-cl-trigger-sub\"\u003eTailored to your exact measurements\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cdiv style=\"display:flex;align-items:center;gap:10px;\"\u003e\n      \u003cspan class=\"si-cl-trigger-fee\"\u003e+£10\u003c\/span\u003e\n      \u003cspan class=\"si-cl-trigger-arrow\"\u003e▼\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/button\u003e\n\n  \u003cdiv id=\"si-cl-panel\"\u003e\n\n\n\u003cdiv class=\"si-cl-unit-toggle\"\u003e\n  \u003cspan class=\"si-cl-unit-label\"\u003eUnits\u003c\/span\u003e\n  \u003cdiv class=\"si-cl-toggle-btn\"\u003e\n    \u003cbutton class=\"si-cl-toggle-opt active\" onclick=\"siClSetUnit('cm')\" type=\"button\"\u003eCM\u003c\/button\u003e\n    \u003cbutton class=\"si-cl-toggle-opt\" onclick=\"siClSetUnit('in')\" type=\"button\"\u003eIN\u003c\/button\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cdiv id=\"si-cl-measurements\"\u003e\u003c\/div\u003e\n\n\u003cdiv class=\"si-cl-divider\"\u003e\u003c\/div\u003e\n\n\u003cdiv class=\"si-cl-optional-title\"\u003eYour details (optional)\u003c\/div\u003e\n\u003cdiv class=\"si-cl-opt-row\"\u003e\n  \u003cdiv class=\"si-cl-opt-field\"\u003e\n    \u003clabel class=\"si-cl-opt-label\"\u003eYour Height\u003c\/label\u003e\n    \u003cinput type=\"text\" class=\"si-cl-opt-input\" id=\"si-cl-height\" placeholder=\"e.g. 5'11 or 180cm\"\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"si-cl-opt-field\"\u003e\n    \u003clabel class=\"si-cl-opt-label\"\u003eYour Weight\u003c\/label\u003e\n    \u003cinput type=\"text\" class=\"si-cl-opt-input\" id=\"si-cl-weight\" placeholder=\"e.g. 75kg\"\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cdiv class=\"si-cl-price-box\"\u003e\n  \u003cdiv\u003e\n    \u003cspan class=\"si-cl-price-label\"\u003eTotal Price\u003c\/span\u003e\n    \u003cdiv class=\"si-cl-price-total\" id=\"si-cl-price-total\"\u003e£70.00\u003c\/div\u003e\n    \u003cdiv class=\"si-cl-price-breakdown\" id=\"si-cl-price-breakdown\"\u003e£60 + \u003cspan style=\"color:#B8935A\"\u003e£10 custom tailoring\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"si-cl-price-fee\"\u003e+£10\u003cbr\u003e\u003cspan style=\"font-size:9px;letter-spacing:0.2em;color:#7A7268;font-family:'Jost',sans-serif;font-style:normal;\"\u003eBESPOKE FEE\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cdiv class=\"si-cl-delivery\"\u003e\n  \u003cdiv class=\"si-cl-delivery-title\"\u003eCrafted just for you.\u003c\/div\u003e\n  \u003cdiv class=\"si-cl-delivery-text\"\u003eBecause each piece is tailored to your exact measurements, please allow \u003cstrong style=\"color:#18181A;\"\u003e2 working weeks\u003c\/strong\u003e for production and delivery. This ensures perfect fit and premium quality.\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cdiv class=\"si-cl-warning\"\u003e\n  \u003cdiv class=\"si-cl-warning-icon\"\u003e+\u003c\/div\u003e\n  \u003cdiv class=\"si-cl-warning-text\"\u003e\n\u003cstrong\u003ePlease note:\u003c\/strong\u003e Custom length items are made to your exact specifications and are \u003cstrong\u003enon-returnable\u003c\/strong\u003e unless there is a production error on our side. Please measure carefully before confirming.\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cbutton class=\"si-cl-add-btn\" onclick=\"siClAddToCart()\" type=\"button\"\u003eAdd to Cart with Custom Length\u003c\/button\u003e\n\n\u003cdiv class=\"si-cl-success\" id=\"si-cl-success\"\u003e\n  \u003cdiv class=\"si-cl-success-title\"\u003eCustom length saved.\u003c\/div\u003e\n  \u003cdiv class=\"si-cl-success-sub\"\u003eYour measurements and tailoring fee have been added to your cart. Complete checkout above.\u003c\/div\u003e\n\u003c\/div\u003e\n\n\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function() {\n  var SI_CL_FEE = 10;\n  var SI_CL_UNIT = 'cm';\n\n  var SI_CL_CONFIGS = {\n    top: {\n      measures: [\n        { id: 'body', name: 'Body Length', num: '01',\n          cm: { min: 50, max: 80, def: 62 },\n          inches: { min: 20, max: 32, def: 24 },\n          presets_cm: [{l:'Crop',v:50},{l:'Regular',v:62},{l:'Long',v:72},{l:'Maxi',v:80}],\n          presets_in: [{l:'Crop',v:20},{l:'Regular',v:24},{l:'Long',v:28},{l:'Maxi',v:32}]\n        },\n        { id: 'sleeve', name: 'Sleeve Length', num: '02',\n          cm: { min: 55, max: 95, def: 64 },\n          inches: { min: 22, max: 37, def: 25 },\n          presets_cm: [{l:'Short',v:55},{l:'Regular',v:64},{l:'Long',v:75},{l:'Ext',v:85}],\n          presets_in: [{l:'Short',v:22},{l:'Regular',v:25},{l:'Long',v:30},{l:'Ext',v:33}]\n        }\n      ]\n    },\n    crop: {\n      measures: [\n        { id: 'body', name: 'Body Length', num: '01',\n          cm: { min: 38, max: 65, def: 48 },\n          inches: { min: 15, max: 26, def: 19 },\n          presets_cm: [{l:'Mini',v:38},{l:'Crop',v:48},{l:'Mid',v:56},{l:'Long',v:65}],\n          presets_in: [{l:'Mini',v:15},{l:'Crop',v:19},{l:'Mid',v:22},{l:'Long',v:26}]\n        },\n        { id: 'sleeve', name: 'Sleeve Length', num: '02',\n          cm: { min: 55, max: 95, def: 64 },\n          inches: { min: 22, max: 37, def: 25 },\n          presets_cm: [{l:'Short',v:55},{l:'Regular',v:64},{l:'Long',v:75},{l:'Ext',v:85}],\n          presets_in: [{l:'Short',v:22},{l:'Regular',v:25},{l:'Long',v:30},{l:'Ext',v:33}]\n        }\n      ]\n    },\n    pants: {\n      measures: [\n        { id: 'inseam', name: 'Inseam \/ Leg Length', num: '01',\n          cm: { min: 60, max: 100, def: 76 },\n          inches: { min: 24, max: 40, def: 30 },\n          presets_cm: [{l:'Capri',v:60},{l:'Crop',v:70},{l:'Regular',v:76},{l:'Full',v:90}],\n          presets_in: [{l:'Capri',v:24},{l:'Crop',v:28},{l:'Regular',v:30},{l:'Full',v:35}]\n        }\n      ]\n    }\n  };\n\n  var siClValues = {};\n\n  function siClGetConfig() {\n    var widget = document.getElementById('si-cl-widget');\n    var type = widget ? (widget.getAttribute('data-product-type') || 'top') : 'top';\n    return SI_CL_CONFIGS[type] || SI_CL_CONFIGS['top'];\n  }\n\n  function siClGetBasePrice() {\n    var widget = document.getElementById('si-cl-widget');\n    return parseFloat(widget ? (widget.getAttribute('data-base-price') || '60') : '60');\n  }\n\n  function siClGetCurrency() {\n    var widget = document.getElementById('si-cl-widget');\n    return widget ? (widget.getAttribute('data-currency') || '£') : '£';\n  }\n\n  function siClGetTailoringVariant() {\n    var widget = document.getElementById('si-cl-widget');\n    return widget ? widget.getAttribute('data-tailoring-variant') : null;\n  }\n\n  function siClBuildMeasurements() {\n    var config = siClGetConfig();\n    var container = document.getElementById('si-cl-measurements');\n    if (!container) return;\n    var html = '';\n    config.measures.forEach(function(m, idx) {\n      var range = SI_CL_UNIT === 'cm' ? m.cm : m.inches;\n      var presets = SI_CL_UNIT === 'cm' ? m.presets_cm : m.presets_in;\n      var unit = SI_CL_UNIT;\n      var val = siClValues[m.id] !== undefined ? siClValues[m.id] : range.def;\n      siClValues[m.id] = val;\n      var progress = ((val - range.min) \/ (range.max - range.min) * 100).toFixed(1);\n\n      html += '\u003cdiv class=\"si-cl-measure-block\"\u003e';\n      html += '\u003cdiv class=\"si-cl-mblock-header\"\u003e';\n      html += '\u003cdiv class=\"si-cl-mblock-left\"\u003e';\n      html += '\u003cspan class=\"si-cl-mblock-num\"\u003e' + m.num + '\u003c\/span\u003e';\n      html += '\u003cspan class=\"si-cl-mblock-name\"\u003e' + m.name + '\u003c\/span\u003e';\n      html += '\u003c\/div\u003e';\n      html += '\u003cspan class=\"si-cl-mblock-value\" id=\"si-cl-val-' + m.id + '\"\u003e' + val + ' ' + unit + '\u003c\/span\u003e';\n      html += '\u003c\/div\u003e';\n      html += '\u003cinput type=\"range\" class=\"si-cl-slider\" id=\"si-cl-slider-' + m.id + '\"';\n      html += ' min=\"' + range.min + '\" max=\"' + range.max + '\" value=\"' + val + '\" step=\"1\"';\n      html += ' style=\"--progress:' + progress + '%\"';\n      html += ' oninput=\"siClSlide(\\'' + m.id + '\\', this)\"\u003e';\n      html += '\u003cdiv class=\"si-cl-presets\"\u003e';\n      presets.forEach(function(p) {\n        var isActive = Math.abs(p.v - val) \u003c 1 ? ' active' : '';\n        html += '\u003cbutton class=\"si-cl-preset' + isActive + '\" onclick=\"siClPreset(\\'' + m.id + '\\',' + p.v + ')\" type=\"button\"\u003e' + p.l + '\u003c\/button\u003e';\n      });\n      html += '\u003c\/div\u003e';\n      html += '\u003c\/div\u003e';\n    });\n    container.innerHTML = html;\n  }\n\n  function siClUpdatePrice() {\n    var base = siClGetBasePrice();\n    var currency = siClGetCurrency();\n    var total = base + SI_CL_FEE;\n    var totalEl = document.getElementById('si-cl-price-total');\n    var breakEl = document.getElementById('si-cl-price-breakdown');\n    if (totalEl) totalEl.textContent = currency + total.toFixed(2);\n    if (breakEl) breakEl.innerHTML = currency + base + ' + \u003cspan style=\"color:#B8935A\"\u003e' + currency + SI_CL_FEE + ' custom tailoring\u003c\/span\u003e';\n  }\n\n  window.siClToggle = function() {\n    var trigger = document.getElementById('si-cl-trigger');\n    var panel = document.getElementById('si-cl-panel');\n    if (!trigger || !panel) return;\n    var isOpen = panel.classList.contains('open');\n    if (isOpen) {\n      panel.classList.remove('open');\n      trigger.classList.remove('active');\n    } else {\n      panel.classList.add('open');\n      trigger.classList.add('active');\n      siClBuildMeasurements();\n      siClUpdatePrice();\n      setTimeout(function() {\n        panel.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n      }, 100);\n    }\n  };\n\n  window.siClSetUnit = function(unit) {\n    SI_CL_UNIT = unit === 'cm' ? 'cm' : 'inches';\n    siClValues = {};\n    var opts = document.querySelectorAll('.si-cl-toggle-opt');\n    for (var i = 0; i \u003c opts.length; i++) {\n      opts[i].classList.remove('active');\n      var btnText = opts[i].textContent.trim().toLowerCase();\n      if ((unit === 'cm' \u0026\u0026 btnText === 'cm') || (unit === 'in' \u0026\u0026 btnText === 'in')) {\n        opts[i].classList.add('active');\n      }\n    }\n    siClBuildMeasurements();\n  };\n\n  window.siClSlide = function(id, input) {\n    var val = parseInt(input.value);\n    siClValues[id] = val;\n    var valEl = document.getElementById('si-cl-val-' + id);\n    var unitDisplay = SI_CL_UNIT === 'inches' ? 'in' : 'cm';\n    if (valEl) valEl.textContent = val + ' ' + unitDisplay;\n    var min = parseInt(input.min);\n    var max = parseInt(input.max);\n    var progress = ((val - min) \/ (max - min) * 100).toFixed(1);\n    input.style.setProperty('--progress', progress + '%');\n    var presets = input.closest('.si-cl-measure-block').querySelectorAll('.si-cl-preset');\n    var config = siClGetConfig();\n    var measure = null;\n    for (var i = 0; i \u003c config.measures.length; i++) {\n      if (config.measures[i].id === id) { measure = config.measures[i]; break; }\n    }\n    if (measure) {\n      var presetList = SI_CL_UNIT === 'cm' ? measure.presets_cm : measure.presets_in;\n      for (var j = 0; j \u003c presets.length; j++) {\n        presets[j].classList.remove('active');\n        if (presetList[j] \u0026\u0026 Math.abs(presetList[j].v - val) \u003c 1) {\n          presets[j].classList.add('active');\n        }\n      }\n    }\n  };\n\n  window.siClPreset = function(id, val) {\n    siClValues[id] = val;\n    var slider = document.getElementById('si-cl-slider-' + id);\n    var valEl = document.getElementById('si-cl-val-' + id);\n    var unitDisplay = SI_CL_UNIT === 'inches' ? 'in' : 'cm';\n    if (slider) {\n      slider.value = val;\n      var min = parseInt(slider.min);\n      var max = parseInt(slider.max);\n      var progress = ((val - min) \/ (max - min) * 100).toFixed(1);\n      slider.style.setProperty('--progress', progress + '%');\n    }\n    if (valEl) valEl.textContent = val + ' ' + unitDisplay;\n    var block = slider ? slider.closest('.si-cl-measure-block') : null;\n    if (block) {\n      var presets = block.querySelectorAll('.si-cl-preset');\n      for (var i = 0; i \u003c presets.length; i++) {\n        presets[i].classList.remove('active');\n        var presetVal = parseFloat(presets[i].getAttribute('onclick').match(\/[\\d.]+\/g).pop());\n        if (Math.abs(presetVal - val) \u003c 0.1) {\n          presets[i].classList.add('active');\n        }\n      }\n    }\n  };\n\n  function siClGetVariantId() {\n    var variantSelect = document.querySelector('select[name=\"id\"]') || document.querySelector('input[name=\"id\"]');\n    if (variantSelect \u0026\u0026 variantSelect.value) return variantSelect.value;\n    if (window.ShopifyAnalytics \u0026\u0026 window.ShopifyAnalytics.meta \u0026\u0026 window.ShopifyAnalytics.meta.selectedVariantId) {\n      return window.ShopifyAnalytics.meta.selectedVariantId;\n    }\n    return null;\n  }\n\n  window.siClAddToCart = function() {\n    var config = siClGetConfig();\n    var height = document.getElementById('si-cl-height') ? document.getElementById('si-cl-height').value : '';\n    var weight = document.getElementById('si-cl-weight') ? document.getElementById('si-cl-weight').value : '';\n    var unitDisplay = SI_CL_UNIT === 'inches' ? 'in' : 'cm';\n\n    var productVariantId = siClGetVariantId();\n    var tailoringVariantId = siClGetTailoringVariant();\n\n    if (!productVariantId) {\n      alert('Please select your size first, then add to cart with custom length.');\n      return;\n    }\n\n    if (!tailoringVariantId) {\n      alert('Configuration error. Please contact support.');\n      return;\n    }\n\n    \/\/ Build properties for the main product\n    var productProps = {};\n    config.measures.forEach(function(m) {\n      var val = siClValues[m.id] !== undefined ? siClValues[m.id] : (SI_CL_UNIT === 'cm' ? m.cm.def : m.inches.def);\n      productProps[m.name] = val + ' ' + unitDisplay;\n    });\n    if (height) productProps['Customer Height'] = height;\n    if (weight) productProps['Customer Weight'] = weight;\n    productProps['_custom_length'] = 'true';\n\n    \/\/ Build matching properties for the tailoring product (so they link in cart)\n    var tailoringProps = {};\n    config.measures.forEach(function(m) {\n      var val = siClValues[m.id] !== undefined ? siClValues[m.id] : (SI_CL_UNIT === 'cm' ? m.cm.def : m.inches.def);\n      tailoringProps[m.name] = val + ' ' + unitDisplay;\n    });\n    tailoringProps['_for_product'] = productVariantId;\n\n    \/\/ Add BOTH items to cart in one request\n    fetch('\/cart\/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n      body: JSON.stringify({\n        items: [\n          { id: parseInt(productVariantId), quantity: 1, properties: productProps },\n          { id: parseInt(tailoringVariantId), quantity: 1, properties: tailoringProps }\n        ]\n      })\n    }).then(function(res) {\n      return res.json();\n    }).then(function(data) {\n      if (data.status === 422 || data.errors) {\n        alert('Please select your size first, then add to cart.');\n        return;\n      }\n      var success = document.getElementById('si-cl-success');\n      if (success) success.classList.add('show');\n      setTimeout(function() {\n        if (success) success.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n      }, 100);\n      \/\/ Trigger cart refresh in Prestige theme\n      document.dispatchEvent(new CustomEvent('cart:refresh'));\n      document.dispatchEvent(new CustomEvent('cart:updated'));\n      \/\/ Open cart drawer if Prestige has one\n      setTimeout(function() {\n        var cartLink = document.querySelector('[data-cart-drawer-trigger]') || document.querySelector('[href=\"\/cart\"]');\n        if (cartLink) cartLink.click();\n      }, 800);\n    }).catch(function(err) {\n      alert('Please select your size first, then add to cart.');\n    });\n  };\n})();\n\u003c\/script\u003e","brand":"Saint Issa","offers":[{"title":"XS","offer_id":53029201838416,"sku":null,"price":130.0,"currency_code":"USD","in_stock":false},{"title":"S","offer_id":53029201707344,"sku":null,"price":130.0,"currency_code":"USD","in_stock":false},{"title":"M","offer_id":53029201740112,"sku":null,"price":130.0,"currency_code":"USD","in_stock":false},{"title":"L","offer_id":53029201772880,"sku":null,"price":130.0,"currency_code":"USD","in_stock":false},{"title":"XL","offer_id":53029201805648,"sku":null,"price":130.0,"currency_code":"USD","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0875\/6409\/1728\/files\/JV6A4575.webp?v=1745981258","url":"https:\/\/saintissa.com\/products\/stone-contrast-sweatshirt-custom-made","provider":"Saint Issa ","version":"1.0","type":"link"}