{"product_id":"viola-kaftan-maxi-dress","title":"VIOLA Kaftan Maxi Dress","description":"\u003cbody\u003e\n\u003cmeta charset=\"UTF-8\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n\u003ctitle\u003eThe VIOLA Kaftan Maxi Dress\u003c\/title\u003e\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\u0026amp;family=Montserrat:wght@300;400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003cstyle\u003e\n:root{--cream:#FAF7F2;--warm-black:#5C3D2E;--muted-gold:#7A6C52;--text-secondary:#4A443D;--border:#E8E2D9;--highlight:#F0EBE3}*{margin:0;padding:0;box-sizing:border-box}body{background:var(--cream);color:var(--warm-black);font-family:'Montserrat',sans-serif;font-weight:300;font-size:14px;min-height:100vh;display:flex;justify-content:center;padding:40px 20px;-webkit-font-smoothing:antialiased}.container{max-width:820px;width:100%;font-size:14px;animation:fadeIn .6s ease-out}@keyframes fadeIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.divider{width:40px;height:1px;background:var(--muted-gold);margin:20px auto}.description{max-width:620px;margin:0 auto 40px;text-align:center}.description .lead{font-family:'Cormorant Garamond',serif;font-weight:400;font-style:italic;font-size:1.15rem;line-height:1.7;margin-bottom:12px}.tabs-container{margin-top:10px}.tab-nav{display:flex;border-bottom:2px solid var(--border);gap:0}.tab-btn{font-family:'Montserrat',sans-serif;font-size:.68rem;font-weight:400;letter-spacing:.18em;text-transform:uppercase;color:var(--text-secondary);background:transparent;border:none;padding:14px 24px;cursor:pointer;position:relative;transition:color .3s ease;white-space:nowrap}.tab-btn:hover{color:var(--warm-black)}.tab-btn.active{color:var(--warm-black);font-weight:500}.tab-btn.active::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:2px;background:var(--warm-black)}.tab-panel{display:none;padding:32px 0;animation:tabFade .3s ease-out}.tab-panel.active{display:block}@keyframes tabFade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.love-list{list-style:none;padding:0}.love-list li{display:flex;align-items:center;gap:14px;padding:10px 0;border-bottom:1px solid var(--border);font-size:.78rem;color:var(--text-secondary);letter-spacing:.02em}.love-list li:last-child{border-bottom:none}.love-dot{width:5px;height:5px;border-radius:50%;background:var(--muted-gold);flex-shrink:0}.details-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:20px;margin-top:8px}.detail-card{text-align:center;padding:16px;background:#fff;border:1px solid var(--border);border-radius:2px}.detail-card .detail-label{font-size:.58rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:6px}.detail-card .detail-value{font-family:'Cormorant Garamond',serif;font-weight:500;font-size:.95rem}.stretch-dots{display:flex;gap:5px;justify-content:center;margin-top:3px}.stretch-dot{width:8px;height:8px;border-radius:50%;border:1px solid var(--muted-gold);background:transparent}.stretch-dot.filled{background:var(--muted-gold)}.size-finder{background:#fff;border:1px solid var(--border);border-radius:2px;padding:24px;margin-bottom:24px}.size-finder-title{font-family:'Cormorant Garamond',serif;font-weight:500;font-size:1.05rem;margin-bottom:6px;text-align:center}.size-finder-subtitle{font-size:.62rem;color:var(--text-secondary);text-align:center;margin-bottom:16px}.size-finder-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(85px,1fr));gap:8px}.size-finder-card{text-align:center;padding:14px 8px;border:1px solid var(--border);border-radius:2px;transition:all .2s ease;cursor:default}.size-finder-card:hover{border-color:var(--muted-gold);background:var(--highlight)}.size-finder-card .size-label{font-family:'Cormorant Garamond',serif;font-weight:600;font-size:1.1rem;margin-bottom:2px}.size-finder-card .us-size{font-size:.58rem;letter-spacing:.15em;text-transform:uppercase;color:var(--muted-gold);margin-bottom:6px}.size-finder-card .bust-range{font-size:.6rem;color:var(--text-secondary);line-height:1.4}.unit-toggle{display:flex;justify-content:center;gap:0;margin-bottom:24px}.unit-btn{font-size:.65rem;letter-spacing:.2em;text-transform:uppercase;padding:10px 28px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);cursor:pointer;transition:all .3s ease;font-family:'Montserrat',sans-serif}.unit-btn:first-child{border-radius:2px 0 0 2px}.unit-btn:last-child{border-radius:0 2px 2px 0;border-left:none}.unit-btn.active{background:var(--warm-black);color:var(--cream);border-color:var(--warm-black)}.garment-label{text-align:center;margin-bottom:16px}.garment-label span{font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text-secondary);background:var(--highlight);padding:6px 16px;border-radius:2px}.table-wrapper{overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:.85rem}thead th{font-family:'Cormorant Garamond',serif;font-weight:500;font-size:1rem;padding:14px 12px;text-align:center;border-bottom:2px solid var(--warm-black)}thead th:first-child{text-align:left;font-family:'Montserrat',sans-serif;font-weight:400;font-size:.65rem;letter-spacing:.18em;text-transform:uppercase;color:var(--text-secondary);vertical-align:bottom}tbody td{padding:12px;text-align:center;border-bottom:1px solid var(--border);font-variant-numeric:tabular-nums;font-weight:300}tbody td:first-child{text-align:left;font-size:.75rem;color:var(--text-secondary);white-space:nowrap;min-width:110px}tbody tr:hover{background:var(--highlight)}.waist-range{font-size:.78rem;white-space:nowrap}.between-sizes{margin-top:20px;padding:16px 20px;background:var(--highlight);border-left:3px solid var(--muted-gold);border-radius:0 2px 2px 0}.between-sizes-title{font-family:'Cormorant Garamond',serif;font-weight:500;font-size:.9rem;margin-bottom:6px}.between-sizes p{font-size:.7rem;line-height:1.7;color:var(--text-secondary)}.fit-notes p{font-size:.72rem;line-height:1.8;color:var(--text-secondary);max-width:600px}.fit-notes p+p{margin-top:8px}.model-note{margin-top:14px;font-style:italic;font-size:.68rem!important;color:var(--muted-gold)!important}.measure-guide{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-top:20px}.measure-item{padding:18px;background:#fff;border:1px solid var(--border);border-radius:2px}.measure-item h4{font-family:'Cormorant Garamond',serif;font-weight:500;font-size:.95rem;margin-bottom:6px}.measure-item p{font-size:.68rem;line-height:1.7;color:var(--text-secondary)}@media(max-width:640px){.description .lead{font-size:1rem}.tab-btn{padding:12px 14px;font-size:.6rem;letter-spacing:.12em}table{font-size:.78rem}thead th{font-size:.88rem;padding:10px 8px}tbody td{padding:10px 8px}.size-finder-grid{grid-template-columns:repeat(4,1fr)}}\n\u003c\/style\u003e\n\u003cdiv class=\"container\"\u003e\n  \u003cdiv class=\"description\"\u003e\n    \u003cp class=\"lead\"\u003eEffortless and unforgettable. The VIOLA Kaftan Maxi Dress is a fluid mesh batwing gown featuring a sweeping ombré that moves from soft lilac at the shoulders to deep violet at the hem. Lightweight enough to wear all day, dramatic enough to own any room. Both sleeves flow into a dramatic oversized batwing drape, and a funnel neckline with keyhole detail and back zipper closure completes the silhouette. A gentle train pools at the floor for a final touch of drama. Resort-ready, and beyond.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"tabs-container\"\u003e\n    \u003cnav class=\"tab-nav\"\u003e\n      \u003cbutton class=\"tab-btn active\" onclick=\"switchTab('details')\"\u003eDetails\u003c\/button\u003e\n      \u003cbutton class=\"tab-btn\" onclick=\"switchTab('sizing')\"\u003eSize Guide\u003c\/button\u003e\n      \u003cbutton class=\"tab-btn\" onclick=\"switchTab('care')\"\u003eFabric \u0026amp; Care\u003c\/button\u003e\n    \u003c\/nav\u003e\n    \u003c!-- DETAILS TAB --\u003e\n    \u003cdiv class=\"tab-panel active\" id=\"tab-details\"\u003e\n      \u003cul class=\"love-list\"\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eOmbré mesh batwing kaftan maxi dress\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eDramatic oversized batwing sleeves, both sides matching\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eFunnel neckline with keyhole detail and back zipper closure\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eSoft trailing train at the hem\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eLightweight and stretchy\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eExcellent air permeability\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eApprox. 62″ long (size S)\u003c\/li\u003e\n        \u003cli\u003e\n\u003cspan class=\"love-dot\"\u003e\u003c\/span\u003eLined but slightly sheer. The mesh fabric has a subtle see-through quality even with the lining\u003c\/li\u003e\n      \u003c\/ul\u003e\n      \u003cdiv style=\"margin-top:16px;padding:14px 18px;background:var(--highlight);border-radius:2px\"\u003e\n        \u003cp style=\"font-size:.72rem;color:var(--text-secondary);line-height:1.6\"\u003e\n          \u003cspan style=\"font-family:'Cormorant Garamond',serif;font-weight:500;font-size:.85rem;color:var(--warm-black)\"\u003eSizing Tip:\u003c\/span\u003e\n          Choose your normal size.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003c!-- SIZE GUIDE TAB --\u003e\n    \u003cdiv class=\"tab-panel\" id=\"tab-sizing\"\u003e\n      \u003cdiv class=\"size-finder\"\u003e\n        \u003cdiv class=\"size-finder-title\"\u003eFind Your Size\u003c\/div\u003e\n        \u003cdiv class=\"size-finder-subtitle\"\u003eBased on your body measurements\u003c\/div\u003e\n        \u003cdiv class=\"size-finder-grid\" id=\"sizeFinderGrid\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"unit-toggle\"\u003e\n        \u003cbutton class=\"unit-btn active\" onclick=\"setUnit('in')\"\u003eInches\u003c\/button\u003e\n        \u003cbutton class=\"unit-btn\" onclick=\"setUnit('cm')\"\u003eCentimetres\u003c\/button\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"garment-label\"\u003e\u003cspan\u003eGarment Measurements: Laid Flat\u003c\/span\u003e\u003c\/div\u003e\n      \u003cdiv class=\"table-wrapper\"\u003e\n        \u003ctable\u003e\n          \u003cthead\u003e\n            \u003ctr\u003e\n              \u003cth\u003eMeasurement\u003c\/th\u003e\n              \u003cth\u003eXS\u003c\/th\u003e\n              \u003cth\u003eS\u003c\/th\u003e\n              \u003cth\u003eM\u003c\/th\u003e\n              \u003cth\u003eL\u003c\/th\u003e\n              \u003cth\u003eXL\u003c\/th\u003e\n              \u003cth\u003e2XL\u003c\/th\u003e\n              \u003cth\u003e3XL\u003c\/th\u003e\n              \u003cth\u003e4XL\u003c\/th\u003e\n            \u003c\/tr\u003e\n          \u003c\/thead\u003e\n          \u003ctbody id=\"tableBody\"\u003e\u003c\/tbody\u003e\n        \u003c\/table\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"between-sizes\"\u003e\n        \u003cdiv class=\"between-sizes-title\"\u003eBetween Sizes?\u003c\/div\u003e\n        \u003cp\u003eChoose your normal size. The stretchy mesh fabric adapts to your shape, and the relaxed silhouette gives plenty of room.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"fit-notes\" style=\"margin-top:24px\"\u003e\n        \u003cp\u003eThe VIOLA Kaftan Maxi Dress is a stretchy mesh style with a 2\/3 stretch factor. The relaxed silhouette flows beautifully over the body.\u003c\/p\u003e\n        \u003cp class=\"model-note\"\u003eEmmanuella is 5′8″ and wears size S.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"measure-guide\"\u003e\n        \u003cdiv class=\"measure-item\"\u003e\n          \u003ch4\u003eBust\u003c\/h4\u003e\n          \u003cp\u003eMeasure around the fullest part of your bust, keeping the tape level across your back.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"measure-item\"\u003e\n          \u003ch4\u003eWaist\u003c\/h4\u003e\n          \u003cp\u003eMeasure around your natural waistline: the narrowest part of your torso, typically just above the navel.\u003c\/p\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"measure-item\"\u003e\n          \u003ch4\u003eHip\u003c\/h4\u003e\n          \u003cp\u003eMeasure around the fullest part of your hips and buttocks, keeping the tape level.\u003c\/p\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003c!-- FABRIC \u0026 CARE TAB --\u003e\n    \u003cdiv class=\"tab-panel\" id=\"tab-care\"\u003e\n      \u003cdiv class=\"details-grid\"\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eFabric\u003c\/div\u003e\n          \u003cdiv class=\"detail-value\"\u003e70% Polyester · 30% Spandex\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eWeight\u003c\/div\u003e\n          \u003cdiv class=\"detail-value\"\u003eLightweight · Breathable\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eCare\u003c\/div\u003e\n          \u003cdiv class=\"detail-value\"\u003eHand Wash\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eStretch\u003c\/div\u003e\n          \u003cdiv class=\"stretch-dots\"\u003e\n            \u003cdiv class=\"stretch-dot filled\"\u003e\u003c\/div\u003e\n            \u003cdiv class=\"stretch-dot filled\"\u003e\u003c\/div\u003e\n            \u003cdiv class=\"stretch-dot\"\u003e\u003c\/div\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eLining\u003c\/div\u003e\n          \u003cdiv class=\"detail-value\"\u003eLined\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eOpacity\u003c\/div\u003e\n          \u003cdiv class=\"detail-value\"\u003eSlightly Sheer\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"detail-card\"\u003e\n          \u003cdiv class=\"detail-label\"\u003eClosure\u003c\/div\u003e\n          \u003cdiv class=\"detail-value\"\u003eBack Zipper\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\nconst usSizes = ['US 0–2', 'US 4–6', 'US 6–8', 'US 10–12', 'US 14–16', 'US 18–20', 'US 22–24', 'US 24–26'];\nconst sizeFinderData = {\n  in: [\n    {size: 'XS',  bust: 'Bust 31–33″',    waist: 'Waist 23–25″'},\n    {size: 'S',   bust: 'Bust 34–36″',    waist: 'Waist 26–28″'},\n    {size: 'M',   bust: 'Bust 37–39″',    waist: 'Waist 29–31″'},\n    {size: 'L',   bust: 'Bust 40–42″',    waist: 'Waist 32–34″'},\n    {size: 'XL',  bust: 'Bust 43–45″',    waist: 'Waist 36–38″'},\n    {size: '2XL', bust: 'Bust 46–48″',    waist: 'Waist 39–41″'},\n    {size: '3XL', bust: 'Bust 49–51″',    waist: 'Waist 42–44″'},\n    {size: '4XL', bust: 'Bust 52–55″',    waist: 'Waist 45–47″'}\n  ],\n  cm: [\n    {size: 'XS',  bust: 'Bust 78.5–84 cm',    waist: 'Waist 58.5–63.5 cm'},\n    {size: 'S',   bust: 'Bust 86.5–91.5 cm',  waist: 'Waist 66–71 cm'},\n    {size: 'M',   bust: 'Bust 94–99 cm',      waist: 'Waist 73.5–79 cm'},\n    {size: 'L',   bust: 'Bust 101.5–107 cm',  waist: 'Waist 81.5–86.5 cm'},\n    {size: 'XL',  bust: 'Bust 109–114 cm',    waist: 'Waist 91.5–96.5 cm'},\n    {size: '2XL', bust: 'Bust 117–122 cm',    waist: 'Waist 99–104 cm'},\n    {size: '3XL', bust: 'Bust 124.5–130 cm',  waist: 'Waist 106.5–112 cm'},\n    {size: '4XL', bust: 'Bust 132–140 cm',    waist: 'Waist 114.5–119.5 cm'}\n  ]\n};\nconst tableData = {\n  in: [\n    {label: 'Bust', values: ['26.0', '28.3', '30.7', '33.1', '35.4', '37.8', '40.1', '42.5']},\n    {label: 'Waist', values: ['23.2', '25.6', '27.9', '30.3', '32.7', '35.0', '37.4', '39.7']},\n    {label: 'Hip',  values: ['31.1', '33.5', '35.8', '38.2', '40.5', '42.9', '45.3', '47.6']},\n    {label: 'Length', values: ['62.4', '63.8', '65.2', '66.5', '67.9', '69.3', '70.7', '72.1']},\n    {label: 'Sleeve Length', values: ['23.0', '23.6', '24.2', '24.8', '25.4', '26.0', '26.6', '27.2']}\n  ],\n  cm: [\n    {label: 'Bust', values: ['66.0', '71.9', '78.0', '84.1', '89.9', '96.0', '101.9', '108.0']},\n    {label: 'Waist', values: ['58.9', '65.0', '70.9', '77.0', '83.1', '88.9', '95.0', '100.8']},\n    {label: 'Hip',  values: ['79.0', '85.1', '90.9', '97.0', '102.9', '109.0', '115.1', '120.9']},\n    {label: 'Length', values: ['158.5', '162.1', '165.6', '168.9', '172.5', '176.0', '179.6', '183.1']},\n    {label: 'Sleeve Length', values: ['58.4', '59.9', '61.5', '63.0', '64.5', '66.0', '67.6', '69.1']}\n  ]\n};\nfunction switchTab(tab) {\n  document.querySelectorAll('.tab-btn').forEach(function(b) { b.classList.remove('active'); });\n  document.querySelectorAll('.tab-panel').forEach(function(p) { p.classList.remove('active'); });\n  event.target.classList.add('active');\n  document.getElementById('tab-' + tab).classList.add('active');\n}\nvar currentUnit = 'in';\nfunction setUnit(u) {\n  currentUnit = u;\n  document.querySelectorAll('.unit-btn').forEach(function(b) {\n    b.classList.toggle('active', b.textContent.toLowerCase().includes(u === 'in' ? 'inch' : 'cent'));\n  });\n  renderTable();\n  renderSizeFinder();\n}\nfunction renderSizeFinder() {\n  var g = document.getElementById('sizeFinderGrid');\n  g.innerHTML = '';\n  sizeFinderData[currentUnit].forEach(function(item, i) {\n    var c = document.createElement('div');\n    c.className = 'size-finder-card';\n    c.innerHTML = '\u003cdiv class=\"size-label\"\u003e' + item.size + '\u003c\/div\u003e'\n      + '\u003cdiv class=\"us-size\"\u003e' + usSizes[i] + '\u003c\/div\u003e'\n      + '\u003cdiv class=\"bust-range\"\u003e' + item.bust + '\u003cbr\u003e' + item.waist + '\u003c\/div\u003e';\n    g.appendChild(c);\n  });\n}\nfunction renderTable() {\n  var t = document.getElementById('tableBody');\n  t.innerHTML = '';\n  tableData[currentUnit].forEach(function(r) {\n    var tr = document.createElement('tr');\n    tr.innerHTML = '\u003ctd\u003e' + r.label + '\u003c\/td\u003e'\n      + r.values.map(function(v) { return '\u003ctd\u003e' + v + '\u003c\/td\u003e'; }).join('');\n    t.appendChild(tr);\n  });\n}\nrenderTable();\nrenderSizeFinder();\n\u003c\/script\u003e\n\u003c\/body\u003e","brand":"shakara","offers":[{"title":"XS","offer_id":45907680624831,"sku":"05756601266","price":290.0,"currency_code":"USD","in_stock":true},{"title":"S","offer_id":45907680657599,"sku":"05756601204","price":290.0,"currency_code":"USD","in_stock":true},{"title":"M","offer_id":45907680690367,"sku":"057566011902","price":290.0,"currency_code":"USD","in_stock":true},{"title":"L","offer_id":45907680723135,"sku":"057566011919","price":290.0,"currency_code":"USD","in_stock":true},{"title":"XL","offer_id":45907680755903,"sku":"057566011926","price":290.0,"currency_code":"USD","in_stock":true},{"title":"XXL","offer_id":45907680788671,"sku":"05756601242","price":290.0,"currency_code":"USD","in_stock":true},{"title":"XXXL","offer_id":45907680821439,"sku":"05756602256","price":290.0,"currency_code":"USD","in_stock":true},{"title":"XXXXL","offer_id":45907680854207,"sku":"05756602348","price":290.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1463\/5092\/files\/ofuurejun2919103.jpg?v=1784875020","url":"https:\/\/www.ofuure.com\/products\/viola-kaftan-maxi-dress","provider":"OFUURE","version":"1.0","type":"link"}