{
  "version": 3,
  "sources": ["/cdn/shop/t/613/assets/printbolt-designer.js?pbv=647-upload-placeholder-20261011"],
  "sourcesContent": ["/*! Metadata readers: probe-image-size 7.2.3, MIT. See vendor/LICENSE in release package. */\nvar pbImageMetadataParsers=(()=>{var l=(i,r)=>()=>{try{return r||i((r={exports:{}}).exports,r),r.exports}catch(e){throw r=0,e}};var c=l(m=>{\"use strict\";m.sliceEq=function(i,r,e){for(var t=r,n=0;n<e.length;)if(i[t++]!==e[n++])return!1;return!0};m.str2arr=function(i,r){var e=[],t=0;if(r&&r===\"hex\")for(;t<i.length;)e.push(parseInt(i.slice(t,t+2),16)),t+=2;else for(;t<i.length;t++)e.push(i.charCodeAt(t)&255);return e};m.readUInt16LE=function(i,r){return i[r]|i[r+1]<<8};m.readUInt16BE=function(i,r){return i[r+1]|i[r]<<8};m.readUInt32LE=function(i,r){return i[r]|i[r+1]<<8|i[r+2]<<16|i[r+3]*16777216};m.readUInt32BE=function(i,r){return i[r+3]|i[r+2]<<8|i[r+1]<<16|i[r]*16777216};function d(i,r,e){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||\"\",this.name=this.constructor.name,this.message=i,r&&(this.code=r),e&&(this.statusCode=e)}d.prototype=Object.create(Error.prototype);d.prototype.constructor=d;m.ProbeError=d});var I=l((Gr,S)=>{\"use strict\";function F(i,r){var e=new Error(i);return e.code=r,e}function rr(i){try{return decodeURIComponent(escape(i))}catch{return i}}function g(i,r,e){this.input=i.subarray(r,e),this.start=r;var t=String.fromCharCode.apply(null,this.input.subarray(0,4));if(t!==\"II*\\0\"&&t!==\"MM\\0*\")throw F(\"invalid TIFF signature\",\"EBADDATA\");this.big_endian=t[0]===\"M\"}g.prototype.each=function(i){this.aborted=!1;var r=this.read_uint32(4);for(this.ifds_to_read=[{id:0,offset:r}];this.ifds_to_read.length>0&&!this.aborted;){var e=this.ifds_to_read.shift();e.offset&&this.scan_ifd(e.id,e.offset,i)}};g.prototype.read_uint16=function(i){var r=this.input;if(i+2>r.length)throw F(\"unexpected EOF\",\"EBADDATA\");return this.big_endian?r[i]*256+r[i+1]:r[i]+r[i+1]*256};g.prototype.read_uint32=function(i){var r=this.input;if(i+4>r.length)throw F(\"unexpected EOF\",\"EBADDATA\");return this.big_endian?r[i]*16777216+r[i+1]*65536+r[i+2]*256+r[i+3]:r[i]+r[i+1]*256+r[i+2]*65536+r[i+3]*16777216};g.prototype.is_subifd_link=function(i,r){return i===0&&r===34665||i===0&&r===34853||i===34665&&r===40965};g.prototype.exif_format_length=function(i){switch(i){case 1:case 2:case 6:case 7:return 1;case 3:case 8:return 2;case 4:case 9:case 11:return 4;case 5:case 10:case 12:return 8;default:return 0}};g.prototype.exif_format_read=function(i,r){var e;switch(i){case 1:case 2:return e=this.input[r],e;case 6:return e=this.input[r],e|(e&128)*33554430;case 3:return e=this.read_uint16(r),e;case 8:return e=this.read_uint16(r),e|(e&32768)*131070;case 4:return e=this.read_uint32(r),e;case 9:return e=this.read_uint32(r),e|0;case 5:case 10:case 11:case 12:return null;case 7:return null;default:return null}};g.prototype.scan_ifd=function(i,r,e){var t=this.read_uint16(r);r+=2;for(var n=0;n<t;n++){var h=this.read_uint16(r),a=this.read_uint16(r+2),s=this.read_uint32(r+4),u=this.exif_format_length(a),o=s*u,v=o<=4?r+8:this.read_uint32(r+8),x=!1;if(v+o>this.input.length)throw F(\"unexpected EOF\",\"EBADDATA\");for(var f=[],y=v,z=0;z<s;z++,y+=u){var k=this.exif_format_read(a,y);if(k===null){f=null;break}f.push(k)}Array.isArray(f)&&a===2&&(f=rr(String.fromCharCode.apply(null,f)),f&&f[f.length-1]===\"\\0\"&&(f=f.slice(0,-1))),this.is_subifd_link(i,h)&&Array.isArray(f)&&Number.isInteger(f[0])&&f[0]>0&&(this.ifds_to_read.push({id:h,offset:f[0]}),x=!0);var Q={is_big_endian:this.big_endian,ifd:i,tag:h,format:a,count:s,entry_offset:r+this.start,data_length:o,data_offset:v+this.start,value:f,is_subifd_link:x};if(e(Q)===!1){this.aborted=!0;return}r+=12}i===0&&this.ifds_to_read.push({id:1,offset:this.read_uint32(r)})};S.exports.ExifParser=g;S.exports.get_orientation=function(i){var r=0;try{return new g(i,0,i.length).each(function(e){if(e.ifd===0&&e.tag===274&&Array.isArray(e.value))return r=e.value[0],!1}),r}catch{return-1}}});var P=l((Pr,G)=>{\"use strict\";var A=c().readUInt16BE,ir=c().str2arr,er=c().sliceEq,tr=I(),nr=ir(\"Exif\\0\\0\");G.exports=function(i){if(!(i.length<2)&&!(i[0]!==255||i[1]!==216||i[2]!==255))for(var r=2;;){for(;;){if(i.length-r<2)return;if(i[r++]===255)break}for(var e=i[r++],t;e===255;)e=i[r++];if(208<=e&&e<=217||e===1)t=0;else if(192<=e&&e<=254){if(i.length-r<2)return;t=A(i,r)-2,r+=2}else return;if(e===217||e===218)return;var n;if(e===225&&t>=10&&er(i,r,nr)&&(n=tr.get_orientation(i.slice(r+6,r+t))),t>=5&&192<=e&&e<=207&&e!==196&&e!==200&&e!==204){if(i.length-r<t)return;var h={width:A(i,r+3),height:A(i,r+1),type:\"jpg\",mime:\"image/jpeg\",wUnits:\"px\",hUnits:\"px\"};return n>0&&(h.orientation=n),h}r+=t}}});var H=l((Tr,L)=>{\"use strict\";var R=c().str2arr,T=c().sliceEq,V=c().readUInt32BE,ar=R(`\\x89PNG\\r\n\u001A\n`),hr=R(\"IHDR\");L.exports=function(i){if(!(i.length<24)&&T(i,0,ar)&&T(i,12,hr))return{width:V(i,16),height:V(i,20),type:\"png\",mime:\"image/png\",wUnits:\"px\",hUnits:\"px\"}}});var X=l((Vr,O)=>{\"use strict\";var W=c().str2arr,M=c().sliceEq,$=c().readUInt16LE,B=c().readUInt32LE,ur=I(),sr=W(\"RIFF\"),fr=W(\"WEBP\");function cr(i,r){if(!(i[r+3]!==157||i[r+4]!==1||i[r+5]!==42))return{width:$(i,r+6)&16383,height:$(i,r+8)&16383,type:\"webp\",mime:\"image/webp\",wUnits:\"px\",hUnits:\"px\"}}function vr(i,r){if(i[r]===47){var e=B(i,r+1);return{width:(e&16383)+1,height:(e>>14&16383)+1,type:\"webp\",mime:\"image/webp\",wUnits:\"px\",hUnits:\"px\"}}}function or(i,r){return{width:(i[r+6]<<16|i[r+5]<<8|i[r+4])+1,height:(i[r+9]<<r|i[r+8]<<8|i[r+7])+1,type:\"webp\",mime:\"image/webp\",wUnits:\"px\",hUnits:\"px\"}}O.exports=function(i){if(!(i.length<16)&&!(!M(i,0,sr)&&!M(i,8,fr))){var r=12,e=null,t=0,n=B(i,4)+8;if(!(n>i.length)){for(;r+8<n;){if(i[r]===0){r++;continue}var h=String.fromCharCode.apply(null,i.slice(r,r+4)),a=B(i,r+4);h===\"VP8 \"&&a>=10?e=e||cr(i,r+8):h===\"VP8L\"&&a>=9?e=e||vr(i,r+8):h===\"VP8X\"&&a>=10?e=e||or(i,r+8):h===\"EXIF\"&&(t=ur.get_orientation(i.slice(r+8,r+8+a)),r=1/0),r+=8+a}if(e)return t>0&&(e.orientation=t),e}}}});var N=l((Rr,U)=>{\"use strict\";var _=c().readUInt16BE,C=c().readUInt32BE;function E(i,r){if(i.length<4+r)return null;var e=C(i,r);return i.length<e+r||e<8?null:{boxtype:String.fromCharCode.apply(null,i.slice(r+4,r+8)),data:i.slice(r+8,r+e),end:r+e}}U.exports.unbox=E;function pr(i,r){for(var e=0;;){var t=E(i,e);if(!t)break;switch(t.boxtype){case\"ispe\":r.sizes.push({width:C(t.data,4),height:C(t.data,8)});break;case\"irot\":r.transforms.push({type:\"irot\",value:t.data[0]&3});break;case\"imir\":r.transforms.push({type:\"imir\",value:t.data[0]&1});break}e=t.end}}function b(i,r,e){for(var t=0,n=0;n<e;n++)t=t*256+(i[r+n]||0);return t}function lr(i,r){for(var e=i[4]>>4&15,t=i[4]&15,n=i[5]>>4&15,h=_(i,6),a=8,s=0;s<h;s++){var u=_(i,a);a+=2;var o=_(i,a);a+=2;var v=b(i,a,n);a+=n;var x=_(i,a);if(a+=2,o===0&&x===1){var f=b(i,a,e),y=b(i,a+e,t);r.item_loc[u]={length:y,offset:f+v}}a+=x*(e+t)}}function gr(i,r){for(var e=_(i,4),t=6,n=0;n<e;n++){var h=E(i,t);if(!h)break;if(h.boxtype===\"infe\"){for(var a=_(h.data,4),s=\"\",u=8;u<h.data.length&&h.data[u];u++)s+=String.fromCharCode(h.data[u]);r.item_inf[s]=a}t=h.end}}function xr(i,r){for(var e=0;;){var t=E(i,e);if(!t)break;t.boxtype===\"ipco\"&&pr(t.data,r),e=t.end}}function mr(i,r){for(var e=4;;){var t=E(i,e);if(!t)break;t.boxtype===\"iprp\"&&xr(t.data,r),t.boxtype===\"iloc\"&&lr(t.data,r),t.boxtype===\"iinf\"&&gr(t.data,r),e=t.end}}function _r(i){var r=i.reduce(function(n,h){return n.width>h.width||n.width===h.width&&n.height>h.height?n:h}),e=i.reduce(function(n,h){return n.height>h.height||n.height===h.height&&n.width>h.width?n:h}),t;return r.width>e.height||r.width===e.height&&r.height>e.width?t=r:t=e,t}U.exports.readSizeFromMeta=function(i){var r={sizes:[],transforms:[],item_inf:{},item_loc:{}};if(mr(i,r),!!r.sizes.length){var e=_r(r.sizes),t=1;r.transforms.forEach(function(h){var a={1:6,2:5,3:8,4:7,5:4,6:3,7:2,8:1},s={1:4,2:3,3:2,4:1,5:6,6:5,7:8,8:7};if(h.type===\"imir\"&&(h.value===0?t=s[t]:(t=s[t],t=a[t],t=a[t])),h.type===\"irot\")for(var u=0;u<h.value;u++)t=a[t]});var n=null;return r.item_inf.Exif&&(n=r.item_loc[r.item_inf.Exif]),{width:e.width,height:e.height,orientation:r.transforms.length?t:null,variants:r.sizes,exif_location:n}}};U.exports.getMimeType=function(i){var r=String.fromCharCode.apply(null,i.slice(0,4)),e={};e[r]=!0;for(var t=8;t<i.length;t+=4)e[String.fromCharCode.apply(null,i.slice(t,t+4))]=!0;if(!(!e.mif1&&!e.msf1&&!e.miaf))return r===\"avif\"||r===\"avis\"||r===\"avio\"?{type:\"avif\",mime:\"image/avif\"}:r===\"heic\"||r===\"heix\"?{type:\"heic\",mime:\"image/heic\"}:r===\"hevc\"||r===\"hevx\"?{type:\"heic\",mime:\"image/heic-sequence\"}:e.avif||e.avis?{type:\"avif\",mime:\"image/avif\"}:e.heic||e.heix||e.hevc||e.hevx||e.heis?e.msf1?{type:\"heif\",mime:\"image/heif-sequence\"}:{type:\"heif\",mime:\"image/heif\"}:{type:\"avif\",mime:\"image/avif\"}}});var D=l((Lr,j)=>{\"use strict\";var wr=c().str2arr,Er=c().sliceEq,yr=c().readUInt32BE,q=N(),dr=I(),Fr=wr(\"ftyp\");j.exports=function(i){if(Er(i,4,Fr)){var r=q.unbox(i,0);if(r){var e=q.getMimeType(r.data);if(e){for(var t,n=r.end;;){var h=q.unbox(i,n);if(!h)break;if(n=h.end,h.boxtype===\"mdat\")return;if(h.boxtype===\"meta\"){t=h.data;break}}if(t){var a=q.readSizeFromMeta(t);if(a){var s={width:a.width,height:a.height,type:e.type,mime:e.mime,wUnits:\"px\",hUnits:\"px\"};if(a.variants.length>1&&(s.variants=a.variants),a.orientation&&(s.orientation=a.orientation),a.exif_location&&a.exif_location.offset+a.exif_location.length<=i.length){var u=yr(i,a.exif_location.offset),o=i.slice(a.exif_location.offset+u+4,a.exif_location.offset+a.exif_location.length),v=dr.get_orientation(o);v>0&&(s.orientation=v)}return s}}}}}}});var J=l((Hr,Y)=>{\"use strict\";function Ir(i){return i===32||i===9||i===13||i===10}function w(i){return typeof i==\"number\"&&isFinite(i)&&i>0}function Ur(i){var r=0,e=i.length;for(i[0]===239&&i[1]===187&&i[2]===191&&(r=3);r<e&&Ir(i[r]);)r++;return r===e?!1:i[r]===60}var qr=/<[-_.:a-zA-Z0-9][^>]*>/,Sr=/^<([-_.:a-zA-Z0-9]+:)?svg\\s/,Ar=/[^-]\\bwidth=\"([^%]+?)\"|[^-]\\bwidth='([^%]+?)'/,Br=/\\bheight=\"([^%]+?)\"|\\bheight='([^%]+?)'/,br=/\\bview[bB]ox=\"(.+?)\"|\\bview[bB]ox='(.+?)'/,Z=/in$|mm$|cm$|pt$|pc$|px$|em$|ex$/;function Cr(i){var r=i.match(Ar),e=i.match(Br),t=i.match(br);return{width:r&&(r[1]||r[2]),height:e&&(e[1]||e[2]),viewbox:t&&(t[1]||t[2])}}function p(i){return Z.test(i)?i.match(Z)[0]:\"px\"}Y.exports=function(i){if(Ur(i)){for(var r=\"\",e=0;e<i.length;e++)r+=String.fromCharCode(i[e]);var t=(r.match(qr)||[\"\"])[0];if(Sr.test(t)){var n=Cr(t),h=parseFloat(n.width),a=parseFloat(n.height);if(n.width&&n.height)return!w(h)||!w(a)?void 0:{width:h,height:a,type:\"svg\",mime:\"image/svg+xml\",wUnits:p(n.width),hUnits:p(n.height)};var s=(n.viewbox||\"\").split(\" \"),u={width:s[2],height:s[3]},o=parseFloat(u.width),v=parseFloat(u.height);if(!(!w(o)||!w(v))&&p(u.width)===p(u.height)){var x=o/v;return n.width?w(h)?{width:h,height:h/x,type:\"svg\",mime:\"image/svg+xml\",wUnits:p(n.width),hUnits:p(n.width)}:void 0:n.height?w(a)?{width:a*x,height:a,type:\"svg\",mime:\"image/svg+xml\",wUnits:p(n.height),hUnits:p(n.height)}:void 0:{width:o,height:v,type:\"svg\",mime:\"image/svg+xml\",wUnits:p(u.width),hUnits:p(u.height)}}}}}});var Dr=l((Mr,K)=>{K.exports={jpeg:P(),png:H(),webp:X(),heic:D(),heif:D(),svg:J()}});return Dr();})();\n\n(function () {\n  // PNG compression is performed in the isolated server renderer.\n  \n\n  function mountPrintboltDesigner(root) {\n    if (!root || root.__pbMounted) return;\n    root.__pbMounted = true;\n    document.documentElement.setAttribute('data-pb-designer-build', '646-stage-upload-20261011');\n\n  var pbLocale = String(root.dataset.locale || (window.Shopify && window.Shopify.locale) || document.documentElement.lang || 'sv').replace(/_/g, '-');\n  var pbTranslations = {};\n  var pbTranslationNode = root.querySelector('[data-pb-translations]');\n  try { pbTranslations = JSON.parse(pbTranslationNode ? pbTranslationNode.textContent : '{}'); } catch (error) { pbTranslations = {}; }\n\n  function pbT(key, fallback, values) {\n    var text = Object.prototype.hasOwnProperty.call(pbTranslations, key) ? pbTranslations[key] : fallback;\n    if (typeof text !== 'string' || /^translation missing:/i.test(text)) text = fallback;\n    return String(text || '').replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, function (match, name) {\n      return values && Object.prototype.hasOwnProperty.call(values, name) ? String(values[name]) : match;\n    });\n  }\n\n  var pbServerErrorKeys = {\"Bilden kunde inte bearbetas.\":\"bilden_kunde_inte_bearbetas\",\"Bilden kunde inte laddas upp. Kontrollera anslutningen och f\u00F6rs\u00F6k igen.\":\"bild_uppladdning_natverksfel\",\"Uppladdningen avbr\u00F6ts. F\u00F6rs\u00F6k igen.\":\"bild_uppladdning_avbruten\",\"Uppladdningen tog f\u00F6r l\u00E5ng tid. F\u00F6rs\u00F6k igen.\":\"bild_uppladdning_timeout\",\"Uppladdning och bearbetning\":\"bild_uppladdning_bearbetning\",\"Skapar bild...\":\"skapar_bild_progress_enhetlig\",\"Laddar upp bild...\":\"bild_uppladdning_enhetlig\",\"Bilden kunde inte laddas upp\":\"bild_uppladdning_misslyckades\",\"Det tog f\u00F6r l\u00E5ng tid att spara designen. Din design finns kvar. F\u00F6rs\u00F6k igen.\":\"designverifieringen_tog_for_lang_tid\",\"Bilden \u00E4r fortfarande f\u00F6r stor efter komprimering. Din design finns kvar. Kontakta support@vardagskammare.shop s\u00E5 hj\u00E4lper vi dig med bilden.\":\"png_filen_for_stor_efter_optimering\",\"Bilden kunde inte laddas upp i tid. Din design finns kvar. Kontrollera anslutningen och f\u00F6rs\u00F6k igen.\":\"bilduppladdningen_tog_for_lang_tid\",\"Bildsvaret \u00E4r f\u00F6r stort.\":\"bildsvaret_for_stort\",\"Ogiltigt svar fr\u00E5n bildbearbetningen.\":\"bildbearbetning_ogiltigt_svar\",\"Bildbearbetningen avbr\u00F6ts. F\u00F6rs\u00F6k igen.\":\"bildbearbetning_avbrots\",\"Bilden kunde inte visas. F\u00F6rs\u00F6k igen.\":\"bilden_kunde_inte_visas\",\"Originalbilden kunde inte h\u00E4mtas. Din design finns kvar.\":\"originalbilden_kunde_inte_hamtas\",\"Bilden laddas fortfarande upp.\":\"bilden_laddas_fortfarande_upp\",\"Designen \u00E4r sparad och klar. Best\u00E4ll igen anv\u00E4nder den h\u00E4r versionen.\":\"design_sparad_aterbestallning\",\"Korrigeringen kunde inte valideras. F\u00F6reg\u00E5ende f\u00E4rdiga version g\u00E4ller fortfarande.\":\"design_korrigering_ogiltig\",\"Korrigeringen \u00E4r \u00E4nnu inte bekr\u00E4ftad. \u00D6ppna designl\u00E4nken igen f\u00F6r att kontrollera vilken version som g\u00E4ller.\":\"design_korrigering_obekraftad\",\"Filen \u00E4r tom.\":\"bildfil_tom\",\"Filen \u00E4r f\u00F6r stor.\":\"bildfil_for_stor\",\"Privat bildlagring \u00E4r inte aktiverad.\":\"privat_bildlagring_inaktiv\",\"Ogiltig bildreferens.\":\"bildreferens_ogiltig\",\"Bilden saknas eller har g\u00E5tt ut.\":\"bild_saknas_eller_utgangen\",\"\u00C5tkomst till bilden nekades.\":\"bild_atkomst_nekad\",\"Bildformatet st\u00F6ds inte.\":\"bildformat_stods_inte_server\",\"Bilden har f\u00F6r m\u00E5nga pixlar.\":\"bild_for_manga_pixlar\",\"Originalbilden kunde inte avkodas.\":\"originalbild_avkodning_misslyckades\",\"F\u00F6rhandsvisningen kunde inte skapas.\":\"bild_forhandsvisning_misslyckades\",\"Originalet saknas.\":\"originalbild_saknas\",\"Originalbilden \u00E4r f\u00F6r stor f\u00F6r denna bildbearbetning.\":\"originalbild_for_stor\",\"Originalet kunde inte arkiveras.\":\"originalbild_arkivering_misslyckades\",\"Originalet kunde inte bekr\u00E4ftas i Shopify.\":\"originalbild_shopify_obekraftad\",\"Originalbildens m\u00E5tt har \u00E4ndrats. Designen kunde inte \u00F6ppnas s\u00E4kert.\":\"originalbild_andrade_matt\",\"Tryckfilen \u00E4r f\u00F6r stor.\":\"tryckfil_for_stor_server\",\"Tryckfilen kunde inte sparas.\":\"tryckfil_kunde_inte_sparas\",\"Den avkodade bilden \u00E4r f\u00F6r stor.\":\"bild_avkodad_for_stor\",\"Uppladdningen avbr\u00F6ts.\":\"bild_uppladdning_avbrots_server\",\"S\u00E4kerhetskontrollen saknas.\":\"bild_sakerhetskontroll_saknas\",\"S\u00E4kerhetskontrollen \u00E4r tillf\u00E4lligt otillg\u00E4nglig.\":\"bild_sakerhetskontroll_otillganglig\",\"S\u00E4kerhetskontrollen kunde inte verifieras. F\u00F6rs\u00F6k igen.\":\"bild_sakerhetskontroll_misslyckades\",\"Ogiltig designsession.\":\"bild_designsession_ogiltig\",\"Verifierad designsession saknas.\":\"bild_designsession_saknas\"};\n  function pbTranslatedError(message) {\n    if (['Failed to fetch','Load failed','NetworkError when attempting to fetch resource.','The operation was aborted.'].includes(message)) return pbT('aterhamtning_natverk', 'Anslutningen avbr\u00F6ts. Din design finns kvar i verktyget. F\u00F6rs\u00F6k igen.');\n    var key = typeof message === 'string' && pbServerErrorKeys[message];\n    return key ? pbT(key, message) : message;\n  }\n\n  // A late 401 may belong to a session that another request already renewed.\n  function pbInvalidateSession(failed) {\n    if (failed && pbSession && pbSession.token === failed.token) pbSession = null;\n  }\n\n  async function pbJsonRequest(url, options, timeoutMs, authorized, timeoutMessage) {\n    var read = !options || !options.method || options.method === 'GET';\n    for (var attempt = 0; ; attempt++) {\n      var result, error;\n      try {\n        result = await pbJsonRequestOnce(url, options, timeoutMs, authorized, timeoutMessage);\n        if (authorized && result.status === 401 && attempt === 0) { continue; }\n        if (!read || ![408, 429, 500, 502, 503, 504].includes(result.status)) return result;\n      } catch (failure) { error = failure; }\n      if (!read || attempt >= 2 || result && result.retryAfter > 5000) {\n        if (error) throw error;\n        return result;\n      }\n      await new Promise(function(resolve) { setTimeout(resolve, Math.max(result && result.retryAfter || 0, 400 * (attempt + 1))); });\n    }\n  }\n\n  async function pbReadJsonResponse(url, options) {\n    var result = await pbJsonRequest(url, options, 12000, false);\n    return { ok: result.ok, status: result.status, json: async function() { return result.data; } };\n  }\n\n  async function pbFetchWithDeadline(url, options, timeoutMs) {\n    var controller = new AbortController();\n    var timer = setTimeout(function() { controller.abort(); }, timeoutMs || 180000);\n    try {\n      var response = await fetch(url, Object.assign({}, options, {signal:controller.signal}));\n      if (!response.body) { clearTimeout(timer); return response; }\n      var reader = response.body.getReader();\n      var stream = new ReadableStream({\n        async pull(target) {\n          try {\n            var next = await reader.read();\n            if (next.done) { clearTimeout(timer); target.close(); }\n            else target.enqueue(next.value);\n          } catch (error) { clearTimeout(timer); target.error(error); }\n        },\n        cancel(reason) { clearTimeout(timer); controller.abort(); return reader.cancel(reason); }\n      });\n      return new Response(stream, { status:response.status, statusText:response.statusText, headers:response.headers });\n    } catch (error) { clearTimeout(timer); throw error; }\n  }\n\n  async function pbAuthorizedFetch(url, options) {\n    for (var attempt = 0; attempt < 2; attempt++) {\n      var session = await pbEnsureSession();\n      var headers = new Headers(options && options.headers || {});\n      headers.set('X-PB-Session', session.token);\n      var response = await pbFetchWithDeadline(url, Object.assign({}, options, {headers:headers}), 180000);\n      if (response.status !== 401) return response;\n      pbInvalidateSession(session);\n      if (attempt) return response;\n      if (response.body) await response.body.cancel().catch(function() {});\n    }\n  }\n\n  async function pbPrivateUploadWithProgress(file, mime, onProgress) {\n    try { return await pbPrivateUploadWithProgressOnce(file, mime, onProgress); }\n    catch (error) {\n      if (error.status !== 401) throw error;\n      return await pbPrivateUploadWithProgressOnce(file, mime, onProgress);\n    }\n  }\n\n  function pbScheduleServerExport() {\n    clearTimeout(pbExportWarmTimer);\n    pbExportWarmTimer = 0;\n    if (pbExportWarmInFlight) pbExportWarmDirty = true;\n    pbScheduleDraftSave();\n    if (!pbExportWarmInFlight && !pbUploadInProgress && !pbCartBusy && !document.hidden) {\n      var delay = Math.max(2500, 15000 - (Date.now() - pbExportWarmLastStarted));\n      pbExportWarmTimer = setTimeout(function () { pbWarmServerExport().catch(function () {}); }, delay);\n    }\n  }\n\n  var pbDraftReady = false, pbDraftDisabled = false, pbDraftTimer = 0, pbDraftSaving = null;\n  var pbDraftDatabase = null, pbDraftPreviews = new Map();\n\n  function pbDraftKey() {\n    return [state.handle, state.shopifyVariantId, state.technique].join(':');\n  }\n\n  function pbDraftGeometry() {\n    return JSON.stringify(Object.keys(state.templatesByPlacement).sort().map(function(placement) {\n      var template = state.templatesByPlacement[placement];\n      return [placement, getTemplatePrintFileWidth(template), getTemplatePrintFileHeight(template),\n        template.print_type_id, template.production_area || null, template.soft_boundary || null];\n    }));\n  }\n\n  function pbDraftDb() {\n    if (pbDraftDatabase) return pbDraftDatabase;\n    pbDraftDatabase = new Promise(function(resolve, reject) {\n      var request = indexedDB.open('printbolt-recovery-v1', 1), finished = false;\n      var timer = setTimeout(function() { finished = true; reject(new Error('draft-timeout')); }, 1500);\n      request.onupgradeneeded = function() { request.result.createObjectStore('drafts', {keyPath:'key'}); };\n      request.onsuccess = function() {\n        clearTimeout(timer);\n        if (finished) { request.result.close(); return; }\n        var db = request.result;\n        db.onversionchange = function() { db.close(); pbDraftDatabase = null; };\n        resolve(db);\n      };\n      request.onerror = function() { clearTimeout(timer); reject(request.error); };\n    }).catch(function(error) { pbDraftDatabase = null; throw error; });\n    return pbDraftDatabase;\n  }\n\n  async function pbDraftTransaction(mode, action) {\n    var db = await pbDraftDb();\n    return await new Promise(function(resolve, reject) {\n      var transaction = db.transaction('drafts', mode), value;\n      var timer = setTimeout(function() { try { transaction.abort(); } catch (_) {} reject(new Error('draft-timeout')); }, 1500);\n      transaction.oncomplete = function() { clearTimeout(timer); resolve(value); };\n      transaction.onerror = transaction.onabort = function() { clearTimeout(timer); reject(transaction.error || new Error('draft-aborted')); };\n      var request = action(transaction.objectStore('drafts'));\n      if (request) request.onsuccess = function() { value = request.result; };\n    });\n  }\n\n  function pbScheduleDraftSave() {\n    clearTimeout(pbDraftTimer);\n    if (!pbDraftReady || pbDraftDisabled || state.savedDesign || state.editCartGroupId) return;\n    pbDraftTimer = setTimeout(function() { pbSaveDraft().catch(function() {}); }, 700);\n  }\n\n  async function pbSaveDraft() {\n    if (!pbDraftReady || pbDraftDisabled || pbUploadInProgress || state.savedDesign || state.editCartGroupId) return;\n    if (pbDraftSaving) { pbScheduleDraftSave(); return pbDraftSaving; }\n    var draftKey = pbDraftKey();\n    var geometry = pbDraftGeometry();\n    var sourceUrls = new Set();\n    var designs = JSON.parse(JSON.stringify(state.designsByPlacement, function(key, value) {\n      if (/^pbUpscale(?:Busy|RequestToken|ResizeReleased|PendingResult|PendingError)$/.test(key)) return undefined;\n      if (typeof value === 'string' && value.startsWith('blob:')) sourceUrls.add(value);\n      return value;\n    }));\n    if (Object.values(designs).some(function(design) { return (design.imageLayers || []).some(function(layer) { return layer.pbUploadPending; }); })) return;\n    var record = {key:draftKey, version:1, updated:Date.now(), expires:Date.now()+6*86400000, geometry:geometry,\n      designs:designs, activePlacement:state.activePlacement, order:state.placementDesignOrder.slice(), projectId:state.projectId,\n      quantities:Object.assign({},state.quantities), sources:[]};\n    if (JSON.stringify(record).length > 2*1024*1024) return;\n    var urls = Array.from(sourceUrls);\n    var capabilities = urls.map(function(url) { return pbPrivateAssets.get(url); });\n    if (capabilities.some(function(asset) { return !asset || asset.expires_at <= Date.now()+60000; })) return;\n    pbDraftSaving = (async function() {\n      var bytes = 0;\n      for (var i = 0; i < urls.length; i++) {\n        var url = urls[i], asset = capabilities[i];\n        var blob = pbDraftPreviews.get(url);\n        if (!blob) blob = await (await fetch(url)).blob();\n        bytes += blob.size;\n        if (bytes > 24*1024*1024) return;\n        pbDraftPreviews.set(url, blob);\n        record.sources.push({url:url, asset:Object.assign({}, asset), preview:blob});\n        record.expires = Math.min(record.expires, asset.expires_at - 60000);\n      }\n      if (pbDraftDisabled || draftKey !== pbDraftKey()) return;\n      await pbDraftTransaction('readwrite', function(store) {\n        var saved = store.put(record), entries = [];\n        var cursor = store.openCursor();\n        cursor.onsuccess = function() {\n          var current = cursor.result;\n          if (current) {\n            entries.push({key:current.key, updated:current.value.updated, expires:current.value.expires}); current.continue();\n          } else {\n            entries.sort(function(a,b) { return b.updated-a.updated; }).forEach(function(entry,index) {\n              if (entry.key !== record.key && (entry.expires <= Date.now() || index >= 8)) store.delete(entry.key);\n            });\n          }\n        };\n        return saved;\n      });\n      pbDraftPreviews.forEach(function(_, url) { if (!sourceUrls.has(url)) pbDraftPreviews.delete(url); });\n    })().finally(function() { pbDraftSaving = null; });\n    return await pbDraftSaving;\n  }\n\n  async function pbRestoreDraft() {\n    if (state.savedDesign || state.editCartGroupId) return;\n    var urls = [];\n    try {\n      var record = await pbDraftTransaction('readonly', function(store) { return store.get(pbDraftKey()); });\n      if (!record || record.version !== 1 || record.expires <= Date.now() || record.geometry !== pbDraftGeometry()) return;\n      if (!record.designs || Object.keys(record.designs).some(function(placement) { return !state.templatesByPlacement[placement]; })) return;\n      var replacements = new Map();\n      for (var source of record.sources || []) {\n        if (!source.asset || source.asset.expires_at <= Date.now()+60000 || !(source.preview instanceof Blob)) throw new Error('expired-draft');\n        var url = URL.createObjectURL(source.preview); urls.push(url);\n        replacements.set(source.url, url);\n        pbPrivateAssets.set(url, source.asset); pbDraftPreviews.set(url, source.preview);\n      }\n      var designs = JSON.parse(JSON.stringify(record.designs), function(key, value) {\n        if (typeof value !== 'string' || !value.startsWith('blob:')) return value;\n        if (!replacements.has(value)) throw new Error('incomplete-draft');\n        return replacements.get(value);\n      });\n      state.designsByPlacement = designs;\n      state.placementDesignOrder = record.order || [];\n      if (state.templatesByPlacement[record.activePlacement]) state.activePlacement = record.activePlacement;\n      state.projectId = record.projectId || state.projectId;\n      state.quantities = record.quantities || {};\n    } catch (_) {\n      urls.forEach(function(url) { URL.revokeObjectURL(url); pbPrivateAssets.delete(url); pbDraftPreviews.delete(url); });\n    }\n  }\n\n  async function pbForgetDraft() {\n    pbDraftDisabled = true; clearTimeout(pbDraftTimer);\n    try {\n      if (pbDraftSaving) await pbDraftSaving;\n      await pbDraftTransaction('readwrite', function(store) { return store.delete(pbDraftKey()); });\n    } catch (_) {}\n    pbDraftPreviews.clear();\n  }\n\n  root.addEventListener('pointerup', pbScheduleDraftSave);\n  root.addEventListener('input', pbScheduleDraftSave);\n  root.addEventListener('change', pbScheduleDraftSave);\n  document.addEventListener('visibilitychange', function() { if (document.hidden) pbSaveDraft().catch(function() {}); });\n\n  var workerUrl = (root.dataset.workerUrl || '').replace(/\\/$/, '');\n  // v552 security session is shared by all simultaneous exports in this mount.\n  // Private-preview draft. Disabled until both backend bindings and this flag are ready.\n  var pbPrivateAssets = new Map();\n  var pbPrivateExports = new Map();\n  var pbPrivateImports = new Map();\n  function pbPrivateEnabled() { return root.dataset.privateAssets === 'true'; }\n  async function pbPrivateJson(path,options) {\n    var response=await pbAuthorizedFetch(workerUrl+'/api/private-assets/'+path,options);\n    var body=await response.json();if(!response.ok||!body.ok)throw new Error(response.status===429 ? pbT('aterhamtning_senare','Bildtj\u00E4nsten \u00E4r tillf\u00E4lligt upptagen. Din design finns kvar i verktyget. F\u00F6rs\u00F6k igen om en liten stund.') : pbTranslatedError(body.error)||pbT(\"bilden_kunde_inte_bearbetas\", \"Bilden kunde inte bearbetas.\"));return body;\n  }\n  function pbReportUploadProgress(callback, progress) {\n    if (typeof callback === 'function') { try { callback(progress); } catch (_) {} }\n  }\n  async function pbPrivateUploadWithProgressOnce(file, mime, onProgress) {\n    pbReportUploadProgress(onProgress, { phase: 'preparing' });\n    var session = await pbEnsureSession();\n    return await new Promise(function(resolve, reject) {\n      var xhr = new XMLHttpRequest(), settled = false, processing = false;\n      var offset = 0, streamedResult = null, lastStage = 0;\n      var stages = ['received', 'validated', 'stored', 'normalized', 'preview', 'saved'];\n      function report(progress) { if (!settled) pbReportUploadProgress(onProgress, progress); }\n      function finish(error, body) {\n        if (settled) return;\n        settled = true;\n        xhr.onload = xhr.onprogress = xhr.onerror = xhr.onabort = xhr.ontimeout = null;\n        xhr.upload.onprogress = xhr.upload.onload = null;\n        if (error) { error.status = error.status || xhr.status; reject(error); } else resolve(body);\n      }\n      function uploaded() {\n        if (processing || settled) return;\n        processing = true;\n        report({ phase: 'processing', transferComplete: true });\n      }\n      function isStream() { return (xhr.getResponseHeader('Content-Type') || '').indexOf('application/x-ndjson') === 0; }\n      function readProgress(final) {\n        if (settled || xhr.status < 200 || xhr.status >= 300 || !isStream()) return;\n        try {\n          var text = xhr.responseText;\n          if (text.length > 4 * 1024 * 1024) throw new Error(pbT(\"bildsvaret_for_stort\", \"Bildsvaret \u00E4r f\u00F6r stort.\"));\n          var end;\n          while ((end = text.indexOf('\\n', offset)) !== -1) {\n            var line = text.slice(offset, end); offset = end + 1;\n            if (!line.trim()) continue;\n            var event = JSON.parse(line);\n            if (streamedResult) throw new Error(pbT(\"bildbearbetning_ogiltigt_svar\", \"Ogiltigt svar fr\u00E5n bildbearbetningen.\"));\n            if (event.type === 'progress') {\n              var step = stages.indexOf(event.stage) + 1;\n              if (step && step > lastStage) {\n                uploaded(); lastStage = step;\n                report({ phase: 'processing', transferComplete: true, stage: event.stage });\n              }\n            } else if (event.type === 'result' && event.result && event.result.ok) {\n              streamedResult = event.result;\n            } else if (event.type === 'error') {\n              if (event.status === 401) pbInvalidateSession(session);\n              throw Object.assign(new Error(pbTranslatedError(event.error) || pbT(\"bilden_kunde_inte_bearbetas\", \"Bilden kunde inte bearbetas.\")), { status: Number(event.status) || 502 });\n            } else throw new Error(pbT(\"bildbearbetning_ogiltigt_svar\", \"Ogiltigt svar fr\u00E5n bildbearbetningen.\"));\n          }\n          if (final && (text.slice(offset).trim() || !streamedResult)) throw new Error(pbT(\"bildbearbetning_avbrots\", \"Bildbearbetningen avbr\u00F6ts. F\u00F6rs\u00F6k igen.\"));\n        } catch (error) { finish(error); xhr.abort(); }\n      }\n      // Register before open/send for Safari. Upload bytes fill the transfer\n      // step; streamed server milestones fill the remaining processing steps.\n      xhr.upload.onprogress = function(event) {\n        if (processing || settled) return;\n        if (event.lengthComputable && event.total > 0 && event.loaded >= event.total) { uploaded(); return; }\n        report({ phase: 'uploading', loaded: event.loaded, total: event.lengthComputable ? event.total : null });\n      };\n      xhr.upload.onload = uploaded;\n      xhr.onprogress = function() { readProgress(false); };\n      xhr.onload = function() {\n        if (xhr.status === 401) pbInvalidateSession(session);\n        var body;\n        if (isStream()) { readProgress(true); if (settled) return; body = streamedResult; }\n        else { try { body = JSON.parse(xhr.responseText); } catch (_) {} }\n        if (xhr.status < 200 || xhr.status >= 300 || !body || !body.ok) {\n          finish(new Error(body && pbTranslatedError(body.error) || pbT('bilden_kunde_inte_bearbetas', 'Bilden kunde inte bearbetas.')));\n          return;\n        }\n        uploaded();\n        finish(null, body);\n      };\n      xhr.onerror = function() { finish(new Error(pbT('bild_uppladdning_natverksfel', 'Bilden kunde inte laddas upp. Kontrollera anslutningen och f\u00F6rs\u00F6k igen.'))); };\n      xhr.onabort = function() { finish(new Error(pbT('bild_uppladdning_avbruten', 'Uppladdningen avbr\u00F6ts. F\u00F6rs\u00F6k igen.'))); };\n      xhr.ontimeout = function() { finish(new Error(pbT('bild_uppladdning_timeout', 'Uppladdningen tog f\u00F6r l\u00E5ng tid. F\u00F6rs\u00F6k igen.'))); };\n      try {\n        xhr.open('POST', workerUrl + '/api/private-assets/upload?progress=1', true);\n        // Includes transfer and server processing; never leave the editor\n        // locked indefinitely, and never automatically replay the POST.\n        xhr.timeout = 240000;\n        xhr.setRequestHeader('Content-Type', mime);\n        xhr.setRequestHeader('X-PB-Session', session.token);\n        // No credential change, wrapper or automatic retry: send the same Blob.\n        report({ phase: 'uploading', loaded: 0, total: file.size });\n        xhr.send(file);\n      } catch (error) { finish(error); }\n    });\n  }\n  async function pbPrivateUpload(file, onProgress) {\n    var format=assertSupportedUploadFile(file);\n    // The picker also accepts MIME aliases and files with a generic MIME.\n    // Send the validated format's canonical type, keeping original bytes intact.\n    var mime=({'jpeg':'image/jpeg','png':'image/png','webp':'image/webp','heic':'image/heic','heif':'image/heif','svg':'image/svg+xml'}[format]);\n    var body=typeof onProgress === 'function' && typeof XMLHttpRequest !== 'undefined'\n      ? await pbPrivateUploadWithProgress(file,mime,onProgress)\n      : await pbPrivateJson('upload',{method:'POST',headers:{'Content-Type':mime},body:file});\n    if (typeof onProgress === 'function' && body.asset) {\n      onProgress({phase:'dimensions', width:body.asset.width, height:body.asset.height});\n    }\n    return await pbPrivatePreview(body);\n  }\n  async function pbPrivatePreview(body) {\n    var preview=await (await fetch(body.preview_data_url)).blob(),url=URL.createObjectURL(preview);\n    try {\n      // A successful server response is not yet a displayable image. Decode\n      // only the small preview before inserting a layer or completing the bar.\n      await new Promise(function(resolve,reject) {\n        var img=new Image();\n        var timer=setTimeout(function(){finish(new Error(pbT(\"bilden_kunde_inte_visas\", \"Bilden kunde inte visas. F\u00F6rs\u00F6k igen.\")));},15000);\n        function finish(error) {\n          clearTimeout(timer);img.onload=img.onerror=null;img.src='';\n          if(error)reject(error);else resolve();\n        }\n        img.onload=function(){finish(img.naturalWidth>0&&img.naturalHeight>0?null:new Error(pbT(\"bilden_kunde_inte_visas\", \"Bilden kunde inte visas. F\u00F6rs\u00F6k igen.\")));};\n        img.onerror=function(){finish(new Error(pbT(\"bilden_kunde_inte_visas\", \"Bilden kunde inte visas. F\u00F6rs\u00F6k igen.\")));};\n        img.src=url;\n      });\n    } catch(error) { URL.revokeObjectURL(url);throw error; }\n    pbPrivateAssets.set(url,body.asset);\n    return {dataUrl:url,width:body.asset.width,height:body.asset.height,normalized:true,trimmed:false};\n  }\n  async function pbPrivateRestore(archive) {\n    return await pbPrivatePreview(await pbPrivateJson('restore',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(archive)}));\n  }\n  async function pbPrivateRestoreImageLayer(savedLayer,archive) {\n    var prepared=await pbPrivateRestore(archive);\n    var layer=await makeRestoredImageLayer(savedLayer,null);\n    Object.assign(layer,{imageDataUrl:prepared.dataUrl,naturalWidth:prepared.width,naturalHeight:prepared.height,\n      backgroundRemoveOriginalImageDataUrl:prepared.dataUrl,backgroundRemoveOriginalNaturalWidth:prepared.width,backgroundRemoveOriginalNaturalHeight:prepared.height});\n    return layer;\n  }\n  async function pbPrivateSource(src) {\n    if(pbPrivateAssets.has(src))return pbPrivateAssets.get(src);\n    // AI output and restored legacy artwork are imported once at original resolution.\n    if(pbPrivateImports.has(src))return await pbPrivateImports.get(src);\n    var promise=(async function(){var file=await dataUrlToBlob(src),prepared=await pbPrivateUpload(file);\n      var asset=pbPrivateAssets.get(prepared.dataUrl);pbPrivateAssets.set(src,asset);return asset;})();\n    pbPrivateImports.set(src,promise);\n    try{return await promise;}finally{pbPrivateImports.delete(src);}\n  }\n  async function pbPrivateOriginalBlob(src) {\n    if(!pbPrivateEnabled()||!pbPrivateAssets.has(src))return await dataUrlToBlob(src);\n    var response=await pbAuthorizedFetch(workerUrl+'/api/private-assets/original',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(pbPrivateAssets.get(src))});\n    if(!response.ok)throw new Error(pbT(\"originalbilden_kunde_inte_hamtas\", \"Originalbilden kunde inte h\u00E4mtas. Din design finns kvar.\"));return await response.blob();\n  }\n  async function pbPrivateOriginalDataUrl(src) {return await blobToDataUrl(await pbPrivateOriginalBlob(src));}\n  async function pbPrivateResult(blob) {return pbPrivateUpload(blob);}\n  // Explicitly scoped to the unpublished multi-PNG test theme.\n  function pbSeparatePngTest(template) {\n    return pbPrivateEnabled() && ['17','32'].indexOf(String(template&&template.print_type_id||''))!==-1;\n  }\n  // Text must be painted where the editor's fonts exist. The server must never\n  // substitute a font inside a viewBox measured with a different font (#15173).\n  // Keep editable text in the design; only the production render plan is rasterized.\n  async function pbRasterizedTextSvg(layer, areaWidth, areaHeight) {\n    await ensureDesignerFontReadyByFamily(layer.fontFamily || '');\n    var fontCss = await getEmbeddedFontCssForFamily(layer.fontFamily || '');\n    var metrics = getTextLayerMetrics(layer);\n    var naturalWidth = Number(metrics.width), naturalHeight = Number(metrics.height);\n    if (!(naturalWidth > 0 && naturalHeight > 0)) throw new Error('Textens m\u00E5tt kunde inte ber\u00E4knas.');\n    var targetWidth = Math.max(1, areaWidth * Number(layer.w || 0) / 100);\n    var targetHeight = Math.max(1, areaHeight * Number(layer.h || 0) / 100);\n    // Contain matches drawRotatedImageContain and the supplier's layer renderer.\n    // Supersample for clean edges, with a bounded memory footprint.\n    var scale = Math.min(targetWidth / naturalWidth, targetHeight / naturalHeight) * 2;\n    scale = Math.min(scale, 6000 / Math.max(naturalWidth, naturalHeight));\n    var canvas = document.createElement('canvas');\n    canvas.width = Math.max(1, Math.ceil(naturalWidth * scale));\n    canvas.height = Math.max(1, Math.ceil(naturalHeight * scale));\n    var ctx = canvas.getContext('2d');\n    if (!ctx) throw new Error('Texten kunde inte exporteras.');\n    var source = await loadImage(getTextLayerSvgDataUrl(layer, fontCss));\n    ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n    if (!getCanvasAlphaBounds(canvas, 0)) throw new Error('Textens bildexport blev tom. F\u00F6rs\u00F6k igen.');\n    var png = canvas.toDataURL('image/png');\n    // A self-contained SVG image keeps the existing private renderer contract.\n    // No text nodes or font lookup remain on the server.\n    var svg = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"' + naturalWidth + '\" height=\"' + naturalHeight + '\" viewBox=\"0 0 ' + naturalWidth + ' ' + naturalHeight + '\"><image width=\"' + naturalWidth + '\" height=\"' + naturalHeight + '\" xlink:href=\"' + png + '\"/></svg>';\n    var result = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n    if (result.length >= 2 * 1024 * 1024) throw new Error('Textens bildexport \u00E4r f\u00F6r stor. Minska textens storlek eller dela upp den.');\n    return result;\n  }\n  async function pbServerExport(placement,template,dState) {\n    if ((dState.imageLayers || []).some(function(layer){return layer.pbUploadPending;})) throw new Error(pbT(\"bilden_laddas_fortfarande_upp\", \"Bilden laddas fortfarande upp.\"));\n    // Freeze before any await, so prewarming cannot mix two design revisions.\n    dState=JSON.parse(JSON.stringify(dState));template=JSON.parse(JSON.stringify(template));\n    var mockupVariant=String(state.shopifyVariantId||state.variant&&state.variant.id||'');\n    var width=Math.max(1,Math.round(getTemplatePrintFileWidth(template)||(Number(template.print_area_width||1000)*exportScale)));\n    var height=Math.max(1,Math.round(getTemplatePrintFileHeight(template)||(Number(template.print_area_height||1000)*exportScale)));\n    var objects=[];\n    if(hasPrimaryDesignContent(dState)){\n      var d=dState.design||{x:0,y:0,w:100,h:100,rotation:0};\n      var primary={object_id:'primary-design',object_type:dState.designType==='image'?'image':'text',kind:dState.designType==='image'?'primary-image':'primary-text',source_filename:dState.sourceFileName||'',x:Number(d.x||0),y:Number(d.y||0),w:Number(d.w||0),h:Number(d.h||0),rotation:Number(d.rotation||0),flipX:false};\n      if(dState.designType==='image')primary.source=await pbPrivateSource(dState.imageDataUrl);else primary.text=dState.text||'';objects.push(primary);\n    }\n    for(var layer of dState.imageLayers||[]){\n      var type=layer.type||'image';if(type==='text'?!String(layer.text||'').trim():!layer.imageDataUrl)continue;\n      var object={object_id:String(layer.id),object_type:type,kind:type==='text'?'layer-text':'layer-image',source_filename:layer.sourceFileName||'',x:Number(layer.x||0),y:Number(layer.y||0),w:Number(layer.w||0),h:Number(layer.h||0),rotation:Number(layer.rotation||0),flipX:Boolean(layer.flipX)};\n      if(type==='text'){object.svg=await pbRasterizedTextSvg(layer,width,height);}\n      else object.source=await pbPrivateSource(layer.imageDataUrl);\n      objects.push(object);\n    }\n    var mask='';\n    if(template.production_area&&template.soft_boundary&&(template.production_area.offset_x_mm||template.production_area.offset_y_mm)){\n      var svg=buildSoftBoundaryObjectMaskSvg(template,{x:0,y:0,w:100,h:100,rotation:0},false);if(svg)mask='data:image/svg+xml;charset=utf-8,'+encodeURIComponent(svg);\n    }\n    var plan={version:1,placement:placement,width:width,height:height,print_type_id:String(template.print_type_id||''),minimum_edge:getSpreadconnectCompositeMinimumEdge(template),mask_svg:mask,objects:objects};\n    if(pbSeparatePngTest(template)){plan.export_mode='separate-png-test-v1';plan.composite_fallback='v1';}\n    plan.mockup_target={variantId:mockupVariant,technique:String(template.technique||'auto')};\n    await pbEnsureSession();var cacheKey=pbSession.token+'\\n'+JSON.stringify(plan),now=Date.now();\n    pbPrivateExports.forEach(function(value,key){if(value.settled&&value.expires<now)pbPrivateExports.delete(key);});\n    if(pbPrivateExports.has(cacheKey))return await pbPrivateExports.get(cacheKey).promise;\n    var promise=pbPrivateJson('render',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(plan)});\n    // Never evict a pending request: Add must join the work started while editing.\n    for(var entry of pbPrivateExports){if(pbPrivateExports.size<6)break;if(entry[1].settled)pbPrivateExports.delete(entry[0]);}\n    var cached={promise:promise,expires:Infinity,settled:false};\n    pbPrivateExports.set(cacheKey,cached);\n    try{var result=await promise;cached.settled=true;cached.expires=Date.now()+5*60000;return result;}\n    catch(error){if(pbPrivateExports.get(cacheKey)===cached)pbPrivateExports.delete(cacheKey);throw error;}\n  }\n  var pbExportWarmTimer = 0, pbExportWarmInFlight = null, pbExportWarmDirty = false;\n  var pbExportWarmLastStarted = 0, pbExportWarmFingerprint = '', pbExportWarmExpires = 0;\n  \n  function pbWarmServerExport() {\n    clearTimeout(pbExportWarmTimer); pbExportWarmTimer = 0;\n    if (pbUploadInProgress || pbCartBusy || document.hidden || !pbPrivateEnabled() || !pbSession || pbSession.expires_at <= Date.now() + 30000) return Promise.resolve();\n    if (pbExportWarmInFlight) { pbExportWarmDirty = true; return pbExportWarmInFlight; }\n    var jobs = getUsedPlacements().map(function (placement) { return {placement:placement,\n      template:JSON.parse(JSON.stringify(state.templatesByPlacement[placement] || selectLocalTemplate(placement))),\n      design:JSON.parse(JSON.stringify(getDesignState(placement,false)))}; });\n    if (!jobs.length || jobs.some(function(job) { return (job.design.imageLayers || []).some(function(layer) { return layer.pbUploadPending; }); })) return Promise.resolve();\n    var fingerprint = JSON.stringify([pbSession.token, state.shopifyVariantId || state.variant && state.variant.id || '', jobs]);\n    if (fingerprint === pbExportWarmFingerprint && pbExportWarmExpires > Date.now()) return Promise.resolve();\n    pbExportWarmLastStarted = Date.now(); pbExportWarmDirty = false;\n    var next = 0;\n    var runners = Array.from({length:Math.min(2,jobs.length)}, async function () {\n      while (next < jobs.length && !pbExportWarmDirty && !pbCartBusy) {\n        var job = jobs[next++];\n        await pbServerExport(job.placement, job.template, job.design);\n      }\n    });\n    // Every runner settles before the next prewarm. Cart joins the exact plan cache.\n    pbExportWarmInFlight = Promise.allSettled(runners).then(function (results) {\n      if (!pbExportWarmDirty && next === jobs.length && results.every(function(r) { return r.status === 'fulfilled'; })) {\n        pbExportWarmFingerprint = fingerprint; pbExportWarmExpires = Date.now() + 4 * 60000;\n      }\n    }).finally(function () {\n      pbExportWarmInFlight = null;\n      if (pbExportWarmDirty) { pbExportWarmDirty = false; pbScheduleServerExport(); }\n    });\n    return pbExportWarmInFlight;\n  }\n  window.addEventListener('pagehide',function(event){clearTimeout(pbExportWarmTimer);pbExportWarmTimer=0;if(event.persisted)return;pbPrivateAssets.forEach(function(_asset,url){if(url.startsWith('blob:'))URL.revokeObjectURL(url);});pbPrivateAssets.clear();pbPrivateExports.clear();});\n\n  // Upload feedback is separate from the editor's error-only status area.\n  var pbUploadFeedback = null;\n  var pbUploadInProgress = false;\n\n  // A pending image is a real editor layer, but has no printable source yet.\n  var pbUploadPlaceholder = null;\n  function pbRemoveUploadPlaceholder() {\n    var pending = pbUploadPlaceholder;\n    pbUploadPlaceholder = null;\n    if (!pending || !pending.layer.pbUploadPending) return;\n    pending.design.imageLayers = pending.design.imageLayers.filter(function(layer) { return layer !== pending.layer; });\n    pending.design.touched = pending.previousTouched;\n    state.activeImageLayerId = pending.previousSelection;\n    state.activePrimarySelected = pending.previousPrimarySelected;\n    renderDesign();\n  }\n\n  function pbSetInitialImageGeometry(layer) {\n    layer.w = 56;\n    layer.h = getImageLayerHeightPctForWidth(layer, layer.w);\n    if (Number(layer.h || 0) > 80) {\n      layer.h = 80;\n      layer.w = getImageLayerWidthPctForHeight(layer, layer.h);\n    }\n    constrainImageLayer(layer);\n    centerImageLayer(layer);\n  }\n\n  async function pbReadUploadDimensions(file) {\n    try {\n      var format = getSupportedUploadFormat(file);\n      var parser = pbImageMetadataParsers[format];\n      if (!parser) return null;\n      // Bounded metadata read: no Image, bitmap, canvas or full original decode.\n      var bytes = new Uint8Array(await file.slice(0, 1024 * 1024).arrayBuffer());\n      var size = parser(bytes);\n      if (!size || !(size.width > 0) || !(size.height > 0)) return null;\n      if (size.orientation >= 5 && size.orientation <= 8) return {width:size.height,height:size.width};\n      return {width:size.width,height:size.height};\n    } catch (_) { return null; }\n  }\n\n  function pbShowUploadPlaceholder(file, knownDimensions) {\n    pbEnsureUploadFeedbackStyle();\n    pbRemoveUploadPlaceholder();\n    var design = getDesignState(state.activePlacement, true);\n    var layer = {id:makeLayerId(),type:'image',imageDataUrl:'',sourceFileName:file.name || '',\n      naturalWidth:1,naturalHeight:1,x:0,y:0,w:56,h:32,rotation:0,flipX:false,locked:false,\n      pbUploadPending:true,pbUpscaleBusy:true};\n    pbUploadPlaceholder = {layer:layer,design:design,previousTouched:design.touched,\n      previousSelection:state.activeImageLayerId,previousPrimarySelected:state.activePrimarySelected};\n    if (knownDimensions) {\n      layer.naturalWidth = knownDimensions.width;\n      layer.naturalHeight = knownDimensions.height;\n      layer.pbUpscaleBusy = false;\n    }\n    pbSetInitialImageGeometry(layer);\n    design.imageLayers = design.imageLayers || [];\n    design.imageLayers.push(layer);\n    state.activeImageLayerId = layer.id;\n    state.activePrimarySelected = false;\n    renderDesign();\n    var pending = pbUploadPlaceholder;\n    if (!knownDimensions) pbReadUploadDimensions(file).then(function(size) {\n      if (size && pbUploadPlaceholder === pending && !pending.serverDimensions) {\n        pbUpdateUploadPlaceholder(size.width, size.height, false);\n      }\n    });\n    return layer;\n  }\n\n  function pbUpdateUploadPlaceholder(width, height, fromServer) {\n    var pending = pbUploadPlaceholder;\n    if (!pending || !(Number(width) > 0) || !(Number(height) > 0)) return;\n    pending.serverDimensions = pending.serverDimensions || fromServer !== false;\n    pending.layer.naturalWidth = Number(width);\n    pending.layer.naturalHeight = Number(height);\n    pending.layer.pbUpscaleBusy = false;\n    pbSetInitialImageGeometry(pending.layer);\n    renderImageLayers(pending.design);\n  }\n\n  function pbEnsureUploadFeedbackStyle() {\n      if (!document.getElementById('pb-stage-upload-style')) {\n        var style = document.createElement('style');\n        style.id = 'pb-stage-upload-style';\n        style.textContent = [\n          '.pb-customizer .pb-stage-upload [hidden]{display:none!important}',\n          '.pb-customizer .pb-ai-pro__submit[data-pb-ai-submit]:disabled{background:#e5e7eb!important;color:#6b7280!important;border-color:#d1d5db!important;box-shadow:none!important;transform:none!important;cursor:wait;opacity:1!important}',\n          '.pb-customizer .pb-stage-upload[data-tone=\"upload\"] .pb-clip-stage-alert__icon{background:rgba(255,255,255,.10);color:#e5e7eb}',\n          '.pb-stage-upload__bar{position:relative;display:block;width:100%;height:3px;margin-top:7px;overflow:hidden;border-radius:999px;background:rgba(255,255,255,.16)}',\n          '.pb-stage-upload__fill{position:absolute;inset:0;border-radius:inherit;background:#e5e7eb;transform-origin:left;transform:scaleX(0);transition:transform .12s linear}',\n          '.pb-stage-upload__close{pointer-events:auto;min-height:36px;padding:4px 0 0;border:0;background:none;color:inherit;font:inherit;text-decoration:underline;cursor:pointer}',\n          '.pb-upload-placeholder__spinner{position:absolute;left:50%;top:50%;translate:-50% -50%;display:block;box-sizing:border-box;width:22px;height:22px;max-width:65%;max-height:65%;aspect-ratio:1;border:2px solid rgba(127,127,127,.18);border-color:color-mix(in srgb,var(--pb-print-area-line,#111827) 18%,transparent);border-top-color:var(--pb-print-area-line,#111827);border-radius:50%;animation:pb-upload-placeholder-spin .85s linear infinite}',\n          '@keyframes pb-upload-placeholder-spin{to{transform:rotate(360deg)}}',\n          '@media(prefers-reduced-motion:reduce){.pb-upload-placeholder__spinner{animation:none}}',\n          '@media(prefers-reduced-motion:reduce){.pb-stage-upload__fill{transition:none}}'\n        ].join('\\n');\n        document.head.appendChild(style);\n      }\n  }\n\n  function pbShowUploadProgress(index, total, file, mode) {\n    if (!pbUploadFeedback) {\n      var source = els.clipStageAlert;\n      if (!source) return;\n      pbEnsureUploadFeedbackStyle();\n      var loading = source.cloneNode(true);\n      loading.removeAttribute('data-pb-clip-stage-alert');\n      loading.removeAttribute('aria-live');\n      loading.setAttribute('aria-hidden', 'false');\n      loading.dataset.tone = 'upload';\n      loading.classList.add('pb-stage-upload', 'is-visible');\n      var caption = loading.querySelector('[data-pb-clip-stage-alert-title]');\n      var count = loading.querySelector('[data-pb-clip-stage-alert-text]');\n      caption.removeAttribute('data-pb-clip-stage-alert-title');\n      count.removeAttribute('data-pb-clip-stage-alert-text');\n      var content = loading.querySelector('.pb-clip-stage-alert__content');\n      var icon = loading.querySelector('.pb-clip-stage-alert__icon');\n      var errorIcon = icon.innerHTML;\n      icon.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path d=\"M12 16V4m-4 4 4-4 4 4M4 16v4h16v-4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n      function child(tag, className) {\n        var node = document.createElement(tag);\n        node.className = className;\n        content.appendChild(node);\n        return node;\n      }\n      var percent = child('span', 'pb-stage-upload__percent');\n      percent.hidden = true;\n      var bar = child('span', 'pb-stage-upload__bar');\n      bar.setAttribute('role', 'progressbar');\n      bar.setAttribute('aria-label', pbT('bild_uppladdning_bearbetning', 'Uppladdning och bearbetning'));\n      bar.setAttribute('aria-valuemin', '0');\n      bar.setAttribute('aria-valuemax', '100');\n      var fill = document.createElement('span');\n      fill.className = 'pb-stage-upload__fill';\n      bar.appendChild(fill);\n      var error = child('span', 'pb-clip-stage-alert__text');\n      error.hidden = true;\n      error.setAttribute('role', 'alert');\n      var close = child('button', 'pb-stage-upload__close');\n      close.type = 'button';\n      close.hidden = true;\n      close.textContent = pbT('stang', 'St\u00E4ng');\n      close.onclick = pbHideUploadProgress;\n      source.parentNode.appendChild(loading);\n      source.classList.remove('is-visible');\n      source.setAttribute('aria-hidden', 'true');\n      var title = document.createElement('span');\n      title.setAttribute('role', 'status');\n      title.setAttribute('aria-live', 'polite');\n      title.style.cssText = 'position:fixed;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;';\n      document.body.appendChild(title);\n      pbUploadFeedback = {dialog:loading,title:title,caption:caption,count:count,percent:percent,bar:bar,fill:fill,error:error,close:close,icon:icon,uploadIcon:icon.innerHTML,errorIcon:errorIcon,previousInert:root.inert,previousFocus:document.activeElement};\n      root.inert = true;\n    }\n    var ui = pbUploadFeedback;\n    ui.mode = mode || 'upload';\n    var aiIcon = ui.mode === 'ai' ? root.querySelector('[data-pb-open-ai-motiv] .pb-ai-sparkle') : null;\n    if (aiIcon) ui.icon.replaceChildren(aiIcon.cloneNode(true));\n    else ui.icon.innerHTML = ui.uploadIcon;\n    ui.bar.setAttribute('aria-label', ui.mode === 'ai' ? pbT('skapar_bild_progress_enhetlig', 'Skapar bild...') : pbT('bild_uppladdning_bearbetning', 'Uppladdning och bearbetning'));\n    ui.dialog.hidden = false;\n    ui.error.hidden = ui.close.hidden = true;\n    ui.count.hidden = total < 2;\n    ui.count.textContent = total > 1 ? pbT('bild_uppladdning_position', 'Bild {{ current }} av {{ total }}', {current:index,total:total}) : '';\n    pbUpdateUploadProgress({phase:'preparing'});\n  }\n\n  function pbStopUploadAnimation() {\n    if (!pbUploadFeedback) return;\n    clearInterval(pbUploadFeedback.animationTimer);\n    pbUploadFeedback.animationTimer = null;\n  }\n\n  function pbAdvanceUploadAnimation() {\n    var ui = pbUploadFeedback;\n    if (!ui || ui.dialog.hidden) { pbStopUploadAnimation(); return; }\n    // Estimated visual progress only; measured milestones remain authoritative.\n    // Approach the cap gradually, reserving completion for a decoded, placed image.\n    var elapsed = Math.max(0, performance.now() - ui.startedAt);\n    // Quick initial movement, then a long gentle tail while processing.\n    var drift = .5 * (1 - Math.exp(-elapsed / 750)) + .5 * elapsed / (elapsed + 18000);\n    var target = Math.min(.98, ui.confirmed + (.98 - ui.confirmed) * drift);\n    ui.displayed = Math.max(ui.displayed, ui.displayed + (target - ui.displayed) * .12);\n    ui.fill.style.transform = 'scaleX(' + ui.displayed + ')';\n  }\n\n  function pbUpdateUploadProgress(progress) {\n    if (progress.phase === 'dimensions') {\n      pbUpdateUploadPlaceholder(progress.width, progress.height);\n      return;\n    }\n    if (!pbUploadFeedback || pbUploadFeedback.dialog.hidden) return;\n    var ui = pbUploadFeedback;\n    var measured = progress.phase === 'uploading' && Number.isFinite(progress.total) && progress.total > 0 && Number.isFinite(progress.loaded) && progress.loaded >= 0;\n    var ratio = measured ? Math.min(1, progress.loaded / progress.total) : 0;\n    var done = progress.phase === 'done';\n    var transferred = progress.phase === 'processing' && progress.transferComplete === true;\n    var stages = ['received', 'validated', 'stored', 'normalized', 'preview', 'saved'];\n    var completed = stages.indexOf(progress.stage) + 1;\n    if (progress.phase === 'preparing') {\n      pbStopUploadAnimation();\n      ui.completed = ui.confirmed = ui.displayed = 0;\n      ui.startedAt = performance.now();\n      ui.reducedMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n      ui.fill.style.transition = 'none';\n      ui.fill.style.transform = 'scaleX(0)';\n      void ui.fill.offsetWidth;\n      ui.fill.style.transition = '';\n      if (!ui.reducedMotion) ui.animationTimer = setInterval(pbAdvanceUploadAnimation, 100);\n    }\n    ui.completed = Math.max(ui.completed || 0, done ? 7 : completed || (transferred ? 1 : ratio));\n    ui.confirmed = ui.completed / 7;\n    var label = ui.mode === 'ai' ? pbT('skapar_bild_progress_enhetlig', 'Skapar bild...') : pbT('bild_uppladdning_enhetlig', 'Laddar upp bild...');\n    ui.caption.textContent = label;\n    ui.percent.hidden = true;\n    ui.percent.textContent = '';\n    ui.bar.hidden = false;\n    if (done || ui.reducedMotion) {\n      ui.displayed = ui.confirmed;\n      ui.fill.style.transform = 'scaleX(' + ui.displayed + ')';\n      if (done) pbStopUploadAnimation();\n    }\n    // Screen readers receive real completed steps, never the estimated visual fill.\n    ui.bar.setAttribute('aria-valuenow', String(Math.floor(ui.confirmed * 100)));\n    ui.bar.setAttribute('aria-valuetext', ui.mode === 'ai' ? label : label + ' ' + pbT('bild_klara_steg', '{{ completed }} av {{ total }} steg klara.', { completed: Math.floor(ui.completed), total: 7 }));\n    var announcement = label + (ui.count.textContent ? ' ' + ui.count.textContent : '');\n    if (ui.title.textContent !== announcement) ui.title.textContent = announcement;\n  }\n\n  function pbHideUploadProgress() {\n    pbRemoveUploadPlaceholder();\n    if (!pbUploadFeedback) return;\n    var ui = pbUploadFeedback;\n    pbStopUploadAnimation();\n    root.inert = ui.previousInert;\n    ui.dialog.remove();\n    ui.title.remove();\n    pbUploadFeedback = null;\n    syncPrintClipWarning();\n    if (ui.previousFocus && ui.previousFocus.isConnected && typeof ui.previousFocus.focus === 'function') ui.previousFocus.focus({preventScroll:true});\n  }\n\n  function pbShowUploadError(message) {\n    pbRemoveUploadPlaceholder();\n    if (!pbUploadFeedback) pbShowUploadProgress(1, 1, null);\n    var ui = pbUploadFeedback;\n    if (!ui) return;\n    ui.dialog.hidden = false;\n    pbStopUploadAnimation();\n    root.inert = ui.previousInert;\n    ui.dialog.dataset.tone = 'danger';\n    ui.icon.innerHTML = ui.errorIcon;\n    ui.caption.textContent = pbT('bild_uppladdning_misslyckades', 'Bilden kunde inte laddas upp');\n    ui.count.hidden = ui.bar.hidden = ui.percent.hidden = true;\n    ui.title.textContent = '';\n    ui.error.textContent = pbTranslatedError(message);\n    ui.error.hidden = ui.close.hidden = false;\n    ui.close.focus({preventScroll:true});\n  }\n\n  async function pbHandleImageUploadSelection() {\n    if (pbUploadInProgress) return;\n    var files = Array.from(els.file.files || []).filter(Boolean);\n    if (!files.length) return;\n    pbHideUploadProgress();\n    pbUploadInProgress = true;\n    var lastLayer = null;\n    var uploadErrorMessage = '';\n    var failures = 0;\n    try {\n      setStatus('', false);\n      for (var i = 0; i < files.length; i++) {\n        // Visible immediately, including the security check and server processing.\n        pbShowUploadProgress(i + 1, files.length, files[i]);\n        try {\n          lastLayer = await addUploadedImageLayer(files[i], pbUpdateUploadProgress);\n          renderDesign();\n          renderPlacements();\n          pbRemoveUploadPlaceholder();\n          pbUpdateUploadProgress({ phase: 'done' });\n          await new Promise(function(resolve) { setTimeout(resolve, 160); });\n        } catch (error) {\n          pbRemoveUploadPlaceholder();\n          failures++;\n          uploadErrorMessage = error.message || pbT('kunde_inte_lasa_bildfilen', 'Kunde inte l\u00E4sa bildfilen.');\n        }\n      }\n    } catch (error) {\n      uploadErrorMessage = error.message || pbT('kunde_inte_lasa_bildfilen', 'Kunde inte l\u00E4sa bildfilen.');\n    } finally {\n      els.file.value = '';\n      pbUploadInProgress = false;\n      pbHideUploadProgress();\n      pbScheduleServerExport();\n    }\n    if (failures && files.length > 1) {\n      uploadErrorMessage = pbT('bild_uppladdning_fel_antal', '{{ failed }} av {{ total }} bilder kunde inte laddas upp.', { failed: failures, total: files.length }) + ' ' + uploadErrorMessage;\n    }\n    setStatus('', false);\n    if (lastLayer) openImageEditorForLayer(lastLayer.id);\n    // Mobile side panels can hide setStatus. Keep the reason visible above\n    // the editor until dismissed, including security, transfer and decode errors.\n    if (uploadErrorMessage) pbShowUploadError(uploadErrorMessage);\n  }\n\n  var pbSession = null;\n  var pbSessionPromise = null;\n  var pbConfigPromise = null;\n  var pbAutomaticDiscountTiers = [];\n  var pbAutomaticDiscountTiersPromise = null;\n  var pbCartDiscountBaseQuantity = 0;\n  // Set before boot starts the three independent requests. Config validation\n  // awaits this promise, while its network request is still started eagerly.\n  var pbExtraPrintAreaPromise = null;\n  var pbCartReviewRequired = false;\n  // Prime the security session while the customer is choosing size/quantity.\n  // The session is deliberately shared with the eventual upload/finalize calls;\n  // this removes Turnstile/config latency from the add-to-cart critical path.\n  var pbSessionWarmupPromise = null;\n  var pbRevisionHistoryRefreshTimer = null;\n  var pbDirectSaveFeedbackTimer = null;\n// Preview-only pixels never become a production source or an Add authority.\n\n\n\n\n\n\n\n\n  \n\n  \n\n  \n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  function pbWarmSessionInBackground() {\n    // Cart previews never start a security session. Only the explicit Add command\n    // may request a challenge from the visible parent page.\n    \n    if (pbSession && pbSession.expires_at > Date.now() + 30000) return Promise.resolve(pbSession);\n    if (!pbSessionWarmupPromise) {\n      pbSessionWarmupPromise = pbEnsureSession().catch(function () {\n        // Do not interrupt editing if a background warmup fails. The normal\n        // authorized request path retries the session with its full error UI.\n        return null;\n      }).finally(function () { pbSessionWarmupPromise = null; });\n    }\n    return pbSessionWarmupPromise;\n  }\n\n  function pbLoadConfig() {\n    if (!pbConfigPromise) {\n      var configRequest = pbJsonRequest(workerUrl + '/api/config', { cache: 'no-store' }, 20000);\n      pbConfigPromise = Promise.all([configRequest, pbExtraPrintAreaPromise || Promise.resolve()])\n      .then(async function (results) {\n        var res = results[0];\n        var config = res.data;\n        if (!res.ok || !config.configured) throw pbDependencyError(new Error(pbT('designern_ar_inte_fardigkonfigurerad_kontakta_butiken', 'Designern \u00E4r inte f\u00E4rdigkonfigurerad. Kontakta butiken.')), res.status);\n        if (String(config.extra_print_area_variant_id) !== String(EXTRA_PRINT_AREA_VARIANT_ID)) {\n          throw new Error(pbT('avgiftsprodukten_i_designern_stammer_inte_med_butikens_installningar', 'Avgiftsprodukten i designern st\u00E4mmer inte med butikens inst\u00E4llningar.'));\n        }\n        return config;\n      }).catch(function (error) { pbConfigPromise = null; throw error; });\n    }\n    return pbConfigPromise;\n  }\n  async function pbTurnstileToken(config) {\n    \n    if (!window.turnstile) {\n      if (!window.__pbTurnstileLoader) window.__pbTurnstileLoader = new Promise(function (resolve, reject) {\n        var script = document.createElement('script');\n        script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';\n        script.async = true;\n        var settled = false;\n        var timer = setTimeout(function () { finish(new Error(pbT('sakerhetskontrollen_kunde_inte_laddas_forsok_igen', 'S\u00E4kerhetskontrollen kunde inte laddas. F\u00F6rs\u00F6k igen.'))); }, 20000);\n        function finish(error) {\n          if (settled) return; settled = true; clearTimeout(timer);\n          if (error) { window.__pbTurnstileLoader = null; script.remove(); reject(error); }\n          else resolve();\n        }\n        script.onload = function () { finish(); };\n        script.onerror = function () { finish(new Error(pbT('sakerhetskontrollen_kunde_inte_laddas', 'S\u00E4kerhetskontrollen kunde inte laddas.'))); };\n        document.head.appendChild(script);\n      });\n      await window.__pbTurnstileLoader;\n    }\n    return new Promise(function (resolve, reject) {\n      // Keep the managed challenge out of the normal customer flow. Cloudflare\n      // only reveals its own widget when interaction is genuinely required.\n      var holder = document.createElement('div');\n      holder.style.cssText = 'position:fixed;left:50%;top:50%;z-index:2147483646;transform:translate(-50%,-50%);';\n      document.body.appendChild(holder);\n      var widget = null, settled = false;\n      function finish(error, token) {\n        if (settled) return; settled = true; clearTimeout(timer);\n        if (widget !== null) window.turnstile.remove(widget);\n        holder.remove();\n        if (error) reject(error); else resolve(token);\n      }\n      var timer = setTimeout(function () { finish(new Error(pbT('sakerhetskontrollen_tog_for_lang_tid_forsok_igen', 'S\u00E4kerhetskontrollen tog f\u00F6r l\u00E5ng tid. F\u00F6rs\u00F6k igen.'))); }, 30000);\n      try {\n        widget = window.turnstile.render(holder, { sitekey: config.turnstile_site_key, action: 'printbolt_designer', language: pbLocale.split('-')[0],\n          appearance: 'interaction-only',\n          callback: function (token) { finish(null, token); },\n          'error-callback': function () { finish(new Error(pbT('sakerhetskontrollen_misslyckades_forsok_igen', 'S\u00E4kerhetskontrollen misslyckades. F\u00F6rs\u00F6k igen.'))); },\n          'expired-callback': function () { finish(new Error(pbT('sakerhetskontrollen_har_lopt_ut_forsok_igen', 'S\u00E4kerhetskontrollen har l\u00F6pt ut. F\u00F6rs\u00F6k igen.'))); }\n        });\n      } catch (error) { finish(error); }\n    });\n  }\n  async function pbEnsureSession() {\n    \n    if (pbSession && pbSession.expires_at > Date.now() + 30000) return pbSession;\n    if (!pbSessionPromise) pbSessionPromise = (async function () {\n      var config = await pbLoadConfig();\n      var token = await pbTurnstileToken(config);\n      var response = await pbJsonRequest(workerUrl + '/api/session', { method: 'POST', headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ turnstile_token: token }) }, 20000);\n      var data = response.data;\n      if (!response.ok || !data.ok) throw new Error(pbTranslatedError(data.error) || pbT('kunde_inte_starta_designsessionen', 'Kunde inte starta designsessionen.'));\n      pbSession = data; return data;\n    })().finally(function () { pbSessionPromise = null; });\n    return pbSessionPromise;\n  }\n  \n  async function pbLoadTrustedVariant() {\n    var response = await pbJsonRequest(workerUrl + '/api/printbolt/verified-variant?id=' + encodeURIComponent(state.variant.id), { cache: 'no-store' }, 12000, false);\n    var data = response.data;\n    if (!response.ok || !data.ok) {\n      // Only these exact, documented validation responses prove a target problem.\n      // A timeout, permission failure, quota or upstream error must not silently\n      // blacklist a product or trigger attempts to bypass a service block.\n      var missingMapping = 'Betrodd leverant\u00F6rskoppling saknas f\u00F6r Shopify-variant ' + state.variant.id + '.';\n      var missingVariant = 'Shopify-varianten ' + state.variant.id + ' finns inte l\u00E4ngre.';\n      \n      throw pbDependencyError(new Error(pbTranslatedError(data.error) || pbT('produktkopplingen_kunde_inte_verifieras', 'Produktkopplingen kunde inte verifieras.')), response.status);\n    }\n    var mapping = data.mapping;\n    if (String(mapping.productId) !== String(state.shopifyProductId)) throw new Error(pbT('produktkopplingen_stammer_inte_med_den_valda_produkten', 'Produktkopplingen st\u00E4mmer inte med den valda produkten.'));\n    var savedMapping = state.savedDesign && state.savedDesign.variantRemapped ? state.savedDesign.mapping : null;\n    if (savedMapping && ['productTypeId', 'appearanceId', 'sizeId'].some(function (key) {\n      return String(mapping[key] || '') !== String(savedMapping[key] || '');\n    })) {\n      throw new Error(pbT('produktkopplingen_kunde_inte_verifieras', 'Produktkopplingen kunde inte verifieras.'));\n    }\n    state.spreadconnectProductTypeId = String(mapping.productTypeId);\n    state.spreadconnectAppearanceId = String(mapping.appearanceId);\n    state.spreadconnectSizeId = String(mapping.sizeId);\n  }\n  async function pbRegisterCartDesigns(items) {\n    var designItems = (Array.isArray(items) ? items : []).filter(function (item) {\n      return Boolean(item && item.properties && item.properties._pb_custom === 'true');\n    });\n    await pbMapLimit(designItems, 4, async function (item) {\n      var props = item.properties || {};\n      var result = await pbJsonRequest(workerUrl + '/api/designs/finalize', { method: 'POST',\n        headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ variant_id: String(item.id),\n          group_id: props._pb_group_id, design_json: props._pb_design_json,\n          editable_design_json: props._pb_design_json,\n          placements_json: props._pb_placements_json,\n          project_id: props._pb_design_project_id,\n          mockup_preview_file_id: props._pb_mockup_preview_file_id || '' }) }, 60000, true,\n          pbT('designverifieringen_tog_for_lang_tid', 'Det tog f\u00F6r l\u00E5ng tid att spara designen. Din design finns kvar. F\u00F6rs\u00F6k igen.'));\n      var data = result.data;\n      if (!result.ok || !data.ok) throw new Error(pbTranslatedError(data.error) || pbT('designen_kunde_inte_verifieras', 'Designen kunde inte verifieras.'));\n      var mapping = data.mapping;\n      if (String(mapping.productTypeId) !== props._pb_sc_product_type_id ||\n          String(mapping.appearanceId) !== props._pb_sc_appearance_id || String(mapping.sizeId) !== props._pb_sc_size_id) {\n        throw new Error(pbT('vald_storlek_eller_farg_stammer_inte_med_shopify_varianten_ladda_om_produkten', 'Vald storlek eller f\u00E4rg st\u00E4mmer inte med Shopify-varianten. Ladda om produkten.'));\n      }\n      if (Number(data.extra_areas) !== Number(props._pb_extra_print_areas) ||\n          String(data.fee_variant_id) !== String(EXTRA_PRINT_AREA_VARIANT_ID)) throw new Error(pbT('antalet_extra_tryckytor_stammer_inte', 'Antalet extra tryckytor st\u00E4mmer inte.'));\n      props._pb_design_ref = data.design_ref;\n      if (!data.edit_token) throw new Error(pbT('designen_saknar_redigeringskod', 'Designen saknar redigeringskod.'));\n      var editUrl = new URL(state.designerPageUrl || window.location.origin + window.location.pathname);\n      editUrl.search = '';\n      editUrl.hash = '';\n      editUrl.searchParams.set('design', String(data.design_ref));\n      editUrl.searchParams.set('token', String(data.edit_token));\n      props._pb_edit_url = editUrl.href;\n      // Keep the preview URL stable across revisions. The Worker resolves the\n      // latest promoted revision for this design/token pair.\n      props._pb_preview_url = data.preview_url\n        ? new URL(String(data.preview_url), workerUrl).href\n        : (data.design_ref && data.preview_token\n          ? new URL('/api/designs/preview?design=' + encodeURIComponent(String(data.design_ref)) + '&token=' + encodeURIComponent(String(data.preview_token)), workerUrl).href\n          : '');\n      props._pb_revision = String(data.revision || '');\n      props._pb_design_revision = String(data.revision || '');\n    });\n  }\n  async function pbJsonRequestOnce(url, options, timeoutMs, authorized, timeoutMessage) {\n    // Session verification has its own bounded UI; only time the actual request here.\n    var session = authorized ? await pbEnsureSession() : null;\n    var controller = new AbortController();\n    var timer = setTimeout(function () { controller.abort(); }, timeoutMs || 8000);\n    var headers = new Headers(options && options.headers || {});\n    if (session) headers.set('X-PB-Session', session.token);\n    try {\n      var response = await fetch(url, Object.assign({}, options, { headers: headers, signal: controller.signal }));\n      if (authorized && response.status === 401) pbInvalidateSession(session);\n      var data;\n      try { data = await response.json(); }\n      catch (error) {\n        if (controller.signal.aborted) throw error;\n        if (response.ok) throw new Error(pbT('svaret_kunde_inte_lasas_forsok_igen', 'Svaret kunde inte l\u00E4sas. F\u00F6rs\u00F6k igen.'));\n        data = {};\n      }\n      if (!data || typeof data !== 'object') throw new Error(pbT('svaret_kunde_inte_lasas_forsok_igen', 'Svaret kunde inte l\u00E4sas. F\u00F6rs\u00F6k igen.'));\n      var retryHeader = response.headers.get('Retry-After');\n      var retryAfter = retryHeader ? (/^\\d+$/.test(retryHeader) ? Number(retryHeader)*1000 : Math.max(0,Date.parse(retryHeader)-Date.now())) : 0;\n      return { ok: response.ok, status: response.status, data: data, retryAfter: retryAfter };\n    } catch (error) {\n      if (controller.signal.aborted) throw new Error(timeoutMessage || pbT('anropet_tog_for_lang_tid_forsok_igen', 'Anropet tog f\u00F6r l\u00E5ng tid. F\u00F6rs\u00F6k igen.'));\n      throw error;\n    } finally { clearTimeout(timer); }\n  }\n  async function pbReadCurrentCart() {\n    var result = await pbJsonRequest(getShopifyRouteRoot() + 'cart.js', { cache: 'no-store', headers: { Accept: 'application/json' } });\n    if (!result.ok || !result.data || !Array.isArray(result.data.items)) throw new Error(pbT('kundvagnen_kunde_inte_lasas', 'Kundvagnen kunde inte l\u00E4sas.'));\n    return result.data;\n  }\n  function pbCartMatches(cart, item) {\n    return (cart.items || []).filter(function (row) {\n      var p = row.properties || {};\n      return String(row.variant_id || row.id) === String(item.id) && p._pb_group_id === item.properties._pb_group_id &&\n        (!item.properties._pb_design_ref || p._pb_design_ref === item.properties._pb_design_ref);\n    }).reduce(function (sum, row) { return sum + Number(row.quantity || 0); }, 0) === Number(item.quantity);\n  }\n  function pbCartHasAttempt(cart, items) {\n    return (cart.items || []).some(function (row) {\n      return items.some(function (item) { return (row.properties || {})._pb_group_id === item.properties._pb_group_id; });\n    });\n  }\n  function pbOpenCart() { window.location.href = getShopifyRouteRoot() + 'cart'; }\n  async function pbCommitCart(items) {\n    \n    await pbRegisterCartDesigns(items);\n    \n    var result, failure, cart;\n    try {\n      result = await pbJsonRequest(getShopifyRouteRoot() + 'cart/add.js', { method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ items: items }) });\n      if (!result.ok) failure = new Error(result.data.description || result.data.message || pbT('shopify_kunde_inte_lagga_till_produkten', 'Shopify kunde inte l\u00E4gga till produkten.'));\n    } catch (error) { failure = error; }\n    var added = !failure && result && Array.isArray(result.data.items) &&\n      items.every(function (item) { return pbCartMatches(result.data, item); });\n    if (!added) {\n      // Read once after an uncertain result. Never replay cart/add automatically.\n      for (var readAttempt = 0; readAttempt < 3; readAttempt++) {\n        try { cart = await pbReadCurrentCart(); } catch (_) { cart = null; break; }\n        if (items.every(function(item) { return pbCartMatches(cart, item); })) break;\n        if (result && [400,422].includes(result.status)) break;\n        if (readAttempt < 2) await new Promise(function(resolve) { setTimeout(resolve, 1000 * (readAttempt + 1)); });\n      }\n      added = cart && items.every(function (item) { return pbCartMatches(cart, item); });\n      if (!added) {\n        if (result && [400, 422].indexOf(result.status) !== -1 && cart && !pbCartHasAttempt(cart, items)) {\n          throw failure || new Error(pbT('shopify_avvisade_produkten_kontrollera_storlek_och_antal', 'Shopify avvisade produkten. Kontrollera storlek och antal.'));\n        }\n        pbCartReviewRequired = true;\n        throw new Error(pbT('tillagget_kunde_inte_bekraftas_oppna_kundvagnen_for_att_se_vilka_produkter_som_finns_dar', 'Till\u00E4gget kunde inte bekr\u00E4ftas. \u00D6ppna kundvagnen f\u00F6r att se vilka produkter som finns d\u00E4r.'));\n      }\n    }\n    if (state.editCartGroupId) {\n      try {\n        cart = await pbReadCurrentCart();\n        if (!items.every(function (item) { return pbCartMatches(cart, item); })) throw new Error(pbT('den_nya_designen_kunde_inte_bekraftas', 'Den nya designen kunde inte bekr\u00E4ftas.'));\n        var updates = {};\n        cart.items.forEach(function (row) {\n          if ((row.properties || {})._pb_group_id === state.editCartGroupId) updates[row.key] = 0;\n        });\n        if (Object.keys(updates).length) {\n          var removed = await pbJsonRequest(getShopifyRouteRoot() + 'cart/update.js', { method: 'POST',\n            headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ updates: updates }) });\n          if (!removed.ok || !Array.isArray(removed.data.items) ||\n              !items.every(function (item) { return pbCartMatches(removed.data, item); }) ||\n              removed.data.items.some(function (row) { return (row.properties || {})._pb_group_id === state.editCartGroupId; })) {\n            throw new Error(pbT('den_gamla_designen_kunde_inte_tas_bort', 'Den gamla designen kunde inte tas bort.'));\n          }\n        }\n      } catch (_) {\n        pbCartReviewRequired = true;\n        throw new Error(pbT('den_nya_designen_lades_till_men_bytet_kunde_inte_slutforas_oppna_kundvagnen_och_kontrollera_den_gaml', 'Den nya designen lades till, men bytet kunde inte slutf\u00F6ras. \u00D6ppna kundvagnen och kontrollera den gamla designen.'));\n      }\n    }\n    pbCartReviewRequired = true; // A second click during navigation only opens the existing cart.\n    // Preview work continues in the cart; never delay a confirmed cart add.\n    \n    \n    await pbForgetDraft();\n    pbOpenCart();\n    return { items: items, groupIds: items.filter(function (item) {\n      return item.properties && item.properties._pb_custom === 'true';\n    }).map(function (item) { return item.properties._pb_group_id; }) };\n  }\n  async function pbAwaitAll(tasks) {\n    var outcomes = await Promise.allSettled(tasks);\n    var failure = outcomes.find(function (outcome) { return outcome.status === 'rejected'; });\n    if (failure) throw failure.reason;\n    return outcomes.map(function (outcome) { return outcome.value; });\n  }\n\n  async function pbMapLimit(items, limit, mapper) {\n    var list = Array.isArray(items) ? items : [];\n    if (!list.length) return [];\n    var output = new Array(list.length);\n    var cursor = 0;\n    var firstError = null;\n    async function worker() {\n      while (!firstError) {\n        var index = cursor;\n        cursor += 1;\n        if (index >= list.length) return;\n        try {\n          output[index] = await mapper(list[index], index);\n        } catch (error) {\n          firstError = error;\n        }\n      }\n    }\n    var workers = [];\n    var count = Math.min(list.length, Math.max(1, Number(limit || 1)));\n    for (var i = 0; i < count; i += 1) workers.push(worker());\n    await Promise.all(workers);\n    if (firstError) throw firstError;\n    return output;\n  }\n\n  var exportScale = Math.max(1, Number(root.dataset.exportScale || 3));\n\n  // Printbolt: hidden Shopify product variant used as fee when a design uses more than one print area.\n  // Product: \"Extra tryckomr\u00E5de\" / Variant: \"Default Title\"\n  var EXTRA_PRINT_AREA_VARIANT_ID = Number(root.dataset.extraPrintAreaVariantId || 54839521050953);\n  var EXTRA_PRINT_AREA_PRICE_CENTS = Math.max(0, Number(root.dataset.extraPrintAreaPriceCents || 0));\n  var MIN_IMAGE_DPI = 150;\n  var PRINT_CLIP_WARNING_MARGIN_PCT = 1.5;\n  var MAX_TEXT_LAYER_SIZE = 200;\n  var DEFAULT_TEXT_LAYER_WIDTH_PCT = 58;\n  var DEFAULT_TEXT_LAYER_HEIGHT_PCT = 18;\n\n  var qs = new URLSearchParams(window.location.search);\n  var state = {\n    \n    designerPageUrl: window.location.href,\n    designerOrigin: window.location.origin,\n    handle: qs.get('handle') || '',\n    shopifyProductId: qs.get('product_id') || '',\n    shopifyVariantId: qs.get('variant') || '',\n    // Generic catalog aliases are retained because active AI/template helpers still use them.\n    catalogProductId: '',\n    catalogVariantId: '',\n    catalogVariantImageUrl: '',\n    spreadconnectProductTypeId: qs.get('product_type') || qs.get('productTypeId') || qs.get('spreadconnect_product_type') || root.dataset.spreadconnectProductTypeId || '',\n    spreadconnectAppearanceId: qs.get('appearance_id') || qs.get('appearanceId') || '',\n    spreadconnectSizeId: qs.get('size_id') || qs.get('sizeId') || '',\n    spreadconnectAppearanceColor: '',\n    spreadconnectAppearanceContrast: '',\n    spreadconnectProduct: null,\n    activePlacement: qs.get('placement') || 'all',\n    technique: qs.get('technique') || qs.get('decoration') || 'auto',\n    region: qs.get('region') || 'europe',\n    currency: root.dataset.currency || (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || '',\n    product: null,\n    variant: null,\n    colorOptionIndex: -1,\n    sizeOptionIndex: -1,\n    activeColor: '',\n    allTemplates: [],\n    placements: [],\n    templatesByPlacement: {},\n    templateRequests: {},\n    designsByPlacement: {},\n    // Chronological order in which the customer actually starts designing print areas.\n    // The first still-used placement is the included print area; later ones are extras.\n    placementDesignOrder: [],\n    quantities: {},\n    projectId: makeProjectId(),\n    \n    \n    \n    editCartGroupId: qs.get('pb_edit_group') || '',\n    editCartItemKey: '',\n    editCartKeys: [],\n    editLoaded: false,\n    // A design+token URL is an in-place revision edit. Keep these credentials\n    // separate from the restored JSON so finalize can reuse them after restore.\n    editDesignRef: qs.get('design') || '',\n    editToken: qs.get('token') || '',\n    editDesignGroupId: '',\n    editRevision: '',\n    currentRevision: '',\n    revisionHistory: [],\n    openedRevision: '',\n    isHistoricalRevision: false,\n    savedDesign: null,\n    openedSavedDesign: false,\n    activeImageLayerId: '',\n    activePrimarySelected: false,\n    snapEnabled: true,\n    mobileTextEntryMode: '',\n    mobileStageZoomed: false,\n    mobileStageExtraZoomed: false,\n    stageZoomPercent: 85,\n    settingsOpen: false,\n    mobileTextSliderPanel: '',\n    textEditorSubpanel: '',\n    textEditorSubpanelParent: ''\n  };\n\n  // v530: remember the user's preferred stage zoom in this browser.\n  // v529 treated a missing localStorage value as Number(null) === 0, which then\n  // clamped to the minimum 75%. Use a fresh key once to escape that bad stored\n  // startup value, and explicitly reject null/empty/invalid values.\n  var STAGE_ZOOM_STORAGE_KEY = 'printbolt-designer-stage-zoom-percent-v2';\n  var LEGACY_STAGE_ZOOM_STORAGE_KEY = 'printbolt-designer-stage-zoom-percent';\n\n  function parseSavedStageZoomPercent(raw) {\n    if (raw == null || String(raw).trim() === '') return null;\n    var saved = Number(raw);\n    if (!Number.isFinite(saved)) return null;\n    if (saved < 75 || saved > 180) return null;\n    return saved;\n  }\n\n  function readSavedStageZoomPercent() {\n    try {\n      var current = parseSavedStageZoomPercent(window.localStorage.getItem(STAGE_ZOOM_STORAGE_KEY));\n      if (current != null) return current;\n\n      // Migrate useful v529 values, but treat 75% as ambiguous because the v529\n      // missing-value bug itself forced first-time users to 75% and saved it.\n      var legacy = parseSavedStageZoomPercent(window.localStorage.getItem(LEGACY_STAGE_ZOOM_STORAGE_KEY));\n      if (legacy != null && legacy !== 75) {\n        window.localStorage.setItem(STAGE_ZOOM_STORAGE_KEY, String(legacy));\n        return legacy;\n      }\n\n      return 85;\n    } catch (error) {\n      return 85;\n    }\n  }\n\n  function saveStageZoomPercent(value) {\n    try {\n      window.localStorage.setItem(STAGE_ZOOM_STORAGE_KEY, String(value));\n    } catch (error) {}\n  }\n\n  state.stageZoomPercent = readSavedStageZoomPercent();\n\n\n  // v213: Printbolt font library.\n  // System fonts remain available for backwards compatibility. Google Fonts are\n  // loaded only when the font picker (or an existing design that uses one) needs them.\n  var PB_DESIGNER_FONTS = [\n    { id: 'arial', name: 'Arial', family: 'Arial, Helvetica, sans-serif', provider: 'system', category: 'clean', popular: true },\n    { id: 'arial-black', name: 'Arial Black', family: \"'Arial Black', Arial, sans-serif\", provider: 'system', category: 'bold' },\n    { id: 'impact', name: 'Impact', family: \"Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif\", provider: 'system', category: 'bold', popular: true },\n    { id: 'trebuchet', name: 'Trebuchet', family: \"'Trebuchet MS', Arial, sans-serif\", provider: 'system', category: 'clean' },\n    { id: 'verdana', name: 'Verdana', family: 'Verdana, Geneva, sans-serif', provider: 'system', category: 'clean' },\n    { id: 'tahoma', name: 'Tahoma', family: 'Tahoma, Geneva, sans-serif', provider: 'system', category: 'clean' },\n    { id: 'gill-sans', name: 'Gill Sans', family: \"'Gill Sans', 'Gill Sans MT', Calibri, sans-serif\", provider: 'system', category: 'clean' },\n    { id: 'georgia', name: 'Georgia', family: \"Georgia, 'Times New Roman', serif\", provider: 'system', category: 'elegant' },\n    { id: 'palatino', name: 'Palatino', family: \"'Palatino Linotype', 'Book Antiqua', Palatino, serif\", provider: 'system', category: 'elegant' },\n    { id: 'courier-new', name: 'Courier New', family: \"'Courier New', Courier, monospace\", provider: 'system', category: 'retro' },\n\n    { id: 'montserrat', name: 'Montserrat', family: \"'Montserrat', Arial, sans-serif\", googleFamily: 'Montserrat', provider: 'google', category: 'clean', popular: true },\n    { id: 'poppins', name: 'Poppins', family: \"'Poppins', Arial, sans-serif\", googleFamily: 'Poppins', provider: 'google', category: 'clean', popular: true },\n    { id: 'oswald', name: 'Oswald', family: \"'Oswald', Impact, sans-serif\", googleFamily: 'Oswald', provider: 'google', category: 'bold', popular: true },\n    { id: 'bebas-neue', name: 'Bebas Neue', family: \"'Bebas Neue', Impact, sans-serif\", googleFamily: 'Bebas Neue', provider: 'google', category: 'bold', popular: true },\n    { id: 'anton', name: 'Anton', family: \"'Anton', Impact, sans-serif\", googleFamily: 'Anton', provider: 'google', category: 'bold', popular: true },\n    { id: 'archivo-black', name: 'Archivo Black', family: \"'Archivo Black', Arial, sans-serif\", googleFamily: 'Archivo Black', provider: 'google', category: 'bold' },\n    { id: 'league-spartan', name: 'League Spartan', family: \"'League Spartan', Arial, sans-serif\", googleFamily: 'League Spartan', provider: 'google', category: 'bold' },\n    { id: 'barlow-condensed', name: 'Barlow Condensed', family: \"'Barlow Condensed', Arial, sans-serif\", googleFamily: 'Barlow Condensed', provider: 'google', category: 'bold' },\n    { id: 'teko', name: 'Teko', family: \"'Teko', Impact, sans-serif\", googleFamily: 'Teko', provider: 'google', category: 'bold' },\n    { id: 'russo-one', name: 'Russo One', family: \"'Russo One', Arial, sans-serif\", googleFamily: 'Russo One', provider: 'google', category: 'bold', popular: true },\n    { id: 'staatliches', name: 'Staatliches', family: \"'Staatliches', Impact, sans-serif\", googleFamily: 'Staatliches', provider: 'google', category: 'bold' },\n    { id: 'alfa-slab-one', name: 'Alfa Slab One', family: \"'Alfa Slab One', Georgia, serif\", googleFamily: 'Alfa Slab One', provider: 'google', category: 'bold' },\n    { id: 'black-ops-one', name: 'Black Ops One', family: \"'Black Ops One', Impact, sans-serif\", googleFamily: 'Black Ops One', provider: 'google', category: 'bold' },\n    { id: 'bowlby-one-sc', name: 'Bowlby One SC', family: \"'Bowlby One SC', Impact, sans-serif\", googleFamily: 'Bowlby One SC', provider: 'google', category: 'bold' },\n\n    { id: 'bangers', name: 'Bangers', family: \"'Bangers', Impact, sans-serif\", googleFamily: 'Bangers', provider: 'google', category: 'fun', popular: true },\n    { id: 'luckiest-guy', name: 'Luckiest Guy', family: \"'Luckiest Guy', Arial, sans-serif\", googleFamily: 'Luckiest Guy', provider: 'google', category: 'fun', popular: true },\n    { id: 'chewy', name: 'Chewy', family: \"'Chewy', Arial, sans-serif\", googleFamily: 'Chewy', provider: 'google', category: 'fun' },\n    { id: 'fredoka', name: 'Fredoka', family: \"'Fredoka', Arial, sans-serif\", googleFamily: 'Fredoka', provider: 'google', category: 'fun', popular: true },\n    { id: 'baloo-2', name: 'Baloo 2', family: \"'Baloo 2', Arial, sans-serif\", googleFamily: 'Baloo 2', provider: 'google', category: 'fun' },\n    { id: 'bubblegum-sans', name: 'Bubblegum Sans', family: \"'Bubblegum Sans', Arial, sans-serif\", googleFamily: 'Bubblegum Sans', provider: 'google', category: 'fun' },\n    { id: 'sniglet', name: 'Sniglet', family: \"'Sniglet', Arial, sans-serif\", googleFamily: 'Sniglet', provider: 'google', category: 'fun' },\n    { id: 'lilita-one', name: 'Lilita One', family: \"'Lilita One', Arial, sans-serif\", googleFamily: 'Lilita One', provider: 'google', category: 'fun' },\n    { id: 'londrina-solid', name: 'Londrina Solid', family: \"'Londrina Solid', Arial, sans-serif\", googleFamily: 'Londrina Solid', provider: 'google', category: 'fun' },\n    { id: 'titan-one', name: 'Titan One', family: \"'Titan One', Arial, sans-serif\", googleFamily: 'Titan One', provider: 'google', category: 'fun' },\n    { id: 'righteous', name: 'Righteous', family: \"'Righteous', Arial, sans-serif\", googleFamily: 'Righteous', provider: 'google', category: 'fun' },\n\n    { id: 'permanent-marker', name: 'Permanent Marker', family: \"'Permanent Marker', cursive\", googleFamily: 'Permanent Marker', provider: 'google', category: 'hand', popular: true },\n    { id: 'caveat', name: 'Caveat', family: \"'Caveat', cursive\", googleFamily: 'Caveat', provider: 'google', category: 'hand', popular: true },\n    { id: 'kalam', name: 'Kalam', family: \"'Kalam', cursive\", googleFamily: 'Kalam', provider: 'google', category: 'hand' },\n    { id: 'patrick-hand', name: 'Patrick Hand', family: \"'Patrick Hand', cursive\", googleFamily: 'Patrick Hand', provider: 'google', category: 'hand' },\n    { id: 'pacifico', name: 'Pacifico', family: \"'Pacifico', cursive\", googleFamily: 'Pacifico', provider: 'google', category: 'hand', popular: true },\n    { id: 'lobster', name: 'Lobster', family: \"'Lobster', cursive\", googleFamily: 'Lobster', provider: 'google', category: 'hand', popular: true },\n\n    { id: 'special-elite', name: 'Special Elite', family: \"'Special Elite', 'Courier New', monospace\", googleFamily: 'Special Elite', provider: 'google', category: 'retro' },\n    { id: 'racing-sans-one', name: 'Racing Sans One', family: \"'Racing Sans One', Arial, sans-serif\", googleFamily: 'Racing Sans One', provider: 'google', category: 'retro' },\n    { id: 'monoton', name: 'Monoton', family: \"'Monoton', Impact, sans-serif\", googleFamily: 'Monoton', provider: 'google', category: 'retro' },\n    { id: 'press-start-2p', name: 'Press Start 2P', family: \"'Press Start 2P', monospace\", googleFamily: 'Press Start 2P', provider: 'google', category: 'retro', popular: true },\n    { id: 'bungee', name: 'Bungee', family: \"'Bungee', Impact, sans-serif\", googleFamily: 'Bungee', provider: 'google', category: 'retro', popular: true },\n    { id: 'bungee-shade', name: 'Bungee Shade', family: \"'Bungee Shade', Impact, sans-serif\", googleFamily: 'Bungee Shade', provider: 'google', category: 'retro' },\n    { id: 'rubik-dirt', name: 'Rubik Dirt', family: \"'Rubik Dirt', Impact, sans-serif\", googleFamily: 'Rubik Dirt', provider: 'google', category: 'retro' },\n    { id: 'rubik-glitch', name: 'Rubik Glitch', family: \"'Rubik Glitch', Impact, sans-serif\", googleFamily: 'Rubik Glitch', provider: 'google', category: 'retro' },\n    { id: 'creepster', name: 'Creepster', family: \"'Creepster', Impact, sans-serif\", googleFamily: 'Creepster', provider: 'google', category: 'retro' },\n\n    { id: 'cinzel', name: 'Cinzel', family: \"'Cinzel', Georgia, serif\", googleFamily: 'Cinzel', provider: 'google', category: 'elegant' },\n    { id: 'abril-fatface', name: 'Abril Fatface', family: \"'Abril Fatface', Georgia, serif\", googleFamily: 'Abril Fatface', provider: 'google', category: 'elegant', popular: true },\n    { id: 'playfair-display', name: 'Playfair Display', family: \"'Playfair Display', Georgia, serif\", googleFamily: 'Playfair Display', provider: 'google', category: 'elegant' },\n    { id: 'dm-serif-display', name: 'DM Serif Display', family: \"'DM Serif Display', Georgia, serif\", googleFamily: 'DM Serif Display', provider: 'google', category: 'elegant' },\n    { id: 'unbounded', name: 'Unbounded', family: \"'Unbounded', Arial, sans-serif\", googleFamily: 'Unbounded', provider: 'google', category: 'elegant' }\n  ];\n\n  // v388: only expose Bold when the selected face has a real heavier weight.\n  // Single-weight display fonts stay untouched instead of relying on browser-synthesized bold.\n  var PB_DESIGNER_FONT_BOLD_WEIGHTS = {\n    'arial': 700,\n    'trebuchet': 700,\n    'verdana': 700,\n    'tahoma': 700,\n    'gill-sans': 700,\n    'georgia': 700,\n    'palatino': 700,\n    'courier-new': 700,\n    'montserrat': 700,\n    'poppins': 700,\n    'oswald': 700,\n    'league-spartan': 700,\n    'barlow-condensed': 700,\n    'teko': 700,\n    'fredoka': 700,\n    'baloo-2': 700,\n    'sniglet': 800,\n    'londrina-solid': 900,\n    'caveat': 700,\n    'kalam': 700,\n    'cinzel': 700,\n    'playfair-display': 700,\n    'unbounded': 700\n  };\n\n  function getDesignerFontBoldWeight(fontOrFamily) {\n    var font = typeof fontOrFamily === 'string' ? getDesignerFontByFamily(fontOrFamily) : fontOrFamily;\n    if (!font) return 0;\n    return Number(PB_DESIGNER_FONT_BOLD_WEIGHTS[font.id] || 0);\n  }\n\n  function designerFontSupportsBold(fontOrFamily) {\n    return getDesignerFontBoldWeight(fontOrFamily) > 0;\n  }\n\n  function normalizeTextBoldRanges(ranges, textLength) {\n    var max = Math.max(0, Number(textLength || 0));\n    var normalized = (Array.isArray(ranges) ? ranges : []).map(function (range) {\n      var start = Array.isArray(range) ? Number(range[0]) : Number(range && range.start);\n      var end = Array.isArray(range) ? Number(range[1]) : Number(range && range.end);\n      if (!Number.isFinite(start) || !Number.isFinite(end)) return null;\n      start = Math.max(0, Math.min(max, Math.floor(start)));\n      end = Math.max(0, Math.min(max, Math.floor(end)));\n      if (end < start) {\n        var temp = start;\n        start = end;\n        end = temp;\n      }\n      if (end <= start) return null;\n      return { start: start, end: end };\n    }).filter(Boolean).sort(function (a, b) {\n      return a.start - b.start || a.end - b.end;\n    });\n\n    var merged = [];\n    normalized.forEach(function (range) {\n      var last = merged[merged.length - 1];\n      if (last && range.start <= last.end) {\n        last.end = Math.max(last.end, range.end);\n      } else {\n        merged.push({ start: range.start, end: range.end });\n      }\n    });\n    return merged;\n  }\n\n  function migrateTextLayerBoldModel(layer) {\n    if (!layer || layer.type !== 'text') return;\n    var text = String(layer.text || '');\n    var hasSavedRanges = Array.isArray(layer.boldRanges);\n\n    if (!hasSavedRanges) {\n      var legacyWeight = Number(layer.fontWeight || 400);\n      if (legacyWeight >= 600 && designerFontSupportsBold(layer.fontFamily) && text.length) {\n        layer.boldRanges = [{ start: 0, end: text.length }];\n      } else {\n        layer.boldRanges = [];\n      }\n    }\n\n    layer.boldRanges = normalizeTextBoldRanges(layer.boldRanges, text.length);\n    // v389: 400 is the neutral/base face. Real bold is stored per character range.\n    // Heavy single-weight faces (Impact, Anton, etc.) are already heavy at their 400 face.\n    layer.fontWeight = '400';\n  }\n\n  function getTextLayerBoldRanges(layer) {\n    if (!layer || layer.type !== 'text') return [];\n    migrateTextLayerBoldModel(layer);\n    return normalizeTextBoldRanges(layer.boldRanges, String(layer.text || '').length);\n  }\n\n  function getTextBoldRangesKey(layer) {\n    return getTextLayerBoldRanges(layer).map(function (range) {\n      return range.start + '-' + range.end;\n    }).join(',');\n  }\n\n  function getTextLineStyledSegments(layer, lineIndex, uppercase) {\n    var raw = String((layer && layer.text) || '').replace(/\\r/g, '');\n    var lines = raw.split('\\n');\n    lineIndex = Math.max(0, Math.min(lines.length - 1, Number(lineIndex || 0)));\n    var line = String(lines[lineIndex] || '');\n    var lineStart = 0;\n    for (var i = 0; i < lineIndex; i++) lineStart += String(lines[i] || '').length + 1;\n    var lineEnd = lineStart + line.length;\n    var ranges = getTextLayerBoldRanges(layer);\n    var points = [0, line.length];\n\n    ranges.forEach(function (range) {\n      var start = Math.max(lineStart, range.start);\n      var end = Math.min(lineEnd, range.end);\n      if (end <= start) return;\n      points.push(start - lineStart, end - lineStart);\n    });\n\n    points = Array.from(new Set(points)).sort(function (a, b) { return a - b; });\n    var segments = [];\n    for (var pIndex = 0; pIndex < points.length - 1; pIndex++) {\n      var localStart = points[pIndex];\n      var localEnd = points[pIndex + 1];\n      if (localEnd <= localStart) continue;\n      var absoluteStart = lineStart + localStart;\n      var absoluteEnd = lineStart + localEnd;\n      var bold = ranges.some(function (range) {\n        return range.start <= absoluteStart && range.end >= absoluteEnd;\n      });\n      var value = line.slice(localStart, localEnd);\n      segments.push({ text: uppercase ? value.toUpperCase() : value, bold: bold });\n    }\n\n    if (!segments.length) segments.push({ text: '', bold: false });\n    return segments;\n  }\n\n  var __pbSavedTextEditorRange = null;\n  var __pbTextEditorComposing = false;\n  var PB_TEXT_EDITOR_SENTINEL = '\\u200B';\n\n  function editorSelectionIsInside() {\n    if (!els || !els.textEditorInput || !window.getSelection) return false;\n    var selection = window.getSelection();\n    if (!selection || !selection.rangeCount) return false;\n    var range = selection.getRangeAt(0);\n    return els.textEditorInput.contains(range.commonAncestorContainer);\n  }\n\n  function saveTextEditorSelection() {\n    if (!editorSelectionIsInside()) return;\n    try {\n      __pbSavedTextEditorRange = window.getSelection().getRangeAt(0).cloneRange();\n    } catch (error) {}\n  }\n\n  function restoreTextEditorSelection() {\n    if (!els || !els.textEditorInput || !__pbSavedTextEditorRange || !window.getSelection) return false;\n    try {\n      var selection = window.getSelection();\n      selection.removeAllRanges();\n      selection.addRange(__pbSavedTextEditorRange.cloneRange());\n      return true;\n    } catch (error) {\n      return false;\n    }\n  }\n\n  function appendRichEditorText(result, value, bold) {\n    value = String(value == null ? '' : value)\n      .replace(/\\u00a0/g, ' ')\n      // v390: editor-only caret sentinel used after a trailing <br>. It must\n      // never become part of the customer's actual text or bold ranges.\n      .replace(/\\u200B/g, '');\n    if (!value) return;\n    var start = result.text.length;\n    result.text += value;\n    if (bold) result.boldRanges.push({ start: start, end: result.text.length });\n  }\n\n  function readTextEditorRichData() {\n    var editor = els && els.textEditorInput;\n    var result = { text: '', boldRanges: [] };\n    if (!editor) return result;\n\n    function nodeIsBold(node, inheritedBold) {\n      if (inheritedBold || !node || node.nodeType !== 1) return inheritedBold;\n      var tag = String(node.tagName || '').toUpperCase();\n      if (tag === 'B' || tag === 'STRONG') return true;\n      var styleWeight = String(node.style && node.style.fontWeight || '').toLowerCase();\n      return styleWeight === 'bold' || Number(styleWeight) >= 600;\n    }\n\n    function walk(node, inheritedBold) {\n      if (!node) return;\n      if (node.nodeType === 3) {\n        appendRichEditorText(result, node.nodeValue || '', inheritedBold);\n        return;\n      }\n      if (node.nodeType !== 1) return;\n\n      var tag = String(node.tagName || '').toUpperCase();\n      if (tag === 'BR') {\n        appendRichEditorText(result, '\\n', false);\n        return;\n      }\n\n      var isBlock = tag === 'DIV' || tag === 'P' || tag === 'LI';\n      if (isBlock && result.text && !result.text.endsWith('\\n')) {\n        appendRichEditorText(result, '\\n', false);\n      }\n\n      var bold = nodeIsBold(node, inheritedBold);\n      Array.from(node.childNodes || []).forEach(function (child) { walk(child, bold); });\n    }\n\n    Array.from(editor.childNodes || []).forEach(function (child) { walk(child, false); });\n    result.text = result.text.replace(/\\r/g, '');\n    if (result.text.length > 220) result.text = result.text.slice(0, 220);\n    result.boldRanges = normalizeTextBoldRanges(result.boldRanges, result.text.length);\n    return result;\n  }\n\n  function getTextEditorPlainText() {\n    return readTextEditorRichData().text;\n  }\n\n  function syncTextEditorPresentation(layer) {\n    if (!els || !els.textEditorInput || !layer) return;\n    els.textEditorInput.style.textAlign = ['left', 'center', 'right'].indexOf(layer.align || 'center') >= 0 ? layer.align : 'center';\n    els.textEditorInput.style.fontFamily = layer.fontFamily || 'Arial, Helvetica, sans-serif';\n    els.textEditorInput.style.fontStyle = layer.fontStyle || 'normal';\n    els.textEditorInput.style.fontWeight = '400';\n    els.textEditorInput.style.setProperty('--pb-editor-bold-weight', String(getDesignerFontBoldWeight(layer.fontFamily || '') || 700));\n  }\n\n  function writeTextEditorFromLayer(layer) {\n    var editor = els && els.textEditorInput;\n    if (!editor || !layer) return;\n    migrateTextLayerBoldModel(layer);\n    var text = String(layer.text || '').replace(/\\r/g, '');\n    var ranges = getTextLayerBoldRanges(layer);\n    var fragment = document.createDocumentFragment();\n\n    function isBoldAt(index) {\n      return ranges.some(function (range) {\n        return index >= range.start && index < range.end;\n      });\n    }\n\n    function appendTextRun(value, bold) {\n      if (!value) return;\n      if (bold) {\n        var strong = document.createElement('strong');\n        strong.textContent = value;\n        fragment.appendChild(strong);\n      } else {\n        fragment.appendChild(document.createTextNode(value));\n      }\n    }\n\n    // v390: use real <br> nodes in the contenteditable instead of literal newline\n    // characters inside text nodes. A trailing literal newline is logically correct\n    // but browsers often keep the caret painted on the previous line until another\n    // Enter is pressed. <br> keeps editor and shirt preview visually 1:1.\n    var run = '';\n    var runBold = false;\n    for (var i = 0; i < text.length; i++) {\n      var ch = text.charAt(i);\n      if (ch === '\\n') {\n        appendTextRun(run, runBold);\n        run = '';\n        fragment.appendChild(document.createElement('br'));\n        continue;\n      }\n      var charBold = isBoldAt(i);\n      if (!run) {\n        runBold = charBold;\n        run = ch;\n      } else if (charBold === runBold) {\n        run += ch;\n      } else {\n        appendTextRun(run, runBold);\n        runBold = charBold;\n        run = ch;\n      }\n    }\n    appendTextRun(run, runBold);\n\n    // A trailing <br> needs a zero-width editor-only anchor so the caret visibly\n    // sits on the new empty row. readTextEditorRichData strips this sentinel.\n    if (text.endsWith('\\n')) {\n      fragment.appendChild(document.createTextNode(PB_TEXT_EDITOR_SENTINEL));\n    }\n\n    editor.replaceChildren(fragment);\n    syncTextEditorPresentation(layer);\n  }\n\n  function selectAllTextEditorContent() {\n    if (!els || !els.textEditorInput || !window.getSelection) return;\n    try {\n      var range = document.createRange();\n      range.selectNodeContents(els.textEditorInput);\n      var selection = window.getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      saveTextEditorSelection();\n    } catch (error) {}\n  }\n\n\n  function placeTextEditorCaretAtEnd() {\n    if (!els || !els.textEditorInput || !window.getSelection) return;\n    try {\n      var range = document.createRange();\n      range.selectNodeContents(els.textEditorInput);\n      range.collapse(false);\n      var selection = window.getSelection();\n      selection.removeAllRanges();\n      selection.addRange(range);\n      saveTextEditorSelection();\n    } catch (error) {}\n  }\n\n  function insertPlainTextIntoTextEditor(value) {\n    var editor = els && els.textEditorInput;\n    if (!editor || !window.getSelection) return;\n    value = String(value == null ? '' : value).replace(/\\r/g, '');\n    var current = readTextEditorRichData();\n    var selection = window.getSelection();\n    var selectedLength = selection && selection.rangeCount && editor.contains(selection.getRangeAt(0).commonAncestorContainer)\n      ? String(selection.toString() || '').length\n      : 0;\n    var allowed = Math.max(0, 220 - (current.text.length - selectedLength));\n    if (value.length > allowed) value = value.slice(0, allowed);\n    if (!value && allowed <= 0) return;\n\n    editor.focus();\n    if (!editorSelectionIsInside()) {\n      var endRange = document.createRange();\n      endRange.selectNodeContents(editor);\n      endRange.collapse(false);\n      selection.removeAllRanges();\n      selection.addRange(endRange);\n    }\n\n    var range = selection.getRangeAt(0);\n    range.deleteContents();\n\n    // v390: newline input is represented with actual <br> elements. This makes\n    // one Enter immediately move the visible caret down one row in contenteditable,\n    // matching the SVG preview. Text pasted with multiple lines uses the same path.\n    var fragment = document.createDocumentFragment();\n    var parts = value.split('\\n');\n    var lastInserted = null;\n\n    parts.forEach(function (part, index) {\n      if (index > 0) {\n        var br = document.createElement('br');\n        fragment.appendChild(br);\n        lastInserted = br;\n      }\n      if (part) {\n        var textNode = document.createTextNode(part);\n        fragment.appendChild(textNode);\n        lastInserted = textNode;\n      }\n    });\n\n    var trailingSentinel = null;\n    if (value.endsWith('\\n')) {\n      trailingSentinel = document.createTextNode(PB_TEXT_EDITOR_SENTINEL);\n      fragment.appendChild(trailingSentinel);\n      lastInserted = trailingSentinel;\n    }\n\n    if (!lastInserted) return;\n    range.insertNode(fragment);\n\n    // Keep the caret before the invisible sentinel. It is already on the new\n    // visual line, but Backspace can still remove the actual <br> in one press.\n    if (trailingSentinel && trailingSentinel.parentNode) {\n      range.setStartBefore(trailingSentinel);\n    } else {\n      range.setStartAfter(lastInserted);\n    }\n    range.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(range);\n    saveTextEditorSelection();\n    editor.dispatchEvent(new Event('input', { bubbles: true }));\n  }\n\n  var PB_FONT_CATEGORY_LABELS = {\n    clean: pbT('ren', 'Ren'),\n    bold: pbT('kraftfull', 'Kraftfull'),\n    fun: pbT('rolig', 'Rolig'),\n    hand: pbT('handskriven', 'Handskriven'),\n    retro: pbT('retro', 'Retro'),\n    elegant: pbT('elegant', 'Elegant')\n  };\n\n  var pbFontCatalogStylesheetPromise = null;\n  var pbFontReadyFamilies = Object.create(null);\n  var pbFontReadyPromises = Object.create(null);\n  var pbFontSvgCssPromises = Object.create(null);\n\n  function getDesignerFontByFamily(family) {\n    family = String(family || '').trim();\n    return PB_DESIGNER_FONTS.find(function (font) { return font.family === family; }) || null;\n  }\n\n  function getDesignerFontById(id) {\n    id = String(id || '').trim();\n    return PB_DESIGNER_FONTS.find(function (font) { return font.id === id; }) || null;\n  }\n\n  function makeGoogleFontsUrl(fonts) {\n    var families = (fonts || []).filter(function (font) { return font && font.provider === 'google' && font.googleFamily; });\n    if (!families.length) return '';\n    var params = families.map(function (font) {\n      var familyParam = encodeURIComponent(font.googleFamily).replace(/%20/g, '+');\n      var boldWeight = getDesignerFontBoldWeight(font);\n      if (boldWeight > 0) familyParam += ':wght@400;' + boldWeight;\n      return 'family=' + familyParam;\n    });\n    return 'https://fonts.googleapis.com/css2?' + params.join('&') + '&display=swap';\n  }\n\n  function ensureFontCatalogStylesheet() {\n    if (pbFontCatalogStylesheetPromise) return pbFontCatalogStylesheetPromise;\n\n    var href = makeGoogleFontsUrl(PB_DESIGNER_FONTS);\n    if (!href) return Promise.resolve();\n\n    pbFontCatalogStylesheetPromise = new Promise(function (resolve) {\n      var existing = document.querySelector('link[data-pb-font-catalog]');\n      if (existing) {\n        if (existing.sheet) return resolve();\n        existing.addEventListener('load', function () { resolve(); }, { once: true });\n        existing.addEventListener('error', function () { resolve(); }, { once: true });\n        return;\n      }\n\n      var link = document.createElement('link');\n      link.rel = 'stylesheet';\n      link.href = href;\n      link.setAttribute('data-pb-font-catalog', '');\n      link.onload = function () { resolve(); };\n      link.onerror = function () { resolve(); };\n      document.head.appendChild(link);\n    });\n\n    return pbFontCatalogStylesheetPromise;\n  }\n\n  function ensureDesignerFontReady(font) {\n    if (!font || font.provider !== 'google') return Promise.resolve();\n    if (pbFontReadyFamilies[font.family]) return Promise.resolve();\n    if (pbFontReadyPromises[font.family]) return pbFontReadyPromises[font.family];\n\n    pbFontReadyPromises[font.family] = ensureFontCatalogStylesheet().then(function () {\n      if (!document.fonts || !document.fonts.load) {\n        pbFontReadyFamilies[font.family] = true;\n        return;\n      }\n      var familyName = font.googleFamily.replace(/\"/g, '');\n      var loads = [document.fonts.load('400 32px \"' + familyName + '\"', 'Printbolt \u00C5\u00C4\u00D6 123').catch(function () {})];\n      var boldWeight = getDesignerFontBoldWeight(font);\n      if (boldWeight > 0) {\n        loads.push(document.fonts.load(String(boldWeight) + ' 32px \"' + familyName + '\"', 'Printbolt \u00C5\u00C4\u00D6 123').catch(function () {}));\n      }\n      return Promise.all(loads).then(function () {\n        pbFontReadyFamilies[font.family] = true;\n      });\n    }).finally(function () {\n      delete pbFontReadyPromises[font.family];\n    });\n\n    return pbFontReadyPromises[font.family];\n  }\n\n  function ensureDesignerFontReadyByFamily(family) {\n    var font = getDesignerFontByFamily(family);\n    return ensureDesignerFontReady(font);\n  }\n\n  function blobToDataUrl(blob) {\n    return new Promise(function (resolve, reject) {\n      var reader = new FileReader();\n      reader.onload = function () { resolve(String(reader.result || '')); };\n      reader.onerror = function () { reject(reader.error || new Error(pbT('kunde_inte_lasa_fontfil', 'Kunde inte l\u00E4sa fontfil.'))); };\n      reader.readAsDataURL(blob);\n    });\n  }\n\n  async function dataUrlToBlob(dataUrl) {\n    var response = await fetch(String(dataUrl || ''));\n    if (!response.ok) throw new Error(pbT('kunde_inte_forbereda_bildfilen', 'Kunde inte f\u00F6rbereda bildfilen.'));\n    return response.blob();\n  }\n\n  async function getEmbeddedFontCssForFamily(family) {\n    var font = getDesignerFontByFamily(family);\n    if (!font || font.provider !== 'google') return '';\n    if (pbFontSvgCssPromises[font.family]) return pbFontSvgCssPromises[font.family];\n\n    pbFontSvgCssPromises[font.family] = (async function () {\n      try {\n        var cssUrl = makeGoogleFontsUrl([font]);\n        var cssRes = await fetch(cssUrl, { mode: 'cors' });\n        if (!cssRes.ok) return '';\n        var cssText = await cssRes.text();\n        var urls = [];\n        cssText.replace(/url\\((['\"]?)(https:\\/\\/fonts\\.gstatic\\.com\\/[^)'\"\\s]+)\\1\\)/g, function (_, _quote, url) {\n          if (urls.indexOf(url) < 0) urls.push(url);\n          return _;\n        });\n\n        for (var i = 0; i < urls.length; i++) {\n          try {\n            var fontRes = await fetch(urls[i], { mode: 'cors' });\n            if (!fontRes.ok) continue;\n            var dataUrl = await blobToDataUrl(await fontRes.blob());\n            cssText = cssText.split(urls[i]).join(dataUrl);\n          } catch (error) {}\n        }\n        return cssText;\n      } catch (error) {\n        return '';\n      }\n    })();\n\n    return pbFontSvgCssPromises[font.family];\n  }\n\n  function getFontPreviewText() {\n    var text = els && els.textEditorInput ? getTextEditorPlainText() : '';\n    if (!text) {\n      var layer = typeof getActiveLayer === 'function' ? getActiveLayer() : null;\n      text = layer && layer.type === 'text' ? String(layer.text || '') : '';\n    }\n    text = text.replace(/\\s+/g, ' ').trim() || pbT('din_text_har', 'Din text h\u00E4r');\n    return text.length > 24 ? text.slice(0, 23) + '\u2026' : text;\n  }\n\n  function setupFontPicker() {\n    if (els.textFont) {\n      var current = els.textFont.value || 'Arial, Helvetica, sans-serif';\n      els.textFont.innerHTML = '';\n      PB_DESIGNER_FONTS.forEach(function (font) {\n        var option = document.createElement('option');\n        option.value = font.family;\n        option.textContent = font.name;\n        els.textFont.appendChild(option);\n      });\n      els.textFont.value = getDesignerFontByFamily(current) ? current : 'Arial, Helvetica, sans-serif';\n    }\n\n    if (els.fontCount) els.fontCount.textContent = PB_DESIGNER_FONTS.length + pbT('teckensnitt_2', ' teckensnitt');\n    syncFontPickerSummary();\n  }\n\n  function syncFontPickerSummary(layer) {\n    layer = layer || (typeof getActiveLayer === 'function' ? getActiveLayer() : null);\n    var family = layer && layer.type === 'text'\n      ? (layer.fontFamily || 'Arial, Helvetica, sans-serif')\n      : (els.textFont ? els.textFont.value : 'Arial, Helvetica, sans-serif');\n    var font = getDesignerFontByFamily(family) || PB_DESIGNER_FONTS[0];\n    var previewText = getFontPreviewText();\n\n    if (els.fontCurrentPreview) {\n      els.fontCurrentPreview.textContent = previewText;\n      els.fontCurrentPreview.style.fontFamily = font.family;\n    }\n    if (els.fontCurrentName) els.fontCurrentName.textContent = font.name;\n    if (els.desktopFontPreview) {\n      els.desktopFontPreview.textContent = previewText;\n      els.desktopFontPreview.style.fontFamily = font.family;\n    }\n    if (els.desktopFontName) els.desktopFontName.textContent = font.name;\n  }\n\n  function renderFontPickerList() {\n    if (!els.fontList) return;\n\n    var currentFamily = els.textFont ? els.textFont.value : ((getActiveLayer() || {}).fontFamily || 'Arial, Helvetica, sans-serif');\n    var previewText = getFontPreviewText();\n\n    els.fontList.innerHTML = '';\n\n    PB_DESIGNER_FONTS.forEach(function (font) {\n      var button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'pb-font-card' + (font.family === currentFamily ? ' is-active' : '');\n      button.dataset.pbFontChoice = font.id;\n      button.setAttribute('aria-pressed', font.family === currentFamily ? 'true' : 'false');\n\n      var preview = document.createElement('span');\n      preview.className = 'pb-font-card__preview';\n      preview.textContent = previewText;\n      preview.style.fontFamily = font.family;\n\n      var meta = document.createElement('span');\n      meta.className = 'pb-font-card__meta';\n      var name = document.createElement('strong');\n      name.textContent = font.name;\n      var category = document.createElement('small');\n      category.textContent = PB_FONT_CATEGORY_LABELS[font.category] || pbT('teckensnitt', 'Teckensnitt');\n      meta.appendChild(name);\n      meta.appendChild(category);\n\n      var check = document.createElement('span');\n      check.className = 'pb-font-card__check';\n      check.textContent = '\u2713';\n      check.setAttribute('aria-hidden', 'true');\n\n      button.appendChild(preview);\n      button.appendChild(meta);\n      button.appendChild(check);\n      els.fontList.appendChild(button);\n    });\n  }\n\n  function openFontPickerPanel() {\n    if (!openEditorSubpanel('font', '', true)) return;\n    syncFontPickerSummary();\n    renderFontPickerList();\n    ensureFontCatalogStylesheet().then(function () {\n      renderFontPickerList();\n    });\n  }\n\n  function closeFontPickerPanel() {\n    navigateBackTextEditorSubpanel();\n  }\n\n  function setActiveTextFont(fontId) {\n    var font = getDesignerFontById(fontId);\n    if (!font) return;\n    if (els.textFont) els.textFont.value = font.family;\n\n    var activeLayer = getActiveLayer();\n    if (activeLayer && activeLayer.type === 'text' && !designerFontSupportsBold(font)) {\n      activeLayer.boldRanges = [];\n      activeLayer.fontWeight = '400';\n      writeTextEditorFromLayer(activeLayer);\n    }\n\n    syncFontPickerSummary();\n    updateActiveTextLayerFromEditor();\n    syncTextBoldControl(getActiveLayer());\n    renderFontPickerList();\n\n    ensureDesignerFontReady(font).then(function () {\n      var layer = getActiveLayer();\n      if (!layer || layer.type !== 'text' || layer.fontFamily !== font.family) return;\n      updateActiveTextLayerFromEditor();\n      syncTextBoldControl(layer);\n      syncTextEditorPresentation(layer);\n      syncFontPickerSummary(layer);\n      renderFontPickerList();\n    });\n  }\n\n  var SNAP_ENABLED_STORAGE_KEY = 'printbolt-designer-support-lines-enabled';\n\n  function loadSnapEnabledPreference() {\n    try {\n      var stored = window.localStorage.getItem(SNAP_ENABLED_STORAGE_KEY);\n      if (stored === '0' || stored === 'false') return false;\n      if (stored === '1' || stored === 'true') return true;\n    } catch (error) {}\n\n    return true;\n  }\n\n  function saveSnapEnabledPreference(enabled) {\n    try {\n      window.localStorage.setItem(SNAP_ENABLED_STORAGE_KEY, enabled ? '1' : '0');\n    } catch (error) {}\n  }\n\n\n  var els = {\n    stage: root.querySelector('[data-pb-stage]'),\n    stageWrap: root.querySelector('.pb-customizer__stage-wrap'),\n    stageZoomControl: root.querySelector('[data-pb-stage-zoom-control]'),\n    stageZoomInput: root.querySelector('[data-pb-stage-zoom-input]'),\n    stageZoomOut: root.querySelector('[data-pb-stage-zoom-out]'),\n    stageZoomIn: root.querySelector('[data-pb-stage-zoom-in]'),\n    clipStageAlert: root.querySelector('[data-pb-clip-stage-alert]'),\n    clipStageAlertTitle: root.querySelector('[data-pb-clip-stage-alert-title]'),\n    clipStageAlertText: root.querySelector('[data-pb-clip-stage-alert-text]'),\n    templateBg: root.querySelector('[data-pb-template-bg]'),\n    templateImg: root.querySelector('[data-pb-template-img]'),\n    printArea: root.querySelector('[data-pb-print-area]'),\n    artworkMask: root.querySelector('[data-pb-artwork-mask]'),\n    snapGuideV: root.querySelector('[data-pb-snap-guide-v]'),\n    snapGuideH: root.querySelector('[data-pb-snap-guide-h]'),\n    imageLayers: root.querySelector('[data-pb-image-layers]'),\n    design: root.querySelector('[data-pb-design]'),\n    designText: root.querySelector('[data-pb-design-text]'),\n    designImg: root.querySelector('[data-pb-design-img]'),\n    measureWidth: root.querySelector('[data-pb-measure-width]'),\n    measureHeight: root.querySelector('[data-pb-measure-height]'),\n    designDelete: root.querySelector('[data-pb-design-delete]'),\n    designRotate: root.querySelector('[data-pb-design-rotate]'),\n    designResizeHandles: Array.from(root.querySelectorAll('[data-pb-design-resize]')),\n    productHead: root.querySelector('[data-pb-product-head]'),\n    productTitle: root.querySelector('[data-pb-product-title]'),\n    productLink: root.querySelector('[data-pb-product-link]'),\n    productDetails: root.querySelector('[data-pb-product-details]'),\n    productDetailsBody: root.querySelector('[data-pb-product-details-body]'),\n    productDetailsClose: root.querySelector('[data-pb-product-details-close]'),\n    status: root.querySelector('[data-pb-status]'),\n    colors: root.querySelector('[data-pb-colors]'),\n    colorsWrap: root.querySelector('[data-pb-colors-wrap]'),\n    colorName: root.querySelector('[data-pb-color-name]'),\n    selectedColorName: root.querySelector('[data-pb-selected-color-name]'),\n    selectedColorImg: root.querySelector('[data-pb-selected-color-img]'),\n    selectedColorStock: root.querySelector('[data-pb-selected-color-stock]'),\n    mobileStageTopbar: root.querySelector('[data-pb-mobile-stage-topbar]'),\n    mobileStageColor: root.querySelector('[data-pb-mobile-stage-color]'),\n    mobileSelectedColorName: root.querySelector('[data-pb-mobile-selected-color-name]'),\n    mobileSelectedColorImg: root.querySelector('[data-pb-mobile-selected-color-img]'),\n    mobileSelectedColorStock: root.querySelector('[data-pb-mobile-selected-color-stock]'),\n    colorPanel: root.querySelector('[data-pb-color-panel]'),\n    openColorPanelButtons: Array.from(root.querySelectorAll('[data-pb-open-color-panel]')),\n    closeColorPanelButtons: Array.from(root.querySelectorAll('[data-pb-close-color-panel]')),\n    sizeColorName: root.querySelector('[data-pb-size-color-name]'),\n    placements: root.querySelector('[data-pb-placements]'),\n    file: root.querySelector('[data-pb-file]'),\n    openAiMotivButtons: Array.from(root.querySelectorAll('[data-pb-open-ai-motiv]')),\n    aiPanel: root.querySelector('[data-pb-ai-panel]'),\n    closeAiPanelButtons: Array.from(root.querySelectorAll('[data-pb-close-ai-panel]')),\n    aiPrompt: root.querySelector('[data-pb-ai-prompt]'),\n    aiStyle: root.querySelector('[data-pb-ai-style]'),\n    aiStatus: root.querySelector('[data-pb-ai-status]'),\n    aiSubmit: root.querySelector('[data-pb-ai-submit]'),\n    aiChips: Array.from(root.querySelectorAll('[data-pb-ai-chip]')),\n    aiHelp: root.querySelector('[data-pb-ai-help]'),\n    aiHelpText: root.querySelector('[data-pb-ai-help-text]'),\n    aiCount: root.querySelector('[data-pb-ai-count]'),\n    openTextEditor: root.querySelector('[data-pb-open-text-editor]'),\n    sidePanel: root.querySelector('.pb-customizer__side-panel'),\n    toolsCard: root.querySelector('[data-pb-tools-card]'),\n    toolsMain: root.querySelector('[data-pb-tools-main]'),\n    textEditorPanel: root.querySelector('[data-pb-text-editor-panel]'),\n    textEditorInput: root.querySelector('[data-pb-text-editor-input]'),\n    textFont: root.querySelector('[data-pb-text-font]'),\n    openFontPicker: root.querySelector('[data-pb-open-font-picker]'),\n    fontPanel: root.querySelector('[data-pb-font-panel]'),\n    closeFontPickerButtons: Array.from(root.querySelectorAll('[data-pb-close-font-picker]')),\n    fontList: root.querySelector('[data-pb-font-list]'),\n    fontCurrentPreview: root.querySelector('[data-pb-font-current-preview]'),\n    fontCurrentName: root.querySelector('[data-pb-font-current-name]'),\n    fontCount: root.querySelector('[data-pb-font-count]'),\n    textColor: root.querySelector('[data-pb-text-color]'),\n    textColorPanel: root.querySelector('[data-pb-text-color-panel]'),\n    openTextColorEditor: root.querySelector('[data-pb-open-text-color-editor]'),\n    textStylePanel: root.querySelector('[data-pb-text-style-panel]'),\n    openStyleEditor: root.querySelector('[data-pb-open-style-editor]'),\n    openStyleOutlineButtons: Array.from(root.querySelectorAll('[data-pb-open-style-outline]')),\n    textSizePanel: root.querySelector('[data-pb-text-size-panel]'),\n    textCurvePanel: root.querySelector('[data-pb-text-curve-panel]'),\n    textSpacingPanel: root.querySelector('[data-pb-text-spacing-panel]'),\n    closeTextControlButtons: Array.from(root.querySelectorAll('[data-pb-close-text-control]')),\n    closeTextColorEditorButtons: Array.from(root.querySelectorAll('[data-pb-close-text-color-editor]')),\n    textColorPalette: root.querySelector('[data-pb-text-color-palette]'),\n    textColorLabel: root.querySelector('[data-pb-text-color-label]'),\n    textColorSwatch: root.querySelector('[data-pb-text-color-swatch]'),\n    textColorSummary: root.querySelector('[data-pb-text-color-summary]'),\n    textColorSummarySwatch: root.querySelector('[data-pb-text-color-summary-swatch]'),\n    textSize: root.querySelector('[data-pb-text-size]'),\n    textSizeNumber: root.querySelector('[data-pb-text-size-number]'),\n    textSizeMinus: root.querySelector('[data-pb-text-size-minus]'),\n    textSizePlus: root.querySelector('[data-pb-text-size-plus]'),\n    textCurve: root.querySelector('[data-pb-text-curve]'),\n    textCurveNumber: root.querySelector('[data-pb-text-curve-number]'),\n    textCurveValue: root.querySelector('[data-pb-text-curve-value]'),\n    textRotate: root.querySelector('[data-pb-text-rotate]'),\n    textRotateNumber: root.querySelector('[data-pb-text-rotate-number]'),\n    textSpacing: root.querySelector('[data-pb-text-spacing]'),\n    textSpacingNumber: root.querySelector('[data-pb-text-spacing-number]'),\n    textSliderToggleButtons: Array.from(root.querySelectorAll('[data-pb-text-slider-toggle]')),\n    textSliderPanels: Array.from(root.querySelectorAll('[data-pb-text-slider-panel]')),\n    textSizeSummary: root.querySelector('[data-pb-text-size-summary]'),\n    textCurveSummary: root.querySelector('[data-pb-text-curve-summary]'),\n    textSpacingSummary: root.querySelector('[data-pb-text-spacing-summary]'),\n    textSizeDetailValue: root.querySelector('[data-pb-text-size-detail-value]'),\n    textCurveDetailValue: root.querySelector('[data-pb-text-curve-detail-value]'),\n    textSpacingDetailValue: root.querySelector('[data-pb-text-spacing-detail-value]'),\n    textSizeReset: root.querySelector('[data-pb-text-size-reset]'),\n    textCurveReset: root.querySelector('[data-pb-text-curve-reset]'),\n    textSpacingReset: root.querySelector('[data-pb-text-spacing-reset]'),\n    desktopTextControls: root.querySelector('[data-pb-desktop-text-controls]'),\n    desktopOpenFontPicker: root.querySelector('[data-pb-desktop-open-font-picker]'),\n    desktopFontPreview: root.querySelector('[data-pb-desktop-font-preview]'),\n    desktopFontName: root.querySelector('[data-pb-desktop-font-name]'),\n    desktopOpenTextColorEditor: root.querySelector('[data-pb-desktop-open-text-color-editor]'),\n    desktopTextColorLabel: root.querySelector('[data-pb-desktop-text-color-label]'),\n    desktopTextColorSwatch: root.querySelector('[data-pb-desktop-text-color-swatch]'),\n    desktopOpenOutlineEditor: root.querySelector('[data-pb-desktop-open-outline-editor]'),\n    desktopOutlineLabel: root.querySelector('[data-pb-desktop-outline-label]'),\n    desktopOutlineSwatch: root.querySelector('[data-pb-desktop-outline-swatch]'),\n    desktopTextSize: root.querySelector('[data-pb-desktop-text-size]'),\n    desktopTextSizeNumber: root.querySelector('[data-pb-desktop-text-size-number]'),\n    desktopTextCurve: root.querySelector('[data-pb-desktop-text-curve]'),\n    desktopTextCurveNumber: root.querySelector('[data-pb-desktop-text-curve-number]'),\n    desktopTextSpacing: root.querySelector('[data-pb-desktop-text-spacing]'),\n    desktopTextSpacingNumber: root.querySelector('[data-pb-desktop-text-spacing-number]'),\n    desktopTextSizeReset: root.querySelector('[data-pb-desktop-text-size-reset]'),\n    desktopTextCurveReset: root.querySelector('[data-pb-desktop-text-curve-reset]'),\n    desktopTextSpacingReset: root.querySelector('[data-pb-desktop-text-spacing-reset]'),\n    textOutline: root.querySelector('[data-pb-text-outline]'),\n    outlinePanel: root.querySelector('[data-pb-outline-panel]'),\n    openOutlineEditor: root.querySelector('[data-pb-open-outline-editor]'),\n    closeOutlineEditorButtons: Array.from(root.querySelectorAll('[data-pb-close-outline-editor]')),\n    outlinePalette: root.querySelector('[data-pb-outline-palette]'),\n    outlineLabel: root.querySelector('[data-pb-outline-label]'),\n    outlineSwatch: root.querySelector('[data-pb-outline-swatch]'),\n    outlineSummary: root.querySelector('[data-pb-outline-summary]'),\n    outlineSummarySwatch: root.querySelector('[data-pb-outline-summary-swatch]'),\n    outlineSize: root.querySelector('[data-pb-outline-size]'),\n    outlineSizeNumber: root.querySelector('[data-pb-outline-size-number]'),\n    textMoveBack: root.querySelector('[data-pb-text-move-back]'),\n    textMoveForward: root.querySelector('[data-pb-text-move-forward]'),\n    textDuplicate: root.querySelector('[data-pb-text-duplicate]'),\n    textLock: root.querySelector('[data-pb-text-lock]'),\n    textFlip: root.querySelector('[data-pb-text-flip]'),\n    textBold: root.querySelector('[data-pb-text-bold]'),\n    textItalic: root.querySelector('[data-pb-text-italic]'),\n    textAlignButtons: Array.from(root.querySelectorAll('[data-pb-text-align]')),\n    textDeleteButtons: Array.from(root.querySelectorAll('[data-pb-text-delete]')),\n    textSnapToggle: root.querySelector('[data-pb-text-snap-toggle]'),\n    settingsToggleButtons: Array.from(root.querySelectorAll('[data-pb-settings-toggle]')),\n    settingsPanel: root.querySelector('[data-pb-settings-panel]'),\n    settingsCloseButtons: Array.from(root.querySelectorAll('[data-pb-settings-close]')),\n    settingsSnapInput: root.querySelector('[data-pb-settings-snap]'),\n    priceWrap: root.querySelector('[data-pb-price-wrap]'),\n    price: root.querySelector('[data-pb-price]'),\n    openSizeModal: root.querySelector('[data-pb-open-size-modal]'),\n    sizeModal: root.querySelector('[data-pb-size-modal]'),\n    sizeProductDescription: root.querySelector('[data-pb-size-product-description]'),\n    sizeRows: root.querySelector('[data-pb-size-rows]'),\n    bulkDiscountHint: root.querySelector('[data-pb-bulk-discount-hint]'),\n    sizeModalError: root.querySelector('[data-pb-size-modal-error]'),\n    modalTotal: root.querySelector('[data-pb-modal-total]'),\n    confirmAdd: root.querySelector('[data-pb-confirm-add]'),\n    loading: root.querySelector('[data-pb-loading]'),\n    loadingTitle: root.querySelector('[data-pb-loading-title]'),\n    loadingText: root.querySelector('[data-pb-loading-text]'),\n    imageEditorPanel: root.querySelector('[data-pb-image-editor-panel]'),\n    closeImageEditorButtons: Array.from(root.querySelectorAll('[data-pb-close-image-editor]')),\n    imagePreview: root.querySelector('[data-pb-image-preview]'),\n    imageName: root.querySelector('[data-pb-image-name]'),\n    imageRemoveBg: root.querySelector('[data-pb-image-remove-bg]'),\n    imageMoveBack: root.querySelector('[data-pb-image-move-back]'),\n    imageMoveForward: root.querySelector('[data-pb-image-move-forward]'),\n    imageDuplicate: root.querySelector('[data-pb-image-duplicate]'),\n    imageFlip: root.querySelector('[data-pb-image-flip]'),\n    imageLock: root.querySelector('[data-pb-image-lock]'),\n    imageSnapToggle: root.querySelector('[data-pb-image-snap-toggle]'),\n    imageDeleteButtons: Array.from(root.querySelectorAll('[data-pb-image-delete]')),\n    mobileBottomUi: root.querySelector('[data-pb-mobile-bottom-ui]'),\n    mobileAddBar: root.querySelector('[data-pb-mobile-add-bar]'),\n    mobileAddToggle: root.querySelector('[data-pb-mobile-add-toggle]'),\n    mobileUpload: root.querySelector('[data-pb-mobile-upload]'),\n    mobilePrice: root.querySelector('[data-pb-mobile-price]'),\n    mobileColorNav: root.querySelector('[data-pb-mobile-color-nav]'),\n    mobileColorSwatch: root.querySelector('[data-pb-mobile-color-swatch]'),\n    mobileZoomInToggle: root.querySelector('[data-pb-mobile-zoom-in-toggle]'),\n    mobileZoomToggle: root.querySelector('[data-pb-mobile-zoom-toggle]'),\n    mobileEmptyActions: root.querySelector('[data-pb-mobile-empty-actions]'),\n    mobileEmptyUpload: root.querySelector('[data-pb-mobile-empty-upload]')\n  };\n\n  function setStatus(message, isError) {\n    message = pbTranslatedError(message);\n    if (!els.status) return;\n    els.status.textContent = message || '';\n    els.status.classList.toggle('is-error', Boolean(isError));\n    els.status.hidden = !isError;\n  }\n\n  function pbDirectSaveControls() {\n    return [els.openSizeModal, els.mobilePrice, els.confirmAdd].filter(Boolean);\n  }\n\n  function setDirectSaveCtaLabel(label, stateClass) {\n    pbDirectSaveControls().forEach(function (control) {\n      control.textContent = label;\n      control.classList.remove('is-saving', 'is-save-success');\n      if (stateClass) control.classList.add(stateClass);\n      control.setAttribute('aria-label', label);\n      control.setAttribute('aria-live', 'polite');\n      control.setAttribute('aria-atomic', 'true');\n    });\n  }\n\n  function resetDirectSaveCta() {\n    if (pbDirectSaveFeedbackTimer) {\n      clearTimeout(pbDirectSaveFeedbackTimer);\n      pbDirectSaveFeedbackTimer = null;\n    }\n    if (isDirectDesignRevisionEdit()) setDirectSaveCtaLabel(pbT('spara_andringar', 'Spara \u00E4ndringar'), '');\n  }\n\n  function showDirectSaveSuccess() {\n    if (pbDirectSaveFeedbackTimer) clearTimeout(pbDirectSaveFeedbackTimer);\n    setDirectSaveCtaLabel(pbT('andringarna_sparades', '\u00C4ndringarna sparades'), 'is-save-success');\n    pbDirectSaveFeedbackTimer = setTimeout(resetDirectSaveCta, 4500);\n  }\n\n  function setupCartPressFeedback() {\n    if (!document.getElementById('pb-cart-press-style')) {\n      var style = document.createElement('style');\n      style.id = 'pb-cart-press-style';\n      style.textContent = '.pb-cart-press{animation:pb-cart-press .3s ease-out!important}@keyframes pb-cart-press{0%,100%{scale:1;filter:brightness(1)}25%,50%{scale:.97;filter:brightness(.82)}}@media(prefers-reduced-motion:reduce){.pb-cart-press{animation-name:pb-cart-press-still!important}@keyframes pb-cart-press-still{0%,100%{filter:brightness(1)}25%,50%{filter:brightness(.82)}}}';\n      document.head.appendChild(style);\n    }\n    [els.openSizeModal, els.mobilePrice, els.confirmAdd].filter(Boolean).forEach(function(button) {\n      function press() {\n        if (button.disabled || root.inert) return;\n        clearTimeout(button.pbPressTimer);\n        button.classList.remove('pb-cart-press');\n        void button.offsetWidth;\n        button.classList.add('pb-cart-press');\n        button.pbPressTimer = setTimeout(function() { button.classList.remove('pb-cart-press'); }, 320);\n      }\n      button.addEventListener('pointerdown', function(event) { if (event.button === 0) press(); });\n      // Capture keyboard/assistive clicks before the cart handler locks the editor.\n      button.addEventListener('click', function(event) { if (event.detail === 0) press(); }, true);\n    });\n  }\n\n  function setSizeModalError(message) {\n    if (!els.sizeModalError) return;\n    var text = String(message || '').trim();\n    els.sizeModalError.textContent = text;\n    els.sizeModalError.hidden = !text;\n    if (text) {\n      els.sizeModalError.setAttribute('role', 'alert');\n      els.sizeModalError.setAttribute('aria-live', 'assertive');\n    } else {\n      els.sizeModalError.removeAttribute('role');\n      els.sizeModalError.removeAttribute('aria-live');\n    }\n  }\n\n\n  function updateAiPromptCount() {\n    if (!els.aiPrompt || !els.aiCount) return;\n    var max = Number(els.aiPrompt.getAttribute('maxlength') || 220) || 220;\n    var len = String(els.aiPrompt.value || '').length;\n    els.aiCount.textContent = len + '/' + max;\n  }\n\n  function scrollActivePanelIntoView() {\n    if (!isMobileEditorLayout() || !els.sidePanel) return;\n\n    window.setTimeout(function () {\n      try {\n        els.sidePanel.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      } catch (error) {\n        els.sidePanel.scrollIntoView();\n      }\n    }, 80);\n  }\n\n  function setAiStatus(message, isError) {\n    if (!els.aiStatus) return;\n    els.aiStatus.textContent = message || '';\n    els.aiStatus.hidden = !message;\n    els.aiStatus.classList.toggle('is-error', Boolean(isError));\n  }\n\n  function wait(ms) {\n    return new Promise(function (resolve) {\n      window.setTimeout(resolve, Math.max(0, Number(ms) || 0));\n    });\n  }\n\n  function setAiBusy(active) {\n    if (!els.aiSubmit) return;\n    els.aiSubmit.disabled = Boolean(active);\n    els.aiSubmit.classList.remove('is-busy');\n    els.aiSubmit.style.removeProperty('--pb-ai-progress');\n    els.aiSubmit.removeAttribute('aria-valuenow');\n    if (active) els.aiSubmit.setAttribute('aria-busy', 'true');\n    else els.aiSubmit.removeAttribute('aria-busy');\n  }\n\n  function startAiProgress() {\n    setAiBusy(true);\n    pbShowUploadProgress(1, 1, null, 'ai');\n  }\n\n  async function completeAiProgress() {\n    pbUpdateUploadProgress({phase:'done'});\n    await wait(160);\n  }\n\n  function syncToolsMainVisibility() {\n    if (!els.toolsMain) return;\n\n    var shouldHide = Boolean(\n      (els.aiPanel && !els.aiPanel.hidden)\n      || (els.textEditorPanel && !els.textEditorPanel.hidden)\n      || (els.imageEditorPanel && !els.imageEditorPanel.hidden)\n      || (els.settingsPanel && !els.settingsPanel.hidden)\n    );\n\n    els.toolsMain.hidden = shouldHide;\n  }\n\n  function openAiPanel() {\n    closeSettingsView();\n    closeTextEditor();\n    closeImageEditor();\n    closeProductDetailsPanel();\n    closeSizeModal();\n    closeColorPanel();\n    closeAiPanel();\n    closeMobileAddBar();\n\n    root.classList.add('is-ai-motiv-open');\n    if (els.sidePanel) els.sidePanel.classList.add('is-ai-motiv-active');\n    if (els.toolsCard) els.toolsCard.classList.add('is-editing-ai');\n    if (els.aiPanel) els.aiPanel.hidden = false;\n    if (els.aiHelpText) els.aiHelpText.hidden = true;\n    syncToolsMainVisibility();\n    updateAiPromptCount();\n\n    setAiStatus('', false);\n\n    // On iPhone/iPad, delayed programmatic focus can mark the textarea as\n    // active without opening the virtual keyboard. Leave mobile focus to the\n    // user's native textarea tap; desktop keeps the convenient autofocus.\n    if (els.aiPrompt && !isMobileEditorLayout()) {\n      window.setTimeout(function () {\n        els.aiPrompt.focus();\n      }, 10);\n    }\n\n    scrollActivePanelIntoView();\n  }\n\n  function closeAiPanel() {\n    root.classList.remove('is-ai-motiv-open');\n    if (els.sidePanel) els.sidePanel.classList.remove('is-ai-motiv-active');\n    if (els.toolsCard) els.toolsCard.classList.remove('is-editing-ai');\n    if (els.aiPanel) els.aiPanel.hidden = true;\n    if (els.aiHelpText) els.aiHelpText.hidden = true;\n    syncToolsMainVisibility();\n    setAiBusy(false);\n    setAiStatus('', false);\n  }\n\n  function buildAiMotivPrompt(userPrompt, styleValue) {\n    var prompt = String(userPrompt || '').trim();\n    var style = String(styleValue || 'auto').trim();\n\n    var styleHints = {\n      'auto': 'Choose the most suitable style for apparel print.',\n      'clean-vector': 'Use a clean bold vector-like t-shirt graphic style.',\n      'vintage': 'Use a vintage retro graphic t-shirt style.',\n      'cartoon': 'Use a playful cartoon illustration style.',\n      'bold-graphic': 'Use a strong bold graphic t-shirt design style.',\n      'tattoo': 'Use a tattoo flash inspired illustration style.'\n    };\n\n    return [\n      prompt,\n      styleHints[style] || styleHints.auto,\n      'Create a single isolated apparel graphic.',\n      'Transparent background.',\n      'No mockup, no t-shirt, no frame, no scene, no extra background.',\n      'Centered composition, crisp edges, high contrast, print-ready.',\n      'Make it suitable as a t-shirt print motif.'\n    ].join(' ');\n  }\n\n  function makeAiMotivFilename() {\n    return 'ai-motiv-' + Date.now() + '.png';\n  }\n\n  async function fetchUrlAsDataUrl(url, options) {\n    var retryPending = Boolean(options && options.retryPending);\n    var maxAttempts = retryPending ? 3 : 1;\n    var lastError = null;\n    for (var attempt = 0; attempt < maxAttempts; attempt += 1) {\n      try {\n        var res = await fetch(url, { cache: retryPending ? 'no-store' : 'default' });\n        if (res.ok) return await readFileAsDataUrl(await res.blob());\n        lastError = new Error(pbT('kunde_inte_lasa_designfilen_http', 'Kunde inte l\u00E4sa designfilen (HTTP ') + res.status + ').');\n        if (!retryPending || [425, 429, 502, 503, 504].indexOf(res.status) < 0) throw lastError;\n        var retryAfter = Math.max(1, Math.min(3, Number(res.headers.get('Retry-After') || 1)));\n        await new Promise(function (resolve) { setTimeout(resolve, retryAfter * 1000); });\n      } catch (error) {\n        lastError = error;\n        if (!retryPending || attempt >= maxAttempts - 1) throw error;\n        await new Promise(function (resolve) { setTimeout(resolve, 1000); });\n      }\n    }\n    throw lastError || new Error(pbT('kunde_inte_lasa_designfilen', 'Kunde inte l\u00E4sa designfilen.'));\n  }\n\n  async function extractAiImageDataUrl(body) {\n    if (!body) return '';\n\n    if (body.image_data_url) return String(body.image_data_url);\n    if (body.result_data_url) return String(body.result_data_url);\n    if (body.data_url) return String(body.data_url);\n\n    if (body.b64_json) return 'data:image/png;base64,' + String(body.b64_json);\n    if (Array.isArray(body.data) && body.data[0]) {\n      if (body.data[0].b64_json) return 'data:image/png;base64,' + String(body.data[0].b64_json);\n      if (body.data[0].image_data_url) return String(body.data[0].image_data_url);\n      if (body.data[0].url) return await fetchUrlAsDataUrl(String(body.data[0].url));\n    }\n\n    if (body.url) return await fetchUrlAsDataUrl(String(body.url));\n\n    return '';\n  }\n\n  async function addAiGeneratedImageLayer(dataUrl, filename, pendingLayer, pendingDesign) {\n    var prepared = await prepareUploadedImageDataUrl(String(dataUrl || ''));\n    var dState = pendingDesign || getDesignState(state.activePlacement, true);\n    state.activePrimarySelected = false;\n\n    var layer = {\n      id: pendingLayer ? pendingLayer.id : makeLayerId(),\n      type: 'image',\n      sourceFileName: filename || makeAiMotivFilename(),\n      imageDataUrl: prepared.dataUrl,\n      naturalWidth: prepared.width,\n      naturalHeight: prepared.height,\n      x: 29,\n      y: 34,\n      w: 56,\n      h: 32,\n      rotation: 0,\n      locked: false,\n      flipX: false,\n      // AI-motiv \u00E4r redan skapat med transparent bakgrund, men ska inte markeras\n      // som att anv\u00E4ndaren har k\u00F6rt \"Ta bort bakgrund\". Annars visas knappen som\n      // \"\u00C5terst\u00E4ll\" direkt i bildeditorn.\n      backgroundRemoved: false,\n      backgroundRemoveOriginalImageDataUrl: '',\n      backgroundRemoveOriginalNaturalWidth: 0,\n      backgroundRemoveOriginalNaturalHeight: 0,\n      backgroundRemoveOriginalSourceFileName: '',\n      backgroundRemoveResultImageDataUrl: '',\n      backgroundRemoveResultNaturalWidth: 0,\n      backgroundRemoveResultNaturalHeight: 0,\n      backgroundRemoveResultSourceFileName: ''\n    };\n\n    // AI-motiv ska f\u00E5 exakt samma startstorlek som en vanlig uppladdad bild.\n    // B\u00F6rja p\u00E5 56 % av tryckf\u00E4ltets bredd, men begr\u00E4nsa h\u00F6jden till 80 %\n    // p\u00E5 breda/l\u00E5ga tryckf\u00E4lt (t.ex. hattar) s\u00E5 motivet alltid startar\n    // helt inne i tryckomr\u00E5det och med bibeh\u00E5llna proportioner.\n    layer.w = 56;\n    layer.h = getImageLayerHeightPctForWidth(layer, layer.w);\n    if (Number(layer.h || 0) > 80) {\n      layer.h = 80;\n      layer.w = getImageLayerWidthPctForHeight(layer, layer.h);\n    }\n    constrainImageLayer(layer);\n    centerImageLayer(layer);\n\n    dState.imageLayers = dState.imageLayers || [];\n    if (pendingLayer) {\n      Object.assign(pendingLayer, layer);\n      delete pendingLayer.pbUploadPending;\n      delete pendingLayer.pbUpscaleBusy;\n      layer = pendingLayer;\n      pbUploadPlaceholder = null;\n    } else dState.imageLayers.push(layer);\n    state.activeImageLayerId = layer.id;\n    dState.touched = hasPrimaryDesignContent(dState) || dState.imageLayers.length > 0;\n\n    return layer;\n  }\n\n  async function generateAiMotiv() {\n    if (pbUploadInProgress) return;\n    var prompt = els.aiPrompt ? String(els.aiPrompt.value || '').trim() : '';\n    var style = els.aiStyle ? String(els.aiStyle.value || 'auto') : 'auto';\n\n    if (!prompt) {\n      setAiStatus(pbT('skriv_vad_du_vill_skapa_forst', 'Skriv vad du vill skapa f\u00F6rst.'), true);\n      if (els.aiPrompt) els.aiPrompt.focus();\n      return;\n    }\n\n    if (!workerUrl) {\n      setAiStatus(pbT('worker_url_saknas_2', 'Worker-URL saknas.'), true);\n      return;\n    }\n\n    var template = state.templatesByPlacement[state.activePlacement] || {};\n    var payload = {\n      prompt: buildAiMotivPrompt(prompt, style),\n      original_prompt: prompt,\n      style: style,\n      placement: state.activePlacement,\n      placement_label: getPlacementLabel(state.activePlacement),\n      product_title: state.product && state.product.title ? state.product.title : '',\n      color: state.activeColor || '',\n      catalog_product_id: state.catalogProductId,\n      catalog_variant_id: state.catalogVariantId,\n      print_area_width: getTemplatePrintFileWidth(template),\n      print_area_height: getTemplatePrintFileHeight(template),\n      print_area_dpi: getTemplatePrintFileDpi(template),\n      output: 'transparent_png',\n      purpose: 'apparel_motif'\n    };\n\n    var previousInert = root.inert;\n    var pendingLayer = null;\n    var pendingDesign = null;\n    pbUploadInProgress = true;\n    root.inert = true;\n    try {\n      startAiProgress();\n      pendingLayer = pbShowUploadPlaceholder({name:makeAiMotivFilename()}, {width:1024,height:1024});\n      pendingDesign = pbUploadPlaceholder.design;\n      setAiStatus('', false);\n      setStatus('', false);\n\n      var endpoints = ['/api/printbolt/ai-motiv', '/api/printbolt/ai-motif'];\n      var res = null;\n      var body = null;\n      var lastErrorMessage = '';\n\n      for (var endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex += 1) {\n        res = await pbAuthorizedFetch(workerUrl + endpoints[endpointIndex], {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(payload)\n        });\n\n        body = await res.json().catch(function () { return {}; });\n\n        if (res.ok && !(body && body.ok === false)) {\n          break;\n        }\n\n        lastErrorMessage = (body && (pbTranslatedError(body.error) || body.message)) || ('HTTP ' + res.status);\n\n        var notFound = res.status === 404 || /not found/i.test(String(lastErrorMessage || ''));\n        if (notFound && endpointIndex === endpoints.length - 1) {\n          throw new Error(pbT('ai_tjansten_hittades_inte_kontrollera_att_worker_routen_api_printbolt_ai_motiv_finns', 'AI-tj\u00E4nsten hittades inte. Kontrollera att worker-routen /api/printbolt/ai-motiv finns.'));\n        }\n\n        if (!notFound || endpointIndex === endpoints.length - 1) {\n          throw new Error(lastErrorMessage || pbT('kunde_inte_skapa_ai_motiv', 'Kunde inte skapa AI-motiv.'));\n        }\n      }\n\n      var imageDataUrl = await extractAiImageDataUrl(body);\n      if (!imageDataUrl) throw new Error(pbT('ai_tjansten_returnerade_ingen_bild', 'AI-tj\u00E4nsten returnerade ingen bild.'));\n\n      var layer = await addAiGeneratedImageLayer(imageDataUrl, body.filename || makeAiMotivFilename(), pendingLayer, pendingDesign);\n\n      renderDesign();\n      renderPlacements();\n      updateMobileEmptyActions();\n\n      await completeAiProgress();\n      pbHideUploadProgress();\n      root.inert = previousInert;\n      closeAiPanel();\n      openImageEditorForLayer(layer.id);\n      setStatus('', false);\n    } catch (error) {\n      pbRemoveUploadPlaceholder();\n      console.error('[Printbolt Designer] AI motif generation failed:', error);\n      var aiErrorMessage = (error && error.message) ? String(error.message) : pbT('kunde_inte_skapa_ai_motiv', 'Kunde inte skapa AI-motiv.');\n      if (/^not found$/i.test(aiErrorMessage) || /404/.test(aiErrorMessage)) {\n        aiErrorMessage = pbT('ai_tjansten_hittades_inte_kontrollera_att_worker_routen_api_printbolt_ai_motiv_finns', 'AI-tj\u00E4nsten hittades inte. Kontrollera att worker-routen /api/printbolt/ai-motiv finns.');\n      }\n      setAiStatus(aiErrorMessage, true);\n      setStatus(aiErrorMessage, true);\n    } finally {\n      if (pbUploadFeedback && pbUploadFeedback.mode === 'ai') pbHideUploadProgress();\n      pbRemoveUploadPlaceholder();\n      pbUploadInProgress = false;\n      root.inert = previousInert;\n      setAiBusy(false);\n      pbScheduleServerExport();\n    }\n  }\n\n\n  function revealEditorInterface() {\n    root.classList.remove('is-loading-templates');\n\n    // The initial gate only protects state that must exist before controls can\n    // be used. The stage image has its own loader and may finish afterwards.\n    if (root.classList.contains('is-initializing')) {\n      root.classList.remove('is-initializing');\n      root.classList.add('is-initialized');\n    }\n  }\n\n  function setLoading(isLoading) {\n    var active = Boolean(isLoading);\n\n    if (els.loadingTitle) els.loadingTitle.textContent = pbT('laddar', 'Laddar');\n    if (els.loadingText) els.loadingText.textContent = '';\n\n    if (active) {\n      root.classList.add('is-loading-templates');\n\n      if (els.stage) {\n        els.stage.classList.add('is-loading');\n        els.stage.classList.remove('is-template-ready');\n      }\n\n      if (els.loading) {\n        window.clearTimeout(els.loading.__pbHideTimer);\n        els.loading.hidden = false;\n        els.loading.classList.remove('is-hiding');\n        els.loading.setAttribute('aria-hidden', 'false');\n      }\n\n      return;\n    }\n\n    revealEditorInterface();\n\n    if (els.stage) {\n      els.stage.classList.remove('is-loading');\n      // Add on the next frame so browser has a clean transition point.\n      window.requestAnimationFrame(function () {\n        if (els.stage && !els.stage.classList.contains('is-loading')) els.stage.classList.add('is-template-ready');\n      });\n    }\n\n    if (els.loading) {\n      els.loading.classList.add('is-hiding');\n      els.loading.setAttribute('aria-hidden', 'true');\n\n      window.clearTimeout(els.loading.__pbHideTimer);\n      els.loading.__pbHideTimer = window.setTimeout(function () {\n        if (!els.loading) return;\n        els.loading.hidden = true;\n        els.loading.classList.remove('is-hiding');\n      }, 280);\n    }\n  }\n\n  // Initial boot uses a stage-only loader so controls outside the preview are\n  // interactive while the remote template/product image is still settling.\n  function setStageLoading(isLoading) {\n    var active = Boolean(isLoading);\n    if (els.stage) {\n      els.stage.classList.toggle('is-loading', active);\n      if (active) els.stage.classList.remove('is-template-ready');\n    }\n    if (!els.loading) return;\n    if (active) {\n      window.clearTimeout(els.loading.__pbHideTimer);\n      els.loading.hidden = false;\n      els.loading.classList.remove('is-hiding');\n      els.loading.setAttribute('aria-hidden', 'false');\n    } else {\n      els.loading.classList.add('is-hiding');\n      els.loading.setAttribute('aria-hidden', 'true');\n      window.clearTimeout(els.loading.__pbHideTimer);\n      els.loading.__pbHideTimer = window.setTimeout(function () {\n        if (!els.loading) return;\n        els.loading.hidden = true;\n        els.loading.classList.remove('is-hiding');\n      }, 280);\n      window.requestAnimationFrame(function () {\n        if (els.stage && !els.stage.classList.contains('is-loading')) els.stage.classList.add('is-template-ready');\n      });\n    }\n  }\n\n  function isMobileEditorLayout() {\n    var narrowViewport = Boolean(\n      window.matchMedia &&\n      window.matchMedia('((width < 1280px) or (height < 750px))').matches\n    );\n\n    var coarsePointer = Boolean(\n      window.matchMedia &&\n      window.matchMedia('(pointer: coarse)').matches\n    );\n\n    var touchDevice = Boolean(\n      navigator &&\n      Number(navigator.maxTouchPoints || 0) > 0\n    );\n\n    var screenWidth = Math.min(\n      Number(window.screen && window.screen.width || Infinity),\n      Number(window.screen && window.screen.height || Infinity)\n    );\n\n    var phoneSizedScreen = Number.isFinite(screenWidth) && screenWidth <= 820;\n\n    // Safari p\u00E5 riktig iPhone kan anv\u00E4nda en bredare layout-viewport \u00E4n DevTools.\n    // D\u00E4rf\u00F6r r\u00E4cker inte enbart max-width f\u00F6r att identifiera mobil-l\u00E4get.\n    return narrowViewport || (touchDevice && coarsePointer && phoneSizedScreen);\n  }\n\n  function syncRealMobileLayoutClass() {\n    if (!root) return;\n    root.classList.toggle('is-pb-real-mobile', isMobileEditorLayout());\n  }\n\n  syncRealMobileLayoutClass();\n  applyMobileTextSliderPanelState();\n\n  window.addEventListener('resize', function () { syncRealMobileLayoutClass(); applyMobileTextSliderPanelState(); });\n  window.addEventListener('orientationchange', function () { syncRealMobileLayoutClass(); applyMobileTextSliderPanelState(); });\n\n  function setTextEditorTitle(title) {\n    var titleEl = els.textEditorPanel ? els.textEditorPanel.querySelector('.pb-text-pro__head h2') : null;\n    if (titleEl) titleEl.textContent = title || pbT('redigera_text', 'Redigera text');\n  }\n\n  function refreshMobileTextSliderSummaries() {\n    var sizeValue = String(Math.round(Number((els.textSizeNumber && els.textSizeNumber.value) || (els.textSize && els.textSize.value) || 0)));\n    var curveValue = String(Math.round(Number((els.textCurveNumber && els.textCurveNumber.value) || (els.textCurve && els.textCurve.value) || 0)));\n    var spacingValue = String(Math.round(Number((els.textSpacingNumber && els.textSpacingNumber.value) || (els.textSpacing && els.textSpacing.value) || 0)));\n    if (els.textSizeSummary) els.textSizeSummary.textContent = sizeValue;\n    if (els.textCurveSummary) els.textCurveSummary.textContent = curveValue;\n    if (els.textSpacingSummary) els.textSpacingSummary.textContent = spacingValue;\n    if (els.textSizeDetailValue) els.textSizeDetailValue.textContent = sizeValue;\n    if (els.textCurveDetailValue) els.textCurveDetailValue.textContent = curveValue;\n    if (els.textSpacingDetailValue) els.textSpacingDetailValue.textContent = spacingValue;\n  }\n\n  function applyMobileTextSliderPanelState() {\n    (els.textSliderToggleButtons || []).forEach(function (button) {\n      button.classList.remove('is-open');\n      button.setAttribute('aria-expanded', 'false');\n    });\n  }\n\n  function setMobileTextSliderPanel(kind) {\n    state.mobileTextSliderPanel = String(kind || '').trim();\n    applyMobileTextSliderPanelState();\n  }\n\n  function toggleMobileTextSliderPanel(kind) {\n    var next = String(kind || '').trim();\n    if (!next) return;\n    openTextSliderEditorPanel(next);\n  }\n\n  function updateMobileZoomTarget() {\n    if (!root || !els.printArea) return;\n\n    var left = parseFloat(els.printArea.style.left || '0') || 0;\n    var top = parseFloat(els.printArea.style.top || '0') || 0;\n    var width = parseFloat(els.printArea.style.width || '100') || 100;\n    var height = parseFloat(els.printArea.style.height || '100') || 100;\n    var originX = left + (width / 2);\n    var originY = top + (height / 2);\n\n    root.style.setProperty('--pb-mobile-zoom-origin-x', originX + '%');\n    root.style.setProperty('--pb-mobile-zoom-origin-y', originY + '%');\n  }\n\n  function updatePrintAreaEmptyActionSizing() {\n    if (!root || !els.printArea) return;\n\n    // Use layout size instead of transformed pixels so the button sizing follows\n    // the actual print area and does not get recalculated larger when the user\n    // zooms the preview.\n    var areaWidth = Math.max(0, Number(els.printArea.offsetWidth || 0));\n    var areaHeight = Math.max(0, Number(els.printArea.offsetHeight || 0));\n\n    if (!areaWidth || !areaHeight) return;\n\n    var isMobile = isMobileEditorLayout();\n\n    // The whole stage is presented at 1.32x on phones. These controls live\n    // inside that stage, so compensate their intrinsic mobile dimensions for\n    // the presentation scale; otherwise a \"smaller\" mobile button ends up\n    // looking almost desktop-sized after the stage transform is applied.\n    var groupWidth = isMobile\n      ? clamp(Math.round(areaWidth * 0.74), 132, 170)\n      : clamp(Math.round(areaWidth * 0.90), 168, 238);\n    var buttonHeight = isMobile\n      ? clamp(Math.round(Math.min(areaHeight * 0.16, 36)), 31, 36)\n      : clamp(Math.round(Math.min(areaHeight * 0.20, 48)), 38, 48);\n    var radius = clamp(Math.round(buttonHeight * 0.37), isMobile ? 11 : 13, isMobile ? 14 : 18);\n    var gap = clamp(Math.round(buttonHeight * 0.17), isMobile ? 4 : 6, isMobile ? 6 : 10);\n    var sidePadding = clamp(Math.round(buttonHeight * 0.28), isMobile ? 8 : 10, isMobile ? 10 : 14);\n    var iconSize = clamp(Math.round(buttonHeight * 0.42), isMobile ? 14 : 18, isMobile ? 16 : 22);\n    var iconSvg = clamp(Math.round(iconSize * 0.78), isMobile ? 11 : 14, isMobile ? 13 : 18);\n    var textSize = clamp(Math.round((buttonHeight * 0.285) * 10) / 10, isMobile ? 9.3 : 11, isMobile ? 10.2 : 13.5);\n    var chevronSize = clamp(Math.round(buttonHeight * 0.38), isMobile ? 11 : 14, isMobile ? 13 : 18);\n    var topPercent = isMobile ? (areaHeight < 180 ? 40.2 : 41.7) : (areaHeight < 180 ? 41.5 : 43);\n\n    root.style.setProperty('--pb-empty-actions-width', groupWidth + 'px');\n    root.style.setProperty('--pb-empty-actions-button-height', buttonHeight + 'px');\n    root.style.setProperty('--pb-empty-actions-radius', radius + 'px');\n    root.style.setProperty('--pb-empty-actions-gap', gap + 'px');\n    root.style.setProperty('--pb-empty-actions-side-padding', sidePadding + 'px');\n    root.style.setProperty('--pb-empty-actions-icon-size', iconSize + 'px');\n    root.style.setProperty('--pb-empty-actions-icon-svg-size', iconSvg + 'px');\n    root.style.setProperty('--pb-empty-actions-text-size', textSize + 'px');\n    root.style.setProperty('--pb-empty-actions-chevron-size', chevronSize + 'px');\n    root.style.setProperty('--pb-empty-actions-top', topPercent + '%');\n  }\n\n  function applyStageZoom(value) {\n    var percent = clamp(value, 75, 180);\n    state.stageZoomPercent = percent;\n    saveStageZoomPercent(percent);\n\n    // Mobile already uses a 1.32x presentation scale. The slider multiplies that\n    // visual scale only; artwork geometry/export data is never changed.\n    var baseScale = isMobileEditorLayout() ? 1.32 : 1;\n    var liveScale = baseScale * (percent / 100);\n    root.style.setProperty('--pb-stage-zoom-scale', String(liveScale));\n\n    if (els.stageZoomInput) {\n      els.stageZoomInput.value = String(percent);\n      els.stageZoomInput.setAttribute('aria-valuetext', percent + '%');\n    }\n\n    if (els.stageZoomControl) {\n      els.stageZoomControl.setAttribute('data-zoom', String(percent));\n      els.stageZoomControl.setAttribute('title', 'Zoom ' + percent + '%');\n    }\n  }\n\n  function stepStageZoom(direction) {\n    var step = 10 * (direction < 0 ? -1 : 1);\n    applyStageZoom(Number(state.stageZoomPercent || 85) + step);\n  }\n\n  function setupStageZoomControl() {\n    if (!els.stageZoomInput) return;\n\n    applyStageZoom(state.stageZoomPercent || 85);\n\n    els.stageZoomInput.addEventListener('input', function () {\n      applyStageZoom(this.value);\n    });\n\n    // A styled range thumb has a very small native drag target in iOS Safari.\n    // Make the full, invisible mobile input box draggable while preserving the\n    // existing 12 px visual thumb and the browser's vertical page scrolling.\n    var activeZoomPointerId = null;\n\n    function applyMobileZoomPointer(event) {\n      if (!isMobileEditorLayout()) return;\n\n      var rect = els.stageZoomInput.getBoundingClientRect();\n      if (!rect || !Number.isFinite(rect.width) || rect.width <= 0) return;\n\n      var min = Number(els.stageZoomInput.min || 75);\n      var max = Number(els.stageZoomInput.max || 180);\n      var step = Math.max(1, Number(els.stageZoomInput.step || 1));\n      var thumbRadius = 6;\n      var usableWidth = Math.max(1, rect.width - (thumbRadius * 2));\n      var ratio = clamp((Number(event.clientX) - rect.left - thumbRadius) / usableWidth, 0, 1);\n      var value = min + (ratio * (max - min));\n      value = min + (Math.round((value - min) / step) * step);\n      applyStageZoom(clamp(value, min, max));\n    }\n\n    els.stageZoomInput.addEventListener('pointerdown', function (event) {\n      if (!isMobileEditorLayout()) return;\n      activeZoomPointerId = event.pointerId;\n      try { this.setPointerCapture(event.pointerId); } catch (error) {}\n      applyMobileZoomPointer(event);\n      event.preventDefault();\n    });\n\n    els.stageZoomInput.addEventListener('pointermove', function (event) {\n      if (!isMobileEditorLayout() || activeZoomPointerId !== event.pointerId) return;\n      applyMobileZoomPointer(event);\n      event.preventDefault();\n    });\n\n    function stopMobileZoomPointer(event) {\n      if (activeZoomPointerId !== event.pointerId) return;\n      activeZoomPointerId = null;\n      try { els.stageZoomInput.releasePointerCapture(event.pointerId); } catch (error) {}\n    }\n\n    els.stageZoomInput.addEventListener('pointerup', stopMobileZoomPointer);\n    els.stageZoomInput.addEventListener('pointercancel', stopMobileZoomPointer);\n\n    if (els.stageZoomOut) {\n      els.stageZoomOut.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        stepStageZoom(-1);\n      });\n    }\n\n    if (els.stageZoomIn) {\n      els.stageZoomIn.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        stepStageZoom(1);\n      });\n    }\n  }\n\n  function setMobileStageZoomed(active) {\n    active = Boolean(active) && isMobileEditorLayout();\n    state.mobileStageZoomed = active;\n    root.classList.toggle('is-mobile-stage-zoomed', active);\n\n    if (els.mobileZoomToggle) {\n      els.mobileZoomToggle.setAttribute('aria-pressed', active ? 'true' : 'false');\n      els.mobileZoomToggle.setAttribute('aria-label', active ? pbT('aterstall_zoom', '\u00C5terst\u00E4ll zoom') : pbT('zooma_till_tryckytan', 'Zooma till tryckytan'));\n      els.mobileZoomToggle.setAttribute('title', active ? pbT('aterstall_zoom', '\u00C5terst\u00E4ll zoom') : pbT('zooma_till_tryckytan', 'Zooma till tryckytan'));\n      els.mobileZoomToggle.textContent = active ? '\u2212' : '\u2315';\n    }\n\n    if (active) updateMobileZoomTarget();\n  }\n\n  function toggleMobileStageZoom() {\n    setMobileStageZoomed(!state.mobileStageZoomed);\n  }\n\n\n  function setMobileStageExtraZoomed(active) {\n    active = Boolean(active) && isMobileEditorLayout();\n    state.mobileStageExtraZoomed = active;\n    root.classList.toggle('is-mobile-stage-extra-zoomed', active);\n\n    if (els.mobileZoomInToggle) {\n      els.mobileZoomInToggle.setAttribute('aria-pressed', active ? 'true' : 'false');\n      els.mobileZoomInToggle.setAttribute('aria-label', active ? pbT('zooma_ut_fran_tryckomradet', 'Zooma ut fr\u00E5n tryckomr\u00E5det') : pbT('zooma_in_pa_tryckomradet', 'Zooma in p\u00E5 tryckomr\u00E5det'));\n      els.mobileZoomInToggle.setAttribute('title', active ? pbT('zooma_ut', 'Zooma ut') : pbT('zooma_in', 'Zooma in'));\n      var text = els.mobileZoomInToggle.querySelector('span');\n      if (text) text.textContent = active ? pbT('zooma_ut', 'Zooma ut') : pbT('zooma_in', 'Zooma in');\n    }\n\n    if (active) updateMobileZoomTarget();\n  }\n\n  function toggleMobileStageExtraZoom() {\n    setMobileStageExtraZoomed(!state.mobileStageExtraZoomed);\n  }\n\n  function syncMobileFullscreenMode() {\n    var active = isMobileEditorLayout();\n    document.documentElement.classList.toggle('pb-designer-mobile-fullscreen', active);\n    document.body.classList.toggle('pb-designer-mobile-fullscreen', active);\n\n    if (!active) {\n      if (state.mobileStageZoomed) setMobileStageZoomed(false);\n      if (state.mobileStageExtraZoomed) setMobileStageExtraZoomed(false);\n    } else {\n      updateMobileZoomTarget();\n    }\n\n    updateMobileEmptyActions();\n  }\n\n\n  function enableMobileTouchSafety() {\n    function shouldProtectTouch() {\n      return isMobileEditorLayout() && root && root.matches && root.matches('.pb-customizer');\n    }\n\n    function isInteractiveTarget(event) {\n      var target = event && event.target;\n      return Boolean(target && target.closest && target.closest('button, a, label, input, select, textarea, [contenteditable=\"true\"], [role=\"textbox\"], [role=\"button\"], [data-pb-mobile-add-toggle], [data-pb-mobile-upload], [data-pb-mobile-price], [data-pb-open-color-panel], [data-pb-open-text-editor], [data-pb-open-ai-motiv]'));\n    }\n\n    function preventMultiTouch(event) {\n      if (!shouldProtectTouch()) return;\n\n      // Keep normal fast button taps working. Only block real two-finger gestures\n      // outside controls, since preventing touchend on controls can cancel clicks.\n      if (!isInteractiveTarget(event) && event.touches && event.touches.length > 1) {\n        event.preventDefault();\n      }\n    }\n\n    function preventIOSGesture(event) {\n      if (!shouldProtectTouch()) return;\n      if (isInteractiveTarget(event)) return;\n      event.preventDefault();\n    }\n\n    root.addEventListener('touchmove', preventMultiTouch, { passive: false });\n    root.addEventListener('gesturestart', preventIOSGesture, { passive: false });\n    root.addEventListener('gesturechange', preventIOSGesture, { passive: false });\n    root.addEventListener('gestureend', preventIOSGesture, { passive: false });\n  }\n\n  function enableUnifiedMobileButtonTaps() {\n    if (!root || root.__pbUnifiedMobileButtonTapsBound) return;\n    root.__pbUnifiedMobileButtonTapsBound = true;\n\n    var activeTap = null;\n    var dispatchingProgrammaticClick = false;\n    var suppressNativeClickElement = null;\n    var suppressNativeClickUntil = 0;\n\n    function getNativeControl(target) {\n      if (!target || !target.closest) return null;\n      return target.closest(\n        'input, textarea, select, option, ' +\n        '[contenteditable=\"true\"], [role=\"textbox\"]'\n      );\n    }\n\n    function getTapActionElement(target) {\n      if (!target || !target.closest) return null;\n\n      // Native form/editable controls own their complete touch lifecycle.\n      // Never turn a tap on one of these into a synthetic click on an ancestor.\n      if (getNativeControl(target)) return null;\n\n      var action = target.closest(\n        'button, ' +\n        'a[href], a[role=\"button\"], a[data-pb-size-product-description], ' +\n        '[role=\"button\"], label, [data-pb-close-size-modal]'\n      );\n      if (!action || !root.contains(action)) return null;\n      if (action.disabled || action.getAttribute('aria-disabled') === 'true') return null;\n\n      // Placement navigation already has a dedicated pointer-up implementation\n      // that distinguishes taps from horizontal scrolling. Leave that logic alone.\n      if (action.matches('.pb-placement[data-placement], [data-pb-mobile-placement-target]')) return null;\n\n      // Image handles/actions use pointerdown/pointermove/pointerup because they\n      // can start a transform gesture. Do not synthesize an extra click for them.\n      if (action.matches('.pb-image-action, [data-pb-design-rotate], [data-pb-design-delete]')) return null;\n\n      return action;\n    }\n\n    root.addEventListener('touchstart', function (event) {\n      if (!isMobileEditorLayout()) return;\n      if (!event.touches || event.touches.length !== 1) {\n        activeTap = null;\n        return;\n      }\n\n      var action = getTapActionElement(event.target);\n      if (!action) {\n        activeTap = null;\n        return;\n      }\n\n      var touch = event.touches[0];\n      activeTap = {\n        element: action,\n        x: Number(touch.clientX || 0),\n        y: Number(touch.clientY || 0),\n        moved: false\n      };\n    }, { capture: true, passive: true });\n\n    root.addEventListener('touchmove', function (event) {\n      if (!activeTap || !event.touches || !event.touches.length) return;\n      var touch = event.touches[0];\n      var dx = Math.abs(Number(touch.clientX || 0) - activeTap.x);\n      var dy = Math.abs(Number(touch.clientY || 0) - activeTap.y);\n      if (dx > 12 || dy > 12) activeTap.moved = true;\n    }, { capture: true, passive: true });\n\n    root.addEventListener('touchcancel', function () {\n      activeTap = null;\n    }, { capture: true, passive: true });\n\n    root.addEventListener('touchend', function (event) {\n      if (!isMobileEditorLayout() || !activeTap) return;\n\n      var tap = activeTap;\n      activeTap = null;\n\n      if (tap.moved || !tap.element || !tap.element.isConnected) return;\n      if (event.changedTouches && event.changedTouches.length > 1) return;\n\n      // Prevent Safari/Chrome's later compatibility click, then synchronously\n      // invoke the same click path desktop uses. This is only for button-like\n      // actions; native fields/sliders never enter this code path.\n      if (event.cancelable) event.preventDefault();\n\n      suppressNativeClickElement = tap.element;\n      suppressNativeClickUntil = Date.now() + 800;\n\n      // Text entry is special on iOS/Safari: the virtual keyboard only opens\n      // reliably when focus happens synchronously inside the real user gesture.\n      // Run the add-text action directly from this trusted touchend instead of\n      // routing it through a later/synthetic click.\n      if (tap.element.matches('[data-pb-open-text-editor]')) {\n        closeAiPanel();\n        closeMobileAddBar();\n        createTextLayerAndOpenEditor();\n        scrollActivePanelIntoView();\n        return;\n      }\n\n      dispatchingProgrammaticClick = true;\n      try {\n        tap.element.click();\n      } finally {\n        dispatchingProgrammaticClick = false;\n      }\n    }, { capture: true, passive: false });\n\n    root.addEventListener('click', function (event) {\n      if (dispatchingProgrammaticClick) return;\n      if (!isMobileEditorLayout()) return;\n      if (Date.now() >= suppressNativeClickUntil) return;\n\n      var action = getTapActionElement(event.target);\n      if (!action || action !== suppressNativeClickElement) return;\n\n      suppressNativeClickElement = null;\n      suppressNativeClickUntil = 0;\n      event.preventDefault();\n      event.stopPropagation();\n      if (event.stopImmediatePropagation) event.stopImmediatePropagation();\n    }, true);\n  }\n\n  function enableUnifiedMobileNativeControls() {\n    if (!root || root.__pbUnifiedMobileNativeControlsBound) return;\n    root.__pbUnifiedMobileNativeControlsBound = true;\n\n    var activeControlTouch = null;\n\n    function getTextualControl(target) {\n      if (!target || !target.closest) return null;\n      var control = target.closest(\n        'textarea, ' +\n        'input:not([type]), ' +\n        'input[type=\"text\"], input[type=\"search\"], input[type=\"number\"], ' +\n        'input[type=\"email\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"password\"], ' +\n        '[contenteditable=\"true\"], [role=\"textbox\"]'\n      );\n      if (!control || !root.contains(control)) return null;\n      if (control.disabled || control.getAttribute('aria-disabled') === 'true') return null;\n      return control;\n    }\n\n    root.addEventListener('touchstart', function (event) {\n      if (!isMobileEditorLayout()) return;\n      if (!event.touches || event.touches.length !== 1) {\n        activeControlTouch = null;\n        return;\n      }\n\n      var control = getTextualControl(event.target);\n      if (!control) {\n        activeControlTouch = null;\n        return;\n      }\n\n      var touch = event.touches[0];\n      activeControlTouch = {\n        control: control,\n        x: Number(touch.clientX || 0),\n        y: Number(touch.clientY || 0),\n        moved: false\n      };\n    }, { capture: true, passive: true });\n\n    root.addEventListener('touchmove', function (event) {\n      if (!activeControlTouch || !event.touches || !event.touches.length) return;\n      var touch = event.touches[0];\n      var dx = Math.abs(Number(touch.clientX || 0) - activeControlTouch.x);\n      var dy = Math.abs(Number(touch.clientY || 0) - activeControlTouch.y);\n      if (dx > 12 || dy > 12) activeControlTouch.moved = true;\n    }, { capture: true, passive: true });\n\n    root.addEventListener('touchcancel', function () {\n      activeControlTouch = null;\n    }, { capture: true, passive: true });\n\n    root.addEventListener('touchend', function () {\n      if (!isMobileEditorLayout() || !activeControlTouch) return;\n\n      var tap = activeControlTouch;\n      activeControlTouch = null;\n      if (tap.moved || !tap.control || !tap.control.isConnected) return;\n\n      // Important: do NOT preventDefault or stopPropagation here. Native text\n      // controls must keep Safari/Chrome's own caret, selection and keyboard\n      // behavior. focus() is only a synchronous fallback for browsers that show\n      // the tap highlight but occasionally fail to focus the editable control.\n      if (typeof tap.control.focus === 'function') {\n        try {\n          // Keep this synchronous in the trusted touchend so iOS may open the\n          // keyboard and perform its native caret/viewport reveal.\n          tap.control.focus();\n        } catch (error) {\n          try { tap.control.focus(); } catch (focusError) {}\n        }\n      }\n    }, { capture: true, passive: true });\n  }\n\n  function setMobileAddBarOpen(open) {\n    open = Boolean(open);\n\n    root.classList.toggle('is-mobile-add-open', open);\n\n    if (els.mobileAddBar) els.mobileAddBar.hidden = !open;\n    if (els.mobileBottomUi) els.mobileBottomUi.classList.toggle('is-add-open', open);\n\n\n    if (els.mobileAddToggle) {\n      els.mobileAddToggle.setAttribute('aria-expanded', open ? 'true' : 'false');\n      els.mobileAddToggle.classList.toggle('is-mobile-add-active', open);\n    }\n  }\n\n  function closeMobileAddBar() {\n    setMobileAddBarOpen(false);\n  }\n\n  function toggleMobileAddBar() {\n    setMobileAddBarOpen(!(els.mobileAddBar && !els.mobileAddBar.hidden));\n  }\n\n  function getCartLineProperty(item, key) {\n    if (!item || !item.properties || typeof item.properties !== 'object') return '';\n    var value = item.properties[key];\n    return value == null ? '' : String(value);\n  }\n\n  function parseCartJsonProperty(item, key, fallback) {\n    var raw = getCartLineProperty(item, key);\n    if (!raw) return fallback;\n    try {\n      return JSON.parse(raw);\n    } catch (error) {\n      return fallback;\n    }\n  }\n\n  function isPrintboltFeeCartItem(item) {\n    return getCartLineProperty(item, '_pb_fee') === 'true'\n      || getCartLineProperty(item, '_pb_fee_type') === 'extra_print_area';\n  }\n\n  function cartItemsForEditGroup(cart, groupId) {\n    return ((cart && cart.items) || []).filter(function (item) {\n      return getCartLineProperty(item, '_pb_group_id') === String(groupId || '');\n    });\n  }\n\n  function findEditableCartItem(cart, groupId) {\n    return cartItemsForEditGroup(cart, groupId).find(function (item) {\n      return getCartLineProperty(item, '_pb_custom') === 'true' && !isPrintboltFeeCartItem(item);\n    }) || null;\n  }\n\n  function makeRestoredTextLayer(savedLayer, template) {\n    var layer = {\n      id: savedLayer.id || makeLayerId(),\n      type: 'text',\n      text: String(savedLayer.text || ''),\n      sourceFileName: String(savedLayer.source_filename || ''),\n      imageDataUrl: '',\n      naturalWidth: Math.max(1, Number(savedLayer.image_natural_width || 1)),\n      naturalHeight: Math.max(1, Number(savedLayer.image_natural_height || 1)),\n      x: Number(savedLayer.x_pct || 0),\n      y: Number(savedLayer.y_pct || 0),\n      w: Math.max(0.01, Number(savedLayer.w_pct || 1)),\n      h: Math.max(0.01, Number(savedLayer.h_pct || 1)),\n      rotation: Number(savedLayer.rotation || 0),\n      fontFamily: savedLayer.font_family || 'Arial, Helvetica, sans-serif',\n      color: savedLayer.color || '#ffffff',\n      fontWeight: savedLayer.font_weight || '400',\n      boldRanges: Array.isArray(savedLayer.bold_ranges) ? savedLayer.bold_ranges : null,\n      fontStyle: savedLayer.font_style || 'normal',\n      uppercase: savedLayer.uppercase !== false,\n      align: savedLayer.align || 'center',\n      fontSize: Number(savedLayer.font_size_pt) > 0\n        ? textPointsToInternalPx(Number(savedLayer.font_size_pt), template)\n        : Number(savedLayer.font_size || 96),\n      curve: Number(savedLayer.curve || 0),\n      outline: savedLayer.outline || 'none',\n      outlineSize: Number(savedLayer.outline_size || 6),\n      letterSpacing: Number(savedLayer.letter_spacing || 100),\n      locked: Boolean(savedLayer.locked),\n      flipX: Boolean(savedLayer.flip_x)\n    };\n    migrateTextLayerBoldModel(layer);\n    freezeTextLayerGeometry(layer);\n    return layer;\n  }\n\n  // v595: editor-object PNGs are cropped from the rendered print-area canvas.\n  // Their rotation/flip is already baked in; original source geometry cannot be\n  // applied to these pixels again. Use the crop rectangle in that same canvas.\n  function getRestoredImageCropGeometry(objectMeta) {\n    if (!objectMeta || (objectMeta.fulfillment_role !== 'editor-object' && objectMeta.submission_mode !== 'editor-object')) return null;\n    var keys = ['full_width', 'full_height', 'crop_x', 'crop_y', 'crop_width', 'crop_height'];\n    var values = keys.map(function (key) {\n      var value = objectMeta[key];\n      return value === null || value === undefined || value === '' ? NaN : Number(value);\n    });\n    var fw = values[0], fh = values[1], x = values[2], y = values[3], w = values[4], h = values[5];\n    if (!values.every(Number.isFinite) || fw <= 0 || fh <= 0 || w <= 0 || h <= 0 || x < 0 || y < 0 || x + w > fw || y + h > fh) {\n      throw new Error(pbT('den_sparade_bildens_placeringsdata_ar_ofullstandiga_designen_kunde_inte_aterstallas_sakert', 'Den sparade bildens placeringsdata \u00E4r ofullst\u00E4ndiga. Designen kunde inte \u00E5terst\u00E4llas s\u00E4kert.'));\n    }\n    return { x: x / fw * 100, y: y / fh * 100, w: w / fw * 100, h: h / fh * 100, naturalWidth: w, naturalHeight: h };\n  }\n\n  async function makeRestoredImageLayer(savedLayer, objectMeta) {\n    if (pbPrivateEnabled() && objectMeta && objectMeta.original_asset) return await pbPrivateRestoreImageLayer(savedLayer, objectMeta.original_asset);\n    var cropGeometry = getRestoredImageCropGeometry(objectMeta);\n    var remoteUrl = objectMeta && objectMeta.print_file_url ? String(objectMeta.print_file_url) : '';\n    var imageDataUrl = '';\n\n    // Convert the saved object file back to a local data URL. A pending Shopify\n    // file is retried; never fall back to a cross-origin URL that can taint the\n    // editor canvas and make the next export fail.\n    if (remoteUrl) {\n      try {\n        imageDataUrl = await fetchUrlAsDataUrl(remoteUrl, { retryPending: true });\n      } catch (error) {\n        throw new Error(pbT('designfilen_bearbetas_fortfarande_forsok_oppna_designen_igen_om_en_kort_stund', 'Designfilen bearbetas fortfarande. F\u00F6rs\u00F6k \u00F6ppna designen igen om en kort stund.'));\n      }\n    }\n\n    var restored = {\n      id: savedLayer.id || makeLayerId(),\n      type: 'image',\n      sourceFileName: String(savedLayer.source_filename || (objectMeta && objectMeta.source_filename) || ''),\n      imageDataUrl: imageDataUrl,\n      naturalWidth: Math.max(1, Number(savedLayer.image_natural_width || 1)),\n      naturalHeight: Math.max(1, Number(savedLayer.image_natural_height || 1)),\n      x: Number(savedLayer.x_pct || 0),\n      y: Number(savedLayer.y_pct || 0),\n      w: Math.max(0.01, Number(savedLayer.w_pct || 1)),\n      h: Math.max(0.01, Number(savedLayer.h_pct || 1)),\n      rotation: Number(savedLayer.rotation || 0),\n      locked: Boolean(savedLayer.locked),\n      flipX: Boolean(savedLayer.flip_x),\n      backgroundRemoved: false,\n      backgroundRemoveOriginalImageDataUrl: imageDataUrl,\n      backgroundRemoveOriginalNaturalWidth: Math.max(1, Number(savedLayer.image_natural_width || 1)),\n      backgroundRemoveOriginalNaturalHeight: Math.max(1, Number(savedLayer.image_natural_height || 1)),\n      backgroundRemoveOriginalSourceFileName: String(savedLayer.source_filename || ''),\n      backgroundRemoveResultImageDataUrl: '',\n      backgroundRemoveResultNaturalWidth: 0,\n      backgroundRemoveResultNaturalHeight: 0,\n      backgroundRemoveResultSourceFileName: ''\n    };\n    if (cropGeometry) {\n      Object.assign(restored, cropGeometry);\n      restored.rotation = 0;\n      restored.flipX = false;\n      // A thin cropped motif can be smaller than the normal 5% upload minimum.\n      restored.pbRestoredImageMinSize = Math.min(5, cropGeometry.w, cropGeometry.h);\n      restored.backgroundRemoveOriginalNaturalWidth = cropGeometry.naturalWidth;\n      restored.backgroundRemoveOriginalNaturalHeight = cropGeometry.naturalHeight;\n    }\n    return restored;\n  }\n\n  function rebaseDesignToProductionArea(dState, savedArea, template) {\n    var target = template && template.production_area;\n    if (!target || !savedArea) return;\n    var width = Number(savedArea.physical_width_mm), height = Number(savedArea.physical_height_mm);\n    if (!(width > 0 && height > 0)) return;\n    var old = savedArea.production_area || {};\n    var x = Number(old.offset_x_mm || 0) - target.offset_x_mm;\n    var y = Number(old.offset_y_mm || 0) - target.offset_y_mm;\n    if (width === target.width_mm && height === target.height_mm && x === 0 && y === 0) return;\n    // Preserve physical artwork size and position. Only the viewport clips it.\n    [dState.design].concat(dState.imageLayers || []).forEach(function (box) {\n      if (!box) return;\n      box.x = (Number(box.x) / 100 * width + x) / target.width_mm * 100;\n      box.y = (Number(box.y) / 100 * height + y) / target.height_mm * 100;\n      box.w = Number(box.w) * width / target.width_mm;\n      box.h = Number(box.h) * height / target.height_mm;\n    });\n  }\n\n  async function restorePlacementDesignFromCart(savedPlacement, placementObjects) {\n    if (!savedPlacement || !savedPlacement.placement) return;\n\n    var placement = String(savedPlacement.placement);\n    var dState = createEmptyDesignState();\n    dState.designType = savedPlacement.type || 'text';\n    dState.text = String(savedPlacement.text || '');\n    dState.sourceFileName = String(savedPlacement.source_filename || '');\n    dState.imageNaturalWidth = Number(savedPlacement.image_natural_width || 0);\n    dState.imageNaturalHeight = Number(savedPlacement.image_natural_height || 0);\n    dState.design = {\n      x: Number(savedPlacement.x_pct || 0),\n      y: Number(savedPlacement.y_pct || 0),\n      w: Math.max(0.01, Number(savedPlacement.w_pct || 1)),\n      h: Math.max(0.01, Number(savedPlacement.h_pct || 1)),\n      rotation: Number(savedPlacement.rotation || 0)\n    };\n\n    var objectRows = (placementObjects || []).filter(function (entry) {\n      if (String(entry && entry.placement || '') !== placement) return false;\n      // Composite rows are the only supplier rows. Cart editing restores the original\n      // per-object image assets and never substitutes the supplier composite.\n      return String(entry && entry.fulfillment_role || 'object') !== 'composite';\n    }).sort(function (a, b) {\n      return Number(a.object_index || 0) - Number(b.object_index || 0);\n    });\n\n    var savedLayers = Array.isArray(savedPlacement.image_layers) ? savedPlacement.image_layers : [];\n    var restoreTemplate = state.templatesByPlacement[placement] || selectLocalTemplate(placement) || null;\n    dState.imageLayers = await Promise.all(savedLayers.map(async function (savedLayer, index) {\n      if ((savedLayer.type || 'image') === 'text') return makeRestoredTextLayer(savedLayer, restoreTemplate);\n      var savedLayerId = String(savedLayer.id || '');\n      var objectMeta = objectRows.find(function (entry) {\n        return savedLayerId && String(entry && entry.object_id || '') === savedLayerId;\n      }) || objectRows.find(function (entry) {\n        return Number(entry.object_index) === Number(index);\n      }) || objectRows[index] || null;\n      return await makeRestoredImageLayer(savedLayer, objectMeta);\n    }));\n\n    // Backward compatibility for older carts that used the primary image slot.\n    if (!dState.imageLayers.length && dState.designType === 'image' && objectRows[0] && objectRows[0].print_file_url) {\n      try {\n        if (pbPrivateEnabled() && objectRows[0].original_asset) {\n          var restoredPrimary = await pbPrivateRestore(objectRows[0].original_asset);\n          dState.imageDataUrl = restoredPrimary.dataUrl;\n          dState.imageNaturalWidth = restoredPrimary.width;\n          dState.imageNaturalHeight = restoredPrimary.height;\n        } else dState.imageDataUrl = await fetchUrlAsDataUrl(String(objectRows[0].print_file_url), { retryPending: true });\n      } catch (error) {\n        throw new Error(pbT('designfilen_bearbetas_fortfarande_forsok_oppna_designen_igen_om_en_kort_stund', 'Designfilen bearbetas fortfarande. F\u00F6rs\u00F6k \u00F6ppna designen igen om en kort stund.'));\n      }\n    }\n\n    rebaseDesignToProductionArea(dState, savedPlacement.print_area, restoreTemplate);\n    dState.touched = Boolean(dState.imageLayers.length || dState.imageDataUrl || String(dState.text || '').trim());\n    dState.initialized = true;\n    state.designsByPlacement[placement] = dState;\n  }\n\n  async function loadSavedDesignFromUrl() {\n    var designRef = qs.get('design');\n    var editToken = qs.get('token');\n    if (!designRef && !editToken) return false;\n    if (!designRef || !editToken) throw new Error(pbT('designlanken_ar_ofullstandig', 'Designl\u00E4nken \u00E4r ofullst\u00E4ndig.'));\n\n    var openUrl = workerUrl + '/api/designs/open?design=' + encodeURIComponent(designRef) +\n      '&token=' + encodeURIComponent(editToken);\n    if (qs.get('revision')) openUrl += '&revision=' + encodeURIComponent(qs.get('revision'));\n    var result = await pbJsonRequest(openUrl, { cache: 'no-store' }, 20000, false);\n    var data = result.data || {};\n    if (!result.ok || !data.ok) throw pbDependencyError(new Error(pbTranslatedError(data.error) || pbT('designen_kunde_inte_oppnas', 'Designen kunde inte \u00F6ppnas.')), result.status);\n    if (!data.product_handle || !data.product_id || !data.variant_id) {\n      throw new Error(pbT('den_sparade_designen_saknar_produktkoppling', 'Den sparade designen saknar produktkoppling.'));\n    }\n    var savedMapping = data.mapping && typeof data.mapping === 'object' ? {\n      productTypeId: String(data.mapping.productTypeId || ''),\n      appearanceId: String(data.mapping.appearanceId || ''),\n      sizeId: String(data.mapping.sizeId || '')\n    } : null;\n    state.handle = String(data.product_handle);\n    state.shopifyProductId = String(data.product_id);\n    state.shopifyVariantId = String(data.variant_id);\n    if (savedMapping) {\n      state.spreadconnectProductTypeId = savedMapping.productTypeId || state.spreadconnectProductTypeId;\n      state.spreadconnectAppearanceId = savedMapping.appearanceId || state.spreadconnectAppearanceId;\n      state.spreadconnectSizeId = savedMapping.sizeId || state.spreadconnectSizeId;\n    }\n    state.savedDesign = {\n      design: data.design_json || data.editable_design_json,\n      placements: data.placements_json,\n      productId: String(data.product_id),\n      originalVariantId: String(data.variant_id),\n      mapping: savedMapping,\n      variantRemapped: false,\n      projectId: data.project_id || '',\n      designRef: String(data.design || designRef),\n      editToken: String(editToken),\n      groupId: String(data.group_id || ''),\n      revision: String(data.revision || ''),\n      currentRevision: String(data.current_revision || data.revision || ''),\n      status: String(data.status || ''),\n      revisions: Array.isArray(data.revisions) ? data.revisions : (Array.isArray(data.revision_history) ? data.revision_history : []),\n      isHistorical: Boolean(data.is_historical || data.historical || data.opened_revision && String(data.opened_revision) !== String(data.revision || '')),\n      openedRevision: String(data.opened_revision || data.revision || ''),\n      previewUrl: String(data.preview_url || '')\n    };\n    state.editDesignRef = state.savedDesign.designRef;\n    state.editToken = state.savedDesign.editToken;\n    state.editDesignGroupId = state.savedDesign.groupId;\n    state.editRevision = state.savedDesign.revision;\n    state.currentRevision = state.savedDesign.currentRevision;\n    state.revisionHistory = state.savedDesign.revisions;\n    state.openedRevision = state.savedDesign.openedRevision;\n    state.isHistoricalRevision = state.savedDesign.isHistorical;\n    if (state.savedDesign.projectId) state.projectId = String(state.savedDesign.projectId);\n    return true;\n  }\n\n  async function restoreSavedDesign() {\n    var saved = state.savedDesign;\n    if (!saved) return false;\n    var designJson = saved.design;\n    var placementObjects = saved.placements;\n    if (typeof designJson === 'string') {\n      try { designJson = JSON.parse(designJson); } catch (_) { designJson = null; }\n    }\n    if (typeof placementObjects === 'string') {\n      try { placementObjects = JSON.parse(placementObjects); } catch (_) { placementObjects = []; }\n    }\n    if (!designJson || !Array.isArray(designJson.placements) || !designJson.placements.length) {\n      throw new Error(pbT('den_sparade_designen_kunde_inte_aterstallas', 'Den sparade designen kunde inte \u00E5terst\u00E4llas.'));\n    }\n    state.designsByPlacement = {};\n    for (var i = 0; i < designJson.placements.length; i++) {\n      await restorePlacementDesignFromCart(designJson.placements[i], Array.isArray(placementObjects) ? placementObjects : []);\n    }\n    state.placementDesignOrder = designJson.placements.map(function (entry) {\n      return String(entry.placement || '');\n    }).filter(Boolean);\n    if (state.placementDesignOrder.length) state.activePlacement = state.placementDesignOrder[0];\n    state.activeImageLayerId = '';\n    state.activePrimarySelected = false;\n    state.editLoaded = true;\n    state.openedSavedDesign = true;\n    return true;\n  }\n\n  async function restoreCartDesignForEdit() {\n    if (!state.editCartGroupId) return false;\n\n    setStatus(pbT('oppnar_designen_fran_kundvagnen', '\u00D6ppnar designen fr\u00E5n kundvagnen\u2026'));\n    var result = await pbJsonRequest(getShopifyRouteRoot() + 'cart.js', {\n      cache: 'no-store',\n      headers: { 'Accept': 'application/json' }\n    });\n    if (!result.ok) throw new Error(pbT('kunde_inte_lasa_designen_fran_kundvagnen', 'Kunde inte l\u00E4sa designen fr\u00E5n kundvagnen.'));\n\n    var cart = result.data;\n    var groupItems = cartItemsForEditGroup(cart, state.editCartGroupId);\n    var mainItem = findEditableCartItem(cart, state.editCartGroupId);\n    if (!mainItem) throw new Error(pbT('den_designade_produkten_finns_inte_langre_i_kundvagnen', 'Den designade produkten finns inte l\u00E4ngre i kundvagnen.'));\n\n    state.editCartItemKey = String(mainItem.key || '');\n    state.editCartKeys = groupItems.map(function (item) { return String(item.key || ''); }).filter(Boolean);\n    state.projectId = getCartLineProperty(mainItem, '_pb_design_project_id') || state.projectId;\n\n    state.quantities = {};\n    var variantId = String(mainItem.variant_id || mainItem.id || state.shopifyVariantId || '');\n    if (variantId) state.quantities[variantId] = Math.max(1, Number(mainItem.quantity || 1));\n\n    var designJson = parseCartJsonProperty(mainItem, '_pb_design_json', null);\n    var placementObjects = parseCartJsonProperty(mainItem, '_pb_placements_json', []);\n    if (!designJson || !Array.isArray(designJson.placements) || !designJson.placements.length) {\n      throw new Error(pbT('designinformationen_i_kundvagnen_kunde_inte_aterstallas', 'Designinformationen i kundvagnen kunde inte \u00E5terst\u00E4llas.'));\n    }\n\n    state.designsByPlacement = {};\n    for (var i = 0; i < designJson.placements.length; i++) {\n      await restorePlacementDesignFromCart(designJson.placements[i], placementObjects);\n    }\n\n    var savedOrder = getCartLineProperty(mainItem, '_pb_design_order')\n      || getCartLineProperty(mainItem, '_pb_active_placements');\n    var restoredPlacements = designJson.placements.map(function (entry) { return String(entry.placement || ''); }).filter(Boolean);\n    state.placementDesignOrder = String(savedOrder || '')\n      .split(',')\n      .map(function (placement) { return placement.trim(); })\n      .filter(function (placement) { return placement && restoredPlacements.indexOf(placement) !== -1; });\n\n    restoredPlacements.forEach(function (placement) {\n      if (state.placementDesignOrder.indexOf(placement) === -1) state.placementDesignOrder.push(placement);\n    });\n\n    if (state.placementDesignOrder.length) state.activePlacement = state.placementDesignOrder[0];\n    state.activeImageLayerId = '';\n    state.activePrimarySelected = false;\n    state.editLoaded = true;\n\n    if (els.confirmAdd) {\n      els.confirmAdd.dataset.pbIdleText = pbT('uppdatera_kundvagnen', 'Uppdatera kundvagnen');\n      els.confirmAdd.textContent = pbT('uppdatera_kundvagnen', 'Uppdatera kundvagnen');\n    }\n\n    return true;\n  }\n\n  // v618: a same-origin cart can reuse this exact designer in a renderable,\n  // offscreen iframe. Read-only previews share the normal template/mockup code;\n  // the explicit Add command shares the normal upload/finalize/cart pipeline.\n  // A local snapshot can render an early preview, but it never authorizes Add.\n  // Purchasable copies require ownership from the current cart and /designs/open;\n  // no parent-provided design JSON, geometry, edit token or URL replaces that check.\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  \n\n  async function boot() {\n    \n    syncMobileFullscreenMode();\n    window.addEventListener('resize', function () {\n      syncMobileFullscreenMode();\n      applyStageZoom(state.stageZoomPercent || 85);\n      window.requestAnimationFrame(updatePrintAreaEmptyActionSizing);\n      if (state.settingsOpen) root.classList.toggle('is-mobile-settings-open', isMobileEditorLayout());\n    }, { passive: true });\n    window.addEventListener('orientationchange', function () {\n      syncMobileFullscreenMode();\n      applyStageZoom(state.stageZoomPercent || 85);\n      window.requestAnimationFrame(updatePrintAreaEmptyActionSizing);\n      if (state.settingsOpen) root.classList.toggle('is-mobile-settings-open', isMobileEditorLayout());\n    }, { passive: true });\n    // Keep only the stage covered while its image is pending. The surrounding\n    // editor is usable as soon as the data dependencies below resolve.\n    setStageLoading(true);\n\n    if (!workerUrl) throw new Error(pbT('worker_url_saknas_i_sektionens_installningar', 'Worker URL saknas i sektionens inst\u00E4llningar.'));\n    \n    await loadSavedDesignFromUrl();\n    if (!state.handle) throw new Error(pbT('produkt_handle_saknas_i_url_en_oppna_designern_via_produktknappen', 'Produkt-handle saknas i URL:en. \u00D6ppna designern via produktknappen.'));\n\n    // Start all independent boot requests before binding controls. This also\n    // makes an early size-panel interaction share the same config promise,\n    // whose validation waits for the extra-area price lookup.\n    pbExtraPrintAreaPromise = loadExtraPrintAreaProductPrice();\n    var productPromise = loadShopifyProduct();\n    var configPromise = pbLoadConfig();\n\n    applyTextEditorControlLimits();\n    setupFontPicker();\n    enableMobileTouchSafety();\n    enableUnifiedMobileButtonTaps();\n    enableUnifiedMobileNativeControls();\n    setupStageZoomControl();\n    bindEvents();\n    setSnapEnabled(loadSnapEnabledPreference(), { skipSave: true });\n    syncSettingsUi();\n    await Promise.all([pbExtraPrintAreaPromise, productPromise, configPromise]);\n    await pbLoadTrustedVariant();\n    await loadSpreadconnectProductType();\n    await discoverTemplatesForCurrentVariant();\n    if (state.savedDesign) await restoreSavedDesign();\n    else if (state.editCartGroupId) await restoreCartDesignForEdit();\n    else await pbRestoreDraft();\n    pbDraftReady = true;\n\n    syncDirectEditUi();\n    setStageLoading(true);\n    renderAll();\n    revealEditorInterface();\n    // Do not hold boot on a remote template/product image. Keep the local\n    // stage loader visible until that image settles, including an error.\n    var initialTemplateSwapToken = pbTemplateSwapToken;\n    waitForTemplateImageReady(initialTemplateSwapToken).then(function (result) {\n      if (!result || result.token === pbTemplateSwapToken) setStageLoading(false);\n    });\n    if (state.openedSavedDesign) setStatus(pbT('den_sparade_designen_ar_oppnad', 'Den sparade designen \u00E4r \u00F6ppnad.'));\n    else if (state.editLoaded) setStatus(pbT('designen_ar_oppnad_fran_kundvagnen', 'Designen \u00E4r \u00F6ppnad fr\u00E5n kundvagnen.'));\n\n  }\n\n  function setEditorLimit(primaryEl, secondaryEl, min, max) {\n    [primaryEl, secondaryEl].forEach(function (el) {\n      if (!el) return;\n      el.min = String(min);\n      el.max = String(max);\n      el.setAttribute('min', String(min));\n      el.setAttribute('max', String(max));\n    });\n  }\n\n  function applyTextEditorControlLimits() {\n    setEditorLimit(els.textSize, els.textSizeNumber, TEXT_SIZE_MIN_PT, TEXT_SIZE_MAX_PT);\n    setEditorLimit(els.textCurve, els.textCurveNumber, -400, 400);\n    setEditorLimit(els.textSpacing, els.textSpacingNumber, 25, 250);\n    setEditorLimit(els.outlineSize, els.outlineSizeNumber, 0, 120);\n  }\n\n  async function loadShopifyProduct() {\n    setStatus(pbT('laddar_produkt', 'Laddar produkt\u2026'));\n    setProductMetaLoadingState(true);\n    if (els.productTitle && !state.product) els.productTitle.textContent = '';\n\n    // A saved-design link is independent of the visitor's cart. Shopify already\n    // exposes the active storefront currency, so do not add a cart.js dependency\n    // while an administrator is reopening a design.\n    if (!state.savedDesign) await loadCartCurrency();\n\n    var res = await pbReadJsonResponse(getShopifyRouteRoot() + 'products/' + encodeURIComponent(state.handle) + '.js', { headers: { 'Accept': 'application/json' } });\n    if (!res.ok) throw new Error(pbT('kunde_inte_hamta_shopify_produkt', 'Kunde inte h\u00E4mta Shopify-produkt.'));\n\n    var product = await res.json();\n    state.product = product;\n\n    var savedProductId = String(state.savedDesign && state.savedDesign.productId || state.shopifyProductId || '');\n    if (state.editDesignRef && savedProductId && String(product.id || '') !== savedProductId) {\n      throw new Error(pbT('produktkopplingen_stammer_inte_med_den_valda_produkten', 'Produktkopplingen st\u00E4mmer inte med den valda produkten.'));\n    }\n\n    var trustedVariant = (product.variants || []).find(function (variant) {\n      return String(variant.id) === String(state.shopifyVariantId);\n    });\n    \n    if (state.editDesignRef && !trustedVariant) {\n      trustedVariant = findSavedDesignReplacementVariant(product);\n      if (!trustedVariant) {\n        throw new Error(pbT('den_sparade_designens_shopify_variant_finns_inte_langre_i_produkten', 'Den sparade designens Shopify-variant finns inte l\u00E4ngre i produkten.'));\n      }\n      state.savedDesign.variantRemapped = true;\n    }\n    state.variant = trustedVariant || (product.variants || []).find(function (variant) { return variant.available; }) || (product.variants || [])[0] || null;\n\n    if (!state.variant) throw new Error(pbT('produkten_saknar_varianter', 'Produkten saknar varianter.'));\n\n    state.shopifyVariantId = String(state.variant.id);\n    var skuIds = getSpreadconnectIdsFromSku(state.variant.sku);\n    state.spreadconnectProductTypeId = String(state.spreadconnectProductTypeId || skuIds.productTypeId || '');\n    state.shopifyProductId = String(savedProductId || product.id || state.shopifyProductId || '');\n\n    detectOptionIndexes(product);\n    state.activeColor = getVariantColor(state.variant);\n\n    els.productTitle.textContent = product.title || pbT('produkt', 'Produkt');\n    els.productLink.href = '#';\n    els.productLink.setAttribute('role', 'button');\n    renderProductDetails();\n  }\n\n\n  async function loadSpreadconnectProductType() {\n    if (!state.spreadconnectProductTypeId) {\n      throw new Error(pbT('spreadconnect_producttypeid_saknas_lagg_till_product_type_6_i_designer_lanken_eller_anvand_sku_forma', 'Spreadconnect productTypeId saknas. L\u00E4gg till ?product_type=6 i designer-l\u00E4nken eller anv\u00E4nd SKU-format SC6-A2-S4.'));\n    }\n\n    setStatus(pbT('hamtar_spreadconnect_produkt', 'H\u00E4mtar Spreadconnect-produkt\u2026'));\n    var url = new URL(workerUrl + '/api/printbolt/catalog-product');\n    url.searchParams.set('id', String(state.spreadconnectProductTypeId));\n\n    var res = await pbReadJsonResponse(url.toString(), { cache: 'no-store', headers: { 'Accept': 'application/json' } });\n    var data = await res.json().catch(function () { return {}; });\n    if (!res.ok || !data.ok || !data.product) {\n      throw pbDependencyError(new Error(pbTranslatedError(data.error) || pbT('kunde_inte_hamta_spreadconnect_produkten', 'Kunde inte h\u00E4mta Spreadconnect-produkten.')), res.status);\n    }\n\n    state.spreadconnectProduct = data.product;\n    syncSpreadconnectVariantMapping();\n  }\n\n  function normalizeSpreadconnectName(value) {\n    return String(value || '')\n      .normalize('NFD')\n      .replace(/[\\u0300-\\u036f]/g, '')\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, ' ')\n      .trim();\n  }\n\n  function getSpreadconnectIdsFromSku(sku) {\n    var value = String(sku || '').trim();\n    var patterns = [\n      /(?:SC|SPOD|SPREADCONNECT)[-_]?(\\d+)[-_]?A(\\d+)[-_]?S(\\d+)/i,\n      /(?:SC|SPOD|SPREADCONNECT)[-_]?(\\d+)[-_](\\d+)[-_](\\d+)/i\n    ];\n\n    for (var i = 0; i < patterns.length; i++) {\n      var match = value.match(patterns[i]);\n      if (match) {\n        return { productTypeId: match[1], appearanceId: match[2], sizeId: match[3] };\n      }\n    }\n\n    // Spreadconnect CYO SKUs use saved-product-id-P{productTypeId}A{appearanceId}S{sizeId}.\n    var cyoMatch = value.match(/^\\d+-P(\\d+)A(\\d+)S(\\d+)$/i);\n    if (cyoMatch) {\n      return { productTypeId: cyoMatch[1], appearanceId: cyoMatch[2], sizeId: cyoMatch[3] };\n    }\n\n    // Native Spreadconnect article SKUs commonly expose the variant suffix as ...A{appearanceId}S{sizeId}.\n    // productTypeId still comes from ?product_type=... in that case.\n    var nativeMatch = value.match(/A(\\d+)S(\\d+)$/i);\n    if (nativeMatch) {\n      return { productTypeId: '', appearanceId: nativeMatch[1], sizeId: nativeMatch[2] };\n    }\n\n    return { productTypeId: '', appearanceId: '', sizeId: '' };\n  }\n\n  function findSavedDesignReplacementVariant(product) {\n    var mapping = state.savedDesign && state.savedDesign.mapping;\n    if (!mapping || !mapping.productTypeId || !mapping.appearanceId || !mapping.sizeId) return null;\n\n    var matches = (product && Array.isArray(product.variants) ? product.variants : []).filter(function (variant) {\n      var ids = getSpreadconnectIdsFromSku(variant && variant.sku);\n      return String(ids.productTypeId || '') === String(mapping.productTypeId) &&\n        String(ids.appearanceId || '') === String(mapping.appearanceId) &&\n        String(ids.sizeId || '') === String(mapping.sizeId);\n    });\n\n    // Never guess when a catalog contains duplicate supplier mappings.\n    return matches.length === 1 ? matches[0] : null;\n  }\n\n  function findSpreadconnectAttribute(list, id, name) {\n    list = Array.isArray(list) ? list : [];\n    if (id) {\n      var exactId = list.find(function (item) { return String(item && item.id) === String(id); });\n      if (exactId) return exactId;\n    }\n\n    var wanted = normalizeSpreadconnectName(name);\n    if (!wanted) return null;\n    return list.find(function (item) {\n      return normalizeSpreadconnectName(item && item.name) === wanted;\n    }) || null;\n  }\n\n  function resolveSpreadconnectVariant(variant) {\n    if (!state.spreadconnectProduct) throw new Error(pbT('spreadconnect_produktdata_saknas', 'Spreadconnect-produktdata saknas.'));\n\n    var skuIds = getSpreadconnectIdsFromSku(variant && variant.sku);\n    var productTypeId = String(skuIds.productTypeId || state.spreadconnectProductTypeId || '');\n    if (!productTypeId) throw new Error(pbT('spreadconnect_producttypeid_saknas_for_varianten', 'Spreadconnect productTypeId saknas f\u00F6r varianten.'));\n    if (state.spreadconnectProductTypeId && productTypeId !== String(state.spreadconnectProductTypeId)) {\n      throw new Error(pbT('shopify_variantens_spreadconnect_producttypeid_matchar_inte_designerprodukten', 'Shopify-variantens Spreadconnect productTypeId matchar inte designerprodukten.'));\n    }\n\n    var appearance = findSpreadconnectAttribute(\n      state.spreadconnectProduct.appearances,\n      skuIds.appearanceId,\n      getVariantColor(variant)\n    );\n    var size = findSpreadconnectAttribute(\n      state.spreadconnectProduct.sizes,\n      skuIds.sizeId,\n      getVariantSize(variant)\n    );\n\n    if (!appearance) {\n      throw new Error(pbT('kunde_inte_matcha_fargen', 'Kunde inte matcha f\u00E4rgen \"') + getVariantColor(variant) + pbT('mot_spreadconnect_anvand_vid_behov_sku_format_sc', '\" mot Spreadconnect. Anv\u00E4nd vid behov SKU-format SC') + productTypeId + '-A{appearanceId}-S{sizeId}.');\n    }\n    if (!size) {\n      throw new Error(pbT('kunde_inte_matcha_storleken', 'Kunde inte matcha storleken \"') + getVariantSize(variant) + pbT('mot_spreadconnect_anvand_vid_behov_sku_format_sc', '\" mot Spreadconnect. Anv\u00E4nd vid behov SKU-format SC') + productTypeId + '-A{appearanceId}-S{sizeId}.');\n    }\n\n    return {\n      productTypeId: productTypeId,\n      appearanceId: String(appearance.id),\n      sizeId: String(size.id),\n      appearanceName: appearance.name || getVariantColor(variant),\n      sizeName: size.name || getVariantSize(variant)\n    };\n  }\n\n  function syncSpreadconnectVariantMapping() {\n    var mapping = resolveSpreadconnectVariant(state.variant);\n    state.spreadconnectProductTypeId = mapping.productTypeId;\n    state.spreadconnectAppearanceId = mapping.appearanceId;\n    state.spreadconnectSizeId = mapping.sizeId;\n\n    // Keep generic catalog aliases populated because active AI/template helpers still reference them.\n    state.catalogProductId = mapping.productTypeId;\n    state.catalogVariantId = mapping.appearanceId;\n  }\n\n  function getShopifyRouteRoot() {\n    var rootPath = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || root.dataset.shopifyRoot || '/';\n    rootPath = String(rootPath || '/');\n    return rootPath.endsWith('/') ? rootPath : rootPath + '/';\n  }\n\n  async function loadExtraPrintAreaProductPrice() {\n    try {\n      var res = await pbReadJsonResponse(getShopifyRouteRoot() + 'products/extra-tryckomrade.js', {\n        cache: 'no-store',\n        headers: {\n          'Accept': 'application/json'\n        }\n      });\n\n      if (!res.ok) throw new Error('Extra print area product unavailable');\n\n      var product = await res.json();\n      var variant = product && product.variants && product.variants.length ? product.variants[0] : null;\n\n      if (variant && variant.id) {\n        EXTRA_PRINT_AREA_VARIANT_ID = Number(variant.id);\n      }\n\n      var priceCents = Number((variant && variant.price) || (product && product.price) || 0);\n      if (Number.isFinite(priceCents) && priceCents > 0) {\n        EXTRA_PRINT_AREA_PRICE_CENTS = priceCents;\n      }\n    } catch (error) {\n      console.warn('[Printbolt Designer] Kunde inte h\u00E4mta pris f\u00F6r Extra tryckomr\u00E5de. Anv\u00E4nder marknadens Liquid-pris om tillg\u00E4ngligt.', error);\n    }\n    if (!Number.isFinite(EXTRA_PRINT_AREA_PRICE_CENTS) || EXTRA_PRINT_AREA_PRICE_CENTS <= 0) {\n      throw new Error(pbT('kunde_inte_hamta_shopify_produkt', 'Kunde inte h\u00E4mta Shopify-produkt.'));\n    }\n  }\n\n  async function loadCartCurrency() {\n    try {\n      var result = await pbJsonRequest(getShopifyRouteRoot() + 'cart.js', { headers: { 'Accept': 'application/json' } });\n      if (!result.ok) return;\n\n      var cart = result.data;\n      if (cart && cart.currency) {\n        state.currency = String(cart.currency).toUpperCase();\n      }\n    } catch (error) {\n      // Keep the Shopify.currency.active fallback if cart.js is not available.\n    }\n  }\n\n  function detectOptionIndexes(product) {\n    var names = (product.options || []).map(function (option) {\n      return String(option.name || option || '').toLowerCase();\n    });\n\n    state.colorOptionIndex = names.findIndex(function (name) {\n      return /color|colour|f\u00E4rg|farg|farve|farbe/.test(name);\n    });\n\n    state.sizeOptionIndex = names.findIndex(function (name) {\n      return /size|storlek|st\u00F8rrelse|storrelse|gr\u00F6\u00DFe|gr\u00F6sse|groesse|grosse/.test(name);\n    });\n  }\n\n  async function discoverTemplatesForCurrentVariant() {\n    if (!state.spreadconnectProductTypeId) throw new Error(pbT('spreadconnect_producttypeid_saknas', 'Spreadconnect productTypeId saknas.'));\n    if (!state.spreadconnectAppearanceId) syncSpreadconnectVariantMapping();\n\n    setStatus(pbT('hamtar_tryckfalt', 'H\u00E4mtar tryckf\u00E4lt\u2026'));\n\n    var data = await fetchTemplateDataCached(state.spreadconnectAppearanceId);\n    applyTemplateDataForCurrentVariant(data, state.spreadconnectAppearanceId);\n    setStatus(pbT('tryckytan_ar_verifierad_och_klar', 'Tryckytan \u00E4r verifierad och klar.'));\n  }\n\n  function getTemplateCacheKey(appearanceId) {\n    var id = String(appearanceId || state.spreadconnectAppearanceId || '').trim();\n    if (!id || !state.spreadconnectProductTypeId) return '';\n    return [\n      'spreadconnect',\n      String(state.spreadconnectProductTypeId),\n      id,\n      String(state.technique || 'auto').toLowerCase()\n    ].join('|');\n  }\n\n  // No browser/session cache. The Worker owns supplier caching centrally.\n  // Keep only an in-flight request dedupe so simultaneous UI paths do not send\n  // duplicate requests during the same render tick.\n  async function fetchTemplateDataCached(appearanceId) {\n    var id = String(appearanceId || state.spreadconnectAppearanceId || '').trim();\n    if (!id) throw new Error(pbT('spreadconnect_appearanceid_saknas', 'Spreadconnect appearanceId saknas.'));\n\n    var key = getTemplateCacheKey(id);\n    if (state.templateRequests[key]) return state.templateRequests[key];\n\n    state.templateRequests[key] = fetchTemplateData('all', id)\n      .then(function (data) {\n        delete state.templateRequests[key];\n        return data;\n      })\n      .catch(function (error) {\n        delete state.templateRequests[key];\n        throw error;\n      });\n\n    return state.templateRequests[key];\n  }\n\n  function applyTemplateDataForCurrentVariant(data, appearanceId) {\n    state.spreadconnectAppearanceId = String(appearanceId || data.appearance_id || state.spreadconnectAppearanceId || '');\n    // v283: the Worker is the source of truth for garment contrast.\n    // Store the selected FF appearance color/contrast at response level so the\n    // guide does not depend on an individual template object carrying the field.\n    state.spreadconnectAppearanceColor = String(\n      data.appearance_color ||\n      (data.summary && data.summary.appearance_color) ||\n      (data.selected && data.selected.appearance_color) ||\n      ''\n    ).trim();\n    state.spreadconnectAppearanceContrast = String(\n      data.appearance_contrast ||\n      (data.summary && data.summary.appearance_contrast) ||\n      (data.selected && data.selected.appearance_contrast) ||\n      ''\n    ).trim().toLowerCase();\n    // v287: FF decides the FINAL guide color server-side. No CSS/light-dark\n    // inference is used for the guide anymore.\n    state.spreadconnectPrintAreaGuideColor = String(\n      data.print_area_guide_color ||\n      (data.summary && data.summary.print_area_guide_color) ||\n      (data.selected && data.selected.print_area_guide_color) ||\n      ''\n    ).trim();\n    state.catalogProductId = String(state.spreadconnectProductTypeId || '');\n    state.catalogVariantId = String(state.spreadconnectAppearanceId || '');\n    state.catalogVariantImageUrl = data.selected && data.selected.image_url ? data.selected.image_url : '';\n\n    var allTemplates = Array.isArray(data.templates) ? data.templates : [];\n    var techniqueTemplates = allTemplates.filter(templateMatchesActiveTechnique);\n    state.allTemplates = techniqueTemplates.length ? techniqueTemplates : allTemplates;\n\n    // v367: the supplier/template resolver chooses the real product technique.\n    // Prefer DTG only when the current product actually exposes it; otherwise the\n    // Worker returns the next available supplier technique.\n    var resolvedTechnique = String(\n      (data.selected && data.selected.technique) ||\n      (state.allTemplates[0] && state.allTemplates[0].technique) ||\n      ''\n    ).trim();\n    if (resolvedTechnique) state.technique = resolvedTechnique;\n\n    if (!state.allTemplates.length) {\n      throw pbCriticalTemplateError(new Error(pbT('tryckfaltet_kunde_inte_verifieras_for_den_har_produkten_fargen', 'Tryckf\u00E4ltet kunde inte verifieras f\u00F6r den h\u00E4r produkten/f\u00E4rgen.')));\n    }\n\n    var placements = sortPlacements(getUniquePlacements(state.allTemplates));\n    if (!placements.length) throw pbCriticalTemplateError(new Error(pbT('den_har_fargen_saknar_verifierade_tryckytor', 'Den h\u00E4r f\u00E4rgen saknar verifierade tryckytor.')));\n\n    state.placements = placements;\n    var requestedPlacement = state.activePlacement || data.placement || '';\n    if (isAllPlacement(requestedPlacement) || placements.indexOf(requestedPlacement) < 0) {\n      requestedPlacement = getPreferredInitialPlacement(placements, data.selected && data.selected.placement);\n    }\n    state.activePlacement = requestedPlacement;\n\n    state.templatesByPlacement = {};\n    placements.forEach(function (placement) {\n      var template = state.allTemplates.find(function (item) { return String(item.placement) === String(placement); });\n      if (template) state.templatesByPlacement[placement] = template;\n    });\n  }\n\n  async function fetchTemplateData(placement, appearanceId) {\n    try {\n    var requestedAppearanceId = String(appearanceId || state.spreadconnectAppearanceId || '').trim();\n    var url = new URL(workerUrl + '/api/printbolt/template');\n    url.searchParams.set('productTypeId', String(state.spreadconnectProductTypeId || ''));\n    url.searchParams.set('appearanceId', requestedAppearanceId);\n    url.searchParams.set('placement', placement || state.activePlacement || 'front');\n    url.searchParams.set('technique', state.technique || 'auto');\n    url.searchParams.set('pb_resolver', 'designer-v601-production-area');\n\n    var res = await pbReadJsonResponse(url.toString(), { cache: 'no-store', headers: { 'Accept': 'application/json' } });\n    var data = await res.json().catch(function () { return {}; });\n\n    if (!res.ok || !data.ok || !Array.isArray(data.templates) || !data.templates.length) {\n      var emptyVerifiedTarget = data.provider === 'spreadconnect' &&\n        String(data.product_type_id || '') === String(state.spreadconnectProductTypeId) &&\n        String(data.appearance_id || '') === requestedAppearanceId && data.summary && Array.isArray(data.diagnostics) &&\n        ((res.status === 503 && data.ok === false) || (res.ok && data.ok && Array.isArray(data.templates) && !data.templates.length));\n      \n      throw new Error(pbTranslatedError(data.error) || data.detail || pbT('tryckfaltet_ar_inte_tillgangligt_designverktyget_kan_inte_anvandas_for_denna_produkt_just_nu', 'Tryckf\u00E4ltet \u00E4r inte tillg\u00E4ngligt. Designverktyget kan inte anv\u00E4ndas f\u00F6r denna produkt just nu.'));\n    }\n\n    return data;\n    } catch (error) {\n      throw pbCriticalTemplateError(error, res && res.status);\n    }\n  }\n\n  function templateMatchesActiveTechnique(template) {\n    var wanted = normalizeTechniqueId(state.technique || 'auto');\n    var actual = normalizeTechniqueId(template && template.technique || '');\n\n    if (!wanted || wanted === 'auto' || !actual) return true;\n\n    // Important:\n    // DTG and DTF/DTFilm are different print methods and have different placements.\n    // Earlier we treated \"everything that is not embroidery\" as normal print,\n    // which made Front DTF, Back DTF, Large DTF etc show on DTG products.\n    return actual === wanted;\n  }\n\n  function normalizeTechniqueId(value) {\n    var v = String(value || '').trim().toLowerCase();\n\n    if (!v) return '';\n    if (v.indexOf('embro') >= 0) return 'embroidery';\n    if (v === 'dtf' || v === 'dtfilm' || v.indexOf('dtfilm') >= 0 || v.indexOf('film') >= 0) return 'dtfilm';\n    if (v === 'digital') return 'digital';\n    if (v === 'uv') return 'uv';\n    if (v === 'sublimation') return 'sublimation';\n    if (v === 'cut-sew' || v === 'cut_sew') return 'cut-sew';\n    if (v === 'dtg' || v.indexOf('direct-to-garment') >= 0) return 'dtg';\n\n    return v;\n  }\n\n\n\n\n  function templateHasCatalogVariant(template, catalogVariantId) {\n    var id = Number(catalogVariantId || 0);\n    if (!id) return false;\n    return getTemplateVariantIds(template).indexOf(id) >= 0;\n  }\n\n  function getTemplateVariantIds(template) {\n    var ids = [];\n    collectTemplateVariantIds(template?.catalog_variant_ids, ids);\n    collectTemplateVariantIds(template?.restricted_to_variants, ids);\n    collectTemplateVariantIds(template?.variant_ids, ids);\n    collectTemplateVariantIds(template?.variants, ids);\n    collectTemplateVariantIds(template?.catalog_variants, ids);\n    collectTemplateVariantIds(template?.variant_mapping, ids);\n    collectTemplateVariantIds(template?.catalog_variant_id, ids);\n    collectTemplateVariantIds(template?.variant_id, ids);\n    return uniqueNumberValues(ids);\n  }\n\n  function collectTemplateVariantIds(value, out) {\n    if (value === null || value === undefined || value === '') return;\n\n    if (Array.isArray(value)) {\n      value.forEach(function (entry) { collectTemplateVariantIds(entry, out); });\n      return;\n    }\n\n    if (typeof value === 'object') {\n      [\n        value.id,\n        value.catalog_variant_id,\n        value.catalogVariantId,\n        value.variant_id,\n        value.variantId,\n        value.catalog_variant_ids,\n        value.restricted_to_variants,\n        value.variant_ids,\n        value.variants\n      ].forEach(function (entry) {\n        collectTemplateVariantIds(entry, out);\n      });\n      return;\n    }\n\n    var n = Number(value);\n    if (Number.isFinite(n) && n > 0) out.push(n);\n  }\n\n  function uniqueNumberValues(values) {\n    var seen = {};\n    var out = [];\n    (values || []).forEach(function (value) {\n      var n = Number(value || 0);\n      if (!Number.isFinite(n) || n <= 0 || seen[n]) return;\n      seen[n] = true;\n      out.push(n);\n    });\n    return out;\n  }\n\n  function getUniquePlacements(templates) {\n    var seen = {};\n    var out = [];\n\n    (templates || []).forEach(function (template) {\n      var placement = String(template.placement || '').trim();\n      if (!placement || seen[placement]) return;\n      seen[placement] = true;\n      out.push(placement);\n    });\n\n    return sortPlacements(out);\n  }\n\n  function isAllPlacement(placement) {\n    var key = String(placement || '').toLowerCase();\n    return key === 'all' || key === '__all' || key === '*';\n  }\n\n  function getPreferredInitialPlacement(placements, selectedPlacement) {\n    var sorted = sortPlacements(placements || []);\n\n    if (sorted.length) {\n      return sorted[0];\n    }\n\n    return selectedPlacement || 'front';\n  }\n\n  function sortPlacements(placements) {\n    return (placements || []).slice().sort(function (a, b) {\n      var diff = getPlacementSortScore(a) - getPlacementSortScore(b);\n      if (diff !== 0) return diff;\n      return getPlacementLabel(a).localeCompare(getPlacementLabel(b), pbLocale);\n    });\n  }\n\n  function getPlacementSortScore(placement) {\n    var key = String(placement || '').toLowerCase();\n\n    // Labels should always be last. They are technically available templates,\n    // but they should not be the first thing the customer sees.\n    if (key.indexOf('label') >= 0) return 900;\n    if (key.indexOf('inside') >= 0 && key.indexOf('label') >= 0) return 910;\n    if (key.indexOf('outside') >= 0 && key.indexOf('label') >= 0) return 920;\n\n    // Natural customer-facing order.\n    if (key === 'front' || key === 'embroidery_front') return 10;\n    if (key.indexOf('front') >= 0 && key.indexOf('embro') < 0) return 20;\n    if (key.indexOf('front') >= 0 && key.indexOf('embro') >= 0) return 30;\n\n    if (key === 'back' || key === 'embroidery_back') return 100;\n    if (key.indexOf('back') >= 0) return 110;\n\n    if (key.indexOf('chest_center') >= 0 || key.indexOf('center_chest') >= 0) return 200;\n    if (key.indexOf('chest_left') >= 0 || key.indexOf('left_chest') >= 0) return 210;\n    if (key.indexOf('chest_right') >= 0 || key.indexOf('right_chest') >= 0) return 220;\n\n    if (key.indexOf('sleeve_left') >= 0 || key.indexOf('left_sleeve') >= 0) return 300;\n    if (key.indexOf('sleeve_right') >= 0 || key.indexOf('right_sleeve') >= 0) return 310;\n    if (key.indexOf('sleeve') >= 0) return 320;\n\n    if (key.indexOf('left') >= 0) return 400;\n    if (key.indexOf('right') >= 0) return 410;\n\n    // Everything else after the common placements, but before labels.\n    return 600;\n  }\n\n  function selectLocalTemplate(placement) {\n    var list = (state.allTemplates || []).filter(function (template) {\n      return String(template.placement || '') === String(placement || '') && templateMatchesActiveTechnique(template);\n    });\n\n    if (!list.length) return null;\n\n    var variantId = Number(state.catalogVariantId || 0);\n\n    var exact = list.filter(function (template) {\n      return templateHasCatalogVariant(template, variantId);\n    });\n\n    if (exact.length) {\n      return exact.find(function (template) { return template.role === 'primary'; }) || exact[0];\n    }\n\n    var generic = list.filter(function (template) {\n      return getTemplateVariantIds(template).length === 0;\n    });\n\n    if (generic.length) {\n      return generic.find(function (template) { return template.role === 'primary'; }) || generic[0];\n    }\n\n    return list.find(function (template) { return template.role === 'primary'; }) || list[0] || null;\n  }\n\n\n  function sanitizeProductDescription(html) {\n    var raw = String(html || '').trim();\n    if (!raw) return '';\n\n    var doc = new DOMParser().parseFromString(raw, 'text/html');\n    doc.querySelectorAll('script, style, iframe, object, embed, form, input, button').forEach(function (node) {\n      node.remove();\n    });\n\n    doc.querySelectorAll('*').forEach(function (node) {\n      Array.from(node.attributes || []).forEach(function (attr) {\n        var name = String(attr.name || '').toLowerCase();\n        var value = String(attr.value || '');\n        if (name.indexOf('on') === 0) node.removeAttribute(attr.name);\n        if ((name === 'href' || name === 'src') && /^\\s*javascript:/i.test(value)) node.removeAttribute(attr.name);\n      });\n    });\n\n    return doc.body.innerHTML.trim();\n  }\n\n  function renderProductDetails() {\n    if (!els.productDetailsBody) return;\n\n    var html = sanitizeProductDescription(state.product?.description || state.product?.body_html || '');\n    if (!html) {\n      html = '<p>' + escapeHtml(pbT('produktinformation_saknas_for_den_har_produkten', 'Produktinformation saknas f\u00F6r den h\u00E4r produkten.')) + '</p>';\n    }\n\n    els.productDetailsBody.innerHTML = html;\n  }\n\n  // v499: remember when product details (the size chart) was opened from the\n  // size/quantity panel, so closing it can restore the exact previous view.\n  var productDetailsReturnView = '';\n\n  function openProductDetailsPanel(options) {\n    if (!els.productDetails) return;\n\n    options = options || {};\n    productDetailsReturnView = options.returnTo === 'size' ? 'size' : '';\n\n    closeTextEditor();\n    closeImageEditor();\n    closeSizeModal();\n    closeColorPanel();\n    closeAiPanel();\n    renderProductDetails();\n\n    if (els.sidePanel) els.sidePanel.classList.add('is-product-details-active');\n    els.productDetails.hidden = false;\n  }\n\n  function closeProductDetailsPanel() {\n    productDetailsReturnView = '';\n    if (els.sidePanel) els.sidePanel.classList.remove('is-product-details-active');\n    if (els.productDetails) els.productDetails.hidden = true;\n  }\n\n  function closeProductDetailsPanelAndRestoreOrigin() {\n    var returnView = productDetailsReturnView;\n    closeProductDetailsPanel();\n\n    if (returnView === 'size') {\n      openSizeModal();\n    }\n  }\n\n  function openColorPanel() {\n    if (!els.colorPanel) return;\n\n    closeTextEditor();\n    closeImageEditor();\n    closeProductDetailsPanel();\n    closeSizeModal();\n\n    if (els.sidePanel) els.sidePanel.classList.add('is-color-panel-active');\n    root.classList.toggle('is-mobile-color-panel-open', isMobileEditorLayout());\n    closeMobileAddBar();\n    renderColors();\n    els.colorPanel.hidden = false;\n  }\n\n  function closeColorPanel() {\n    root.classList.remove('is-mobile-color-panel-open');\n    if (els.sidePanel) els.sidePanel.classList.remove('is-color-panel-active');\n    if (els.colorPanel) els.colorPanel.hidden = true;\n  }\n\n  function renderAll() {\n    renderProductMeta();\n    renderColors();\n    renderPlacements();\n    renderTemplate(state.templatesByPlacement[state.activePlacement]);\n    renderDesign();\n  }\n\n  function getBaseProductPriceCents() {\n    return Number((state.variant && state.variant.price) || (state.product && state.product.price) || 0);\n  }\n\n  function getCurrentProductUnitPriceCents() {\n    return getBaseProductPriceCents() + (getCurrentExtraPrintAreaCount() * EXTRA_PRINT_AREA_PRICE_CENTS);\n  }\n\n  function setPriceLoadingState(isLoading) {\n    if (!els.priceWrap) return;\n    var active = Boolean(isLoading);\n    els.priceWrap.setAttribute('aria-busy', active ? 'true' : 'false');\n\n    if (active) {\n      els.priceWrap.classList.add('is-price-loading');\n      els.priceWrap.classList.remove('is-price-revealed');\n      return;\n    }\n\n    window.requestAnimationFrame(function () {\n      if (!els.priceWrap) return;\n      els.priceWrap.classList.remove('is-price-loading');\n      window.requestAnimationFrame(function () {\n        if (els.priceWrap) els.priceWrap.classList.add('is-price-revealed');\n      });\n    });\n  }\n\n  function updateDisplayedProductPrice() {\n    if (!els.price) return;\n\n    // Keep the skeleton visible until Shopify has resolved an actual variant.\n    // A legitimate free product may still be 0 kr, so variant readiness\u2014not price > 0\u2014is the signal.\n    if (!state.product || !state.variant) {\n      els.price.textContent = '';\n      setPriceLoadingState(true);\n      return;\n    }\n\n    els.price.textContent = formatMoney(getCurrentProductUnitPriceCents());\n    setPriceLoadingState(false);\n  }\n\n  function setProductMetaLoadingState(isLoading) {\n    if (!els.productHead) return;\n    var active = Boolean(isLoading);\n\n    if (active) {\n      els.productHead.classList.add('is-meta-loading');\n      els.productHead.classList.remove('is-meta-revealed');\n      els.productHead.setAttribute('aria-busy', 'true');\n      if (els.productLink) {\n        els.productLink.tabIndex = -1;\n        els.productLink.setAttribute('aria-hidden', 'true');\n      }\n      return;\n    }\n\n    // v316: let the browser paint the loaded title first, then cross-fade from\n    // skeleton -> real product meta. This avoids the title popping in instantly.\n    els.productHead.setAttribute('aria-busy', 'false');\n    window.requestAnimationFrame(function () {\n      if (!els.productHead) return;\n      els.productHead.classList.remove('is-meta-loading');\n      window.requestAnimationFrame(function () {\n        if (!els.productHead) return;\n        els.productHead.classList.add('is-meta-revealed');\n        if (els.productLink) {\n          els.productLink.tabIndex = 0;\n          els.productLink.setAttribute('aria-hidden', 'false');\n        }\n      });\n    });\n  }\n\n  function renderProductMeta() {\n    if (!state.product || !state.variant) return;\n    els.productTitle.textContent = state.product.title || pbT('produkt', 'Produkt');\n    setProductMetaLoadingState(false);\n    if (els.colorName) els.colorName.textContent = state.activeColor || pbT('standard', 'Standard');\n    if (els.selectedColorName) els.selectedColorName.textContent = state.activeColor || pbT('standard', 'Standard');\n    if (els.mobileSelectedColorName) els.mobileSelectedColorName.textContent = state.activeColor || pbT('standard', 'Standard');\n    if (els.sizeColorName) els.sizeColorName.textContent = state.activeColor || pbT('standard', 'Standard');\n    updateDisplayedProductPrice();\n  }\n\n  function renderColors() {\n    var colors = getColorGroups();\n\n    if (!els.colorsWrap || !els.colors) return;\n\n    if (colors.length <= 1 && (colors[0]?.name || pbT('standard', 'Standard')) === pbT('standard', 'Standard')) {\n      els.colorsWrap.hidden = true;\n      if (els.mobileStageColor) els.mobileStageColor.hidden = true;\n      if (els.mobileColorNav) els.mobileColorNav.hidden = true;\n      root.classList.remove('has-mobile-color-nav');\n      return;\n    }\n\n    els.colorsWrap.hidden = false;\n    if (els.mobileStageColor) els.mobileStageColor.hidden = false;\n    if (els.mobileColorNav) els.mobileColorNav.hidden = false;\n    root.classList.add('has-mobile-color-nav');\n\n    var activeGroup = colors.find(function (group) {\n      return group.name === state.activeColor;\n    }) || colors[0] || null;\n\n    if (activeGroup) {\n      var activeImage = getVariantImage(activeGroup.variant) || getProductImage() || '';\n      if (els.colorName) els.colorName.textContent = activeGroup.name || state.activeColor || pbT('standard', 'Standard');\n      if (els.selectedColorName) els.selectedColorName.textContent = activeGroup.name || state.activeColor || pbT('standard', 'Standard');\n      if (els.mobileSelectedColorName) els.mobileSelectedColorName.textContent = activeGroup.name || state.activeColor || pbT('standard', 'Standard');\n      if (els.sizeColorName) els.sizeColorName.textContent = activeGroup.name || state.activeColor || pbT('standard', 'Standard');\n      if (els.selectedColorStock) els.selectedColorStock.hidden = Boolean(activeGroup.available);\n      if (els.mobileSelectedColorStock) els.mobileSelectedColorStock.hidden = Boolean(activeGroup.available);\n      if (els.colorsWrap) els.colorsWrap.classList.toggle('has-unavailable-active', !activeGroup.available);\n      if (els.selectedColorImg) {\n        els.selectedColorImg.src = activeImage;\n        els.selectedColorImg.alt = activeGroup.name || state.activeColor || pbT('vald_farg', 'Vald f\u00E4rg');\n      }\n      if (els.mobileColorSwatch) {\n        els.mobileColorSwatch.style.backgroundImage = activeImage ? 'url(\"' + activeImage.replace(/\"/g, '%22') + '\")' : '';\n        els.mobileColorSwatch.setAttribute('title', activeGroup.name || state.activeColor || pbT('vald_farg', 'Vald f\u00E4rg'));\n      }\n      if (els.mobileColorNav) {\n        els.mobileColorNav.setAttribute('aria-label', pbT('byt_farg_vald_farg', 'Byt f\u00E4rg. Vald f\u00E4rg: ') + (activeGroup.name || state.activeColor || pbT('standard', 'Standard')));\n      }\n      if (els.mobileSelectedColorImg) {\n        els.mobileSelectedColorImg.src = activeImage;\n        els.mobileSelectedColorImg.alt = activeGroup.name || state.activeColor || pbT('vald_farg', 'Vald f\u00E4rg');\n      }\n    }\n\n    els.colors.innerHTML = '';\n\n    colors.forEach(function (group) {\n      var isActive = group.name === state.activeColor;\n      var isAvailable = Boolean(group.available);\n\n      var btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'pb-color pb-color--choice' + (isActive ? ' is-active' : '') + (!isAvailable ? ' is-unavailable' : '');\n      btn.title = isAvailable ? group.name : group.name + pbT('ej_i_lager_2', ' - Ej i lager');\n      btn.setAttribute('aria-label', btn.title);\n      btn.setAttribute('aria-disabled', isAvailable ? 'false' : 'true');\n      btn.dataset.color = group.name;\n\n      var img = document.createElement('img');\n      img.src = getVariantImage(group.variant) || getProductImage() || '';\n      img.alt = group.name;\n      btn.appendChild(img);\n\n      var label = document.createElement('span');\n      label.className = 'pb-color__name';\n      label.textContent = group.name;\n      btn.appendChild(label);\n\n      if (!isAvailable) {\n        var stock = document.createElement('span');\n        stock.className = 'pb-color__stock';\n        stock.textContent = isDirectDesignRevisionEdit() ? pbT('ej_i_lager_i_storlek', 'Ej i lager i storlek ') + getVariantSize(state.variant) : pbT('ej_i_lager', 'Ej i lager');\n        btn.appendChild(stock);\n      }\n\n      btn.addEventListener('click', async function () {\n        if (!isAvailable) {\n          setStatus(isDirectDesignRevisionEdit() ? pbT('den_har_fargen_finns_inte_i_lager_i_storlek', 'Den h\u00E4r f\u00E4rgen finns inte i lager i storlek ') + getVariantSize(state.variant) + '.' : pbT('den_har_fargen_ar_inte_i_lager_just_nu', 'Den h\u00E4r f\u00E4rgen \u00E4r inte i lager just nu.'), true);\n          return;\n        }\n\n        await changeColor(group.name);\n        closeColorPanel();\n      });\n\n      els.colors.appendChild(btn);\n    });\n  }\n\n  function getColorGroups() {\n    var groups = {};\n    var editSize = isDirectDesignRevisionEdit() ? getVariantSize(state.variant) : null;\n\n    (state.product?.variants || []).forEach(function (variant) {\n      var color = getVariantColor(variant);\n      if (!groups[color]) {\n        groups[color] = {\n          name: color,\n          variant: variant,\n          availableVariant: null,\n          available: false\n        };\n      }\n\n      var availableForSize = variant.available && (editSize === null || getVariantSize(variant) === editSize);\n      if (availableForSize && !groups[color].availableVariant) {\n        groups[color].availableVariant = variant;\n        groups[color].variant = variant;\n      }\n\n      if (availableForSize) {\n        groups[color].available = true;\n      }\n\n      if (String(variant.id) === String(state.variant?.id)) {\n        groups[color].variant = variant;\n      }\n    });\n\n    return Object.keys(groups).map(function (key) { return groups[key]; });\n  }\n\n  async function changeColor(color) {\n    if (!state.product) return;\n\n    var currentSize = getVariantSize(state.variant);\n    var variants = state.product.variants || [];\n    var next = variants.find(function (variant) {\n      return getVariantColor(variant) === color && getVariantSize(variant) === currentSize && variant.available;\n    }) || (!isDirectDesignRevisionEdit() && variants.find(function (variant) {\n      return getVariantColor(variant) === color && variant.available;\n    }));\n\n    if (!next) {\n      setStatus(pbT('den_har_fargen_finns_inte_i_lager_i_storlek', 'Den h\u00E4r f\u00E4rgen finns inte i lager i storlek ') + currentSize + '.', true);\n      return;\n    }\n\n    state.variant = next;\n    state.shopifyVariantId = String(next.id);\n    state.activeColor = getVariantColor(next);\n    syncSpreadconnectVariantMapping();\n    state.quantities = {};\n\n    try {\n      setLoading(true);\n      await discoverTemplatesForCurrentVariant();\n      renderAll();\n      await waitForTemplateImageReady();\n      setLoading(false);\n    } catch (error) {\n      setLoading(false);\n      setStatus(error.message, true);\n      if (error && error.pbCriticalTemplate) {\n        pbShowLoadFailure(error, async function () {\n          await discoverTemplatesForCurrentVariant();\n          renderAll();\n          await waitForTemplateImageReady();\n          setLoading(false);\n        }, function () {});\n      }\n    }\n  }\n\n  function renderPlacements() {\n    syncPlacementDesignOrder();\n\n    var availablePlacements = state.placements.filter(function (placement) {\n      return state.templatesByPlacement[placement] || selectLocalTemplate(placement);\n    });\n\n    var desktopWrap = document.createElement('div');\n    desktopWrap.className = 'pb-placements-desktop';\n\n    availablePlacements.forEach(function (placement) {\n      var template = state.templatesByPlacement[placement] || selectLocalTemplate(placement);\n      if (!template) return;\n\n      var d = getDesignState(placement, false);\n      var btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'pb-placement' + (placement === state.activePlacement ? ' is-active' : '') + (hasDesignContent(d) ? ' has-design' : '');\n      btn.dataset.placement = placement;\n\n      var imgWrap = document.createElement('span');\n      imgWrap.className = 'pb-placement__img';\n      var img = document.createElement('img');\n      // v317: every placement thumbnail owns the same intrinsic box immediately.\n      img.width = 60;\n      img.height = 60;\n      img.src = template.image_url || getProductImage() || '';\n      img.alt = getPlacementLabel(placement);\n      imgWrap.appendChild(img);\n\n      var label = document.createElement('span');\n      label.className = 'pb-placement__label';\n      label.textContent = getPlacementLabel(placement);\n\n      btn.appendChild(imgWrap);\n      btn.appendChild(label);\n      btn.addEventListener('click', function () {\n        switchPlacement(placement);\n      });\n\n      desktopWrap.appendChild(btn);\n    });\n\n    var placementFragment = document.createDocumentFragment();\n    placementFragment.appendChild(desktopWrap);\n\n    if (availablePlacements.length > 1) {\n      var activeIndex = Math.max(0, availablePlacements.indexOf(state.activePlacement));\n\n      var mobileNav = document.createElement('div');\n      mobileNav.className = 'pb-mobile-placement-nav';\n\n      var prev = document.createElement('button');\n      prev.type = 'button';\n      prev.className = 'pb-mobile-placement-nav__arrow';\n      prev.setAttribute('aria-label', pbT('foregaende_tryckyta', 'F\u00F6reg\u00E5ende tryckyta'));\n      prev.textContent = '\u2039';\n      var prevIndex = (activeIndex - 1 + availablePlacements.length) % availablePlacements.length;\n      prev.setAttribute('data-pb-mobile-placement-target', availablePlacements[prevIndex]);\n\n      var center = document.createElement('div');\n      center.className = 'pb-mobile-placement-nav__center';\n\n      var dots = document.createElement('div');\n      dots.className = 'pb-mobile-placement-nav__dots';\n      availablePlacements.forEach(function (placement, index) {\n        var dot = document.createElement('button');\n        dot.type = 'button';\n        dot.className = 'pb-mobile-placement-nav__dot' + (index === activeIndex ? ' is-active' : '') + (hasDesignContent(getDesignState(placement, false)) ? ' has-design' : '');\n        dot.setAttribute('aria-label', getPlacementLabel(placement));\n        dot.setAttribute('data-pb-mobile-placement-target', placement);\n        dots.appendChild(dot);\n      });\n\n      var activeLabel = document.createElement('div');\n      activeLabel.className = 'pb-mobile-placement-nav__label';\n      activeLabel.textContent = getPlacementLabel(state.activePlacement);\n\n      center.appendChild(dots);\n      center.appendChild(activeLabel);\n\n      var next = document.createElement('button');\n      next.type = 'button';\n      next.className = 'pb-mobile-placement-nav__arrow';\n      next.setAttribute('aria-label', pbT('nasta_tryckyta', 'N\u00E4sta tryckyta'));\n      next.textContent = '\u203A';\n      var nextIndex = (activeIndex + 1) % availablePlacements.length;\n      next.setAttribute('data-pb-mobile-placement-target', availablePlacements[nextIndex]);\n\n      mobileNav.appendChild(prev);\n      mobileNav.appendChild(center);\n      mobileNav.appendChild(next);\n      placementFragment.appendChild(mobileNav);\n    } else if (availablePlacements.length === 1) {\n      var singleMobileNav = document.createElement('div');\n      singleMobileNav.className = 'pb-mobile-placement-nav pb-mobile-placement-nav--single';\n\n      var singleLabel = document.createElement('div');\n      singleLabel.className = 'pb-mobile-placement-nav__label';\n      singleLabel.textContent = getPlacementLabel(availablePlacements[0]);\n\n      singleMobileNav.appendChild(singleLabel);\n      placementFragment.appendChild(singleMobileNav);\n    }\n\n    // One atomic swap: the outer placement rail never temporarily collapses.\n    els.placements.replaceChildren(placementFragment);\n  }\n\n  function switchPlacement(placement) {\n    placement = String(placement || '').trim();\n    if (!placement || placement === state.activePlacement) return;\n\n    var nextTemplate = state.templatesByPlacement[placement] || selectLocalTemplate(placement);\n    if (!nextTemplate) {\n      setStatus(pbT('kunde_inte_oppna_tryckytan', 'Kunde inte \u00F6ppna tryckytan ') + getPlacementLabel(placement) + '.', true);\n      return;\n    }\n\n    // Close editors that belong to the OLD placement before changing state.\n    // A UI cleanup error must never prevent the actual placement switch.\n    try { closeTextEditor(); } catch (error) { console.warn('Placement switch: closeTextEditor failed', error); }\n    try { closeImageEditor(); } catch (error) { console.warn('Placement switch: closeImageEditor failed', error); }\n    try { closeMobileAddBar(); } catch (error) { console.warn('Placement switch: closeMobileAddBar failed', error); }\n    try { clearSnapGuides(); } catch (error) { console.warn('Placement switch: clearSnapGuides failed', error); }\n\n    state.activeImageLayerId = '';\n    state.activePrimarySelected = false;\n    state.templatesByPlacement[placement] = nextTemplate;\n    state.activePlacement = placement;\n\n    // Paint the active state first, then swap the actual product/view.\n    renderPlacements();\n\n    try {\n      renderTemplate(nextTemplate);\n      renderDesign();\n      updateMobileEmptyActions();\n    } catch (error) {\n      console.error('Placement switch failed after state update:', error);\n      setStatus(pbT('kunde_inte_visa_tryckytan', 'Kunde inte visa tryckytan ') + getPlacementLabel(placement) + ': ' + (error.message || String(error)), true);\n    }\n  }\n\n  function parseColorToRgb(value) {\n    value = String(value || '').trim().toLowerCase();\n    if (!value || value === 'transparent') return null;\n\n    var hex = value.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);\n    if (hex) {\n      var h = hex[1];\n      if (h.length === 3) {\n        h = h.split('').map(function (char) { return char + char; }).join('');\n      }\n\n      return {\n        r: parseInt(h.slice(0, 2), 16),\n        g: parseInt(h.slice(2, 4), 16),\n        b: parseInt(h.slice(4, 6), 16)\n      };\n    }\n\n    var rgb = value.match(/^rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})/i);\n    if (rgb) {\n      return {\n        r: Math.max(0, Math.min(255, Number(rgb[1]))),\n        g: Math.max(0, Math.min(255, Number(rgb[2]))),\n        b: Math.max(0, Math.min(255, Number(rgb[3])))\n      };\n    }\n\n    return null;\n  }\n\n\n\n  function escapeSoftMaskXmlAttr(value) {\n    return String(value === undefined || value === null ? '' : value)\n      .replace(/&/g, '&amp;')\n      .replace(/\"/g, '&quot;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n  }\n\n\n\n  function clearSoftBoundaryArtworkMask() {\n    if (root) root.classList.remove('has-soft-print-clip');\n    if (!els.artworkMask) return;\n    els.artworkMask.style.removeProperty('mask-image');\n    els.artworkMask.style.removeProperty('mask-size');\n    els.artworkMask.style.removeProperty('mask-position');\n    els.artworkMask.style.removeProperty('mask-repeat');\n    els.artworkMask.style.removeProperty('-webkit-mask-image');\n    els.artworkMask.style.removeProperty('-webkit-mask-size');\n    els.artworkMask.style.removeProperty('-webkit-mask-position');\n    els.artworkMask.style.removeProperty('-webkit-mask-repeat');\n    els.artworkMask.removeAttribute('data-pb-soft-mask-active');\n  }\n\n\n\n  function ensureSoftBoundaryOverlay() {\n    if (!els.printArea) return null;\n    var existing = els.printArea.querySelector('[data-pb-soft-boundary]');\n    if (existing) return existing;\n\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('data-pb-soft-boundary', '');\n    svg.setAttribute('aria-hidden', 'true');\n    svg.setAttribute('focusable', 'false');\n    svg.classList.add('pb-customizer__soft-boundary');\n    svg.setAttribute('data-pb-soft-boundary-version', 'v381');\n    els.printArea.insertBefore(svg, els.printArea.firstChild || null);\n    return svg;\n  }\n\n  function renderSoftBoundary(template) {\n    if (!els.printArea) return;\n    var soft = template && template.soft_boundary;\n    var svg = els.printArea.querySelector('[data-pb-soft-boundary]');\n\n    if (!soft || !soft.view_box || !soft.shapes) {\n      if (svg) svg.remove();\n      clearSoftBoundaryArtworkMask();\n      root.classList.remove('has-soft-print-boundary');\n      return;\n    }\n\n    var vbWidth = Number(soft.view_box.width || 0);\n    var vbHeight = Number(soft.view_box.height || 0);\n    if (!(vbWidth > 0) || !(vbHeight > 0)) {\n      if (svg) svg.remove();\n      clearSoftBoundaryArtworkMask();\n      root.classList.remove('has-soft-print-boundary');\n      return;\n    }\n\n    svg = ensureSoftBoundaryOverlay();\n    while (svg.firstChild) svg.removeChild(svg.firstChild);\n    svg.setAttribute('viewBox', Number(soft.view_box.x || 0) + ' ' + Number(soft.view_box.y || 0) + ' ' + vbWidth + ' ' + vbHeight);\n    svg.setAttribute('preserveAspectRatio', 'none');\n\n    var attributeWhitelist = {\n      path: ['d'],\n      rect: ['x', 'y', 'width', 'height', 'rx', 'ry'],\n      circle: ['cx', 'cy', 'r'],\n      ellipse: ['cx', 'cy', 'rx', 'ry'],\n      polygon: ['points'],\n      polyline: ['points'],\n      line: ['x1', 'y1', 'x2', 'y2']\n    };\n\n    Object.keys(attributeWhitelist).forEach(function (tag) {\n      var nodes = Array.isArray(soft.shapes[tag]) ? soft.shapes[tag] : [];\n      nodes.forEach(function (raw) {\n        if (!raw || typeof raw !== 'object') return;\n        var node = document.createElementNS('http://www.w3.org/2000/svg', tag);\n        attributeWhitelist[tag].forEach(function (key) {\n          if (raw[key] !== undefined && raw[key] !== null && String(raw[key]).trim()) {\n            node.setAttribute(key, String(raw[key]));\n          }\n        });\n        node.setAttribute('vector-effect', 'non-scaling-stroke');\n        svg.appendChild(node);\n      });\n    });\n\n    var hasGuide = svg.childNodes.length > 0;\n\n    // v381: do not mask the entire artwork/control wrapper. The actual artwork\n    // pixels are clipped object-by-object in applyPrimaryDesignVisualClip() and\n    // applyImageLayerVisualClip(), exactly like the existing hard-edge clipping.\n    clearSoftBoundaryArtworkMask();\n    root.classList.toggle('has-soft-print-boundary', hasGuide);\n    root.classList.toggle('has-soft-print-clip', hasGuide);\n\n    var activeDesignState = getDesignState(state.activePlacement, false);\n    if (activeDesignState) {\n      applyPrimaryDesignVisualClip(activeDesignState);\n      (activeDesignState.imageLayers || []).forEach(function (layer) {\n        var layerNode = getImageLayerNode(layer.id);\n        if (layerNode) applyImageLayerVisualClip(layerNode, layer);\n      });\n    }\n  }\n\n  function applyPrintAreaGuideVisual() {\n    if (!els.printArea || !root) return;\n\n    var visible = root.classList.contains('is-print-area-guide-visible');\n\n    // v287: the final line color comes directly from the Worker, which derives\n    // it exclusively from FF appearance.colors[].value for the requested\n    // appearanceId. No localized names, template background or CSS contrast\n    // state participates in the color decision.\n    var lineColor = String(state.spreadconnectPrintAreaGuideColor || '').trim();\n\n    // Fail visibly-neutral only if FF did not return a usable color. This is\n    // not a garment-color guess; it simply prevents broken CSS.\n    if (!lineColor) lineColor = 'rgba(17, 24, 39, .92)';\n\n    els.printArea.style.setProperty('border-style', 'dashed', 'important');\n    els.printArea.style.setProperty('border-width', '2px', 'important');\n    els.printArea.style.setProperty('border-color', visible ? lineColor : 'transparent', 'important');\n    els.printArea.style.setProperty('background', 'transparent', 'important');\n    els.printArea.style.setProperty('box-shadow', 'none', 'important');\n    els.printArea.style.setProperty('--pb-print-area-line', lineColor);\n    els.printArea.style.setProperty('--pb-print-area-fill', 'transparent');\n  }\n\n  function updatePrintAreaContrast(template) {\n    if (!els.printArea || !root) return;\n\n    var guideColor = String(\n      (template && template.print_area_guide_color) ||\n      state.spreadconnectPrintAreaGuideColor ||\n      ''\n    ).trim();\n\n    if (guideColor) state.spreadconnectPrintAreaGuideColor = guideColor;\n\n    // Keep these classes only for legacy layout selectors. They no longer\n    // determine the guide color in v286.\n    var explicitContrast = String(\n      (template && template.appearance_contrast) ||\n      state.spreadconnectAppearanceContrast ||\n      ''\n    ).trim().toLowerCase();\n\n    root.classList.toggle('is-print-area-on-light', explicitContrast === 'light');\n    root.classList.toggle('is-print-area-on-dark', explicitContrast === 'dark');\n    if (explicitContrast === 'light' || explicitContrast === 'dark') {\n      root.dataset.printAreaContrast = explicitContrast;\n    } else {\n      delete root.dataset.printAreaContrast;\n    }\n\n    root.dataset.printAreaGuideSource = guideColor ? 'ff' : 'missing';\n    applyPrintAreaGuideVisual();\n  }\n\n  function getTemplatePrintFileWidth(template) {\n    return Number(\n      template?.print_file_width ||\n      template?.printfile_width ||\n      template?.output_width ||\n      template?.print_area_width ||\n      0\n    );\n  }\n\n  function getTemplatePrintFileHeight(template) {\n    return Number(\n      template?.print_file_height ||\n      template?.printfile_height ||\n      template?.output_height ||\n      template?.print_area_height ||\n      0\n    );\n  }\n\n  function getTemplatePrintFileDpi(template) {\n    return Number(\n      template?.print_file_dpi ||\n      template?.print_area_dpi ||\n      template?.dpi ||\n      150\n    ) || 150;\n  }\n\n  function renderTemplate(template) {\n    if (!template) return;\n\n    var tw = Number(template.template_width || 1);\n    var th = Number(template.template_height || 1);\n\n    els.stage.style.aspectRatio = tw + ' / ' + th;\n\n    var nextBackgroundImage = template.background_url ? 'url(' + template.background_url + ')' : '';\n    var nextBackgroundColor = template.background_color || '#eeeeee';\n\n    updatePrintAreaContrast(template);\n    renderSoftBoundary(template);\n    setTemplateVisuals(getTemplatePreviewImageUrl(template), nextBackgroundImage, nextBackgroundColor);\n\n    var left = (Number(template.print_area_left) / tw) * 100;\n    var top = (Number(template.print_area_top) / th) * 100;\n    var width = (Number(template.print_area_width) / tw) * 100;\n    var height = (Number(template.print_area_height) / th) * 100;\n\n    els.printArea.style.left = left + '%';\n    els.printArea.style.top = top + '%';\n    els.printArea.style.width = width + '%';\n    els.printArea.style.height = height + '%';\n\n    updateMobileZoomTarget();\n\n    window.requestAnimationFrame(function () {\n      updatePrintAreaEmptyActionSizing();\n      updateMobileEmptyActions();\n    });\n  }\n\n  var pbTemplateSwapToken = 0;\n  var pbTemplateImageReadyPromise = Promise.resolve({ token: 0, status: 'ready' });\n  var pbTemplateImageReadySettler = null;\n\n  function beginTemplateImageReadiness() {\n    // Settle the superseded request immediately. Its consumer can then follow\n    // the newest promise without retaining an event handler forever.\n    if (pbTemplateImageReadySettler) pbTemplateImageReadySettler('stale');\n\n    var token = ++pbTemplateSwapToken;\n    var settled = false;\n    var settle;\n    pbTemplateImageReadyPromise = new Promise(function (resolve) {\n      settle = function (status) {\n        if (settled) return;\n        settled = true;\n        if (pbTemplateImageReadySettler === settle) pbTemplateImageReadySettler = null;\n        resolve({ token: token, status: status });\n      };\n    });\n    pbTemplateImageReadySettler = settle;\n    return { token: token, settle: settle };\n  }\n\n  function applyTemplateBackground(bgImage, bgColor) {\n    if (!els.templateBg) return;\n\n    var surfaceColor = String(bgColor || '#f4f4f2').trim() || '#f4f4f2';\n\n    // v491: the padded frame, stage and loader share the exact same surface\n    // color as the active Spreadconnect template. Update them in the same\n    // operation so there is no lighter/darker frame flash while loading.\n    root.style.setProperty('--pb-stage-surface-color', surfaceColor);\n\n    els.templateBg.style.backgroundImage = bgImage || '';\n    els.templateBg.style.backgroundColor = surfaceColor;\n  }\n\n  function setTemplateVisuals(src, bgImage, bgColor) {\n    src = String(src || '').trim();\n    bgImage = String(bgImage || '');\n    bgColor = String(bgColor || '#eeeeee');\n\n    var readiness = beginTemplateImageReadiness();\n    var swapToken = readiness.token;\n    var settleReady = readiness.settle;\n\n    if (!els.templateImg) {\n      applyTemplateBackground(bgImage, bgColor);\n      settleReady('empty');\n      return;\n    }\n\n    var currentSrc = els.templateImg.getAttribute('src') || '';\n    var currentBgImage = els.templateBg ? String(els.templateBg.style.backgroundImage || '') : '';\n    var currentBgColor = els.templateBg ? String(els.templateBg.style.backgroundColor || '') : '';\n\n    if (!src) {\n      applyTemplateBackground(bgImage, bgColor);\n      els.templateImg.hidden = true;\n      els.templateImg.removeAttribute('src');\n      if (els.stage) els.stage.classList.remove('is-template-switching');\n      settleReady('empty');\n      return;\n    }\n\n    if (currentSrc === src && currentBgImage === bgImage && currentBgColor === bgColor && els.templateImg.complete && els.templateImg.naturalWidth) {\n      applyTemplateBackground(bgImage, bgColor);\n      els.templateImg.hidden = false;\n      if (els.stage) els.stage.classList.remove('is-template-switching');\n      settleReady('ready');\n      return;\n    }\n\n    function finalizeSwap() {\n      if (swapToken !== pbTemplateSwapToken) {\n        settleReady('stale');\n        return;\n      }\n      applyTemplateBackground(bgImage, bgColor);\n      els.templateImg.hidden = false;\n      els.templateImg.src = src;\n      settleReady('loaded');\n      if (els.stage) {\n        window.requestAnimationFrame(function () {\n          window.requestAnimationFrame(function () {\n            if (swapToken !== pbTemplateSwapToken) return;\n            els.stage.classList.remove('is-template-switching');\n          });\n        });\n      }\n    }\n\n    if (els.stage) els.stage.classList.add('is-template-switching');\n\n    var preloadImg = new Image();\n    preloadImg.decoding = 'async';\n    preloadImg.fetchPriority = 'high';\n    preloadImg.onload = finalizeSwap;\n    preloadImg.onerror = function () {\n      if (swapToken !== pbTemplateSwapToken) {\n        settleReady('stale');\n        return;\n      }\n      applyTemplateBackground(bgImage, bgColor);\n      els.templateImg.hidden = false;\n      els.templateImg.src = src;\n      settleReady('error');\n      if (els.stage) els.stage.classList.remove('is-template-switching');\n    };\n    preloadImg.src = src;\n  }\n\n  function waitForTemplateImageReady(expectedSwapToken) {\n    var targetToken = Number(expectedSwapToken || pbTemplateSwapToken);\n    var targetPromise = pbTemplateImageReadyPromise;\n    return targetPromise.then(function (result) {\n      // During initial boot the controls are already visible. If the customer\n      // switches placement before the first image settles, follow that newer\n      // request so its spinner is the one that gets dismissed.\n      if (targetToken !== pbTemplateSwapToken) return waitForTemplateImageReady(pbTemplateSwapToken);\n      return result;\n    });\n  }\n\n  function getTemplatePreviewImageUrl(template) {\n    // Use the supplier/template image first.\n    // Shopify variant images may already contain a printed placeholder/design and should not be used\n    // as the main designer preview.\n    return template?.image_url || state.catalogVariantImageUrl || getProductImage() || '';\n  }\n\n\n  function createEmptyDesignState() {\n    return {\n      designType: 'text',\n      text: '',\n      imageDataUrl: '',\n      sourceFileName: '',\n      imageNaturalWidth: 0,\n      imageNaturalHeight: 0,\n      imageLayers: [],\n      touched: false,\n      initialized: true,\n      design: { x: 25, y: 38, w: 50, h: 18, rotation: 0 }\n    };\n  }\n\n  function getDesignState(placement, create) {\n    if (!state.designsByPlacement[placement] && create !== false) {\n      state.designsByPlacement[placement] = createEmptyDesignState();\n    }\n    return state.designsByPlacement[placement] || null;\n  }\n\n  function clearSoftBoundaryObjectVisualMask(element) {\n    if (!element) return;\n    element.style.removeProperty('mask-image');\n    element.style.removeProperty('mask-size');\n    element.style.removeProperty('mask-position');\n    element.style.removeProperty('mask-repeat');\n    element.style.removeProperty('-webkit-mask-image');\n    element.style.removeProperty('-webkit-mask-size');\n    element.style.removeProperty('-webkit-mask-position');\n    element.style.removeProperty('-webkit-mask-repeat');\n    element.removeAttribute('data-pb-soft-object-mask');\n  }\n\n  function getActiveSoftBoundaryTemplate() {\n    return state && state.templatesByPlacement\n      ? (state.templatesByPlacement[state.activePlacement] || null)\n      : null;\n  }\n\n  function buildSoftBoundaryObjectMaskSvg(template, boxLike, flipX) {\n    var soft = template && template.soft_boundary;\n    if (!soft || !soft.view_box || !soft.shapes || !boxLike) return '';\n\n    var vbWidth = Number(soft.view_box.width || 0);\n    var vbHeight = Number(soft.view_box.height || 0);\n    if (!(vbWidth > 0) || !(vbHeight > 0)) return '';\n\n    var xPct = Number(boxLike.x || 0);\n    var yPct = Number(boxLike.y || 0);\n    var wPct = Math.max(0.0001, Number(boxLike.w || 0));\n    var hPct = Math.max(0.0001, Number(boxLike.h || 0));\n    var rotation = Number(boxLike.rotation || 0) * Math.PI / 180;\n\n    var objectX = (xPct / 100) * vbWidth;\n    var objectY = (yPct / 100) * vbHeight;\n    var objectW = (wPct / 100) * vbWidth;\n    var objectH = (hPct / 100) * vbHeight;\n    if (!(objectW > 0) || !(objectH > 0)) return '';\n\n    // Convert the supplier soft shape (hard-print-area coordinates) into this\n    // object's own local coordinate system. The artwork element itself is later\n    // rotated by the designer, so apply the inverse object rotation here.\n    var cx = objectX + objectW / 2;\n    var cy = objectY + objectH / 2;\n    var cos = Math.cos(rotation);\n    var sin = Math.sin(rotation);\n\n    // q = R(-theta) * (P - C) + C - objectOrigin\n    var a = cos;\n    var b = -sin;\n    var c = sin;\n    var d = cos;\n    var e = cx - objectX - cos * cx - sin * cy;\n    var f = cy - objectY + sin * cx - cos * cy;\n\n    // Supplier shapes use the full garment area; move them into the viewport.\n    e -= a * Number(soft.view_box.x || 0) + c * Number(soft.view_box.y || 0);\n    f -= b * Number(soft.view_box.x || 0) + d * Number(soft.view_box.y || 0);\n\n    // If the actual artwork image is CSS-flipped horizontally, pre-flip the\n    // mask in local coordinates so the final visual mask remains fixed to the\n    // supplier print area after the element transform is applied.\n    if (flipX) {\n      a = -a;\n      c = -c;\n      e = objectW - e;\n    }\n\n    var whitelist = {\n      path: ['d'],\n      rect: ['x', 'y', 'width', 'height', 'rx', 'ry'],\n      circle: ['cx', 'cy', 'r'],\n      ellipse: ['cx', 'cy', 'rx', 'ry'],\n      polygon: ['points']\n    };\n\n    var shapes = [];\n    Object.keys(whitelist).forEach(function (tag) {\n      var nodes = Array.isArray(soft.shapes[tag]) ? soft.shapes[tag] : [];\n      nodes.forEach(function (raw) {\n        if (!raw || typeof raw !== 'object') return;\n        var attrs = [];\n        whitelist[tag].forEach(function (key) {\n          if (raw[key] === undefined || raw[key] === null) return;\n          var value = String(raw[key]).trim();\n          if (!value) return;\n          attrs.push(key + '=\"' + escapeSoftMaskXmlAttr(value) + '\"');\n        });\n        if (!attrs.length) return;\n        shapes.push('<' + tag + ' ' + attrs.join(' ') + ' fill=\"#fff\"/>');\n      });\n    });\n\n    if (!shapes.length) return '';\n\n    return (\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" ' +\n      'viewBox=\"0 0 ' + escapeSoftMaskXmlAttr(objectW) + ' ' + escapeSoftMaskXmlAttr(objectH) + '\" ' +\n      'preserveAspectRatio=\"none\">' +\n      '<g transform=\"matrix(' +\n      [a, b, c, d, e, f].map(function (n) { return Number(n).toFixed(8); }).join(' ') +\n      ')\">' +\n      shapes.join('') +\n      '</g></svg>'\n    );\n  }\n\n  function applySoftBoundaryObjectVisualMask(element, boxLike, flipX) {\n    if (!element) return false;\n\n    var template = getActiveSoftBoundaryTemplate();\n    var svg = buildSoftBoundaryObjectMaskSvg(template, boxLike, Boolean(flipX));\n    if (!svg) {\n      clearSoftBoundaryObjectVisualMask(element);\n      return false;\n    }\n\n    var dataUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);\n    var cssUrl = 'url(\"' + dataUrl.replace(/\"/g, '%22') + '\")';\n\n    element.style.setProperty('mask-image', cssUrl);\n    element.style.setProperty('mask-size', '100% 100%');\n    element.style.setProperty('mask-position', '0 0');\n    element.style.setProperty('mask-repeat', 'no-repeat');\n    element.style.setProperty('-webkit-mask-image', cssUrl);\n    element.style.setProperty('-webkit-mask-size', '100% 100%');\n    element.style.setProperty('-webkit-mask-position', '0 0');\n    element.style.setProperty('-webkit-mask-repeat', 'no-repeat');\n    element.setAttribute('data-pb-soft-object-mask', 'v381');\n    return true;\n  }\n\n  function getPrintAreaClipInset(x, y, w, h) {\n    x = Number(x || 0);\n    y = Number(y || 0);\n    w = Math.max(0.0001, Number(w || 0));\n    h = Math.max(0.0001, Number(h || 0));\n\n    var left = clamp((-x / w) * 100, 0, 100);\n    var top = clamp((-y / h) * 100, 0, 100);\n    var right = clamp(((x + w - 100) / w) * 100, 0, 100);\n    var bottom = clamp(((y + h - 100) / h) * 100, 0, 100);\n\n    // If an object is almost entirely outside, clip it fully instead of letting\n    // browser edge cases show a thin artefact.\n    if (left + right >= 100 || top + bottom >= 100) {\n      return 'inset(50% 50% 50% 50%)';\n    }\n\n    return 'inset('\n      + top.toFixed(3) + '% '\n      + right.toFixed(3) + '% '\n      + bottom.toFixed(3) + '% '\n      + left.toFixed(3) + '%)';\n  }\n\n  function getRotatedPrintBounds(boxLike) {\n    var x = Number((boxLike && boxLike.x) || 0);\n    var y = Number((boxLike && boxLike.y) || 0);\n    var w = Math.max(0, Number((boxLike && boxLike.w) || 0));\n    var h = Math.max(0, Number((boxLike && boxLike.h) || 0));\n    var rotation = Number((boxLike && boxLike.rotation) || 0);\n\n    if (!rotation) {\n      return { left: x, top: y, right: x + w, bottom: y + h };\n    }\n\n    var radians = rotation * Math.PI / 180;\n    var cos = Math.cos(radians);\n    var sin = Math.sin(radians);\n    var cx = x + w / 2;\n    var cy = y + h / 2;\n    var corners = [\n      [x, y],\n      [x + w, y],\n      [x + w, y + h],\n      [x, y + h]\n    ];\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n\n    corners.forEach(function (point) {\n      var dx = point[0] - cx;\n      var dy = point[1] - cy;\n      var rx = cx + dx * cos - dy * sin;\n      var ry = cy + dx * sin + dy * cos;\n      minX = Math.min(minX, rx);\n      minY = Math.min(minY, ry);\n      maxX = Math.max(maxX, rx);\n      maxY = Math.max(maxY, ry);\n    });\n\n    return { left: minX, top: minY, right: maxX, bottom: maxY };\n  }\n\n  function getPrintEdgeRiskState(boxLike) {\n    var bounds = getRotatedPrintBounds(boxLike);\n    var epsilon = 0.02;\n    var margin = Math.max(0, Number(PRINT_CLIP_WARNING_MARGIN_PCT || 0));\n    var clipped = bounds.left < -epsilon\n      || bounds.top < -epsilon\n      || bounds.right > 100 + epsilon\n      || bounds.bottom > 100 + epsilon;\n    var nearEdge = !clipped && (\n      bounds.left <= margin\n      || bounds.top <= margin\n      || bounds.right >= 100 - margin\n      || bounds.bottom >= 100 - margin\n    );\n\n    return {\n      clipped: clipped,\n      risk: nearEdge,\n      bounds: bounds\n    };\n  }\n\n  function getPrintEdgeRiskStateFromBounds(bounds) {\n    if (!bounds) return null;\n    var epsilon = 0.02;\n    var margin = Math.max(0, Number(PRINT_CLIP_WARNING_MARGIN_PCT || 0));\n    var clipped = Number(bounds.left) < -epsilon\n      || Number(bounds.top) < -epsilon\n      || Number(bounds.right) > 100 + epsilon\n      || Number(bounds.bottom) > 100 + epsilon;\n    var nearEdge = !clipped && (\n      Number(bounds.left) <= margin\n      || Number(bounds.top) <= margin\n      || Number(bounds.right) >= 100 - margin\n      || Number(bounds.bottom) >= 100 - margin\n    );\n\n    return {\n      clipped: clipped,\n      risk: nearEdge,\n      bounds: bounds\n    };\n  }\n\n  function getLiveTextPaintBoundsPct(layer, node) {\n    if (!layer || (layer.type || 'image') !== 'text' || !els.printArea) return null;\n\n    if (!node && els.imageLayers) {\n      Array.from(els.imageLayers.children || []).some(function (candidate) {\n        if (candidate && candidate.dataset && String(candidate.dataset.layerId || '') === String(layer.id || '')) {\n          node = candidate;\n          return true;\n        }\n        return false;\n      });\n    }\n\n    if (!node) return null;\n\n    var groups = Array.from(node.querySelectorAll('.pb-customizer__text-layer-inline [data-pb-text-paint]'));\n    if (!groups.length) return null;\n\n    var printRect = els.printArea.getBoundingClientRect();\n    if (!printRect || printRect.width <= 0 || printRect.height <= 0) return null;\n\n    var minLeft = Infinity;\n    var minTop = Infinity;\n    var maxRight = -Infinity;\n    var maxBottom = -Infinity;\n    var found = false;\n\n    groups.forEach(function (group) {\n      var rect = group.getBoundingClientRect();\n      if (!rect || !Number.isFinite(rect.left) || !Number.isFinite(rect.top)\n        || !Number.isFinite(rect.right) || !Number.isFinite(rect.bottom)\n        || rect.width <= 0 || rect.height <= 0) return;\n\n      minLeft = Math.min(minLeft, rect.left);\n      minTop = Math.min(minTop, rect.top);\n      maxRight = Math.max(maxRight, rect.right);\n      maxBottom = Math.max(maxBottom, rect.bottom);\n      found = true;\n    });\n\n    if (!found) return null;\n\n    // getBoundingClientRect() follows the actual live SVG through scale, curve,\n    // rotation and alignment. Convert that painted glyph rectangle back into\n    // print-area percentages. Selection handles and empty box space are excluded.\n    return {\n      left: ((minLeft - printRect.left) / printRect.width) * 100,\n      top: ((minTop - printRect.top) / printRect.height) * 100,\n      right: ((maxRight - printRect.left) / printRect.width) * 100,\n      bottom: ((maxBottom - printRect.top) / printRect.height) * 100\n    };\n  }\n\n  function getLayerPrintEdgeRiskState(layer, node) {\n    if (layer && (layer.type || 'image') === 'text') {\n      var paintedBounds = getLiveTextPaintBoundsPct(layer, node);\n      var paintedState = getPrintEdgeRiskStateFromBounds(paintedBounds);\n      if (paintedState) return paintedState;\n    }\n    return getPrintEdgeRiskState(layer);\n  }\n\n  function layerHasVisiblePrintContent(layer) {\n    if (!layer) return false;\n    if ((layer.type || 'image') === 'text') return /\\S/.test(String(layer.text || ''));\n    return Boolean(layer.imageDataUrl);\n  }\n\n  var __pbPrintClipWarningRaf = 0;\n  function schedulePrintClipWarningSync() {\n    if (__pbPrintClipWarningRaf) return;\n    __pbPrintClipWarningRaf = window.requestAnimationFrame(function () {\n      __pbPrintClipWarningRaf = 0;\n      syncPrintClipWarning();\n    });\n  }\n\n  function syncPrintClipWarning() {\n    var alert = els.clipStageAlert;\n    if (!alert) return;\n    if (pbUploadFeedback) {\n      alert.classList.remove('is-visible');\n      alert.setAttribute('aria-hidden', 'true');\n      return;\n    }\n\n    var dState = getDesignState(state.activePlacement, false);\n    var clippedCount = 0;\n    var riskCount = 0;\n\n    function countEdgeState(edgeState) {\n      if (!edgeState) return;\n      if (edgeState.clipped) clippedCount += 1;\n      else if (edgeState.risk) riskCount += 1;\n    }\n\n    function countBox(boxLike) {\n      countEdgeState(getPrintEdgeRiskState(boxLike));\n    }\n\n    if (dState && hasPrimaryDesignContent(dState) && dState.design) {\n      countBox(dState.design);\n    }\n\n    if (dState) {\n      (dState.imageLayers || []).forEach(function (layer) {\n        if (!layerHasVisiblePrintContent(layer)) return;\n        countEdgeState(getLayerPrintEdgeRiskState(layer, null));\n      });\n    }\n\n    var tone = clippedCount > 0 ? 'danger' : (riskCount > 0 ? 'warning' : '');\n    var visible = Boolean(tone);\n    var title = '';\n    var message = '';\n\n    if (tone === 'danger') {\n      title = pbT('utanfor_tryckytan', 'Utanf\u00F6r tryckytan');\n      message = clippedCount > 1\n        ? pbT('delar_av_flera_objekt_kommer_att_klippas_bort', 'Delar av flera objekt kommer att klippas bort.')\n        : pbT('en_del_av_motivet_kommer_att_klippas_bort', 'En del av motivet kommer att klippas bort.');\n    } else if (tone === 'warning') {\n      title = pbT('nara_tryckkanten', 'N\u00E4ra tryckkanten');\n      message = riskCount > 1\n        ? pbT('flytta_in_objekten_lite_sa_att_inget_riskerar_att_klippas', 'Flytta in objekten lite s\u00E5 att inget riskerar att klippas.')\n        : pbT('flytta_in_motivet_lite_sa_att_inget_riskerar_att_klippas', 'Flytta in motivet lite s\u00E5 att inget riskerar att klippas.');\n    }\n\n    alert.dataset.tone = tone || 'none';\n    alert.classList.toggle('is-visible', visible);\n    alert.setAttribute('aria-hidden', visible ? 'false' : 'true');\n    root.classList.toggle('has-print-edge-warning', visible);\n    root.classList.toggle('has-print-edge-danger', tone === 'danger');\n\n    if (els.clipStageAlertTitle && els.clipStageAlertTitle.textContent !== title) {\n      els.clipStageAlertTitle.textContent = title;\n    }\n\n    if (els.clipStageAlertText && els.clipStageAlertText.textContent !== message) {\n      els.clipStageAlertText.textContent = message;\n    }\n  }\n\n  function applyPrimaryDesignVisualClip(dState) {\n    if (!dState || !dState.design) return;\n\n    var d = dState.design;\n    var clip = getPrintAreaClipInset(d.x, d.y, d.w, d.h);\n    var edgeState = getPrintEdgeRiskState(d);\n    var axisClipped = Number(d.x || 0) < 0\n      || Number(d.y || 0) < 0\n      || Number(d.x || 0) + Number(d.w || 0) > 100\n      || Number(d.y || 0) + Number(d.h || 0) > 100;\n    var isClipped = edgeState.clipped || axisClipped;\n\n    if (els.designImg) {\n      els.designImg.style.clipPath = clip;\n      applySoftBoundaryObjectVisualMask(els.designImg, d, false);\n    }\n    if (els.designText) {\n      els.designText.style.clipPath = clip;\n      applySoftBoundaryObjectVisualMask(els.designText, d, false);\n    }\n    if (els.design) {\n      els.design.classList.toggle('is-print-clipped', isClipped);\n      els.design.classList.toggle('is-print-edge-risk', !isClipped && edgeState.risk);\n    }\n    schedulePrintClipWarningSync();\n  }\n\n  function applyImageLayerVisualClip(node, layer) {\n    if (!node || !layer) return;\n\n    var clip = getPrintAreaClipInset(layer.x, layer.y, layer.w, layer.h);\n    var edgeState = getLayerPrintEdgeRiskState(layer, node);\n    var axisClipped = (layer.type || 'image') === 'text'\n      ? false\n      : (Number(layer.x || 0) < 0\n        || Number(layer.y || 0) < 0\n        || Number(layer.x || 0) + Number(layer.w || 0) > 100\n        || Number(layer.y || 0) + Number(layer.h || 0) > 100);\n    var isClipped = edgeState.clipped || axisClipped;\n\n    var artwork = node.querySelector('.pb-customizer__image-layer-img, .pb-customizer__text-layer-img, .pb-customizer__text-layer');\n    if (artwork) {\n      artwork.style.clipPath = clip;\n      applySoftBoundaryObjectVisualMask(artwork, layer, Boolean(layer.flipX));\n    }\n    node.classList.toggle('is-print-clipped', isClipped);\n    node.classList.toggle('is-print-edge-risk', !isClipped && edgeState.risk);\n    schedulePrintClipWarningSync();\n  }\n\n  // v278: drive print-area guide visibility from real editor state.\n  // This is deliberately explicit instead of relying on CSS :has(), so image\n  // layers, text layers and the legacy primary design all behave identically.\n  function syncPrintAreaGuideVisibility() {\n    if (!root) return;\n\n    var dState = getDesignState(state.activePlacement, false);\n    var primarySelected = Boolean(\n      state.activePrimarySelected &&\n      dState &&\n      hasPrimaryDesignContent(dState)\n    );\n\n    var layerSelected = false;\n    if (dState && state.activeImageLayerId) {\n      layerSelected = (dState.imageLayers || []).some(function (layer) {\n        return String(layer.id) === String(state.activeImageLayerId);\n      });\n    }\n\n    root.classList.toggle(\n      'is-print-area-guide-visible',\n      primarySelected || layerSelected\n    );\n\n    // v284: selection state and guide paint are synchronized in the same pass.\n    // This also fixes repeated mark/unmark cycles and variant/color changes.\n    applyPrintAreaGuideVisual();\n  }\n\n  function renderDesign() {\n    \n    var dState = getDesignState(state.activePlacement, true);\n    var d = dState.design;\n\n    constrainDesignBounds(dState);\n\n    els.design.style.left = d.x + '%';\n    els.design.style.top = d.y + '%';\n    els.design.style.width = d.w + '%';\n    els.design.style.height = d.h + '%';\n    els.design.style.transform = 'rotate(' + Number(d.rotation || 0) + 'deg)';\n\n    els.design.classList.toggle('is-visible', hasPrimaryDesignContent(dState));\n    els.design.classList.toggle('is-image', dState.designType === 'image');\n    els.design.classList.toggle('is-selected', Boolean(state.activePrimarySelected) && hasPrimaryDesignContent(dState));\n    els.designText.textContent = dState.text || pbT('din_design', 'DIN DESIGN');\n\n    if (dState.imageDataUrl) els.designImg.src = dState.imageDataUrl;\n\n    applyPrimaryDesignVisualClip(dState);\n    updateDesignMeasurements(dState);\n    renderImageLayers(dState);\n    syncPrintAreaGuideVisibility();\n    updateMobileEmptyActions();\n    updateDisplayedProductPrice();\n    pbScheduleServerExport();\n  }\n\n  // Coordinates use the stored 0\u2013100 print-area position, without a unit.\n  function formatDragCoordinate(axis, value) {\n    var number = Number(value || 0);\n    if (!Number.isFinite(number)) number = 0;\n    return axis + ': ' + (Math.round(number * 10) / 10).toFixed(1);\n  }\n\n  function updateLayerDragMeasurements(node, layer) {\n    var width = node.querySelector('.pb-image-measure--width');\n    var height = node.querySelector('.pb-image-measure--height');\n    if (width) width.textContent = formatDragCoordinate('X', layer.x);\n    if (height) height.textContent = formatDragCoordinate('Y', layer.y);\n  }\n\n  function updateDesignMeasurements(dState) {\n    if (!els.measureWidth || !els.measureHeight) return;\n\n    if (!dState || !hasPrimaryDesignContent(dState)) {\n      els.measureWidth.textContent = '0.0 cm';\n      els.measureHeight.textContent = '0.0 cm';\n      return;\n    }\n\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    if (!template) return;\n\n    if (els.design.classList.contains('is-dragging')) {\n      els.measureWidth.textContent = formatDragCoordinate('X', dState.design.x);\n      els.measureHeight.textContent = formatDragCoordinate('Y', dState.design.y);\n      return;\n    }\n\n    var visible = getVisibleBoxPct(dState.design);\n    els.measureWidth.textContent = formatCm(getPhysicalWidthCmForPct(template, visible.w));\n    els.measureHeight.textContent = formatCm(getPhysicalHeightCmForPct(template, visible.h));\n  }\n\n  function getVisibleBoxPct(boxLike) {\n    var x = Number((boxLike && boxLike.x) || 0);\n    var y = Number((boxLike && boxLike.y) || 0);\n    var w = Math.max(0, Number((boxLike && boxLike.w) || 0));\n    var h = Math.max(0, Number((boxLike && boxLike.h) || 0));\n\n    var left = Math.max(0, x);\n    var top = Math.max(0, y);\n    var right = Math.min(100, x + w);\n    var bottom = Math.min(100, y + h);\n\n    return {\n      w: Math.max(0, right - left),\n      h: Math.max(0, bottom - top)\n    };\n  }\n\n  function getTemplatePhysicalPrintAreaWidthCm(template) {\n    var mm = Number(\n      template?.physical_width_mm ||\n      template?.ff_print_area_width_mm ||\n      0\n    );\n\n    if (mm > 0) return mm / 10;\n\n    var dpi = getTemplatePrintFileDpi(template);\n    var px = getTemplatePrintFileWidth(template);\n    return dpi > 0 && px > 0 ? (px / dpi) * 2.54 : 0;\n  }\n\n  function getTemplatePhysicalPrintAreaHeightCm(template) {\n    var mm = Number(\n      template?.physical_height_mm ||\n      template?.ff_print_area_height_mm ||\n      0\n    );\n\n    if (mm > 0) return mm / 10;\n\n    var dpi = getTemplatePrintFileDpi(template);\n    var px = getTemplatePrintFileHeight(template);\n    return dpi > 0 && px > 0 ? (px / dpi) * 2.54 : 0;\n  }\n\n  var TEXT_SIZE_MIN_PT = 12;\n  var TEXT_SIZE_MAX_PT = 240;\n  var TEXT_SIZE_DEFAULT_PT = 60;\n\n  function getTextSizingTemplate(placement) {\n    var key = placement || state.activePlacement;\n    return state.templatesByPlacement[key] || selectLocalTemplate(key) || null;\n  }\n\n  function getTemplateTextCoordinatePpi(template) {\n    if (!template) return 72;\n\n    // Text geometry is measured against Spreadconnect's preview print-area\n    // coordinates (template.print_area_height), then exported proportionally to\n    // the physical print area. Convert those coordinates to physical inches so\n    // 72 pt always means one real inch regardless of template/export resolution.\n    var coordinateHeightPx = Number(template.print_area_height || 0);\n    var physicalHeightCm = getTemplatePhysicalPrintAreaHeightCm(template);\n    var physicalHeightInches = physicalHeightCm > 0 ? (physicalHeightCm / 2.54) : 0;\n\n    if (coordinateHeightPx > 0 && physicalHeightInches > 0) {\n      return coordinateHeightPx / physicalHeightInches;\n    }\n\n    // Safe fallback for incomplete template metadata.\n    return Math.max(1, Number(getTemplatePrintFileDpi(template) || 72));\n  }\n\n  function textPointsToInternalPx(points, template) {\n    var pt = clamp(Number(points || TEXT_SIZE_DEFAULT_PT), TEXT_SIZE_MIN_PT, TEXT_SIZE_MAX_PT);\n    var ppi = getTemplateTextCoordinatePpi(template || getTextSizingTemplate());\n    return Math.max(1, (pt / 72) * ppi);\n  }\n\n  function textInternalPxToPoints(fontSizePx, template) {\n    var ppi = getTemplateTextCoordinatePpi(template || getTextSizingTemplate());\n    if (!ppi) return TEXT_SIZE_DEFAULT_PT;\n    return clamp((Number(fontSizePx || 0) / ppi) * 72, TEXT_SIZE_MIN_PT, TEXT_SIZE_MAX_PT);\n  }\n\n  function getTextInternalSizeBounds(template) {\n    var sizingTemplate = template || getTextSizingTemplate();\n    return {\n      min: textPointsToInternalPx(TEXT_SIZE_MIN_PT, sizingTemplate),\n      max: textPointsToInternalPx(TEXT_SIZE_MAX_PT, sizingTemplate)\n    };\n  }\n\n  function getPhysicalWidthCmForPct(template, widthPct) {\n    return getTemplatePhysicalPrintAreaWidthCm(template) * (Math.max(0, Number(widthPct || 0)) / 100);\n  }\n\n  function getPhysicalHeightCmForPct(template, heightPct) {\n    return getTemplatePhysicalPrintAreaHeightCm(template) * (Math.max(0, Number(heightPct || 0)) / 100);\n  }\n\n  function formatCm(value) {\n    if (!Number.isFinite(value) || value <= 0) return '0.0 cm';\n    return value.toFixed(1) + ' cm';\n  }\n\n\n  function hasImageNaturalSize(dState) {\n    return Boolean(dState && Number(dState.imageNaturalWidth) > 0 && Number(dState.imageNaturalHeight) > 0);\n  }\n\n  function getImageHeightPctForWidth(dState, widthPct) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n    var imageRatio = Number(dState.imageNaturalWidth || 0) / Number(dState.imageNaturalHeight || 1);\n\n    if (!printAreaWidthPx || !printAreaHeightPx || !imageRatio) {\n      return dState.design.h;\n    }\n\n    return (Number(widthPct || 0) * printAreaWidthPx) / (printAreaHeightPx * imageRatio);\n  }\n\n  function getImageWidthPctForHeight(dState, heightPct) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n    var imageRatio = Number(dState.imageNaturalWidth || 0) / Number(dState.imageNaturalHeight || 1);\n\n    if (!printAreaWidthPx || !printAreaHeightPx || !imageRatio) {\n      return dState.design.w;\n    }\n\n    return (Number(heightPct || 0) * printAreaHeightPx * imageRatio) / printAreaWidthPx;\n  }\n\n\n  function constrainDesignBounds(dState) {\n    if (!dState) return;\n\n    var d = dState.design;\n    var minW = 5;\n    var minH = 5;\n    var maxSize = 200;\n\n    if (dState.designType === 'image' && hasImageNaturalSize(dState)) {\n      d.w = clamp(d.w, minW, maxSize);\n      d.h = getImageHeightPctForWidth(dState, d.w);\n\n      if (d.h > maxSize) {\n        d.h = maxSize;\n        d.w = getImageWidthPctForHeight(dState, d.h);\n      }\n\n      d.w = clamp(d.w, minW, maxSize);\n      d.h = clamp(d.h, minH, maxSize);\n    } else {\n      d.w = clamp(d.w, 10, maxSize);\n      d.h = clamp(d.h, 7, maxSize);\n    }\n\n    var outsideX = Math.max(30, Number(d.w || 0) * 0.95);\n    var outsideY = Math.max(18, Number(d.h || 0) * 0.95);\n\n    d.x = clamp(Number(d.x || 0), -outsideX, 100 - d.w + outsideX);\n    d.y = clamp(Number(d.y || 0), -outsideY, 100 - d.h + outsideY);\n  }\n\n  var PB_ALLOWED_UPLOAD_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'heic', 'heif', 'svg'];\n  var PB_ALLOWED_UPLOAD_MIME_TYPES = {\n    'image/png': 'png',\n    'image/jpeg': 'jpeg',\n    'image/jpg': 'jpeg',\n    'image/webp': 'webp',\n    'image/heic': 'heic',\n    'image/heif': 'heif',\n    'image/heic-sequence': 'heic',\n    'image/heif-sequence': 'heif',\n    'image/svg+xml': 'svg'\n  };\n\n  function getUploadFileExtension(file) {\n    var name = String(file && file.name || '').trim().toLowerCase();\n    var match = name.match(/\\.([a-z0-9]+)$/i);\n    return match ? match[1].toLowerCase() : '';\n  }\n\n  function getSupportedUploadFormat(file) {\n    var ext = getUploadFileExtension(file);\n    if (PB_ALLOWED_UPLOAD_EXTENSIONS.indexOf(ext) >= 0) return ext === 'jpg' ? 'jpeg' : ext;\n\n    var mime = String(file && file.type || '').trim().toLowerCase();\n    return PB_ALLOWED_UPLOAD_MIME_TYPES[mime] || '';\n  }\n\n  function assertSupportedUploadFile(file) {\n    var format = getSupportedUploadFormat(file);\n    if (!format) {\n      throw new Error(pbT('filformatet_stods_inte_ladda_upp_png_jpg_jpeg_webp_heic_heif_eller_svg', 'Filformatet st\u00F6ds inte. Ladda upp PNG, JPG/JPEG, WebP, HEIC/HEIF eller SVG.'));\n    }\n    return format;\n  }\n\n  async function prepareUploadedImageDataUrl(dataUrl) {\n    // v256: raster uploads are normalized to PNG before they enter designer state.\n    // The accepted source formats are intentionally limited to the formats that\n    // make sense for Printbolt: PNG, JPEG, WebP, HEIC/HEIF and SVG.\n    var img = await loadImage(dataUrl);\n    var prepared = trimTransparentPixelsFromImage(img, dataUrl);\n\n    if (prepared && prepared.dataUrl && prepared.dataUrl.startsWith('data:image/png')) {\n      return prepared;\n    }\n\n    var width = Number(prepared && prepared.width || img.naturalWidth || img.width || 0);\n    var height = Number(prepared && prepared.height || img.naturalHeight || img.height || 0);\n    if (!width || !height) throw new Error(pbT('bildformatet_kunde_inte_avkodas', 'Bildformatet kunde inte avkodas.'));\n\n    var canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    var ctx = canvas.getContext('2d');\n    ctx.clearRect(0, 0, width, height);\n\n    // If trimTransparentPixelsFromImage returned the original image, draw the\n    // already decoded bitmap. If it returned a non-PNG data URL, decode that.\n    var sourceImg = img;\n    if (prepared && prepared.dataUrl && prepared.dataUrl !== dataUrl) {\n      sourceImg = await loadImage(prepared.dataUrl);\n    }\n    ctx.drawImage(sourceImg, 0, 0, width, height);\n\n    return {\n      dataUrl: canvas.toDataURL('image/png'),\n      width: width,\n      height: height,\n      trimmed: Boolean(prepared && prepared.trimmed),\n      normalized: true\n    };\n  }\n\n  function getSvgRasterTargetSize(img) {\n    var sourceWidth = Math.max(1, Number(img && (img.naturalWidth || img.width) || 1));\n    var sourceHeight = Math.max(1, Number(img && (img.naturalHeight || img.height) || 1));\n    var ratio = sourceWidth / sourceHeight;\n    if (!Number.isFinite(ratio) || ratio <= 0) ratio = 1;\n\n    var template = state.templatesByPlacement[state.activePlacement] || selectLocalTemplate(state.activePlacement) || null;\n    var printWidth = Number(template && getTemplatePrintFileWidth(template) || 0);\n    var printHeight = Number(template && getTemplatePrintFileHeight(template) || 0);\n    var printLongEdge = Math.max(printWidth, printHeight, 0);\n\n    // SVG is vector and never needs AI upscaling. Rasterize it once at a generous\n    // print-ready resolution so normal DPI calculations work with the PNG result.\n    var longEdge = clamp(printLongEdge ? printLongEdge * 2 : 4096, 3072, 4096);\n    var width;\n    var height;\n    if (ratio >= 1) {\n      width = Math.round(longEdge);\n      height = Math.max(1, Math.round(width / ratio));\n    } else {\n      height = Math.round(longEdge);\n      width = Math.max(1, Math.round(height * ratio));\n    }\n\n    return { width: width, height: height };\n  }\n\n  async function rasterizeUploadedSvgFile(file) {\n    var dataUrl = await readFileAsDataUrl(file);\n    var img = await loadImage(String(dataUrl || ''));\n    var target = getSvgRasterTargetSize(img);\n    var canvas = document.createElement('canvas');\n    canvas.width = target.width;\n    canvas.height = target.height;\n    var ctx = canvas.getContext('2d');\n    if (!ctx) throw new Error(pbT('svg_filen_kunde_inte_rasteriseras', 'SVG-filen kunde inte rasteriseras.'));\n    ctx.clearRect(0, 0, target.width, target.height);\n    ctx.drawImage(img, 0, 0, target.width, target.height);\n    return await prepareUploadedImageDataUrl(canvas.toDataURL('image/png'));\n  }\n\n  async function normalizeUploadedImageFile(file, onUploadProgress) {\n    if (pbPrivateEnabled() && getSupportedUploadFormat(file) !== 'svg') return await pbPrivateUpload(file, onUploadProgress);\n    pbReportUploadProgress(onUploadProgress, { phase: 'processing' });\n    var format = assertSupportedUploadFile(file);\n\n    // SVG stays vector until this point, then becomes one high-resolution PNG.\n    // This avoids sending SVG into the DPI/upscale path where vector dimensions\n    // otherwise have no useful DPI meaning.\n    if (format === 'svg') {\n      return await rasterizeUploadedSvgFile(file);\n    }\n\n    var localError = null;\n\n    // Fast path: PNG/JPEG/WebP and HEIC/HEIF on browsers that support them.\n    try {\n      var dataUrl = await readFileAsDataUrl(file);\n      return await prepareUploadedImageDataUrl(String(dataUrl || ''));\n    } catch (error) {\n      localError = error;\n    }\n\n    // HEIC/HEIF commonly needs server-side decoding. The same Cloudflare fallback\n    // is also safe for an allowed PNG/JPEG/WebP file if local browser decoding fails.\n    if (!workerUrl) {\n      throw localError || new Error(pbT('bildformatet_kunde_inte_avkodas', 'Bildformatet kunde inte avkodas.'));\n    }\n\n    var response = await pbAuthorizedFetch(workerUrl + '/api/printbolt/normalize-image', {\n      method: 'POST',\n      headers: {\n        'Content-Type': file.type || 'application/octet-stream',\n        'X-PB-Source-Ext': format\n      },\n      body: file\n    });\n\n    if (!response.ok) {\n      var errorText = await response.text().catch(function () { return ''; });\n      var errorBody = null;\n      try { errorBody = errorText ? JSON.parse(errorText) : null; } catch (ignore) {}\n      var detail = errorBody && errorBody.error;\n      throw new Error(detail || errorText || pbT('bildformatet_kunde_inte_konverteras', 'Bildformatet kunde inte konverteras.'));\n    }\n\n    var pngBlob = await response.blob();\n    if (!pngBlob || !pngBlob.size) throw new Error(pbT('bildkonverteringen_returnerade_en_tom_fil', 'Bildkonverteringen returnerade en tom fil.'));\n    var pngDataUrl = await blobToDataUrl(pngBlob);\n    return await prepareUploadedImageDataUrl(pngDataUrl);\n  }\n\n  function trimTransparentPixelsFromImage(img, originalDataUrl) {\n    var width = img.naturalWidth || img.width;\n    var height = img.naturalHeight || img.height;\n\n    if (!width || !height) {\n      return { dataUrl: originalDataUrl, width: 0, height: 0, trimmed: false };\n    }\n\n    var canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    var ctx = canvas.getContext('2d', { willReadFrequently: true });\n    ctx.clearRect(0, 0, width, height);\n    ctx.drawImage(img, 0, 0);\n\n    var data;\n    try {\n      data = ctx.getImageData(0, 0, width, height).data;\n    } catch (error) {\n      return { dataUrl: originalDataUrl, width: width, height: height, trimmed: false };\n    }\n\n    var alphaThreshold = 8;\n    var minX = width;\n    var minY = height;\n    var maxX = -1;\n    var maxY = -1;\n    var hasTransparentPixel = false;\n\n    for (var y = 0; y < height; y++) {\n      for (var x = 0; x < width; x++) {\n        var alpha = data[(y * width + x) * 4 + 3];\n        if (alpha < 255) hasTransparentPixel = true;\n        if (alpha > alphaThreshold) {\n          if (x < minX) minX = x;\n          if (y < minY) minY = y;\n          if (x > maxX) maxX = x;\n          if (y > maxY) maxY = y;\n        }\n      }\n    }\n\n    if (maxX < minX || maxY < minY) {\n      return { dataUrl: originalDataUrl, width: width, height: height, trimmed: false };\n    }\n\n    var trimmedWidth = maxX - minX + 1;\n    var trimmedHeight = maxY - minY + 1;\n    var isAlreadyTight = minX === 0 && minY === 0 && trimmedWidth === width && trimmedHeight === height;\n\n    if (!hasTransparentPixel || isAlreadyTight) {\n      return { dataUrl: originalDataUrl, width: width, height: height, trimmed: false };\n    }\n\n    var out = document.createElement('canvas');\n    out.width = trimmedWidth;\n    out.height = trimmedHeight;\n    var outCtx = out.getContext('2d');\n    outCtx.clearRect(0, 0, trimmedWidth, trimmedHeight);\n    outCtx.drawImage(canvas, minX, minY, trimmedWidth, trimmedHeight, 0, 0, trimmedWidth, trimmedHeight);\n\n    return {\n      dataUrl: out.toDataURL('image/png'),\n      width: trimmedWidth,\n      height: trimmedHeight,\n      trimmed: true\n    };\n  }\n\n  function bindEvents() {\n    // v301: robust placement switching.\n    // The placement buttons are rendered dynamically, so keep a delegated\n    // capture-phase handler on the stable rail as a fallback in addition to\n    // each button's own click listener.\n    if (els.placements && !els.placements.__pbPlacementSwitchBound) {\n      els.placements.__pbPlacementSwitchBound = true;\n\n      var placementPointerStart = null;\n      var suppressMobilePlacementClickUntil = 0;\n\n      function getPlacementNavigationTarget(event) {\n        var button = event.target && event.target.closest\n          ? event.target.closest('.pb-placement[data-placement], [data-pb-mobile-placement-target]')\n          : null;\n        if (!button || !els.placements.contains(button)) return null;\n\n        var placement = button.getAttribute('data-placement') ||\n          button.getAttribute('data-pb-mobile-placement-target') || '';\n        if (!placement) return null;\n\n        return { button: button, placement: placement };\n      }\n\n      els.placements.addEventListener('pointerdown', function (event) {\n        var target = getPlacementNavigationTarget(event);\n        if (!target) {\n          placementPointerStart = null;\n          return;\n        }\n\n        placementPointerStart = {\n          id: event.pointerId,\n          x: Number(event.clientX || 0),\n          y: Number(event.clientY || 0),\n          placement: target.placement\n        };\n      }, true);\n\n      // Pointer-up fallback covers browsers/themes where a click can be\n      // cancelled by another interaction layer. Ignore drags so horizontal\n      // scrolling of the placement rail still works on touch.\n      els.placements.addEventListener('pointerup', function (event) {\n        if (!placementPointerStart || placementPointerStart.id !== event.pointerId) return;\n\n        var dx = Math.abs(Number(event.clientX || 0) - placementPointerStart.x);\n        var dy = Math.abs(Number(event.clientY || 0) - placementPointerStart.y);\n        var placement = placementPointerStart.placement;\n        placementPointerStart = null;\n\n        if (dx > 10 || dy > 10 || !placement) return;\n\n        // On touch browsers a synthetic click is often fired immediately after\n        // pointerup. Because switchPlacement() re-renders the mobile arrows,\n        // that follow-up click can land on the NEW arrow and instantly switch\n        // back again. Dots did not expose this because the replacement dot still\n        // targets the same placement. Suppress only that synthetic mobile click.\n        var pointerTarget = getPlacementNavigationTarget(event);\n        if (pointerTarget && pointerTarget.button.matches('[data-pb-mobile-placement-target]')) {\n          suppressMobilePlacementClickUntil = Date.now() + 700;\n        }\n\n        switchPlacement(placement);\n      }, true);\n\n      els.placements.addEventListener('pointercancel', function () {\n        placementPointerStart = null;\n      }, true);\n\n      els.placements.addEventListener('click', function (event) {\n        var target = getPlacementNavigationTarget(event);\n        if (!target) return;\n\n        event.preventDefault();\n\n        if (\n          target.button.matches('[data-pb-mobile-placement-target]') &&\n          Date.now() < suppressMobilePlacementClickUntil\n        ) {\n          suppressMobilePlacementClickUntil = 0;\n          return;\n        }\n\n        switchPlacement(target.placement);\n      }, true);\n    }\n    var backButton = root.querySelector('[data-pb-back]');\n    if (backButton) {\n      backButton.addEventListener('click', function () {\n        if (history.length > 1) history.back();\n        else window.location.href = getShopifyRouteRoot() + 'products/' + state.handle;\n      });\n    }\n\n    var shareButton = root.querySelector('[data-pb-share]');\n    if (shareButton) {\n      shareButton.addEventListener('click', async function () {\n        try {\n          if (navigator.share) await navigator.share({ title: document.title, url: location.href });\n          else await navigator.clipboard.writeText(location.href);\n        } catch (error) {}\n      });\n    }\n\n    if (els.productLink) {\n      els.productLink.addEventListener('click', function (event) {\n        event.preventDefault();\n        openProductDetailsPanel();\n      });\n    }\n\n    if (els.productDetailsClose) {\n      els.productDetailsClose.addEventListener('click', closeProductDetailsPanelAndRestoreOrigin);\n    }\n\n    (els.openColorPanelButtons || []).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        openColorPanel();\n      });\n    });\n\n    (els.closeColorPanelButtons || []).forEach(function (button) {\n      button.addEventListener('click', closeColorPanel);\n    });\n\n    els.stage.addEventListener('pointerdown', function (event) {\n      // v518: on phones, the first tap beside the text while the keyboard is open\n      // should only dismiss the keyboard. Keep the text editor/menu active; a\n      // second tap on the stage can then close the editor through the normal path.\n      if (isMobileEditorLayout() && root.classList.contains('is-mobile-text-entry-only')) {\n        var activeElement = document.activeElement;\n        var editorOwnsFocus = Boolean(\n          els.textEditorInput &&\n          (activeElement === els.textEditorInput || (els.textEditorInput.contains && els.textEditorInput.contains(activeElement)))\n        );\n\n        if (editorOwnsFocus) {\n          event.preventDefault();\n          event.stopPropagation();\n          try { els.textEditorInput.blur(); } catch (blurError) {}\n          return;\n        }\n      }\n\n      if (event.target.closest('.pb-customizer__image-layer')) return;\n      if (event.target.closest('[data-pb-design]')) return;\n      state.activeImageLayerId = '';\n      state.activePrimarySelected = false;\n      closeMobileAddBar();\n      clearSnapGuides();\n\n      // v324: clicking outside the AI panel should never leave the side panel in\n      // a split state. Close the AI panel first, then continue with the normal\n      // stage deselect flow.\n      if (els.aiPanel && !els.aiPanel.hidden) {\n        closeAiPanel();\n      }\n\n      closeTextEditor();\n      closeImageEditor();\n      renderDesign();\n      renderImageLayers(getDesignState(state.activePlacement, true));\n    });\n\n    if (els.openAiMotivButtons && els.openAiMotivButtons.length) {\n      els.openAiMotivButtons.forEach(function (button) {\n        button.addEventListener('click', function (event) {\n          if (event) {\n            event.preventDefault();\n            event.stopPropagation();\n          }\n          openAiPanel();\n        });\n\n      });\n    }\n\n    root.addEventListener('click', function (event) {\n      var openAiButton = event.target.closest('[data-pb-open-ai-motiv]');\n      if (!openAiButton || !root.contains(openAiButton)) return;\n\n      event.preventDefault();\n      event.stopPropagation();\n      openAiPanel();\n    });\n\n    root.addEventListener('click', function (event) {\n      var chip = event.target.closest('[data-pb-ai-chip]');\n      if (!chip || !root.contains(chip)) return;\n\n      event.preventDefault();\n      var chipValue = String(chip.getAttribute('data-pb-ai-chip') || '').trim();\n      if (!chipValue || !els.aiPrompt) return;\n\n      var current = String(els.aiPrompt.value || '').trim();\n      els.aiPrompt.value = current ? (current + (/[,.!?]$/.test(current) ? ' ' : ', ') + chipValue) : chipValue;\n      els.aiPrompt.focus();\n      els.aiPrompt.setSelectionRange(els.aiPrompt.value.length, els.aiPrompt.value.length);\n    });\n\n    root.addEventListener('click', function (event) {\n      var addTextButton = event.target.closest('[data-pb-open-text-editor]');\n      if (!addTextButton || !root.contains(addTextButton)) return;\n\n      event.preventDefault();\n      event.stopPropagation();\n      closeAiPanel();\n      closeMobileAddBar();\n      createTextLayerAndOpenEditor();\n      scrollActivePanelIntoView();\n    });\n\n    root.querySelectorAll('[data-pb-close-ai-panel]').forEach(function (el) {\n      el.addEventListener('click', closeAiPanel);\n    });\n\n    if (els.aiSubmit) {\n      els.aiSubmit.addEventListener('click', generateAiMotiv);\n    }\n\n    if (els.aiPrompt) {\n      els.aiPrompt.addEventListener('input', updateAiPromptCount);\n      els.aiPrompt.addEventListener('keydown', function (event) {\n        if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {\n          event.preventDefault();\n          generateAiMotiv();\n        }\n      });\n    }\n\n    if (els.aiHelp && els.aiHelpText) {\n      els.aiHelp.addEventListener('click', function (event) {\n        event.preventDefault();\n        els.aiHelpText.hidden = !els.aiHelpText.hidden;\n        els.aiHelp.classList.toggle('is-open', !els.aiHelpText.hidden);\n      });\n    }\n\n    root.querySelectorAll('[data-pb-close-text-editor]').forEach(function (el) {\n      el.addEventListener('click', closeTextEditor);\n    });\n\n    root.querySelectorAll('[data-pb-text-editor-done]').forEach(function (el) {\n      el.addEventListener('click', handleTextEditorDone);\n    });\n\n    root.querySelectorAll('[data-pb-text-editor-edit]').forEach(function (el) {\n      el.addEventListener('click', handleTextEditorEdit);\n    });\n\n    (els.closeImageEditorButtons || []).forEach(function (el) {\n      el.addEventListener('click', closeImageEditor);\n    });\n\n    if (els.textEditorInput) {\n      els.textEditorInput.addEventListener('compositionstart', function () {\n        __pbTextEditorComposing = true;\n      });\n      els.textEditorInput.addEventListener('compositionend', function () {\n        __pbTextEditorComposing = false;\n        updateActiveTextLayerFromEditor();\n        saveTextEditorSelection();\n      });\n      els.textEditorInput.addEventListener('input', function () {\n        if (__pbTextEditorComposing) return;\n        updateActiveTextLayerFromEditor();\n        saveTextEditorSelection();\n        syncTextBoldControl(getActiveLayer());\n      });\n      els.textEditorInput.addEventListener('beforeinput', function (event) {\n        if (__pbTextEditorComposing) return;\n        if (event.inputType === 'insertParagraph' || event.inputType === 'insertLineBreak') {\n          event.preventDefault();\n          insertPlainTextIntoTextEditor('\\n');\n          return;\n        }\n\n        if (event.inputType === 'insertText' && typeof event.data === 'string' && event.data) {\n          var current = readTextEditorRichData();\n          var selectedLength = editorSelectionIsInside() ? String(window.getSelection().toString() || '').length : 0;\n          var allowed = Math.max(0, 220 - (current.text.length - selectedLength));\n          if (event.data.length > allowed) {\n            event.preventDefault();\n            if (allowed > 0) insertPlainTextIntoTextEditor(event.data.slice(0, allowed));\n          }\n        }\n      });\n      els.textEditorInput.addEventListener('keydown', function (event) {\n        if ((event.ctrlKey || event.metaKey) && String(event.key || '').toLowerCase() === 'b') {\n          event.preventDefault();\n          if (els.textBold && !els.textBold.disabled) els.textBold.click();\n          return;\n        }\n        if (event.key === 'Enter' && !__pbTextEditorComposing) {\n          event.preventDefault();\n          insertPlainTextIntoTextEditor('\\n');\n        }\n      });\n      els.textEditorInput.addEventListener('paste', function (event) {\n        event.preventDefault();\n        var text = event.clipboardData ? event.clipboardData.getData('text/plain') : '';\n        insertPlainTextIntoTextEditor(text);\n      });\n      ['keyup', 'mouseup', 'touchend'].forEach(function (eventName) {\n        els.textEditorInput.addEventListener(eventName, function () {\n          saveTextEditorSelection();\n          syncTextBoldControl(getActiveLayer());\n        });\n      });\n\n      // v516: the mobile keyboard's Done/OK button dismisses the keyboard by\n      // blurring the real contenteditable. In the hidden mobile text-entry mode,\n      // use that blur as the signal that typing is finished and reveal the normal\n      // Redigera text controls again. Do not react to blur in the regular editor.\n      els.textEditorInput.addEventListener('blur', function () {\n        if (!isMobileEditorLayout()) return;\n        if (!root.classList.contains('is-mobile-text-entry-only')) return;\n\n        updateActiveTextLayerFromEditor();\n        root.classList.remove('is-mobile-text-entry-only');\n        state.mobileTextEntryMode = '';\n        setTextEditorTitle(pbT('redigera_text', 'Redigera text'));\n        setMobileTextSliderPanel('');\n        renderImageLayers(getDesignState(state.activePlacement, true));\n        renderPlacements();\n\n        window.requestAnimationFrame(function () {\n          scrollActivePanelIntoView();\n        });\n      });\n\n      document.addEventListener('selectionchange', function () {\n        if (!editorSelectionIsInside()) return;\n        saveTextEditorSelection();\n        syncTextBoldControl(getActiveLayer());\n      });\n    }\n\n    if (els.textFont) {\n      els.textFont.addEventListener('change', function () {\n        updateActiveTextLayerFromEditor();\n        syncFontPickerSummary();\n      });\n    }\n\n    if (els.openFontPicker) {\n      els.openFontPicker.addEventListener('click', openFontPickerPanel);\n    }\n\n    if (els.desktopOpenFontPicker) {\n      els.desktopOpenFontPicker.addEventListener('click', openFontPickerPanel);\n    }\n\n    (els.closeFontPickerButtons || []).forEach(function (button) {\n      button.addEventListener('click', closeFontPickerPanel);\n    });\n\n    if (els.fontList) {\n      els.fontList.addEventListener('click', function (event) {\n        var button = event.target.closest('[data-pb-font-choice]');\n        if (!button || !els.fontList.contains(button)) return;\n        setActiveTextFont(button.dataset.pbFontChoice || '');\n      });\n    }\n\n    if (els.textColor) {\n      els.textColor.addEventListener('input', updateActiveTextLayerFromEditor);\n      els.textColor.addEventListener('change', updateActiveTextLayerFromEditor);\n    }\n\n    bindTextNumberPair(els.textSize, els.textSizeNumber, TEXT_SIZE_MIN_PT, TEXT_SIZE_MAX_PT, TEXT_SIZE_DEFAULT_PT);\n    bindTextNumberPair(els.textCurve, els.textCurveNumber, -400, 400, 0);\n    bindTextNumberPair(els.textRotate, els.textRotateNumber, -180, 180, 0);\n    bindTextNumberPair(els.textSpacing, els.textSpacingNumber, 25, 250, 100);\n\n    bindDesktopTextPair(els.desktopTextSize, els.desktopTextSizeNumber, els.textSize, els.textSizeNumber, TEXT_SIZE_MIN_PT, TEXT_SIZE_MAX_PT, TEXT_SIZE_DEFAULT_PT);\n    bindDesktopTextPair(els.desktopTextCurve, els.desktopTextCurveNumber, els.textCurve, els.textCurveNumber, -400, 400, 0);\n    bindDesktopTextPair(els.desktopTextSpacing, els.desktopTextSpacingNumber, els.textSpacing, els.textSpacingNumber, 25, 250, 100);\n\n    (els.textSliderToggleButtons || []).forEach(function (button) {\n      button.addEventListener('click', function () {\n        toggleMobileTextSliderPanel(button.dataset.pbTextSliderToggle || '');\n      });\n    });\n\n    if (els.textSizeReset) {\n      els.textSizeReset.addEventListener('click', function () { resetActiveTextAdjustment('size'); });\n    }\n    if (els.textCurveReset) {\n      els.textCurveReset.addEventListener('click', function () { resetActiveTextAdjustment('curve'); });\n    }\n    if (els.textSpacingReset) {\n      els.textSpacingReset.addEventListener('click', function () { resetActiveTextAdjustment('spacing'); });\n    }\n\n    if (els.desktopTextSizeReset) {\n      els.desktopTextSizeReset.addEventListener('click', function () { resetActiveTextAdjustment('size'); syncDesktopTextControls(getActiveLayer()); });\n    }\n    if (els.desktopTextCurveReset) {\n      els.desktopTextCurveReset.addEventListener('click', function () { resetActiveTextAdjustment('curve'); syncDesktopTextControls(getActiveLayer()); });\n    }\n    if (els.desktopTextSpacingReset) {\n      els.desktopTextSpacingReset.addEventListener('click', function () { resetActiveTextAdjustment('spacing'); syncDesktopTextControls(getActiveLayer()); });\n    }\n\n    if (els.textSizeMinus) {\n      els.textSizeMinus.addEventListener('click', function () {\n        adjustTextSize(-2);\n      });\n    }\n\n    if (els.textSizePlus) {\n      els.textSizePlus.addEventListener('click', function () {\n        adjustTextSize(2);\n      });\n    }\n\n    if (els.textOutline) {\n      els.textOutline.addEventListener('change', updateActiveTextLayerFromEditor);\n    }\n\n    if (els.openTextColorEditor) {\n      els.openTextColorEditor.addEventListener('click', openTextColorEditorPanel);\n    }\n\n    if (els.desktopOpenTextColorEditor) {\n      els.desktopOpenTextColorEditor.addEventListener('click', openTextColorEditorPanel);\n    }\n\n    if (els.openStyleEditor) {\n      els.openStyleEditor.addEventListener('click', openStyleEditorPanel);\n    }\n\n    (els.openStyleOutlineButtons || []).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        if (event) { event.preventDefault(); event.stopPropagation(); }\n        openOutlineEditorPanel('style');\n      });\n    });\n\n    (els.closeTextColorEditorButtons || []).forEach(function (button) {\n      button.addEventListener('click', closeTextColorEditorPanel);\n    });\n\n    if (els.textColorPalette) {\n      els.textColorPalette.addEventListener('click', function (event) {\n        var button = event.target.closest('[data-pb-text-color-choice]');\n        if (!button) return;\n        setActiveTextColor(button.dataset.pbTextColorChoice || '#ffffff');\n      });\n    }\n\n    if (els.openOutlineEditor) {\n      els.openOutlineEditor.addEventListener('click', openOutlineEditorPanel);\n    }\n\n    if (els.desktopOpenOutlineEditor) {\n      els.desktopOpenOutlineEditor.addEventListener('click', function () { openOutlineEditorPanel(''); });\n    }\n\n    (els.closeTextControlButtons || []).forEach(function (button) {\n      button.addEventListener('click', navigateBackTextEditorSubpanel);\n    });\n\n    (els.closeOutlineEditorButtons || []).forEach(function (button) {\n      button.addEventListener('click', closeOutlineEditorPanel);\n    });\n\n    if (els.outlinePalette) {\n      els.outlinePalette.addEventListener('click', function (event) {\n        var button = event.target.closest('[data-pb-outline-color]');\n        if (!button) return;\n        setActiveTextOutline(button.dataset.pbOutlineColor || 'none');\n      });\n    }\n\n    bindTextNumberPair(els.outlineSize, els.outlineSizeNumber, 0, 120, 6);\n\n    if (els.textMoveBack) {\n      els.textMoveBack.addEventListener('click', function () {\n        moveActiveLayerInStack(-1);\n      });\n    }\n\n    if (els.textMoveForward) {\n      els.textMoveForward.addEventListener('click', function () {\n        moveActiveLayerInStack(1);\n      });\n    }\n\n    if (els.textDuplicate) {\n      els.textDuplicate.addEventListener('click', duplicateActiveTextLayer);\n    }\n\n    if (els.textLock) {\n      els.textLock.addEventListener('click', function () {\n        togglePressedButton(els.textLock);\n        updateActiveTextLayerFromEditor();\n      });\n    }\n\n    if (els.textFlip) {\n      els.textFlip.addEventListener('click', function () {\n        togglePressedButton(els.textFlip);\n        updateActiveTextLayerFromEditor();\n      });\n    }\n\n    if (els.textBold) {\n      els.textBold.addEventListener('pointerdown', function () {\n        saveTextEditorSelection();\n      });\n      els.textBold.addEventListener('mousedown', function (event) {\n        // Keep the marked word selected while clicking the toolbar.\n        event.preventDefault();\n      });\n      els.textBold.addEventListener('click', function () {\n        if (els.textBold.disabled || !els.textEditorInput) return;\n        var layer = getActiveLayer();\n        if (!layer || layer.type !== 'text') return;\n        if (!designerFontSupportsBold(layer.fontFamily)) return;\n\n        els.textEditorInput.focus();\n        restoreTextEditorSelection();\n        try {\n          document.execCommand('bold', false, null);\n        } catch (error) {}\n        saveTextEditorSelection();\n        updateActiveTextLayerFromEditor();\n        syncTextBoldControl(layer);\n      });\n    }\n\n    if (els.textItalic) {\n      els.textItalic.addEventListener('click', function () {\n        togglePressedButton(els.textItalic);\n        updateActiveTextLayerFromEditor();\n      });\n    }\n\n    if (els.textAlignButtons && els.textAlignButtons.length) {\n      els.textAlignButtons.forEach(function (button) {\n        button.addEventListener('mousedown', function (event) { event.preventDefault(); });\n        button.addEventListener('click', function () {\n          setTextAlignButton(button.dataset.pbTextAlign || 'center');\n          updateActiveTextLayerFromEditor();\n          syncTextEditorPresentation(getActiveLayer());\n        });\n      });\n    }\n\n    (els.textDeleteButtons || []).forEach(function (button) {\n      button.addEventListener('click', function () {\n        var layer = getActiveLayer();\n        if (layer && layer.type === 'text') {\n          deleteImageLayer(layer.id);\n          closeTextEditor();\n        }\n      });\n    });\n\n    if (els.imageRemoveBg) {\n      els.imageRemoveBg.addEventListener('click', removeBackgroundFromActiveImageLayer);\n    }\n\n    if (els.imageMoveBack) {\n      els.imageMoveBack.addEventListener('click', function () {\n        moveActiveLayerInStack(-1);\n        syncImageEditorControls(getActiveLayer());\n      });\n    }\n\n    if (els.imageMoveForward) {\n      els.imageMoveForward.addEventListener('click', function () {\n        moveActiveLayerInStack(1);\n        syncImageEditorControls(getActiveLayer());\n      });\n    }\n\n    if (els.imageDuplicate) {\n      els.imageDuplicate.addEventListener('click', duplicateActiveImageLayer);\n    }\n\n    if (els.imageFlip) {\n      els.imageFlip.addEventListener('click', function () {\n        var layer = getActiveLayer();\n        if (!layer || layer.type === 'text') return;\n        layer.flipX = !Boolean(layer.flipX);\n        renderImageLayers(getDesignState(state.activePlacement, true));\n        renderPlacements();\n        syncImageEditorControls(layer);\n      });\n    }\n\n    if (els.imageLock) {\n      els.imageLock.addEventListener('click', function () {\n        var layer = getActiveLayer();\n        if (!layer || layer.type === 'text') return;\n        layer.locked = !Boolean(layer.locked);\n        renderImageLayers(getDesignState(state.activePlacement, true));\n        renderPlacements();\n        syncImageEditorControls(layer);\n      });\n    }\n\n    (els.imageDeleteButtons || []).forEach(function (button) {\n      button.addEventListener('click', function () {\n        var layer = getActiveLayer();\n        var layerId = layer && layer.type !== 'text' ? layer.id : state.activeImageLayerId;\n        if (layerId) {\n          deleteImageLayer(layerId);\n          closeImageEditor();\n        }\n      });\n    });\n\n    els.file.addEventListener('change', pbHandleImageUploadSelection);\n\n    (els.settingsToggleButtons || []).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        setSettingsPanelOpen(!state.settingsOpen);\n      });\n    });\n\n    (els.settingsCloseButtons || []).forEach(function (button) {\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        setSettingsPanelOpen(false);\n      });\n    });\n\n    if (els.settingsSnapInput) {\n      els.settingsSnapInput.addEventListener('change', function () {\n        setSnapEnabled(Boolean(els.settingsSnapInput.checked));\n      });\n    }\n\n    document.addEventListener('click', function (event) {\n      if (!state.settingsOpen) return;\n      var target = event.target;\n      if (!target || !root.contains(target)) return;\n      if (target.closest('[data-pb-settings-panel]') || target.closest('[data-pb-settings-toggle]')) return;\n      setSettingsPanelOpen(false);\n    });\n\n    document.addEventListener('keydown', function (event) {\n      if (event.key === 'Escape' && state.settingsOpen) {\n        setSettingsPanelOpen(false);\n      }\n    });\n\n    // v503: bottom-toolbar taps are handled by the unified mobile button tap layer.\n\n    if (els.mobileAddToggle) {\n      function setMobileAddPressing(active) {\n        active = Boolean(active);\n        els.mobileAddToggle.classList.toggle('is-mobile-add-pressing', active);\n        root.classList.toggle('is-mobile-add-pressing', active);\n      }\n\n      els.mobileAddToggle.addEventListener('pointerdown', function () {\n        setMobileAddPressing(true);\n      });\n\n      els.mobileAddToggle.addEventListener('pointerup', function () {\n        window.setTimeout(function () {\n          setMobileAddPressing(false);\n        }, 120);\n      });\n\n      els.mobileAddToggle.addEventListener('pointercancel', function () {\n        setMobileAddPressing(false);\n      });\n\n      els.mobileAddToggle.addEventListener('pointerleave', function () {\n        setMobileAddPressing(false);\n      });\n\n      els.mobileAddToggle.addEventListener('touchstart', function () {\n        setMobileAddPressing(true);\n      }, { passive: true, capture: true });\n\n      els.mobileAddToggle.addEventListener('touchend', function () {\n        window.setTimeout(function () {\n          setMobileAddPressing(false);\n        }, 140);\n      }, { passive: true, capture: true });\n\n      els.mobileAddToggle.addEventListener('touchcancel', function () {\n        setMobileAddPressing(false);\n      }, { passive: true, capture: true });\n\n      els.mobileAddToggle.addEventListener('click', function (event) {\n        if (event) event.preventDefault();\n        toggleMobileAddBar();\n      });\n    }\n\n\n    [els.textSnapToggle, els.imageSnapToggle].forEach(function (button) {\n      if (!button) return;\n      button.addEventListener('click', function (event) {\n        event.preventDefault();\n        setSnapEnabled(!state.snapEnabled);\n      });\n    });\n\n    if (els.mobileUpload) {\n      els.mobileUpload.addEventListener('click', function () {\n        closeMobileAddBar();\n        if (els.file) els.file.click();\n      });\n    }\n\n    if (els.mobilePrice) {\n      els.mobilePrice.addEventListener('click', function (event) {\n        if (event) event.preventDefault();\n        closeMobileAddBar();\n        handlePrimaryDesignCta(event);\n      });\n    }\n\n    if (els.mobileZoomToggle) {\n      els.mobileZoomToggle.addEventListener('click', function (event) {\n        if (event) event.preventDefault();\n        toggleMobileStageZoom();\n      });\n    }\n\n\n    if (els.mobileZoomInToggle) {\n      els.mobileZoomInToggle.addEventListener('click', function (event) {\n        if (event) event.preventDefault();\n        toggleMobileStageExtraZoom();\n      });\n    }\n\n    if (els.mobileEmptyUpload) {\n      els.mobileEmptyUpload.addEventListener('click', function (event) {\n        if (event) event.preventDefault();\n        if (els.file) els.file.click();\n      });\n    }\n\n    setupCartPressFeedback();\n    if (els.openSizeModal) els.openSizeModal.addEventListener('click', handlePrimaryDesignCta);\n\n    if (els.sizeProductDescription) {\n      els.sizeProductDescription.addEventListener('click', function (event) {\n        event.preventDefault();\n        openProductDetailsPanel({ returnTo: 'size' });\n      });\n    }\n\n    els.confirmAdd.addEventListener('click', confirmAddToCart);\n\n    root.querySelectorAll('[data-pb-close-size-modal]').forEach(function (el) {\n      el.addEventListener('click', closeSizeModal);\n    });\n\n    setupDrag();\n    setupResize();\n  }\n\n\n  async function addUploadedImageLayer(file, onUploadProgress) {\n    var pendingLayer = pbShowUploadPlaceholder(file);\n    var dState = pbUploadPlaceholder.design;\n    var prepared;\n    try { prepared = await normalizeUploadedImageFile(file, onUploadProgress); }\n    catch (error) { pbRemoveUploadPlaceholder(); throw error; }\n    state.activePrimarySelected = false;\n\n\n    var layer = {\n      id: pendingLayer.id,\n      type: 'image',\n      sourceFileName: file.name || '',\n      imageDataUrl: prepared.dataUrl,\n      naturalWidth: prepared.width,\n      naturalHeight: prepared.height,\n      x: 29,\n      y: 34,\n      w: 56,\n      h: 32,\n      rotation: 0,\n      locked: false,\n      flipX: false,\n      backgroundRemoved: false,\n      backgroundRemoveOriginalImageDataUrl: prepared.dataUrl,\n      backgroundRemoveOriginalNaturalWidth: prepared.width,\n      backgroundRemoveOriginalNaturalHeight: prepared.height,\n      backgroundRemoveOriginalSourceFileName: file.name || '',\n      backgroundRemoveResultImageDataUrl: '',\n      backgroundRemoveResultNaturalWidth: 0,\n      backgroundRemoveResultNaturalHeight: 0,\n      backgroundRemoveResultSourceFileName: ''\n    };\n\n    // New uploads should always START fully inside the print area. Keep the\n    // familiar 56% default width, but cap the initial height for wide/short\n    // print areas such as caps. Later resize/drag behavior stays unchanged.\n    pbSetInitialImageGeometry(layer);\n\n    dState.imageLayers = dState.imageLayers || [];\n    Object.assign(pendingLayer, layer);\n    delete pendingLayer.pbUploadPending;\n    delete pendingLayer.pbUpscaleBusy;\n    layer = pendingLayer;\n    pbUploadPlaceholder = null;\n    state.activeImageLayerId = layer.id;\n    dState.touched = hasPrimaryDesignContent(dState) || dState.imageLayers.length > 0;\n\n    return layer;\n  }\n\n  function getDefaultTextColorForCurrentAppearance() {\n    // Use the same server-resolved contrast decision as the print-area guide.\n    // The Worker already chooses the guide color from the selected appearance,\n    // so a light garment gets a dark default and a dark garment gets white.\n    var guideRgb = parseColorToRgb(state.spreadconnectPrintAreaGuideColor || '');\n    if (guideRgb) {\n      function toHex(value) {\n        return Math.max(0, Math.min(255, Math.round(Number(value) || 0)))\n          .toString(16)\n          .padStart(2, '0');\n      }\n      return ('#' + toHex(guideRgb.r) + toHex(guideRgb.g) + toHex(guideRgb.b)).toUpperCase();\n    }\n\n    var contrast = String(state.spreadconnectAppearanceContrast || '').trim().toLowerCase();\n    if (contrast === 'light') return '#111827';\n    if (contrast === 'dark') return '#FFFFFF';\n\n    // Preserve the old default only when supplier appearance contrast is missing.\n    return '#FFFFFF';\n  }\n\n  async function createTextLayerAndOpenEditor() {\n    try {\n      var dState = getDesignState(state.activePlacement, true);\n      state.activePrimarySelected = false;\n      var defaultTextColor = getDefaultTextColorForCurrentAppearance();\n\n      var layer = {\n        id: makeLayerId(),\n        type: 'text',\n        text: pbT('din_text_har', 'Din text h\u00E4r'),\n        sourceFileName: '',\n        imageDataUrl: '',\n        naturalWidth: 1,\n        naturalHeight: 1,\n        x: 21,\n        y: 27,\n        w: 58,\n        h: 18,\n        // New text layers should always start from clean defaults,\n        // not inherit the last edited layer's settings.\n        rotation: 0,\n        fontFamily: 'Arial, Helvetica, sans-serif',\n        color: defaultTextColor,\n        fontWeight: '400',\n        boldRanges: [],\n        fontStyle: 'normal',\n        uppercase: false,\n        align: 'center',\n        fontSize: textPointsToInternalPx(TEXT_SIZE_DEFAULT_PT, getTextSizingTemplate()),\n        curve: 0,\n        outline: 'none',\n        outlineSize: 6,\n        letterSpacing: 100,\n        locked: false,\n        flipX: false\n      };\n\n      // v383: text stays as one live SVG object on the stage. Do not rasterize\n      // it just to show/edit it; rasterization is reserved for export paths.\n      updateTextLayerNaturalSize(layer);\n      setStatus('', false);\n\n      // Calculate a sensible real point size from the actual Spreadconnect\n      // print area, then center the text. The resulting value shown in the UI\n      // is still a genuine typographic pt value.\n      fitNewTextLayerToDefaultSize(layer);\n      constrainImageLayer(layer);\n      freezeTextLayerGeometry(layer);\n\n      dState.imageLayers = dState.imageLayers || [];\n      dState.imageLayers.push(layer);\n      state.activeImageLayerId = layer.id;\n      dState.touched = hasPrimaryDesignContent(dState) || dState.imageLayers.length > 0;\n\n      renderDesign();\n      renderPlacements();\n      openTextEditorForLayer(layer.id, true);\n    } catch (error) {\n      setStatus(error.message || pbT('kunde_inte_lagga_till_text', 'Kunde inte l\u00E4gga till text.'), true);\n      console.error('[Printbolt Designer] Add text failed:', error);\n    }\n  }\n\n  function getActiveLayer() {\n    var dState = getDesignState(state.activePlacement, true);\n    return (dState.imageLayers || []).find(function (layer) {\n      return layer.id === state.activeImageLayerId;\n    }) || null;\n  }\n\n  function openTextEditorForLayer(layerId, selectText) {\n    closeSettingsView();\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = (dState.imageLayers || []).find(function (item) { return item.id === layerId; });\n    if (!layer || layer.type !== 'text') return;\n\n    state.activeImageLayerId = layer.id;\n    closeImageEditor();\n    closeProductDetailsPanel();\n    closeSizeModal();\n    closeColorPanel();\n    closeAiPanel();\n    applyTextEditorControlLimits();\n\n    if (els.textEditorInput) writeTextEditorFromLayer(layer);\n    if (els.textFont) {\n      if (!getDesignerFontByFamily(layer.fontFamily || '')) {\n        layer.fontFamily = 'Arial, Helvetica, sans-serif';\n      }\n      els.textFont.value = layer.fontFamily || 'Arial, Helvetica, sans-serif';\n    }\n    syncFontPickerSummary(layer);\n    ensureDesignerFontReadyByFamily(layer.fontFamily).then(function () {\n      if (getActiveLayer() && getActiveLayer().id === layer.id) {\n        updateTextLayerNaturalSize(layer);\n        renderImageLayers(getDesignState(state.activePlacement, true));\n        syncFontPickerSummary(layer);\n      }\n    });\n    if (els.textColor) els.textColor.value = normalizeHexColor(layer.color || '#ffffff');\n    syncTextColorControls(layer);\n    syncTextNumberPair(\n      els.textSize,\n      els.textSizeNumber,\n      textInternalPxToPoints(Number(layer.fontSize || 96), getTextSizingTemplate())\n    );\n    syncTextNumberPair(els.textCurve, els.textCurveNumber, Number(layer.curve || 0));\n    syncTextNumberPair(els.textRotate, els.textRotateNumber, normalizeSignedRotation(layer.rotation || 0));\n    syncTextNumberPair(els.textSpacing, els.textSpacingNumber, Number(layer.letterSpacing || 100));\n    syncTextAdjustmentResetButtons(layer);\n    refreshMobileTextSliderSummaries();\n    syncDesktopTextControls(layer);\n    if (els.textCurveValue) els.textCurveValue.textContent = String(Number(layer.curve || 0));\n    if (els.textOutline) els.textOutline.value = layer.outline || 'none';\n    syncTextNumberPair(els.outlineSize, els.outlineSizeNumber, Number(layer.outlineSize || 6));\n    syncOutlineControls(layer);\n    syncTextBoldControl(layer);\n    setPressedButton(els.textItalic, String(layer.fontStyle || 'normal') === 'italic');\n    setPressedButton(els.textLock, Boolean(layer.locked));\n    setPressedButton(els.textFlip, Boolean(layer.flipX));\n    setTextAlignButton(layer.align || 'center');\n    syncSnapToggleButtons();\n\n    var isInitialMobileTextEntry = Boolean(selectText && isMobileEditorLayout());\n    state.mobileTextEntryMode = isInitialMobileTextEntry ? 'create' : '';\n    root.classList.toggle('is-mobile-text-entry-only', isInitialMobileTextEntry);\n    setTextEditorTitle(isInitialMobileTextEntry ? pbT('lagg_till_text', 'L\u00E4gg till text') : pbT('redigera_text', 'Redigera text'));\n    setMobileTextSliderPanel('');\n\n    if (els.sidePanel) els.sidePanel.classList.add('is-text-editor-active');\n    if (els.toolsCard) els.toolsCard.classList.add('is-editing-text');\n    if (els.textEditorPanel) {\n      els.textEditorPanel.hidden = false;\n      els.textEditorPanel.style.display = '';\n      closeTextEditorSubpanels();\n    }\n    syncToolsMainVisibility();\n\n    renderImageLayers(dState);\n\n    // v513: on the initial mobile \u201CL\u00E4gg till text\u201D flow, focus must happen\n    // synchronously while the touch gesture still owns browser user activation.\n    // Delaying focus (even ~40 ms) can make iOS Safari show the editor without\n    // opening the virtual keyboard.\n    if (isInitialMobileTextEntry && els.textEditorInput) {\n      try {\n        els.textEditorInput.focus({ preventScroll: true });\n      } catch (focusError) {\n        try { els.textEditorInput.focus(); } catch (fallbackFocusError) {}\n      }\n      if (selectText) selectAllTextEditorContent();\n    } else {\n      setTimeout(function () {\n        if (!els.textEditorInput) return;\n        els.textEditorInput.focus();\n        if (selectText) selectAllTextEditorContent();\n      }, 40);\n    }\n  }\n\n  function handleTextEditorDone() {\n    updateActiveTextLayerFromEditor();\n\n    if (root.classList.contains('is-mobile-text-entry-only')) {\n      root.classList.remove('is-mobile-text-entry-only');\n      state.mobileTextEntryMode = '';\n      setTextEditorTitle(pbT('redigera_text', 'Redigera text'));\n      setMobileTextSliderPanel('');\n      if (els.textEditorInput) els.textEditorInput.blur();\n      renderImageLayers(getDesignState(state.activePlacement, true));\n      renderPlacements();\n      return;\n    }\n\n    closeTextEditor();\n  }\n\n  function handleTextEditorEdit(event) {\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    updateActiveTextLayerFromEditor();\n\n    if (root.classList.contains('is-mobile-text-entry-only')) {\n      root.classList.remove('is-mobile-text-entry-only');\n      state.mobileTextEntryMode = '';\n      setTextEditorTitle(pbT('redigera_text', 'Redigera text'));\n      if (els.textEditorInput) els.textEditorInput.blur();\n      renderImageLayers(getDesignState(state.activePlacement, true));\n      renderPlacements();\n      return;\n    }\n\n    if (!isMobileEditorLayout()) return;\n\n    var layer = getActiveLayer();\n    if (!layer || layer.type !== 'text') return;\n\n    state.mobileTextEntryMode = 'edit';\n    setMobileTextSliderPanel('');\n    root.classList.add('is-mobile-text-entry-only');\n    setTextEditorTitle(pbT('andra_text', '\u00C4ndra text'));\n    closeTextEditorSubpanels();\n\n    if (els.textEditorInput) {\n      writeTextEditorFromLayer(layer);\n      try {\n        els.textEditorInput.focus({ preventScroll: true });\n      } catch (focusError) {\n        try { els.textEditorInput.focus(); } catch (fallbackFocusError) {}\n      }\n      // v517: editing an existing text must never re-select the whole value.\n      // Put the caret at the end so one Backspace removes one character.\n      placeTextEditorCaretAtEnd();\n    }\n\n    renderImageLayers(getDesignState(state.activePlacement, true));\n  }\n\n  function closeTextEditor() {\n    setTextEditorTitle(pbT('redigera_text', 'Redigera text'));\n    var activeLayerBeforeClose = getActiveLayer();\n    var closingTextLayerId = activeLayerBeforeClose && activeLayerBeforeClose.type === 'text'\n      ? String(activeLayerBeforeClose.id || '')\n      : '';\n    var shouldCancelInitialMobileText = root.classList.contains('is-mobile-text-entry-only') && state.mobileTextEntryMode === 'create';\n    var initialMobileLayer = shouldCancelInitialMobileText ? activeLayerBeforeClose : null;\n\n    root.classList.remove('is-mobile-text-entry-only');\n    state.mobileTextEntryMode = '';\n    setMobileTextSliderPanel('');\n    if (els.sidePanel) els.sidePanel.classList.remove('is-text-editor-active');\n    if (els.toolsCard) els.toolsCard.classList.remove('is-editing-text');\n    if (els.textEditorPanel) {\n      els.textEditorPanel.hidden = true;\n      closeTextEditorSubpanels();\n    }\n    syncToolsMainVisibility();\n\n    if (shouldCancelInitialMobileText && initialMobileLayer && initialMobileLayer.type === 'text') {\n      var dState = getDesignState(state.activePlacement, true);\n      dState.imageLayers = (dState.imageLayers || []).filter(function (layer) {\n        return layer.id !== initialMobileLayer.id;\n      });\n      if (state.activeImageLayerId === initialMobileLayer.id) state.activeImageLayerId = '';\n      dState.touched = hasPrimaryDesignContent(dState) || dState.imageLayers.length > 0;\n      renderDesign();\n      renderPlacements();\n      return;\n    }\n\n    removeEmptyTextLayersOnActivePlacement();\n\n    // v323: closing the text editor should also leave edit/selection mode.\n    // Only clear the selection when the layer that was active at close-time was text;\n    // closeTextEditor() is also reused while opening image tools, where the newly\n    // selected image must remain selected.\n    if (closingTextLayerId && String(state.activeImageLayerId || '') === closingTextLayerId) {\n      state.activeImageLayerId = '';\n      state.activePrimarySelected = false;\n      var closeState = getDesignState(state.activePlacement, true);\n      renderImageLayers(closeState);\n      syncPrintAreaGuideVisibility();\n      renderPlacements();\n    }\n  }\n\n  function openImageEditorForLayer(layerId) {\n    closeSettingsView();\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = (dState.imageLayers || []).find(function (item) { return item.id === layerId; });\n    if (!layer || layer.type === 'text') return;\n\n    state.activeImageLayerId = layer.id;\n    state.activePrimarySelected = false;\n    root.classList.remove('is-mobile-text-entry-only');\n    state.mobileTextEntryMode = '';\n\n    closeTextEditor();\n    closeProductDetailsPanel();\n    closeSizeModal();\n    closeColorPanel();\n    closeAiPanel();\n    syncImageEditorControls(layer);\n\n    if (els.sidePanel) els.sidePanel.classList.add('is-image-editor-active');\n    if (els.toolsCard) els.toolsCard.classList.add('is-editing-image');\n    if (els.imageEditorPanel) {\n      els.imageEditorPanel.hidden = false;\n      els.imageEditorPanel.style.display = '';\n    }\n    syncToolsMainVisibility();\n\n    renderImageLayers(dState);\n  }\n\n  function closeImageEditor() {\n    if (els.sidePanel) els.sidePanel.classList.remove('is-image-editor-active');\n    if (els.toolsCard) els.toolsCard.classList.remove('is-editing-image');\n    if (els.imageEditorPanel) els.imageEditorPanel.hidden = true;\n    syncToolsMainVisibility();\n  }\n\n  function getImageLayerDisplayName(layer) {\n    if (!layer || layer.type === 'text') return pbT('uppladdad_bild', 'Uppladdad bild');\n    return String(layer.backgroundRemoveOriginalSourceFileName || layer.sourceFileName || pbT('uppladdad_bild', 'Uppladdad bild'));\n  }\n\n  function getImageLayerEffectiveDpi(layer, placement) {\n    if (!layer || layer.type === 'text') return null;\n\n    var template = state.templatesByPlacement[placement || state.activePlacement] || selectLocalTemplate(placement || state.activePlacement) || null;\n    if (!template) return null;\n\n    var sourceWidthPx = Number(layer.naturalWidth || 0);\n    var sourceHeightPx = Number(layer.naturalHeight || 0);\n    var printAreaWidthPx = getTemplatePrintFileWidth(template);\n    var printAreaHeightPx = getTemplatePrintFileHeight(template);\n    var printAreaDpi = getTemplatePrintFileDpi(template);\n\n    if (\n      !Number.isFinite(sourceWidthPx) || sourceWidthPx <= 0 ||\n      !Number.isFinite(sourceHeightPx) || sourceHeightPx <= 0 ||\n      !Number.isFinite(printAreaWidthPx) || printAreaWidthPx <= 0 ||\n      !Number.isFinite(printAreaHeightPx) || printAreaHeightPx <= 0 ||\n      !Number.isFinite(printAreaDpi) || printAreaDpi <= 0\n    ) {\n      return null;\n    }\n\n    var printedWidthInches = (printAreaWidthPx * (Number(layer.w || 0) / 100)) / printAreaDpi;\n    var printedHeightInches = (printAreaHeightPx * (Number(layer.h || 0) / 100)) / printAreaDpi;\n\n    if (printedWidthInches <= 0 || printedHeightInches <= 0) return null;\n\n    var dpiX = sourceWidthPx / printedWidthInches;\n    var dpiY = sourceHeightPx / printedHeightInches;\n    var effectiveDpi = Math.min(dpiX, dpiY);\n\n    if (!Number.isFinite(effectiveDpi) || effectiveDpi <= 0) return null;\n\n    return {\n      dpi: effectiveDpi,\n      dpiX: dpiX,\n      dpiY: dpiY,\n      printedWidthCm: printedWidthInches * 2.54,\n      printedHeightCm: printedHeightInches * 2.54,\n      sourceWidthPx: sourceWidthPx,\n      sourceHeightPx: sourceHeightPx\n    };\n  }\n\n\n  // v279: DPI remains an internal quality/upscale metric only.\n  // Never show DPI values in the customer-facing editor.\n\n  function syncImageEditorControls(layer) {\n    layer = layer || getActiveLayer();\n    if (!layer || layer.type === 'text') return;\n\n    if (els.imagePreview) {\n      els.imagePreview.src = layer.imageDataUrl || '';\n      els.imagePreview.alt = getImageLayerDisplayName(layer) || pbT('designbild', 'Designbild');\n    }\n\n    if (els.imageName) {\n      els.imageName.textContent = getImageLayerDisplayName(layer) || pbT('uppladdad_bild', 'Uppladdad bild');\n    }\n\n\n    setPressedButton(els.imageFlip, Boolean(layer.flipX));\n    setPressedButton(els.imageLock, Boolean(layer.locked));\n    syncSnapToggleButtons();\n    syncImageRemoveBgButton(layer);\n\n    if (els.imageLock) {\n      var strong = els.imageLock.querySelector('strong');\n      if (strong) strong.textContent = layer.locked ? pbT('las_upp', 'L\u00E5s upp') : pbT('las', 'L\u00E5s');\n    }\n  }\n\n  function syncImageRemoveBgButton(layer, options) {\n    if (!els.imageRemoveBg) return;\n\n    layer = layer || getActiveLayer();\n    options = options || {};\n    var hasExplicitBusy = Object.prototype.hasOwnProperty.call(options, 'busy');\n    var busy = hasExplicitBusy\n      ? Boolean(options.busy)\n      : Boolean(layer && (layer.pbBackgroundBusy || layer.pbBackgroundActionPending));\n    var pendingAction = layer && layer.pbBackgroundActionPending;\n    var label = options.label || (busy && pendingAction\n      ? (pendingAction === 'restore' ? pbT('aterstaller', '\u00C5terst\u00E4ller\u2026') : pbT('tar_bort', 'Tar bort\u2026'))\n      : getImageRemoveBgButtonLabel(layer));\n    var removed = layer && layer.type !== 'text' && Boolean(layer.backgroundRemoved);\n\n    els.imageRemoveBg.disabled = busy;\n    els.imageRemoveBg.classList.toggle('is-busy', busy);\n\n    var labelEl = els.imageRemoveBg.querySelector('strong');\n    if (labelEl) {\n      labelEl.textContent = label;\n    } else {\n      els.imageRemoveBg.textContent = label;\n    }\n\n    var iconEl = els.imageRemoveBg.querySelector('.pb-text-pro__icon');\n    if (iconEl) {\n      iconEl.textContent = busy ? '\u2026' : '';\n        if (!busy) {\n          iconEl.innerHTML = removed\n            ? '<span class=\"pb-ui-svg-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M4 10a8 8 0 1 1 2.34 5.66\"/><path d=\"M4 16v-6h6\"/></svg></span>'\n            : '<span class=\"pb-ui-svg-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" focusable=\"false\"><rect x=\"5\" y=\"5\" width=\"14\" height=\"14\" rx=\"2\"/><path d=\"M9 9h6v6H9z\"/></svg></span>';\n        }\n    }\n\n    els.imageRemoveBg.setAttribute('aria-pressed', removed ? 'true' : 'false');\n  }\n\n  function getImageRemoveBgButtonLabel(layer) {\n    if (!layer || layer.type === 'text') return pbT('ta_bort_bakgrund', 'Ta bort bakgrund');\n    return layer.backgroundRemoved ? pbT('aterstall', '\u00C5terst\u00E4ll') : pbT('ta_bort_bakgrund', 'Ta bort bakgrund');\n  }\n\n  function applyImageLayerBitmap(layer, imageDataUrl, naturalWidth, naturalHeight, sourceFileName) {\n    if (!layer || layer.type === 'text') return;\n    layer.imageDataUrl = imageDataUrl || '';\n    layer.naturalWidth = Number(naturalWidth || layer.naturalWidth || 1);\n    layer.naturalHeight = Number(naturalHeight || layer.naturalHeight || 1);\n    layer.sourceFileName = sourceFileName || layer.sourceFileName || 'bild.png';\n  }\n\n  function duplicateActiveImageLayer() {\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = getActiveLayer();\n    if (!layer || layer.type === 'text') return;\n\n    var copy = Object.assign({}, layer);\n    copy.boldRanges = getTextLayerBoldRanges(layer).map(function (range) { return { start: range.start, end: range.end }; });\n    copy.id = makeLayerId();\n\n    // v253: processing state belongs to one concrete layer instance and must\n    // never be inherited by a duplicate. Permanent bitmap/cache state is kept.\n    copy.pbUpscaleBusy = false;\n    copy.pbUpscaleResizeReleased = false;\n    copy.pbUpscalePendingResult = null;\n    copy.pbUpscalePendingError = '';\n    copy.pbUpscaleRequestToken = '';\n    copy.pbUpscaleRequest = null;\n    copy.pbBackgroundBusy = false;\n    copy.pbBackgroundRequestToken = '';\n    copy.pbBackgroundActionPending = '';\n    copy.pbBackgroundActionPlacement = '';\n    copy.x = clamp(Number(layer.x || 0) + 4, -40, 100 - Number(layer.w || 20) + 40);\n    copy.y = clamp(Number(layer.y || 0) + 4, -30, 100 - Number(layer.h || 10) + 30);\n    copy.locked = false;\n\n    var originalName = String(layer.backgroundRemoveOriginalSourceFileName || layer.sourceFileName || 'bild.png');\n    var duplicateOriginalName = makeDuplicateImageName(originalName);\n\n    if (copy.backgroundRemoveOriginalImageDataUrl) {\n      copy.backgroundRemoveOriginalSourceFileName = duplicateOriginalName;\n      if (copy.backgroundRemoveResultImageDataUrl) {\n        copy.backgroundRemoveResultSourceFileName = makeBackgroundRemovedImageName(duplicateOriginalName);\n      }\n      copy.sourceFileName = copy.backgroundRemoved\n        ? (copy.backgroundRemoveResultSourceFileName || makeBackgroundRemovedImageName(duplicateOriginalName))\n        : duplicateOriginalName;\n    } else {\n      copy.sourceFileName = makeDuplicateImageName(layer.sourceFileName || 'bild.png');\n    }\n\n    dState.imageLayers = dState.imageLayers || [];\n    dState.imageLayers.push(copy);\n    state.activeImageLayerId = copy.id;\n    dState.touched = true;\n\n    renderImageLayers(dState);\n    renderPlacements();\n    openImageEditorForLayer(copy.id);\n  }\n\n  function makeDuplicateImageName(name) {\n    name = String(name || 'bild.png');\n    var dot = name.lastIndexOf('.');\n    if (dot > 0) return name.slice(0, dot) + '-copy' + name.slice(dot);\n    return name + '-copy';\n  }\n\n  function getImageLayerForProcessing(placement, layerId) {\n    var dState = getDesignState(placement || state.activePlacement, true);\n    return (dState.imageLayers || []).find(function (item) {\n      return item.id === layerId && item.type !== 'text';\n    }) || null;\n  }\n\n  function queueBackgroundActionAfterUpscale(layer, action, placement) {\n    if (!layer || layer.type === 'text') return false;\n    layer.pbBackgroundActionPending = action === 'restore' ? 'restore' : 'remove';\n    layer.pbBackgroundActionPlacement = placement || state.activePlacement;\n\n    // The user explicitly clicked the background tool, so keep that button busy,\n    // but do not expose the silent upscale itself.\n    if (state.activeImageLayerId === layer.id) {\n      syncImageRemoveBgButton(layer, {\n        busy: true,\n        label: layer.pbBackgroundActionPending === 'restore' ? pbT('aterstaller', '\u00C5terst\u00E4ller\u2026') : pbT('tar_bort', 'Tar bort\u2026')\n      });\n    }\n    return true;\n  }\n\n  function drainPendingBackgroundAction(layer, placement) {\n    if (!layer || layer.type === 'text' || layer.pbUpscaleBusy || layer.pbBackgroundBusy) return false;\n\n    var action = String(layer.pbBackgroundActionPending || '');\n    if (!action) return false;\n\n    var actionPlacement = layer.pbBackgroundActionPlacement || placement || state.activePlacement;\n    var layerId = layer.id;\n    layer.pbBackgroundActionPending = '';\n    layer.pbBackgroundActionPlacement = '';\n\n    Promise.resolve().then(function () {\n      return runBackgroundActionForLayer(layerId, actionPlacement, action);\n    }).catch(function (error) {\n      console.error('[Printbolt] Queued background action failed', error);\n    });\n    return true;\n  }\n\n  async function removeBackgroundFromActiveImageLayer() {\n    var layer = getActiveLayer();\n    if (!layer || layer.type === 'text') return;\n    if (layer.pbBackgroundBusy || layer.pbBackgroundActionPending) return;\n\n    var action = layer.backgroundRemoved ? 'restore' : 'remove';\n    var placement = state.activePlacement;\n\n    // v253: image processing is serialized per layer. If a silent upscale is in\n    // flight/ready-but-waiting, remember the click and run background processing\n    // only after the upscale has been applied (or its 150-DPI fallback completed).\n    if (layer.pbUpscaleBusy) {\n      queueBackgroundActionAfterUpscale(layer, action, placement);\n      return;\n    }\n\n    return runBackgroundActionForLayer(layer.id, placement, action);\n  }\n\n  async function runBackgroundActionForLayer(layerId, placement, action) {\n    var layer = getImageLayerForProcessing(placement, layerId);\n    if (!layer || layer.pbBackgroundBusy) return false;\n\n    action = action === 'restore' ? 'restore' : 'remove';\n\n    if (action === 'restore') {\n      if (!layer.backgroundRemoveOriginalImageDataUrl) return false;\n      applyImageLayerBitmap(\n        layer,\n        layer.backgroundRemoveOriginalImageDataUrl,\n        layer.backgroundRemoveOriginalNaturalWidth,\n        layer.backgroundRemoveOriginalNaturalHeight,\n        layer.backgroundRemoveOriginalSourceFileName || 'bild.png'\n      );\n      layer.backgroundRemoved = false;\n      constrainImageLayer(layer);\n\n      if (state.activePlacement === placement) {\n        renderImageLayers(getDesignState(placement, true));\n        renderPlacements();\n        if (state.activeImageLayerId === layer.id) syncImageEditorControls(layer);\n        setStatus('', false);\n      }\n      return true;\n    }\n\n    // A cached remove-background result is valid only for the current source.\n    // Successful upscale clears this cache before a queued remove action reaches here.\n    if (layer.backgroundRemoveResultImageDataUrl) {\n      applyImageLayerBitmap(\n        layer,\n        layer.backgroundRemoveResultImageDataUrl,\n        layer.backgroundRemoveResultNaturalWidth,\n        layer.backgroundRemoveResultNaturalHeight,\n        layer.backgroundRemoveResultSourceFileName || makeBackgroundRemovedImageName(layer.backgroundRemoveOriginalSourceFileName || layer.sourceFileName || 'bild.png')\n      );\n      layer.backgroundRemoved = true;\n      constrainImageLayer(layer);\n\n      if (state.activePlacement === placement) {\n        renderImageLayers(getDesignState(placement, true));\n        renderPlacements();\n        if (state.activeImageLayerId === layer.id) syncImageEditorControls(layer);\n        setStatus('', false);\n      }\n      return true;\n    }\n\n    if (!workerUrl) {\n      if (state.activePlacement === placement) setStatus(pbT('worker_url_saknas', 'Worker URL saknas.'), true);\n      return false;\n    }\n\n    var originalSourceFileName = String(layer.sourceFileName || 'bild.png');\n    var originalImageDataUrl = String(layer.imageDataUrl || '');\n    var originalNaturalWidth = Number(layer.naturalWidth || 0);\n    var originalNaturalHeight = Number(layer.naturalHeight || 0);\n    var token = 'bg-' + Date.now() + '-' + Math.random().toString(36).slice(2);\n\n    layer.pbBackgroundBusy = true;\n    layer.pbBackgroundRequestToken = token;\n\n    if (state.activePlacement === placement && state.activeImageLayerId === layer.id) {\n      syncImageRemoveBgButton(layer, { busy: true, label: pbT('tar_bort', 'Tar bort\u2026') });\n      setStatus(pbT('tar_bort_bakgrund', 'Tar bort bakgrund\u2026'));\n    }\n\n    try {\n      var privateRemoved=null,removedBlob;\n      if(pbPrivateEnabled() && (await pbLoadConfig()).private_background_removal===true){\n        var originalAsset=await pbPrivateSource(originalImageDataUrl);\n        privateRemoved=await pbPrivatePreview(await pbPrivateJson('remove-background',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(originalAsset)}));\n      }else{\n      var pngDataUrl = await convertImageDataUrlToPng(pbPrivateEnabled() ? await pbPrivateOriginalDataUrl(originalImageDataUrl) : originalImageDataUrl);\n      var pngBlob = await dataUrlToBlob(pngDataUrl);\n      var res = await pbAuthorizedFetch(workerUrl + '/api/printbolt/remove-background', {\n        method: 'POST',\n        headers: { 'Content-Type': pngBlob.type || 'image/png' },\n        body: pngBlob\n      });\n\n      if (!res.ok) {\n        var bgErrorText = await res.text().catch(function () { return ''; });\n        var bgErrorBody = null;\n        try { bgErrorBody = bgErrorText ? JSON.parse(bgErrorText) : null; } catch (ignore) {}\n        throw new Error((bgErrorBody && bgErrorBody.error) || bgErrorText || pbT('kunde_inte_ta_bort_bakgrunden', 'Kunde inte ta bort bakgrunden.'));\n      }\n\n      var removedBlob = await res.blob();\n      if (!removedBlob || !removedBlob.size) throw new Error(pbT('bakgrundsborttagningen_returnerade_en_tom_bild', 'Bakgrundsborttagningen returnerade en tom bild.'));\n      privateRemoved = pbPrivateEnabled() ? await pbPrivateResult(removedBlob) : null;\n\n      }\n      var removedDataUrl = privateRemoved ? privateRemoved.dataUrl : await blobToDataUrl(removedBlob);\n      var img = privateRemoved ? { naturalWidth: privateRemoved.width, naturalHeight: privateRemoved.height } : await loadImage(removedDataUrl);\n      var currentLayer = getImageLayerForProcessing(placement, layerId);\n      if (!currentLayer || currentLayer.pbBackgroundRequestToken !== token) return false;\n\n      // Never let a stale async result overwrite a bitmap changed by another tool.\n      if (currentLayer.imageDataUrl !== originalImageDataUrl) return false;\n\n      var removedSourceFileName = makeBackgroundRemovedImageName(originalSourceFileName);\n      var removedNaturalWidth = img.naturalWidth || img.width || originalNaturalWidth || currentLayer.naturalWidth;\n      var removedNaturalHeight = img.naturalHeight || img.height || originalNaturalHeight || currentLayer.naturalHeight;\n\n      currentLayer.backgroundRemoveOriginalImageDataUrl = originalImageDataUrl;\n      currentLayer.backgroundRemoveOriginalNaturalWidth = originalNaturalWidth;\n      currentLayer.backgroundRemoveOriginalNaturalHeight = originalNaturalHeight;\n      currentLayer.backgroundRemoveOriginalSourceFileName = originalSourceFileName;\n      currentLayer.backgroundRemoveResultImageDataUrl = removedDataUrl;\n      currentLayer.backgroundRemoveResultNaturalWidth = removedNaturalWidth;\n      currentLayer.backgroundRemoveResultNaturalHeight = removedNaturalHeight;\n      currentLayer.backgroundRemoveResultSourceFileName = removedSourceFileName;\n\n      applyImageLayerBitmap(\n        currentLayer,\n        removedDataUrl,\n        removedNaturalWidth,\n        removedNaturalHeight,\n        removedSourceFileName\n      );\n      currentLayer.backgroundRemoved = true;\n      constrainImageLayer(currentLayer);\n\n      if (state.activePlacement === placement) {\n        renderImageLayers(getDesignState(placement, true));\n        renderPlacements();\n        if (state.activeImageLayerId === currentLayer.id) syncImageEditorControls(currentLayer);\n        setStatus('', false);\n      }\n      return true;\n    } catch (error) {\n      var failedLayer = getImageLayerForProcessing(placement, layerId);\n      if (failedLayer && failedLayer.pbBackgroundRequestToken === token) {\n        if (state.activePlacement === placement) {\n          setStatus(error.message || pbT('kunde_inte_ta_bort_bakgrunden', 'Kunde inte ta bort bakgrunden.'), true);\n        }\n      }\n      return false;\n    } finally {\n      var finalLayer = getImageLayerForProcessing(placement, layerId);\n      if (finalLayer && finalLayer.pbBackgroundRequestToken === token) {\n        finalLayer.pbBackgroundBusy = false;\n        finalLayer.pbBackgroundRequestToken = '';\n        if (state.activePlacement === placement && state.activeImageLayerId === finalLayer.id) {\n          syncImageRemoveBgButton(finalLayer);\n        }\n      }\n    }\n  }\n\n  function makeBackgroundRemovedImageName(name) {\n    name = String(name || 'bild.png')\n      .replace(/\\.[a-z0-9]{1,8}$/i, '')\n      .replace(/-bgremoved$/i, '')\n      .replace(/[^a-z0-9_-]+/gi, '-')\n      .replace(/^-+|-+$/g, '')\n      .slice(0, 46) || 'bild';\n\n    return name + '-bgremoved.png';\n  }\n\n  async function convertImageDataUrlToPng(dataUrl) {\n    dataUrl = String(dataUrl || '');\n    if (dataUrl.startsWith('data:image/png;base64,')) return dataUrl;\n\n    var img = await loadImage(dataUrl);\n    var canvas = document.createElement('canvas');\n    canvas.width = img.naturalWidth || img.width || 1;\n    canvas.height = img.naturalHeight || img.height || 1;\n\n    var ctx = canvas.getContext('2d');\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n    ctx.drawImage(img, 0, 0);\n\n    return canvas.toDataURL('image/png');\n  }\n\n  function removeEmptyTextLayersOnActivePlacement() {\n    var dState = getDesignState(state.activePlacement, true);\n    var layers = dState.imageLayers || [];\n    var activeId = state.activeImageLayerId;\n    var removedActive = false;\n    var removedAny = false;\n\n    dState.imageLayers = layers.filter(function (layer) {\n      var isEmptyText = layer && layer.type === 'text' && !String(layer.text || '').trim();\n\n      if (isEmptyText) {\n        removedAny = true;\n        if (layer.id === activeId) removedActive = true;\n        return false;\n      }\n\n      return true;\n    });\n\n    if (!removedAny) return;\n\n    if (removedActive) state.activeImageLayerId = '';\n    dState.touched = hasPrimaryDesignContent(dState) || dState.imageLayers.length > 0;\n\n    renderImageLayers(dState);\n    renderPlacements();\n  }\n\n  function updateActiveTextLayerFromEditor() {\n    var layer = getActiveLayer();\n    if (!layer || layer.type !== 'text') return;\n\n    migrateTextLayerBoldModel(layer);\n    var previousX = Number(layer.x || 0);\n    var previousY = Number(layer.y || 0);\n    var previousText = String(layer.text || '');\n    var previousBoldKey = getTextBoldRangesKey(layer);\n    var previousW = Number(layer.w || 46);\n    var previousH = Number(layer.h || 15);\n\n    // v391: capture the scale that is actually visible before the editor mutates\n    // the text. A line break may change natural bounds, but it must never change\n    // the rendered font size. This also preserves any tiny geometry difference\n    // caused by rounding/minimum box sizes or a previous handle resize.\n    var previousNaturalBox = getTextLayerBoxPct(layer);\n    var previousNaturalW = Math.max(0.0001, Number(previousNaturalBox && previousNaturalBox.w || previousW));\n    var previousNaturalH = Math.max(0.0001, Number(previousNaturalBox && previousNaturalBox.h || previousH));\n    var previousScaleW = previousW / previousNaturalW;\n    var previousScaleH = previousH / previousNaturalH;\n    var previousRenderScale = Math.min(previousScaleW, previousScaleH);\n    if (!Number.isFinite(previousRenderScale) || previousRenderScale <= 0) previousRenderScale = 1;\n    previousRenderScale = clamp(previousRenderScale, 0.12, 8);\n\n    var centerX = previousX + previousW / 2;\n    var centerY = previousY + previousH / 2;\n    var beforeGeometryKey = getTextGeometryKey(layer);\n    var beforePreviewKey = getTextPreviewGeometryKey(layer);\n\n    var editorData = els.textEditorInput ? readTextEditorRichData() : {\n      text: String(layer.text || ''),\n      boldRanges: getTextLayerBoldRanges(layer)\n    };\n\n    layer.text = String(editorData.text || '');\n    layer.fontFamily = els.textFont ? els.textFont.value : (layer.fontFamily || 'Arial, Helvetica, sans-serif');\n    layer.color = els.textColor ? normalizeHexColor(els.textColor.value || '#ffffff') : (layer.color || '#ffffff');\n    var selectedPointSize = getTextControlNumber(\n      els.textSize,\n      els.textSizeNumber,\n      TEXT_SIZE_DEFAULT_PT,\n      TEXT_SIZE_MIN_PT,\n      TEXT_SIZE_MAX_PT\n    );\n    layer.fontSize = textPointsToInternalPx(selectedPointSize, getTextSizingTemplate());\n    layer.curve = getTextControlNumber(els.textCurve, els.textCurveNumber, 0, -400, 400);\n    layer.rotation = normalizeRotation(getTextControlNumber(els.textRotate, els.textRotateNumber, normalizeSignedRotation(layer.rotation || 0), -180, 180));\n    layer.letterSpacing = getTextControlNumber(els.textSpacing, els.textSpacingNumber, 100, 25, 250);\n    layer.outline = layer.outline || (els.textOutline ? els.textOutline.value : 'none');\n    layer.outlineSize = getTextControlNumber(els.outlineSize, els.outlineSizeNumber, Number(layer.outlineSize || 6), 0, 120);\n\n    var selectedFont = getDesignerFontByFamily(layer.fontFamily);\n    if (designerFontSupportsBold(selectedFont)) {\n      layer.boldRanges = normalizeTextBoldRanges(editorData.boldRanges, layer.text.length);\n    } else {\n      layer.boldRanges = [];\n    }\n    layer.fontWeight = '400';\n    layer.fontStyle = els.textItalic ? (isPressedButton(els.textItalic) ? 'italic' : 'normal') : (layer.fontStyle || 'normal');\n    layer.uppercase = false;\n    layer.align = (els.textAlignButtons && els.textAlignButtons.length) ? getActiveTextAlign() : (layer.align || 'center');\n    layer.locked = isPressedButton(els.textLock);\n    layer.flipX = isPressedButton(els.textFlip);\n\n    syncTextNumberPair(\n      els.textSize,\n      els.textSizeNumber,\n      textInternalPxToPoints(layer.fontSize, getTextSizingTemplate())\n    );\n    syncTextNumberPair(els.textCurve, els.textCurveNumber, Math.round(layer.curve));\n    syncTextNumberPair(els.textRotate, els.textRotateNumber, normalizeSignedRotation(layer.rotation || 0));\n    syncTextNumberPair(els.textSpacing, els.textSpacingNumber, Math.round(layer.letterSpacing || 100));\n    syncTextNumberPair(els.outlineSize, els.outlineSizeNumber, Math.round(layer.outlineSize || 6));\n    syncTextAdjustmentResetButtons(layer);\n    syncTextColorControls(layer);\n    syncOutlineControls(layer);\n    syncTextEditorPresentation(layer);\n    syncFontPickerSummary(layer);\n    syncTextBoldControl(layer);\n    if (els.textCurveValue) els.textCurveValue.textContent = String(Math.round(layer.curve));\n\n    var afterGeometryKey = getTextGeometryKey(layer);\n    var afterPreviewKey = getTextPreviewGeometryKey(layer);\n    var richTextChanged = String(layer.text || '') !== previousText || getTextBoldRangesKey(layer) !== previousBoldKey;\n\n    if (beforePreviewKey !== afterPreviewKey) {\n      layer.pbManualTextGeometry = false;\n      layer.pbManualTextGeometryKey = '';\n    }\n    if (beforeGeometryKey !== afterGeometryKey) {\n      updateTextLayerNaturalSize(layer);\n\n      // Typing, line breaks and partial bold all preserve the typographic anchor:\n      // top stays fixed and left/center/right follows the selected alignment.\n      if (richTextChanged) {\n        autoFitTextLayerToContentsFromTextAnchor(\n          layer,\n          previousX,\n          previousY,\n          previousW,\n          previousRenderScale\n        );\n\n        // Freeze the freshly calculated content geometry BEFORE constraining the\n        // position. Otherwise constrainImageLayer() measures the text a second time\n        // and can subtly rescale/recenter it when a blank row is added.\n        freezeTextLayerGeometry(layer);\n        constrainImageLayer(layer);\n      } else {\n        autoFitTextLayerToContents(layer, centerX, centerY);\n        constrainImageLayer(layer);\n        freezeTextLayerGeometry(layer);\n      }\n    }\n\n    if (!updateTextLayerNodeLive(layer, beforePreviewKey !== afterPreviewKey || beforeGeometryKey !== afterGeometryKey)) {\n      renderImageLayers(getDesignState(state.activePlacement, true));\n    }\n    renderPlacements();\n  }\n\n  function getTextGeometryKey(layer) {\n    if (!layer) return '';\n    var hasOutline = String(layer.outline || 'none').toLowerCase() !== 'none';\n    return [\n      String(layer.text || ''),\n      String(layer.fontFamily || ''),\n      String(layer.fontWeight || '400'),\n      getTextBoldRangesKey(layer),\n      String(layer.fontStyle || ''),\n      String(layer.uppercase === true),\n      String(layer.align || 'center'),\n      Math.round(Number(layer.fontSize || 0)),\n      Math.round(Number(layer.curve || 0)),\n      Math.round(Number(layer.letterSpacing || 100)),\n      // v399: outline changes are real geometry changes. The stroke must expand\n      // the selection box instead of being scaled down inside the old box.\n      hasOutline ? 'outline' : 'no-outline',\n      hasOutline ? Math.round(Number(layer.outlineSize || 0)) : 0\n    ].join('|');\n  }\n\n  function getTextPreviewGeometryKey(layer) {\n    if (!layer) return '';\n    var fontFamily = String(layer.fontFamily || '');\n    var fontReady = pbFontReadyFamilies[fontFamily] ? '1' : '0';\n    return [\n      getTextGeometryKey(layer),\n      normalizeHexColor(layer.color || '#ffffff'),\n      String(layer.outline || 'none'),\n      Math.round(Number(layer.outlineSize || 0)),\n      fontReady\n    ].join('|');\n  }\n\n  function freezeTextLayerGeometry(layer) {\n    if (!layer || layer.type !== 'text') return;\n    layer.pbManualTextGeometry = true;\n    layer.pbManualTextGeometryKey = getTextPreviewGeometryKey(layer);\n  }\n\n  function getTextResetDefaultPointSize(layer) {\n    if (!layer || layer.type !== 'text') return TEXT_SIZE_DEFAULT_PT;\n\n    var template = getTextSizingTemplate();\n    var probe = Object.assign({}, layer, {\n      // Reset uses the same neutral text geometry as a freshly added text layer.\n      curve: 0,\n      letterSpacing: 100,\n      fontSize: textPointsToInternalPx(TEXT_SIZE_DEFAULT_PT, template),\n      pbManualTextGeometry: false,\n      pbManualTextGeometryKey: ''\n    });\n\n    updateTextLayerNaturalSize(probe);\n    var box = getTextLayerBoxPct(probe);\n    var boxW = Math.max(0.01, Number(box && box.w || 0));\n    var boxH = Math.max(0.01, Number(box && box.h || 0));\n    var widthScale = DEFAULT_TEXT_LAYER_WIDTH_PCT / boxW;\n    var heightScale = DEFAULT_TEXT_LAYER_HEIGHT_PCT / boxH;\n    var scale = Math.min(widthScale, heightScale);\n\n    if (!Number.isFinite(scale) || scale <= 0) scale = 1;\n\n    return clamp(\n      Math.round(TEXT_SIZE_DEFAULT_PT * scale),\n      TEXT_SIZE_MIN_PT,\n      TEXT_SIZE_MAX_PT\n    );\n  }\n\n  function syncTextAdjustmentResetButtons(layer) {\n    var validLayer = layer && layer.type === 'text' ? layer : null;\n    var defaultPointSize = validLayer ? getTextResetDefaultPointSize(validLayer) : TEXT_SIZE_DEFAULT_PT;\n    var currentPointSize = validLayer\n      ? Math.round(textInternalPxToPoints(Number(validLayer.fontSize || 96), getTextSizingTemplate()))\n      : defaultPointSize;\n    var currentCurve = validLayer ? Math.round(Number(validLayer.curve || 0)) : 0;\n    var currentSpacing = validLayer ? Math.round(Number(validLayer.letterSpacing || 100)) : 100;\n\n    if (els.textSizeReset) {\n      els.textSizeReset.hidden = !validLayer || currentPointSize === Math.round(defaultPointSize);\n    }\n    if (els.textCurveReset) {\n      els.textCurveReset.hidden = !validLayer || currentCurve === 0;\n    }\n    if (els.textSpacingReset) {\n      els.textSpacingReset.hidden = !validLayer || currentSpacing === 100;\n    }\n  }\n\n  function resetActiveTextAdjustment(kind) {\n    var layer = getActiveLayer();\n    if (!layer || layer.type !== 'text') return;\n\n    if (kind === 'size') {\n      syncTextNumberPair(els.textSize, els.textSizeNumber, getTextResetDefaultPointSize(layer));\n    } else if (kind === 'curve') {\n      syncTextNumberPair(els.textCurve, els.textCurveNumber, 0);\n      if (els.textCurveValue) els.textCurveValue.textContent = '0';\n    } else if (kind === 'spacing') {\n      syncTextNumberPair(els.textSpacing, els.textSpacingNumber, 100);\n    } else {\n      return;\n    }\n\n    updateActiveTextLayerFromEditor();\n  }\n\n  function adjustTextSize(delta) {\n    if (!els.textSize) return;\n    var current = Number(els.textSize.value || TEXT_SIZE_DEFAULT_PT);\n    syncTextNumberPair(\n      els.textSize,\n      els.textSizeNumber,\n      clamp(current + Number(delta || 0), TEXT_SIZE_MIN_PT, TEXT_SIZE_MAX_PT)\n    );\n    updateActiveTextLayerFromEditor();\n  }\n\n  function bindTextNumberPair(rangeEl, numberEl, min, max, fallback) {\n    function syncFromRange() {\n      syncTextNumberPair(rangeEl, numberEl, getTextControlNumber(rangeEl, rangeEl, fallback, min, max));\n      updateActiveTextLayerFromEditor();\n    }\n\n    function syncFromNumber() {\n      syncTextNumberPair(rangeEl, numberEl, getTextControlNumber(numberEl, numberEl, fallback, min, max));\n      updateActiveTextLayerFromEditor();\n    }\n\n    if (rangeEl) {\n      rangeEl.addEventListener('input', syncFromRange);\n      rangeEl.addEventListener('change', syncFromRange);\n    }\n\n    if (numberEl) {\n      numberEl.addEventListener('input', syncFromNumber);\n      numberEl.addEventListener('change', syncFromNumber);\n    }\n  }\n\n  function syncTextNumberPair(rangeEl, numberEl, value) {\n    var n = Math.round(Number(value || 0));\n    if (rangeEl) rangeEl.value = String(n);\n    if (numberEl) numberEl.value = String(n);\n    refreshMobileTextSliderSummaries();\n    if (typeof syncDesktopTextControls === 'function') syncDesktopTextControls(getActiveLayer());\n  }\n\n  function getTextControlNumber(primaryEl, secondaryEl, fallback, min, max) {\n    var value = primaryEl ? Number(primaryEl.value) : Number.NaN;\n    if (!Number.isFinite(value) && secondaryEl) value = Number(secondaryEl.value);\n    if (!Number.isFinite(value)) value = Number(fallback || 0);\n    return clamp(value, Number(min), Number(max));\n  }\n\n  function syncDesktopTextControls(layer) {\n    if (!els.desktopTextControls) return;\n    layer = layer || (typeof getActiveLayer === 'function' ? getActiveLayer() : null);\n\n    var sizeValue = layer && layer.type === 'text'\n      ? Math.round(textInternalPxToPoints(Number(layer.fontSize || 96), getTextSizingTemplate()))\n      : Math.round(Number((els.textSizeNumber && els.textSizeNumber.value) || (els.textSize && els.textSize.value) || TEXT_SIZE_DEFAULT_PT));\n    var curveValue = layer && layer.type === 'text'\n      ? Math.round(Number(layer.curve || 0))\n      : Math.round(Number((els.textCurveNumber && els.textCurveNumber.value) || (els.textCurve && els.textCurve.value) || 0));\n    var spacingValue = layer && layer.type === 'text'\n      ? Math.round(Number(layer.letterSpacing || 100))\n      : Math.round(Number((els.textSpacingNumber && els.textSpacingNumber.value) || (els.textSpacing && els.textSpacing.value) || 100));\n\n    if (els.desktopTextSize) els.desktopTextSize.value = String(sizeValue);\n    if (els.desktopTextSizeNumber) els.desktopTextSizeNumber.value = String(sizeValue);\n    if (els.desktopTextCurve) els.desktopTextCurve.value = String(curveValue);\n    if (els.desktopTextCurveNumber) els.desktopTextCurveNumber.value = String(curveValue);\n    if (els.desktopTextSpacing) els.desktopTextSpacing.value = String(spacingValue);\n    if (els.desktopTextSpacingNumber) els.desktopTextSpacingNumber.value = String(spacingValue);\n\n    if (layer && layer.type === 'text') {\n      var family = layer.fontFamily || 'Arial, Helvetica, sans-serif';\n      var font = getDesignerFontByFamily(family) || PB_DESIGNER_FONTS[0];\n      if (els.desktopFontPreview) {\n        els.desktopFontPreview.textContent = getFontPreviewText();\n        els.desktopFontPreview.style.fontFamily = font.family;\n      }\n      if (els.desktopFontName) els.desktopFontName.textContent = font.name;\n\n      var color = normalizeHexColor(layer.color || '#ffffff');\n      if (els.desktopTextColorLabel) els.desktopTextColorLabel.textContent = color.toUpperCase();\n      if (els.desktopTextColorSwatch) els.desktopTextColorSwatch.style.background = color;\n\n      var outline = String(layer.outline || 'none').toLowerCase();\n      if (els.desktopOutlineLabel) els.desktopOutlineLabel.textContent = getOutlineName(outline);\n      if (els.desktopOutlineSwatch) {\n        els.desktopOutlineSwatch.classList.toggle('is-none', outline === 'none');\n        els.desktopOutlineSwatch.style.background = outline === 'none' ? 'transparent' : outline;\n      }\n\n      var defaultPointSize = getTextResetDefaultPointSize(layer);\n      if (els.desktopTextSizeReset) els.desktopTextSizeReset.hidden = sizeValue === Math.round(defaultPointSize);\n      if (els.desktopTextCurveReset) els.desktopTextCurveReset.hidden = curveValue === 0;\n      if (els.desktopTextSpacingReset) els.desktopTextSpacingReset.hidden = spacingValue === 100;\n    }\n  }\n\n  function bindDesktopTextPair(rangeEl, numberEl, sourceRange, sourceNumber, min, max, fallback) {\n    function applyFrom(el) {\n      var value = getTextControlNumber(el, el, fallback, min, max);\n      syncTextNumberPair(sourceRange, sourceNumber, value);\n      if (rangeEl) rangeEl.value = String(Math.round(value));\n      if (numberEl) numberEl.value = String(Math.round(value));\n      updateActiveTextLayerFromEditor();\n      syncDesktopTextControls(getActiveLayer());\n    }\n    if (rangeEl) {\n      rangeEl.addEventListener('input', function () { applyFrom(rangeEl); });\n      rangeEl.addEventListener('change', function () { applyFrom(rangeEl); });\n    }\n    if (numberEl) {\n      numberEl.addEventListener('input', function () { applyFrom(numberEl); });\n      numberEl.addEventListener('change', function () { applyFrom(numberEl); });\n    }\n  }\n\n  function normalizeSignedRotation(value) {\n    var n = normalizeRotation(value);\n    if (n > 180) n -= 360;\n    return Math.round(n);\n  }\n\n  function setPressedButton(button, pressed) {\n    if (!button) return;\n    button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n    button.classList.toggle('is-active', Boolean(pressed));\n  }\n\n  function togglePressedButton(button) {\n    setPressedButton(button, !isPressedButton(button));\n  }\n\n  function isPressedButton(button) {\n    return Boolean(button && button.getAttribute('aria-pressed') === 'true');\n  }\n\n  function getSnapButtonLabel() {\n    return state.snapEnabled ? pbT('stodlinjer_pa', 'St\u00F6dlinjer: P\u00E5') : pbT('stodlinjer_av', 'St\u00F6dlinjer: Av');\n  }\n\n  function syncSnapToggleButtons() {\n    [els.textSnapToggle, els.imageSnapToggle].forEach(function (button) {\n      if (!button) return;\n      setPressedButton(button, state.snapEnabled);\n      var strong = button.querySelector('strong');\n      if (strong) strong.textContent = getSnapButtonLabel();\n      button.setAttribute('title', state.snapEnabled ? pbT('stodlinjer_ar_aktiverade', 'St\u00F6dlinjer \u00E4r aktiverade') : pbT('stodlinjer_ar_avstangda', 'St\u00F6dlinjer \u00E4r avst\u00E4ngda'));\n    });\n  }\n\n  function syncSettingsUi() {\n    var open = Boolean(state.settingsOpen);\n    (els.settingsToggleButtons || []).forEach(function (button) {\n      if (!button) return;\n      button.setAttribute('aria-expanded', open ? 'true' : 'false');\n      button.classList.toggle('is-active', open);\n      button.setAttribute('title', open ? pbT('stang_installningar', 'St\u00E4ng inst\u00E4llningar') : pbT('installningar', 'Inst\u00E4llningar'));\n    });\n\n    if (els.settingsPanel) els.settingsPanel.hidden = !open;\n    if (els.settingsSnapInput) els.settingsSnapInput.checked = Boolean(state.snapEnabled);\n  }\n\n  function closeSettingsView() {\n    state.settingsOpen = false;\n    root.classList.remove('is-mobile-settings-open');\n    if (els.sidePanel) els.sidePanel.classList.remove('is-settings-active');\n    if (els.toolsCard) els.toolsCard.classList.remove('is-editing-settings');\n    if (els.settingsPanel) els.settingsPanel.hidden = true;\n    syncToolsMainVisibility();\n    syncSettingsUi();\n  }\n\n  function openSettingsView() {\n    closeTextEditor();\n    closeImageEditor();\n    closeAiPanel();\n    closeProductDetailsPanel();\n    closeSizeModal();\n    closeColorPanel();\n\n    state.settingsOpen = true;\n    root.classList.toggle('is-mobile-settings-open', isMobileEditorLayout());\n    if (els.sidePanel) els.sidePanel.classList.add('is-settings-active');\n    if (els.toolsCard) els.toolsCard.classList.add('is-editing-settings');\n    if (els.settingsPanel) {\n      els.settingsPanel.hidden = false;\n      els.settingsPanel.style.display = '';\n    }\n    syncToolsMainVisibility();\n    syncSettingsUi();\n  }\n\n  function setSettingsPanelOpen(open) {\n    if (open) openSettingsView();\n    else closeSettingsView();\n  }\n\n  function setSnapEnabled(enabled, options) {\n    state.snapEnabled = Boolean(enabled);\n    if (!(options && options.skipSave)) saveSnapEnabledPreference(state.snapEnabled);\n    syncSnapToggleButtons();\n    syncSettingsUi();\n  }\n\n  function syncTextBoldControl(layer) {\n    if (!els.textBold) return;\n    layer = layer || getActiveLayer();\n    var family = layer && layer.type === 'text'\n      ? String(layer.fontFamily || '')\n      : String((els.textFont && els.textFont.value) || '');\n    var font = getDesignerFontByFamily(family);\n    var supported = getDesignerFontBoldWeight(font) > 0;\n    var pressed = false;\n\n    els.textBold.disabled = !supported;\n    els.textBold.setAttribute('aria-disabled', supported ? 'false' : 'true');\n    els.textBold.title = supported ? pbT('fetstil', 'Fetstil') : pbT('fetstil_finns_inte_for_det_har_teckensnittet', 'Fetstil finns inte f\u00F6r det h\u00E4r teckensnittet');\n\n    if (supported && editorSelectionIsInside()) {\n      try {\n        pressed = Boolean(document.queryCommandState && document.queryCommandState('bold'));\n      } catch (error) {\n        pressed = false;\n      }\n    } else if (supported && layer && layer.type === 'text') {\n      var textLength = String(layer.text || '').length;\n      var ranges = getTextLayerBoldRanges(layer);\n      pressed = textLength > 0 && ranges.length === 1 && ranges[0].start === 0 && ranges[0].end === textLength;\n    }\n\n    setPressedButton(els.textBold, pressed);\n  }\n\n  function setTextAlignButton(align) {\n    align = ['left', 'center', 'right'].indexOf(align) >= 0 ? align : 'center';\n    (els.textAlignButtons || []).forEach(function (button) {\n      var isActive = (button.dataset.pbTextAlign || 'center') === align;\n      setPressedButton(button, isActive);\n    });\n  }\n\n  function getActiveTextAlign() {\n    var active = (els.textAlignButtons || []).find(function (button) {\n      return isPressedButton(button);\n    });\n    return active ? (active.dataset.pbTextAlign || 'center') : 'center';\n  }\n\n  function moveActiveLayerInStack(direction) {\n    var dState = getDesignState(state.activePlacement, true);\n    var layers = dState.imageLayers || [];\n    var layer = getActiveLayer();\n    if (!layer) return;\n\n    var index = layers.findIndex(function (item) { return item.id === layer.id; });\n    if (index < 0) return;\n\n    var nextIndex = clamp(index + Number(direction || 0), 0, layers.length - 1);\n    if (nextIndex === index) return;\n\n    var moved = layers.splice(index, 1)[0];\n    layers.splice(nextIndex, 0, moved);\n    state.activeImageLayerId = moved.id;\n\n    renderImageLayers(dState);\n    renderPlacements();\n  }\n\n  function hideAllTextEditorSubpanels() {\n    if (els.fontPanel) els.fontPanel.hidden = true;\n    if (els.textColorPanel) els.textColorPanel.hidden = true;\n    if (els.outlinePanel) els.outlinePanel.hidden = true;\n    if (els.textStylePanel) els.textStylePanel.hidden = true;\n    if (els.textSizePanel) els.textSizePanel.hidden = true;\n    if (els.textCurvePanel) els.textCurvePanel.hidden = true;\n    if (els.textSpacingPanel) els.textSpacingPanel.hidden = true;\n  }\n\n  function showTextEditorSubpanel(which) {\n    if (which === 'font' && els.fontPanel) els.fontPanel.hidden = false;\n    if (which === 'text-color' && els.textColorPanel) els.textColorPanel.hidden = false;\n    if (which === 'outline' && els.outlinePanel) els.outlinePanel.hidden = false;\n    if (which === 'style' && els.textStylePanel) els.textStylePanel.hidden = false;\n    if (which === 'size' && els.textSizePanel) els.textSizePanel.hidden = false;\n    if (which === 'curve' && els.textCurvePanel) els.textCurvePanel.hidden = false;\n    if (which === 'spacing' && els.textSpacingPanel) els.textSpacingPanel.hidden = false;\n  }\n\n  function openEditorSubpanel(which, parent, toggleSame) {\n    if (!els.textEditorPanel) return false;\n\n    which = String(which || '').trim();\n    parent = String(parent || '').trim();\n    if (!which) return false;\n\n    if (toggleSame === true && state.textEditorSubpanel === which) {\n      closeTextEditorSubpanels();\n      return false;\n    }\n\n    hideAllTextEditorSubpanels();\n    els.textEditorPanel.classList.add('is-subpanel-mode');\n    showTextEditorSubpanel(which);\n    state.textEditorSubpanel = which;\n    state.textEditorSubpanelParent = parent;\n    return true;\n  }\n\n  function closeTextEditorSubpanels() {\n    if (els.textEditorPanel) els.textEditorPanel.classList.remove('is-subpanel-mode');\n    hideAllTextEditorSubpanels();\n    state.textEditorSubpanel = '';\n    state.textEditorSubpanelParent = '';\n    state.mobileTextSliderPanel = '';\n    applyMobileTextSliderPanelState();\n  }\n\n  function navigateBackTextEditorSubpanel() {\n    var parent = String(state.textEditorSubpanelParent || '').trim();\n    if (parent) {\n      openEditorSubpanel(parent, '', false);\n      return;\n    }\n    closeTextEditorSubpanels();\n  }\n\n  function openTextColorEditorPanel() {\n    if (!openEditorSubpanel('text-color', '', true)) return;\n    syncTextColorControls(getActiveLayer());\n  }\n\n  function closeTextColorEditorPanel() {\n    navigateBackTextEditorSubpanel();\n  }\n\n  function openStyleEditorPanel() {\n    openEditorSubpanel('style', '', true);\n  }\n\n  function openTextSliderEditorPanel(kind) {\n    kind = String(kind || '').trim();\n    if (kind === 'size' || kind === 'curve' || kind === 'spacing') {\n      var parent = (state.textEditorSubpanel === 'style' && (kind === 'curve' || kind === 'spacing')) ? 'style' : '';\n      if (!openEditorSubpanel(kind, parent, true)) return;\n      refreshMobileTextSliderSummaries();\n    }\n  }\n\n  function setActiveTextColor(color) {\n    var layer = getActiveLayer();\n    if (!layer || layer.type !== 'text') return;\n\n    var nextColor = normalizeHexColor(color || '#ffffff');\n    if (els.textColor) els.textColor.value = nextColor;\n    updateActiveTextLayerFromEditor();\n    syncTextColorControls(layer);\n  }\n\n  function syncTextColorControls(layer) {\n    layer = layer || getActiveLayer();\n    if (!layer) return;\n\n    var color = normalizeHexColor(layer.color || '#ffffff');\n    if (els.textColor) els.textColor.value = color;\n    if (els.textColorLabel) els.textColorLabel.textContent = color.toUpperCase();\n    if (els.textColorSummary) els.textColorSummary.textContent = color.toUpperCase();\n    if (els.desktopTextColorLabel) els.desktopTextColorLabel.textContent = color.toUpperCase();\n    if (els.desktopTextColorSwatch) els.desktopTextColorSwatch.style.background = color;\n\n    [els.textColorSwatch, els.textColorSummarySwatch].forEach(function (swatch) {\n      if (!swatch) return;\n      swatch.style.background = color;\n      swatch.classList.remove('is-none');\n    });\n\n    if (els.textColorPalette) {\n      Array.from(els.textColorPalette.querySelectorAll('[data-pb-text-color-choice]')).forEach(function (button) {\n        button.classList.toggle('is-active', normalizeHexColor(button.dataset.pbTextColorChoice || '#ffffff') === color);\n      });\n    }\n  }\n\n  function openOutlineEditorPanel(parent) {\n    var resolvedParent = String(parent || '').trim();\n    if (!openEditorSubpanel('outline', resolvedParent, true)) return;\n    syncOutlineControls(getActiveLayer());\n  }\n\n  function closeOutlineEditorPanel() {\n    navigateBackTextEditorSubpanel();\n  }\n\n  function setActiveTextOutline(color) {\n    var layer = getActiveLayer();\n    if (!layer || layer.type !== 'text') return;\n\n    layer.outline = color === 'none' ? 'none' : normalizeHexColor(color);\n    if (layer.outline !== 'none' && (!layer.outlineSize || layer.outlineSize <= 0)) {\n      layer.outlineSize = 6;\n      syncTextNumberPair(els.outlineSize, els.outlineSizeNumber, layer.outlineSize);\n    }\n\n    syncOutlineControls(layer);\n    updateActiveTextLayerFromEditor();\n  }\n\n  function getOutlineName(value) {\n    value = String(value || 'none').toLowerCase();\n    if (value === 'none') return pbT('ingen', 'Ingen');\n    var names = {\n      '#ffffff': pbT('vit', 'Vit'),\n      '#d9d9d9': pbT('ljusgra', 'Ljusgr\u00E5'),\n      '#8a9aa5': pbT('blagra', 'Bl\u00E5gr\u00E5'),\n      '#808073': pbT('gragron', 'Gr\u00E5gr\u00F6n'),\n      '#705a59': pbT('brungra', 'Brungr\u00E5'),\n      '#4d4d4d': pbT('morkgra', 'M\u00F6rkgr\u00E5'),\n      '#000000': pbT('svart', 'Svart'),\n      '#ff1f4f': pbT('rodrosa', 'R\u00F6drosa'),\n      '#f75f86': pbT('rosa', 'Rosa'),\n      '#b71b47': pbT('vinrod', 'Vinr\u00F6d'),\n      '#8b2346': pbT('mork_magenta', 'M\u00F6rk magenta'),\n      '#eb69be': pbT('ljusrosa', 'Ljusrosa'),\n      '#e894cf': pbT('pastellrosa', 'Pastellrosa'),\n      '#ef32b9': pbT('magenta', 'Magenta'),\n      '#a345a4': pbT('lila', 'Lila'),\n      '#613ddd': pbT('violett', 'Violett'),\n      '#4331a8': pbT('morklila', 'M\u00F6rklila'),\n      '#1f358c': pbT('morkbla', 'M\u00F6rkbl\u00E5'),\n      '#2760e7': pbT('klarbla', 'Klarbl\u00E5'),\n      '#2b78ed': pbT('himmelbla', 'Himmelbl\u00E5'),\n      '#5aa6d6': 'Powder Blue',\n      '#7cc9de': pbT('ljus_cyan', 'Ljus cyan'),\n      '#42b9d2': pbT('cyan', 'Cyan'),\n      '#29afcb': pbT('turkos', 'Turkos'),\n      '#22bdc2': pbT('teal', 'Teal'),\n      '#1b9ba1': pbT('mork_turkos', 'M\u00F6rk turkos'),\n      '#12b57a': pbT('mintgron', 'Mintgr\u00F6n'),\n      '#15892e': pbT('gron', 'Gr\u00F6n'),\n      '#277c22': pbT('morkgron', 'M\u00F6rkgr\u00F6n'),\n      '#55ce36': pbT('limegron', 'Limegr\u00F6n'),\n      '#95ef2c': pbT('lime', 'Lime'),\n      '#7c8747': pbT('olivgron', 'Olivgr\u00F6n'),\n      '#ded899': pbT('beige', 'Beige'),\n      '#f5ea11': pbT('gul', 'Gul'),\n      '#d6c23e': pbT('senap', 'Senap'),\n      '#ecca85': pbT('sand', 'Sand'),\n      '#f8ca2d': pbT('solgul', 'Solgul'),\n      '#f4c772': pbT('ljus_orange', 'Ljus orange'),\n      '#e79d35': pbT('orangebrun', 'Orangebrun'),\n      '#ff8800': pbT('orange', 'Orange'),\n      '#e97e1a': pbT('mellanorange', 'Mellanorange'),\n      '#efc3a0': pbT('hudton', 'Hudton'),\n      '#d39157': pbT('karamell', 'Karamell'),\n      '#ff6200': pbT('klar_orange', 'Klar orange'),\n      '#ff4816': pbT('rodorange', 'R\u00F6dorange'),\n      '#c27c48': pbT('kastanj', 'Kastanj'),\n      '#935321': pbT('brun', 'Brun'),\n      '#9a6147': pbT('terrakotta', 'Terrakotta'),\n      '#f248a9': pbT('hot_pink', 'Hot pink'),\n      '#b9bbc7': pbT('silver', 'Silver'),\n      '#aaa35b': pbT('khaki', 'Khaki')\n    };\n    return names[value] || value.toUpperCase();\n  }\n\n  function syncOutlineControls(layer) {\n    layer = layer || getActiveLayer();\n    if (!layer) return;\n\n    var outline = String(layer.outline || 'none').toLowerCase();\n    var label = getOutlineName(outline);\n\n    if (els.outlineLabel) els.outlineLabel.textContent = label;\n    if (els.outlineSummary) els.outlineSummary.textContent = label;\n    if (els.desktopOutlineLabel) els.desktopOutlineLabel.textContent = label;\n    if (els.desktopOutlineSwatch) {\n      els.desktopOutlineSwatch.classList.toggle('is-none', outline === 'none');\n      els.desktopOutlineSwatch.style.background = outline === 'none' ? 'transparent' : outline;\n    }\n\n    [els.outlineSwatch, els.outlineSummarySwatch].forEach(function (swatch) {\n      if (!swatch) return;\n      swatch.classList.toggle('is-none', outline === 'none');\n      swatch.style.background = outline === 'none' ? 'transparent' : outline;\n    });\n\n    if (els.outlinePalette) {\n      els.outlinePalette.querySelectorAll('[data-pb-outline-color]').forEach(function (button) {\n        var value = String(button.dataset.pbOutlineColor || 'none').toLowerCase();\n        button.classList.toggle('is-active', value === outline);\n      });\n    }\n  }\n\n  function duplicateActiveTextLayer() {\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = getActiveLayer();\n    if (!layer || layer.type !== 'text') return;\n\n    var copy = Object.assign({}, layer);\n    copy.id = makeLayerId();\n    copy.x = clamp(Number(layer.x || 0) + 4, 0, 100 - Number(layer.w || 20));\n    copy.y = clamp(Number(layer.y || 0) + 4, 0, 100 - Number(layer.h || 10));\n    copy.locked = false;\n\n    dState.imageLayers = dState.imageLayers || [];\n    dState.imageLayers.push(copy);\n    state.activeImageLayerId = copy.id;\n    dState.touched = true;\n\n    renderImageLayers(dState);\n    renderPlacements();\n    openTextEditorForLayer(copy.id, false);\n  }\n\n  function updateTextLayerNaturalSize(layer) {\n    var metrics = getTextLayerMetrics(layer);\n\n    // v385: natural geometry is the exact painted SVG glyph box (including curve).\n    // The live SVG viewBox is cropped to those same bounds, so the selection box,\n    // visible artwork and print-edge warning all share one geometry.\n    layer.naturalWidth = Number(metrics.width || 1);\n    layer.naturalHeight = Number(metrics.height || 1);\n    layer.textPaddingXPx = Number(metrics.paddingX || 0);\n    layer.textPaddingYPx = Number(metrics.paddingY || 0);\n    layer.textInsetLeftPx = Number(metrics.insetLeft || metrics.paddingX || 0);\n    layer.textInsetRightPx = Number(metrics.insetRight || metrics.paddingX || 0);\n  }\n\n  // v383: no stage raster-preview pipeline for text. The editable canvas keeps\n  // one live SVG object mounted. Export still rasterizes the final SVG only when\n  // generating print assets, where a bitmap is actually required.\n\n\n  function fitNewTextLayerToDefaultSize(layer) {\n    if (!layer || layer.type !== 'text') return;\n\n    var template = getTextSizingTemplate();\n    var targetWidthPct = DEFAULT_TEXT_LAYER_WIDTH_PCT;\n    var targetHeightPct = DEFAULT_TEXT_LAYER_HEIGHT_PCT;\n\n    // Start from a real physical point size, measure the actual rendered glyphs\n    // against this Spreadconnect print area, then calculate a real pt size that\n    // gives the same balanced initial footprint as uploaded images.\n    //\n    // Uploaded images start at 56% of print-area width and preserve aspect ratio.\n    // Text uses a similar target (58% width) plus an 18% height ceiling so short,\n    // tall or unusual fonts do not start absurdly large.\n    layer.fontSize = textPointsToInternalPx(TEXT_SIZE_DEFAULT_PT, template);\n    updateTextLayerNaturalSize(layer);\n\n    var box = getTextLayerBoxPct(layer);\n    var boxW = Math.max(0.01, Number(box && box.w || 0));\n    var boxH = Math.max(0.01, Number(box && box.h || 0));\n\n    var widthScale = targetWidthPct / boxW;\n    var heightScale = targetHeightPct / boxH;\n    var scale = Math.min(widthScale, heightScale);\n\n    if (!Number.isFinite(scale) || scale <= 0) scale = 1;\n\n    var startPt = textInternalPxToPoints(layer.fontSize, template);\n    var smartPt = clamp(\n      Math.round(startPt * scale),\n      TEXT_SIZE_MIN_PT,\n      TEXT_SIZE_MAX_PT\n    );\n\n    layer.fontSize = textPointsToInternalPx(smartPt, template);\n    updateTextLayerNaturalSize(layer);\n\n    autoFitTextLayerToContents(layer, 50, 50);\n  }\n\n  function autoFitTextLayerToContents(layer, centerX, centerY) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n\n    centerX = clamp(Number(centerX || 50), 2.5, 97.5);\n    centerY = clamp(Number(centerY || 50), 2.5, 97.5);\n\n    if (!printAreaWidthPx || !printAreaHeightPx) {\n      fitImageLayerToNaturalAspect(layer, Number(layer.w || 46));\n      return;\n    }\n\n    // Text size changes should grow/shrink from the visual center of the selected text.\n    // If the text would hit the print-area edge, reduce font size instead of moving the object.\n    updateTextLayerNaturalSize(layer);\n    var box = getTextLayerBoxPct(layer);\n\n    var maxW = MAX_TEXT_LAYER_SIZE;\n    var maxH = MAX_TEXT_LAYER_SIZE;\n\n    // Do not shrink text just because the normal text box reaches the print-area edge.\n    // Text may now be placed outside the guide lines intentionally.\n    layer.w = clamp(box.w, 1, maxW);\n    layer.h = clamp(box.h, 1, maxH);\n    layer.x = centerX - layer.w / 2;\n    layer.y = centerY - layer.h / 2;\n  }\n\n  function autoFitTextLayerToContentsFromTextAnchor(layer, previousX, previousY, previousW, renderScale) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n\n    previousX = Number(previousX || 0);\n    previousY = Number(previousY || 0);\n    previousW = Math.max(0, Number(previousW || layer.w || 0));\n\n    if (!printAreaWidthPx || !printAreaHeightPx) {\n      fitImageLayerToNaturalAspect(layer, Number(layer.w || 46));\n      layer.y = previousY;\n      return;\n    }\n\n    // v387: text content is anchored like real typography rather than to an\n    // arbitrary selection-box corner. Vertically, the first row stays fixed and\n    // new rows only grow downward. Horizontally, preserve the alignment anchor:\n    // left = left edge, center = center point, right = right edge.\n    updateTextLayerNaturalSize(layer);\n    var box = getTextLayerBoxPct(layer);\n    renderScale = Number(renderScale || 1);\n    if (!Number.isFinite(renderScale) || renderScale <= 0) renderScale = 1;\n    renderScale = clamp(renderScale, 0.12, 8);\n\n    // Keep the exact pre-edit visual scale. Adding/removing rows changes only the\n    // measured box dimensions; it must not make the glyphs larger or smaller.\n    var newW = clamp(Number(box.w || 1) * renderScale, 1, MAX_TEXT_LAYER_SIZE);\n    var newH = clamp(Number(box.h || 1) * renderScale, 1, MAX_TEXT_LAYER_SIZE);\n    var align = ['left', 'center', 'right'].indexOf(layer.align || 'center') >= 0\n      ? (layer.align || 'center')\n      : 'center';\n\n    if (align === 'left') {\n      layer.x = previousX;\n    } else if (align === 'right') {\n      layer.x = previousX + previousW - newW;\n    } else {\n      layer.x = previousX + previousW / 2 - newW / 2;\n    }\n\n    layer.y = previousY;\n    layer.w = newW;\n    layer.h = newH;\n  }\n\n  function getTextLayerBoxPct(layer) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n    if (!printAreaWidthPx || !printAreaHeightPx) {\n      return {\n        w: Number(layer.w || 46),\n        h: Number(layer.h || 15)\n      };\n    }\n\n    // v385: selection geometry comes from the final painted SVG glyph bounds.\n    // Curved text therefore has no font-metric/line-height air around the visible letters.\n    var metrics = getTextLayerMetrics(layer);\n    return {\n      w: clamp((Number(metrics.width || 1) / printAreaWidthPx) * 100, 1, MAX_TEXT_LAYER_SIZE),\n      h: clamp((Number(metrics.height || 1) / printAreaHeightPx) * 100, 1, MAX_TEXT_LAYER_SIZE)\n    };\n  }\n\n  var __pbSvgTextMeasureCache = Object.create(null);\n  var __pbSvgTextMeasureCacheSize = 0;\n  var __pbTextArtworkMeasureCache = Object.create(null);\n  var __pbTextArtworkMeasureCacheSize = 0;\n  var __pbTextMeasureSvgSerial = 0;\n\n  function measureSvgTextLineBounds(value, layer, trackingPx, lineIndex) {\n    if (!document.body || typeof document.createElementNS !== 'function') return null;\n\n    var fontSize = Math.max(1, Number((layer && layer.fontSize) || 96));\n    var fontFamily = (layer && layer.fontFamily) || 'Arial, Helvetica, sans-serif';\n    var fontWeight = '400';\n    var fontStyle = (layer && layer.fontStyle) || 'normal';\n    var text = String(value || ' ');\n    var fontReadyKey = pbFontReadyFamilies[fontFamily] ? '1' : '0';\n    var cacheKey = [\n      text,\n      fontFamily,\n      fontWeight,\n      fontStyle,\n      fontSize,\n      Number(trackingPx || 0).toFixed(3),\n      Number(lineIndex || 0),\n      getTextBoldRangesKey(layer),\n      fontReadyKey\n    ].join('\\u0001');\n\n    if (__pbSvgTextMeasureCache[cacheKey]) {\n      return __pbSvgTextMeasureCache[cacheKey];\n    }\n\n    var ns = 'http://www.w3.org/2000/svg';\n    var svg = document.createElementNS(ns, 'svg');\n    var textEl = document.createElementNS(ns, 'text');\n\n    svg.setAttribute('width', '1');\n    svg.setAttribute('height', '1');\n    svg.setAttribute('viewBox', '0 0 1 1');\n    svg.style.position = 'fixed';\n    svg.style.left = '-10000px';\n    svg.style.top = '-10000px';\n    svg.style.opacity = '0';\n    svg.style.pointerEvents = 'none';\n    svg.style.overflow = 'visible';\n    svg.style.zIndex = '-1';\n\n    textEl.setAttribute('x', '0');\n    textEl.setAttribute('y', '0');\n    textEl.setAttribute('font-family', fontFamily);\n    textEl.setAttribute('font-size', String(fontSize));\n    textEl.setAttribute('font-weight', fontWeight);\n    textEl.setAttribute('font-style', fontStyle);\n    textEl.setAttribute('letter-spacing', Number(trackingPx || 0).toFixed(3));\n    textEl.setAttribute('text-anchor', 'start');\n\n    var boldWeight = getDesignerFontBoldWeight(fontFamily);\n    var segments = getTextLineStyledSegments(layer, Number(lineIndex || 0), Boolean(layer && layer.uppercase === true));\n    if (!String(value || '')) segments = [{ text: ' ', bold: false }];\n    segments.forEach(function (segment) {\n      var tspan = document.createElementNS(ns, 'tspan');\n      if (segment.bold && boldWeight > 0) tspan.setAttribute('font-weight', String(boldWeight));\n      tspan.textContent = segment.text || ' ';\n      textEl.appendChild(tspan);\n    });\n\n    svg.appendChild(textEl);\n    document.body.appendChild(svg);\n\n    var result = null;\n    try {\n      var box = textEl.getBBox();\n      if (box && Number.isFinite(box.width) && box.width > 0) {\n        result = {\n          x: Number(box.x || 0),\n          y: Number(box.y || 0),\n          width: Number(box.width || 0),\n          height: Number(box.height || 0)\n        };\n      }\n    } catch (error) {\n      result = null;\n    }\n\n    if (svg.parentNode) svg.parentNode.removeChild(svg);\n\n    if (result) {\n      if (__pbSvgTextMeasureCacheSize > 600) {\n        __pbSvgTextMeasureCache = Object.create(null);\n        __pbSvgTextMeasureCacheSize = 0;\n      }\n      __pbSvgTextMeasureCache[cacheKey] = result;\n      __pbSvgTextMeasureCacheSize += 1;\n    }\n\n    return result;\n  }\n\n  function getRenderableTextLines(value) {\n    var raw = String(value == null ? '' : value).replace(/\\r/g, '');\n    // v388: preserve the textarea line structure 1:1. Empty/whitespace-only rows\n    // are intentional line breaks and must keep their vertical slot.\n    var lines = raw.split('\\n');\n    return lines.length ? lines : [''];\n  }\n\n  function measureTextArtworkBoundsFromMetrics(layer, provisionalMetrics) {\n    if (!document.body || !provisionalMetrics || typeof document.createElement !== 'function') return null;\n\n    var fontFamily = String((layer && layer.fontFamily) || 'Arial, Helvetica, sans-serif');\n    var fontReadyKey = pbFontReadyFamilies[fontFamily] ? '1' : '0';\n    var outline = String((layer && layer.outline) || 'none').toLowerCase();\n    var cacheKey = [\n      String((layer && layer.text) || ''),\n      fontFamily,\n      String((layer && layer.fontWeight) || '400'),\n      getTextBoldRangesKey(layer),\n      String((layer && layer.fontStyle) || 'normal'),\n      String(Boolean(layer && layer.uppercase === true)),\n      String((layer && layer.align) || 'center'),\n      Number((layer && layer.fontSize) || 96).toFixed(3),\n      Number((layer && layer.curve) || 0).toFixed(3),\n      Number((layer && layer.letterSpacing) || 100).toFixed(3),\n      outline === 'none' ? 'none' : 'outline',\n      Number((layer && layer.outlineSize) || 0).toFixed(3),\n      Number(provisionalMetrics.layoutWidth || provisionalMetrics.width || 0).toFixed(3),\n      Number(provisionalMetrics.layoutHeight || provisionalMetrics.height || 0).toFixed(3),\n      fontReadyKey\n    ].join('\\u0001');\n\n    if (__pbTextArtworkMeasureCache[cacheKey]) {\n      return __pbTextArtworkMeasureCache[cacheKey];\n    }\n\n    var serial = ++__pbTextMeasureSvgSerial;\n    var prefix = 'pb-measure-curve-' + serial + '-';\n    var markup = buildTextLayerSvgWithMetrics(layer, provisionalMetrics, '', prefix);\n    var template = document.createElement('template');\n    template.innerHTML = String(markup || '').trim();\n    var svg = template.content.firstElementChild;\n    if (!svg) return null;\n\n    svg.style.position = 'fixed';\n    svg.style.left = '-100000px';\n    svg.style.top = '-100000px';\n    svg.style.opacity = '0';\n    svg.style.pointerEvents = 'none';\n    svg.style.overflow = 'visible';\n    svg.style.zIndex = '-1';\n    svg.setAttribute('aria-hidden', 'true');\n    document.body.appendChild(svg);\n\n    var minX = Infinity;\n    var minY = Infinity;\n    var maxX = -Infinity;\n    var maxY = -Infinity;\n    var found = false;\n\n    try {\n      Array.from(svg.querySelectorAll('[data-pb-text-paint]')).forEach(function (paintGroup) {\n        var box = paintGroup.getBBox();\n        if (!box || !Number.isFinite(box.width) || !Number.isFinite(box.height) || box.width <= 0 || box.height <= 0) return;\n        minX = Math.min(minX, Number(box.x || 0));\n        minY = Math.min(minY, Number(box.y || 0));\n        maxX = Math.max(maxX, Number(box.x || 0) + Number(box.width || 0));\n        maxY = Math.max(maxY, Number(box.y || 0) + Number(box.height || 0));\n        found = true;\n      });\n    } catch (error) {\n      found = false;\n    }\n\n    if (svg.parentNode) svg.parentNode.removeChild(svg);\n    if (!found) return null;\n\n    // SVG getBBox() does not consistently include stroke. Expand only by the\n    // actually painted outline plus a sub-pixel AA guard, keeping the editor box\n    // visually flush with the glyphs instead of preserving font/line-height air.\n    var strokeExpand = outline !== 'none' ? Math.max(0, Number((layer && layer.outlineSize) || 0)) / 2 : 0;\n    var aaGuard = 0.5;\n    var expand = strokeExpand + aaGuard;\n    minX -= expand;\n    minY -= expand;\n    maxX += expand;\n    maxY += expand;\n\n    var result = {\n      x: minX,\n      y: minY,\n      width: Math.max(1, maxX - minX),\n      height: Math.max(1, maxY - minY)\n    };\n\n    if (__pbTextArtworkMeasureCacheSize > 450) {\n      __pbTextArtworkMeasureCache = Object.create(null);\n      __pbTextArtworkMeasureCacheSize = 0;\n    }\n    __pbTextArtworkMeasureCache[cacheKey] = result;\n    __pbTextArtworkMeasureCacheSize += 1;\n    return result;\n  }\n\n  function measureStyledTextLineCanvas(layer, lineIndex, uppercase, trackingPx) {\n    var fontSize = Math.max(1, Number((layer && layer.fontSize) || 96));\n    var fontFamily = (layer && layer.fontFamily) || 'Arial, Helvetica, sans-serif';\n    var fontStyle = (layer && layer.fontStyle) || 'normal';\n    var boldWeight = getDesignerFontBoldWeight(fontFamily);\n    var segments = getTextLineStyledSegments(layer, lineIndex, uppercase);\n    var canvas = getTextMeasureCanvas();\n    var ctx = canvas.getContext('2d');\n    var width = 0;\n    var ascent = 0;\n    var descent = 0;\n    var firstLeft = 0;\n    var lastRight = 0;\n    var measuredAny = false;\n    var charCount = 0;\n\n    segments.forEach(function (segment) {\n      var value = String(segment.text || '');\n      if (!value) return;\n      var weight = segment.bold && boldWeight > 0 ? boldWeight : 400;\n      ctx.font = fontStyle + ' ' + weight + ' ' + fontSize + 'px ' + fontFamily;\n      var m = ctx.measureText(value);\n      if (!measuredAny) firstLeft = Number(m.actualBoundingBoxLeft || 0);\n      lastRight = Number(m.actualBoundingBoxRight || 0);\n      width += Number(m.width || 0);\n      ascent = Math.max(ascent, Number(m.actualBoundingBoxAscent || 0));\n      descent = Math.max(descent, Number(m.actualBoundingBoxDescent || 0));\n      charCount += value.length;\n      measuredAny = true;\n    });\n\n    if (!measuredAny) {\n      ctx.font = fontStyle + ' 400 ' + fontSize + 'px ' + fontFamily;\n      var blank = ctx.measureText(' ');\n      return blank;\n    }\n\n    width += Math.max(0, charCount - 1) * Number(trackingPx || 0);\n    return {\n      width: width,\n      actualBoundingBoxLeft: firstLeft,\n      actualBoundingBoxRight: Math.max(lastRight, width - firstLeft),\n      actualBoundingBoxAscent: ascent,\n      actualBoundingBoxDescent: descent\n    };\n  }\n\n  function getTextLayerMetrics(layer) {\n    var raw = String((layer && layer.text) || 'DIN TEXT').replace(/\\r/g, '');\n    var lines = getRenderableTextLines(raw);\n    var leadingBlankLines = 0;\n    var trailingBlankLines = 0;\n    while (leadingBlankLines < lines.length && !/\\S/.test(String(lines[leadingBlankLines] || ''))) leadingBlankLines += 1;\n    while (trailingBlankLines < lines.length - leadingBlankLines && !/\\S/.test(String(lines[lines.length - 1 - trailingBlankLines] || ''))) trailingBlankLines += 1;\n    var fontSize = Math.max(1, Number((layer && layer.fontSize) || 96));\n    var fontFamily = (layer && layer.fontFamily) || 'Arial, Helvetica, sans-serif';\n    var fontWeight = '400';\n    var fontStyle = (layer && layer.fontStyle) || 'normal';\n    var uppercase = Boolean(layer && layer.uppercase === true);\n\n    var measureCanvas = getTextMeasureCanvas();\n    var measureCtx = measureCanvas.getContext('2d');\n    measureCtx.font = fontStyle + ' ' + fontWeight + ' ' + fontSize + 'px ' + fontFamily;\n    measureCtx.textAlign = 'start';\n    measureCtx.textBaseline = 'alphabetic';\n\n    var trackingPx = (Number((layer && layer.letterSpacing) || 100) - 100) / 5;\n    var maxWidth = 0;\n    var maxAscent = 0;\n    var maxDescent = 0;\n    var lineBounds = [];\n    var minPaintedLeft = 0;\n    var maxPaintedRight = 0;\n    var hasPaintedBounds = false;\n\n    lines.forEach(function (line, lineIndex) {\n      var measureText = uppercase ? String(line || '').toUpperCase() : String(line || '');\n      var canvasMetrics = measureStyledTextLineCanvas(layer, lineIndex, uppercase, trackingPx);\n      var svgBounds = measureSvgTextLineBounds(measureText || ' ', layer, trackingPx, lineIndex);\n\n      var extraTracking = Math.max(0, measureText.length - 1) * trackingPx;\n      var measuredWidth = Number(canvasMetrics.width || 0);\n      var glyphLeft = Number(canvasMetrics.actualBoundingBoxLeft || 0);\n      var glyphRight = Number(canvasMetrics.actualBoundingBoxRight || 0);\n      var canvasGlyphWidth = glyphLeft + glyphRight;\n      if (!canvasGlyphWidth || canvasGlyphWidth < 1) canvasGlyphWidth = measuredWidth;\n\n      // Use the browser's own SVG paint bounds whenever possible. The preview is\n      // rendered as SVG too, so this removes the old mismatch where Canvas could\n      // report a much wider advance/bounding box than the letters actually shown.\n      var painted = svgBounds || {\n        x: -glyphLeft,\n        y: -Number(canvasMetrics.actualBoundingBoxAscent || 0),\n        width: Math.max(1, canvasGlyphWidth + extraTracking),\n        height: Math.max(1, Number(canvasMetrics.actualBoundingBoxAscent || 0) + Number(canvasMetrics.actualBoundingBoxDescent || 0))\n      };\n\n      painted = {\n        x: Number(painted.x || 0),\n        y: Number(painted.y || 0),\n        width: Math.max(1, Number(painted.width || 1)),\n        height: Math.max(1, Number(painted.height || 1))\n      };\n\n      lineBounds.push(painted);\n      maxWidth = Math.max(maxWidth, painted.width);\n      var paintedLeft = Number(painted.x || 0);\n      var paintedRight = paintedLeft + Number(painted.width || 0);\n      if (!hasPaintedBounds) {\n        minPaintedLeft = paintedLeft;\n        maxPaintedRight = paintedRight;\n        hasPaintedBounds = true;\n      } else {\n        minPaintedLeft = Math.min(minPaintedLeft, paintedLeft);\n        maxPaintedRight = Math.max(maxPaintedRight, paintedRight);\n      }\n      maxAscent = Math.max(maxAscent, Number(canvasMetrics.actualBoundingBoxAscent || 0));\n      maxDescent = Math.max(maxDescent, Number(canvasMetrics.actualBoundingBoxDescent || 0));\n    });\n\n    if (!maxAscent) maxAscent = fontSize * 0.78;\n    if (!maxDescent) maxDescent = fontSize * 0.22;\n\n    var lineHeight = fontSize * 1.02;\n    var baseHeight = Math.max(maxAscent + maxDescent + (Math.max(lines.length, 1) - 1) * lineHeight, fontSize * 0.82);\n\n    // Keep horizontal selection bounds virtually flush with the painted glyphs.\n    // Only preserve a tiny safety margin so anti-aliased edges survive, while the\n    // visible text hugs the selection border more closely than before.\n    var hasOutline = String((layer && layer.outline) || 'none').toLowerCase() !== 'none';\n    var outlineSafety = hasOutline ? (Math.max(1, Number((layer && layer.outlineSize) || 6)) / 2 + 1) : 0.25;\n    var paddingX = hasOutline ? outlineSafety : 0.25;\n    var paddingY = Math.max(hasOutline ? outlineSafety : 1, fontSize * 0.012);\n    var curve = Number((layer && layer.curve) || 0);\n    var curveMagnitude = Math.abs(curve) / 100;\n    var curveLift = curveMagnitude * Math.max(fontSize * 0.48, lineHeight * 0.44);\n    var contentLeft = hasPaintedBounds ? minPaintedLeft : 0;\n    var contentRight = hasPaintedBounds ? maxPaintedRight : maxWidth;\n    var contentWidth = Math.max(1, contentRight - contentLeft);\n\n    var width = Math.max(1, contentWidth + paddingX * 2);\n\n    // Curved text needs an asymmetric canvas:\n    // enough room above the arc so letters are not clipped,\n    // but no large empty area below the visible text.\n    var textHalfHeight = Math.max(fontSize * 0.46, (maxAscent + maxDescent) * 0.55);\n    var lineStackHeight = Math.max(0, Math.max(lines.length, 1) - 1) * lineHeight;\n    var curvedHeight = paddingY * 2 + lineStackHeight + textHalfHeight * 2 + curveLift;\n    var height = Math.max(fontSize * 0.35, Math.abs(curve) > 0.5 ? curvedHeight : baseHeight + paddingY * 2);\n\n    var align = (layer && layer.align) || 'center';\n    var extraX = Math.max(0, width - maxWidth);\n    var insetLeft = align === 'left' ? paddingX : (align === 'right' ? extraX - paddingX : extraX / 2);\n    var insetRight = align === 'right' ? paddingX : (align === 'left' ? extraX - paddingX : extraX / 2);\n\n    var provisionalMetrics = {\n      // layoutWidth/layoutHeight describe the internal coordinate system used to\n      // lay out paths and baselines. width/height below are replaced by the exact\n      // painted glyph bounds once the provisional SVG has been measured.\n      width: width,\n      height: height,\n      layoutWidth: width,\n      layoutHeight: height,\n      viewBoxX: 0,\n      viewBoxY: 0,\n      viewBoxWidth: width,\n      viewBoxHeight: height,\n      paddingX: paddingX,\n      paddingY: paddingY,\n      insetLeft: Math.max(0, Math.min(insetLeft, paddingX)),\n      insetRight: Math.max(0, Math.min(insetRight, paddingX)),\n      lineBounds: lineBounds,\n      contentLeft: contentLeft,\n      contentRight: contentRight\n    };\n\n    var paintedBounds = measureTextArtworkBoundsFromMetrics(layer, provisionalMetrics);\n    if (paintedBounds) {\n      // Interior empty rows already move later painted glyphs down. Leading/trailing\n      // empty rows have no glyphs of their own, so explicitly keep those line slots\n      // in the live SVG/viewBox instead of cropping them away.\n      var extraTop = leadingBlankLines * lineHeight;\n      var extraBottom = trailingBlankLines * lineHeight;\n      var expandedY = Number(paintedBounds.y || 0) - extraTop;\n      var expandedHeight = Number(paintedBounds.height || height) + extraTop + extraBottom;\n\n      provisionalMetrics.width = Number(paintedBounds.width || width);\n      provisionalMetrics.height = Math.max(1, expandedHeight);\n      provisionalMetrics.viewBoxX = Number(paintedBounds.x || 0);\n      provisionalMetrics.viewBoxY = expandedY;\n      provisionalMetrics.viewBoxWidth = Number(paintedBounds.width || width);\n      provisionalMetrics.viewBoxHeight = Math.max(1, expandedHeight);\n    }\n\n    return provisionalMetrics;\n  }\n\n  var __pbTextMeasureCanvas = null;\n  function getTextMeasureCanvas() {\n    if (!__pbTextMeasureCanvas) __pbTextMeasureCanvas = document.createElement('canvas');\n    return __pbTextMeasureCanvas;\n  }\n\n  function normalizeHexColor(value) {\n    var color = String(value || '').trim();\n    if (/^#[0-9a-fA-F]{6}$/.test(color)) return color;\n    if (/^#[0-9a-fA-F]{3}$/.test(color)) {\n      return '#' + color.slice(1).split('').map(function (c) { return c + c; }).join('');\n    }\n    return '#ffffff';\n  }\n\n  function readFileAsDataUrl(file) {\n    return new Promise(function (resolve, reject) {\n      var reader = new FileReader();\n      reader.onload = function () { resolve(reader.result); };\n      reader.onerror = function () { reject(reader.error || new Error(pbT('kunde_inte_lasa_filen', 'Kunde inte l\u00E4sa filen.'))); };\n      reader.readAsDataURL(file);\n    });\n  }\n\n  function makeLayerId() {\n    return 'layer-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 9);\n  }\n\n\n  function hasPrimaryDesignContent(dState) {\n    if (!dState) return false;\n    if (dState.designType === 'image') return Boolean(dState.imageDataUrl);\n    return Boolean(String(dState.text || '').trim());\n  }\n\n  // v383: patch an existing SVG tree instead of replacing the live text object.\n  // Most slider ticks only change attributes/path data/textContent on nodes that are\n  // already painted. Children are created/removed only when the SVG structure really\n  // changes (for example curve 0 -> curved, outline on/off, or line count changes).\n  function patchSvgTreeInPlace(currentNode, nextNode) {\n    if (!currentNode || !nextNode) return false;\n    if (currentNode.nodeType !== nextNode.nodeType || currentNode.nodeName !== nextNode.nodeName) {\n      if (currentNode.parentNode) currentNode.parentNode.replaceChild(nextNode.cloneNode(true), currentNode);\n      return true;\n    }\n\n    if (currentNode.nodeType === 3 || currentNode.nodeType === 4 || currentNode.nodeType === 8) {\n      if (currentNode.nodeValue !== nextNode.nodeValue) currentNode.nodeValue = nextNode.nodeValue;\n      return true;\n    }\n\n    if (currentNode.nodeType !== 1) return true;\n\n    Array.from(currentNode.attributes || []).forEach(function (attr) {\n      if (!nextNode.hasAttribute(attr.name)) currentNode.removeAttribute(attr.name);\n    });\n    Array.from(nextNode.attributes || []).forEach(function (attr) {\n      if (currentNode.getAttribute(attr.name) !== attr.value) currentNode.setAttribute(attr.name, attr.value);\n    });\n\n    var nextChildren = Array.from(nextNode.childNodes || []);\n    var i = 0;\n    while (i < nextChildren.length || i < currentNode.childNodes.length) {\n      var currentChild = currentNode.childNodes[i] || null;\n      var nextChild = nextChildren[i] || null;\n\n      if (!nextChild && currentChild) {\n        currentNode.removeChild(currentChild);\n        continue;\n      }\n      if (nextChild && !currentChild) {\n        currentNode.appendChild(nextChild.cloneNode(true));\n        i += 1;\n        continue;\n      }\n      if (!currentChild || !nextChild) {\n        i += 1;\n        continue;\n      }\n\n      if (currentChild.nodeType !== nextChild.nodeType || currentChild.nodeName !== nextChild.nodeName) {\n        currentNode.replaceChild(nextChild.cloneNode(true), currentChild);\n      } else {\n        patchSvgTreeInPlace(currentChild, nextChild);\n      }\n      i += 1;\n    }\n    return true;\n  }\n\n  function ensureLiveTextLayerHost(node) {\n    var host = node.querySelector('.pb-customizer__text-layer-inline');\n    if (host) return host;\n\n    // Remove any legacy raster preview if this project was loaded from an older build.\n    Array.from(node.querySelectorAll('.pb-customizer__text-layer-img')).forEach(function (oldPreview) {\n      if (oldPreview.parentNode === node) oldPreview.parentNode.removeChild(oldPreview);\n    });\n\n    host = document.createElement('div');\n    host.className = 'pb-customizer__text-layer pb-customizer__text-layer-inline';\n    host.setAttribute('aria-label', pbT('textlager', 'Textlager'));\n    host.style.position = 'absolute';\n    host.style.inset = '0';\n    host.style.width = '100%';\n    host.style.height = '100%';\n    host.style.margin = '0';\n    host.style.padding = '0';\n    host.style.boxSizing = 'border-box';\n    host.style.display = 'block';\n    host.style.lineHeight = '0';\n    node.insertBefore(host, node.firstChild || null);\n    return host;\n  }\n\n  function updateTextLayerArtworkInPlace(node, layer, force) {\n    if (!node || !layer || layer.type !== 'text') return false;\n\n    // Never let a legacy pixel preview sit on top of the editable SVG.\n    Array.from(node.querySelectorAll('.pb-customizer__text-layer-img')).forEach(function (oldPreview) {\n      if (oldPreview.parentNode === node) oldPreview.parentNode.removeChild(oldPreview);\n    });\n\n    var host = ensureLiveTextLayerHost(node);\n    var renderKey = getTextPreviewGeometryKey(layer);\n    host.style.transform = layer.flipX ? 'scaleX(-1)' : '';\n\n    if (!force && host.dataset.pbTextRenderKey === renderKey && host.firstElementChild) return true;\n\n    var template = document.createElement('template');\n    template.innerHTML = buildTextLayerSvg(layer).trim();\n    var nextSvg = template.content.firstElementChild;\n    var currentSvg = host.firstElementChild;\n\n    if (currentSvg && nextSvg && currentSvg.nodeName === nextSvg.nodeName) {\n      patchSvgTreeInPlace(currentSvg, nextSvg);\n    } else {\n      while (host.firstChild) host.removeChild(host.firstChild);\n      if (nextSvg) host.appendChild(nextSvg.cloneNode(true));\n    }\n\n    var liveSvg = host.firstElementChild;\n    if (liveSvg) {\n      liveSvg.style.display = 'block';\n      liveSvg.style.width = '100%';\n      liveSvg.style.height = '100%';\n      liveSvg.style.maxWidth = 'none';\n      liveSvg.style.maxHeight = 'none';\n      liveSvg.style.margin = '0';\n      liveSvg.style.padding = '0';\n      liveSvg.style.overflow = 'visible';\n    }\n\n    host.dataset.pbTextRenderKey = renderKey;\n    return true;\n  }\n\n  function updateImageLayerArtworkInPlace(node, layer) {\n    if (!node || !layer) return false;\n\n    var textHost = node.querySelector('.pb-customizer__text-layer');\n    if (textHost && textHost.parentNode === node) textHost.parentNode.removeChild(textHost);\n    Array.from(node.querySelectorAll('.pb-customizer__text-layer-img')).forEach(function (oldPreview) {\n      if (oldPreview.parentNode === node) oldPreview.parentNode.removeChild(oldPreview);\n    });\n\n    var img = node.querySelector('.pb-customizer__image-layer-img');\n    if (!img) {\n      img = document.createElement('img');\n      img.className = 'pb-customizer__image-layer-img';\n      img.decoding = 'async';\n      img.draggable = false;\n      node.insertBefore(img, node.firstChild || null);\n    }\n\n    var spinner = node.querySelector('.pb-upload-placeholder__spinner');\n    if (layer.pbUploadPending && !spinner) {\n      spinner = document.createElement('span');\n      spinner.className = 'pb-upload-placeholder__spinner';\n      spinner.setAttribute('aria-hidden', 'true');\n      node.appendChild(spinner);\n    } else if (!layer.pbUploadPending && spinner) spinner.remove();\n    node.setAttribute('aria-busy', layer.pbUploadPending ? 'true' : 'false');\n    if (layer.pbUploadPending) {\n      // Keep the normal layer frame, but no image source until the preview is ready.\n      img.style.visibility = 'hidden';\n      img.removeAttribute('src');\n      img.alt = '';\n      return true;\n    }\n    var nextSrc = String(layer.imageDataUrl || '');\n    if (img.getAttribute('src') !== nextSrc) img.src = nextSrc;\n    img.style.removeProperty('visibility');\n    img.alt = layer.sourceFileName || pbT('designbild', 'Designbild');\n    img.style.transform = layer.flipX ? 'scaleX(-1)' : '';\n    return true;\n  }\n\n  function createImageLayerNode(layer) {\n    var node = document.createElement('div');\n\n    ['tl', 'tr', 'bl', 'br'].forEach(function (pos) {\n      var handle = document.createElement('span');\n      handle.className = 'pb-image-handle pb-image-handle--' + pos;\n      handle.dataset.pbLayerResize = pos;\n      node.appendChild(handle);\n    });\n\n    var del = document.createElement('button');\n    del.type = 'button';\n    del.className = 'pb-image-action pb-image-action--delete';\n    del.setAttribute('aria-label', pbT('ta_bort_bild', 'Ta bort bild'));\n    del.innerHTML = '<svg class=\"pb-image-action__svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M9 3h6m-9 4h12m-10 0 .7 12h6.6L16 7M10 10v6m4-6v6\"/></svg>';\n    node.appendChild(del);\n\n    var rotate = document.createElement('button');\n    rotate.type = 'button';\n    rotate.className = 'pb-image-action pb-image-action--rotate';\n    rotate.innerHTML = '<span class=\"pb-ui-svg-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M20 11a8 8 0 1 0-2.34 5.66\"/><path d=\"M20 5v6h-6\"/></svg></span>';\n    node.appendChild(rotate);\n\n    var mw = document.createElement('span');\n    mw.className = 'pb-image-measure pb-image-measure--width';\n    node.appendChild(mw);\n\n    var mh = document.createElement('span');\n    mh.className = 'pb-image-measure pb-image-measure--height';\n    node.appendChild(mh);\n\n    node.dataset.layerId = layer.id;\n    bindImageLayerNode(node);\n    return node;\n  }\n\n  function updateLayerNodeInPlace(node, layer, forceTextArtwork) {\n    if (!node || !layer) return false;\n\n    var isText = (layer.type || 'image') === 'text';\n    node.className = 'pb-customizer__image-layer'\n      + (layer.id === state.activeImageLayerId ? ' is-selected' : '')\n      + (layer.locked ? ' is-locked' : '')\n      + (layer.pbUploadPending ? ' is-upload-pending' : '');\n    node.dataset.layerId = layer.id;\n    node.dataset.layerType = layer.type || 'image';\n    node.style.left = Number(layer.x || 0) + '%';\n    node.style.top = Number(layer.y || 0) + '%';\n    node.style.width = Number(layer.w || 0) + '%';\n    node.style.height = Number(layer.h || 0) + '%';\n    node.style.transform = 'rotate(' + Number(layer.rotation || 0) + 'deg)';\n\n    if (isText) updateTextLayerArtworkInPlace(node, layer, Boolean(forceTextArtwork));\n    else updateImageLayerArtworkInPlace(node, layer);\n\n    var del = node.querySelector('[data-pb-layer-delete]') || node.querySelector('.pb-image-action--delete');\n    if (del) {\n      del.dataset.pbLayerDelete = layer.id;\n      del.setAttribute('aria-label', isText ? pbT('ta_bort_text', 'Ta bort text') : pbT('ta_bort_bild', 'Ta bort bild'));\n    }\n\n    var rotate = node.querySelector('[data-pb-layer-rotate]') || node.querySelector('.pb-image-action--rotate');\n    if (rotate) {\n      rotate.dataset.pbLayerRotate = layer.id;\n      rotate.setAttribute('aria-label', isText ? pbT('rotera_text', 'Rotera text') : pbT('rotera_bild', 'Rotera bild'));\n    }\n\n    var mw = node.querySelector('.pb-image-measure--width');\n    var mh = node.querySelector('.pb-image-measure--height');\n    if (mw) mw.textContent = getLayerWidthCm(layer);\n    if (mh) mh.textContent = getLayerHeightCm(layer);\n\n    applyImageLayerVisualClip(node, layer);\n\n    if (activeImageResize && String(activeImageResize.layerId) === String(layer.id)) {\n      node.classList.add('is-resizing', 'is-live-transform');\n    }\n    if (activeImageDrag && String(activeImageDrag.layerId) === String(layer.id)) {\n      node.classList.add('is-dragging', 'is-live-transform');\n      updateLayerDragMeasurements(node, layer);\n    }\n    if (activeImageRotate && String(activeImageRotate.layerId) === String(layer.id)) {\n      node.classList.add('is-rotating', 'is-live-transform');\n    }\n\n    return true;\n  }\n\n  function updateTextLayerNodeLive(layer, forceArtwork) {\n    if (!layer || layer.type !== 'text') return false;\n    var node = getImageLayerNode(layer.id);\n    if (!node) return false;\n    return updateLayerNodeInPlace(node, layer, forceArtwork !== false);\n  }\n\n  function renderImageLayers(dState) {\n    if (!els.imageLayers) return;\n    dState = dState || getDesignState(state.activePlacement, true);\n    var layers = dState.imageLayers || [];\n    var existingById = Object.create(null);\n\n    Array.from(els.imageLayers.children || []).forEach(function (node) {\n      var id = node && node.dataset ? String(node.dataset.layerId || '') : '';\n      if (id) existingById[id] = node;\n    });\n\n    layers.forEach(function (layer) {\n      constrainImageLayer(layer);\n\n      // Keyed by layer.id: keep the exact same outer DOM node alive between renders.\n      var node = existingById[layer.id] || createImageLayerNode(layer);\n      delete existingById[layer.id];\n      updateLayerNodeInPlace(node, layer, false);\n\n      // appendChild moves an existing node without recreating it, so stack order can\n      // change while decoded images and live text SVGs remain intact.\n      els.imageLayers.appendChild(node);\n\n      if ((layer.type || 'image') === 'text') {\n        var fontForLayer = getDesignerFontByFamily(layer.fontFamily || '');\n        if (fontForLayer && fontForLayer.provider === 'google' && !pbFontReadyFamilies[fontForLayer.family] && !layer.pbLiveFontLoadPending) {\n          layer.pbLiveFontLoadPending = true;\n          ensureDesignerFontReady(fontForLayer).then(function () {\n            var currentState = getDesignState(state.activePlacement, false);\n            var current = currentState ? (currentState.imageLayers || []).find(function (item) { return item.id === layer.id; }) : null;\n            if (!current || current.type !== 'text') return;\n            current.pbLiveFontLoadPending = false;\n\n            // Loading the real font changes the glyph metrics, but it still edits the\n            // same live object. Preserve manual resize geometry exactly.\n            if (current.pbManualTextGeometry !== true) {\n              var oldW = Number(current.w || 46);\n              var oldH = Number(current.h || 15);\n              var cx = Number(current.x || 0) + oldW / 2;\n              var cy = Number(current.y || 0) + oldH / 2;\n              updateTextLayerNaturalSize(current);\n              autoFitTextLayerToContents(current, cx, cy);\n              constrainImageLayer(current);\n              freezeTextLayerGeometry(current);\n            } else {\n              updateTextLayerNaturalSize(current);\n            }\n\n            updateTextLayerNodeLive(current, true);\n            renderPlacements();\n          }).catch(function () {\n            layer.pbLiveFontLoadPending = false;\n          });\n        }\n      }\n    });\n\n    Object.keys(existingById).forEach(function (id) {\n      var obsolete = existingById[id];\n      if (obsolete && obsolete.parentNode === els.imageLayers) obsolete.parentNode.removeChild(obsolete);\n    });\n\n    syncPrintClipWarning();\n    syncPrintAreaGuideVisibility();\n  }\n\n  // v252: robust delegated delete. Using pointerdown avoids the browser losing\n  // the later click event if a render replaces the selected layer DOM node.\n  // This is especially important after a hidden upscale swaps the bitmap.\n  if (els.imageLayers && !els.imageLayers.__pbDeleteDelegated) {\n    els.imageLayers.__pbDeleteDelegated = true;\n    els.imageLayers.addEventListener('pointerdown', function (event) {\n      var deleteButton = event.target && event.target.closest ? event.target.closest('[data-pb-layer-delete]') : null;\n      if (!deleteButton || !els.imageLayers.contains(deleteButton)) return;\n\n      event.preventDefault();\n      event.stopPropagation();\n      if (event.stopImmediatePropagation) event.stopImmediatePropagation();\n\n      var layerId = String(deleteButton.dataset.pbLayerDelete || '');\n      if (layerId) deleteImageLayer(layerId);\n    }, true);\n\n    syncPrintAreaGuideVisibility();\n  }\n\n\n  function getTextLayerSvgDataUrl(layer, embeddedFontCss) {\n    return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(buildTextLayerSvg(layer, embeddedFontCss));\n  }\n\n  function buildTextLayerSvg(layer, embeddedFontCss) {\n    var metrics = getTextLayerMetrics(layer);\n    var safeLayerId = String((layer && layer.id) || 'text').replace(/[^a-zA-Z0-9_-]/g, '-');\n    return buildTextLayerSvgWithMetrics(layer, metrics, embeddedFontCss, 'pb-curve-' + safeLayerId + '-');\n  }\n\n  function buildTextLayerSvgWithMetrics(layer, metrics, embeddedFontCss, curveIdPrefix) {\n    metrics = metrics || {};\n    curveIdPrefix = curveIdPrefix || 'pb-curve-text-';\n\n    var width = Math.max(10, Number(metrics.layoutWidth || metrics.width || 10));\n    var height = Math.max(10, Number(metrics.layoutHeight || metrics.height || 10));\n    var outputWidth = Math.max(1, Number(metrics.width || width));\n    var outputHeight = Math.max(1, Number(metrics.height || height));\n    var viewBoxX = Number.isFinite(Number(metrics.viewBoxX)) ? Number(metrics.viewBoxX) : 0;\n    var viewBoxY = Number.isFinite(Number(metrics.viewBoxY)) ? Number(metrics.viewBoxY) : 0;\n    var viewBoxWidth = Math.max(1, Number(metrics.viewBoxWidth || outputWidth));\n    var viewBoxHeight = Math.max(1, Number(metrics.viewBoxHeight || outputHeight));\n    var fontSize = Math.max(1, Number(layer.fontSize || 96));\n    var fontFamily = escapeHtmlAttr(layer.fontFamily || 'Arial, Helvetica, sans-serif');\n    var fontWeight = '400';\n    var fontStyle = escapeHtmlAttr(layer.fontStyle || 'normal');\n    var fill = escapeHtmlAttr(layer.color || '#ffffff');\n    var outline = String(layer.outline || 'none');\n    var strokeColor = outline === 'none' ? '' : escapeHtmlAttr(outline);\n    var strokeWidth = strokeColor ? Math.max(1, Number(layer.outlineSize || 6)) : 0;\n    var trackingPx = (Number(layer.letterSpacing || 100) - 100) / 5;\n    var uppercase = Boolean(layer.uppercase === true);\n    var align = ['left', 'center', 'right'].indexOf(layer.align || 'center') >= 0 ? (layer.align || 'center') : 'center';\n    var lines = getRenderableTextLines(layer.text || '');\n    var richBoldWeight = getDesignerFontBoldWeight(layer.fontFamily || '');\n\n    function buildStyledLineMarkup(lineIndex) {\n      var segments = getTextLineStyledSegments(layer, lineIndex, uppercase);\n      if (!segments.length || (segments.length === 1 && !segments[0].text)) return ' ';\n      return segments.map(function (segment) {\n        var value = escapeHtml(segment.text || '');\n        if (!value) return '';\n        return segment.bold && richBoldWeight > 0\n          ? '<tspan font-weight=\"' + String(richBoldWeight) + '\">' + value + '</tspan>'\n          : '<tspan font-weight=\"400\">' + value + '</tspan>';\n      }).join('') || ' ';\n    }\n\n    var lineHeight = fontSize * 1.02;\n    var curve = Number(layer.curve || 0);\n    var curveMagnitude = Math.abs(curve) / 100;\n    var curvePx = curveMagnitude * Math.max(fontSize * 0.48, lineHeight * 0.44);\n    var centerX = width / 2;\n    var textAnchor = align === 'left' ? 'start' : (align === 'right' ? 'end' : 'middle');\n    var groupTextAnchor = Math.abs(curve) > 0.5 ? textAnchor : 'start';\n\n    var measureCanvas = getTextMeasureCanvas();\n    var measureCtx = measureCanvas.getContext('2d');\n    measureCtx.font = fontStyle + ' ' + fontWeight + ' ' + fontSize + 'px ' + (layer.fontFamily || 'Arial, Helvetica, sans-serif');\n\n    var maxAscent = 0;\n    var maxDescent = 0;\n    lines.forEach(function (_, lineIndex) {\n      var m = measureStyledTextLineCanvas(layer, lineIndex, uppercase, trackingPx);\n      maxAscent = Math.max(maxAscent, Number(m.actualBoundingBoxAscent || 0));\n      maxDescent = Math.max(maxDescent, Number(m.actualBoundingBoxDescent || 0));\n    });\n    if (!maxAscent) maxAscent = fontSize * 0.78;\n    if (!maxDescent) maxDescent = fontSize * 0.22;\n\n    var actualTextHeight = maxAscent + maxDescent + (Math.max(lines.length, 1) - 1) * lineHeight;\n    var firstBaselineY = (height - actualTextHeight) / 2 + maxAscent;\n\n    var edgePadding = Math.max(1, Number(metrics.paddingX || 1));\n    var flatTextX = align === 'left' ? edgePadding : (align === 'right' ? width - edgePadding : centerX);\n    var pathStartOffset = align === 'left' ? '0%' : (align === 'right' ? '100%' : '50%');\n    var textHalfHeight = Math.max(fontSize * 0.46, (maxAscent + maxDescent) * 0.55);\n    var curvedTopPadding = Math.max(fontSize * 0.10, Number(metrics.paddingY || 0));\n    var curvedCenterYStart = height / 2 - ((Math.max(lines.length, 1) - 1) * lineHeight / 2);\n\n    if (Math.abs(curve) > 0.5) {\n      // Positive curve arches upward, so move the path down enough to keep the top\n      // of the letters inside the box. Negative curve arches downward and only\n      // needs the normal top text room. This removes the oversized empty underside.\n      curvedCenterYStart = curve >= 0\n        ? curvedTopPadding + curvePx + textHalfHeight\n        : curvedTopPadding + textHalfHeight;\n    }\n    var paddingX = edgePadding;\n    var leftX = paddingX;\n    var rightX = width - paddingX;\n    var svg = [];\n\n    function pushTextNodes(isStrokePass) {\n      if (Math.abs(curve) > 0.5) {\n        for (var j = 0; j < lines.length; j++) {\n          var lineMarkup = buildStyledLineMarkup(j);\n          if (isStrokePass) {\n            svg.push('<text dominant-baseline=\"middle\"><textPath href=\"#' + curveIdPrefix + j + '\" startOffset=\"' + pathStartOffset + '\">' + lineMarkup + '</textPath></text>');\n          } else {\n            svg.push('<text dominant-baseline=\"middle\"><textPath href=\"#' + curveIdPrefix + j + '\" startOffset=\"' + pathStartOffset + '\">' + lineMarkup + '</textPath></text>');\n          }\n        }\n      } else {\n        for (var k = 0; k < lines.length; k++) {\n          var lineMarkup2 = buildStyledLineMarkup(k);\n          var y = firstBaselineY + k * lineHeight;\n          var paintedBounds = metrics.lineBounds && metrics.lineBounds[k] ? metrics.lineBounds[k] : null;\n          var flatLineX = flatTextX;\n\n          if (paintedBounds) {\n            var paintedLeft = Number(paintedBounds.x || 0);\n            var paintedWidth = Math.max(1, Number(paintedBounds.width || 1));\n\n            // Place the actual painted glyph bounds at the requested alignment,\n            // rather than aligning by the font's invisible advance box.\n            if (align === 'left') {\n              flatLineX = edgePadding - paintedLeft;\n            } else if (align === 'right') {\n              flatLineX = width - edgePadding - paintedLeft - paintedWidth;\n            } else {\n              flatLineX = centerX - paintedLeft - paintedWidth / 2;\n            }\n          }\n\n          if (isStrokePass) {\n            svg.push('<text x=\"' + flatLineX.toFixed(2) + '\" y=\"' + y.toFixed(1) + '\" dominant-baseline=\"alphabetic\">' + lineMarkup2 + '</text>');\n          } else {\n            svg.push('<text x=\"' + flatLineX.toFixed(2) + '\" y=\"' + y.toFixed(1) + '\" dominant-baseline=\"alphabetic\">' + lineMarkup2 + '</text>');\n          }\n        }\n      }\n    }\n\n    svg.push('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + outputWidth.toFixed(3) + '\" height=\"' + outputHeight.toFixed(3) + '\" viewBox=\"' + viewBoxX.toFixed(3) + ' ' + viewBoxY.toFixed(3) + ' ' + viewBoxWidth.toFixed(3) + ' ' + viewBoxHeight.toFixed(3) + '\" style=\"overflow:visible;text-shadow:none;filter:none\">');\n    svg.push('<defs>');\n    if (embeddedFontCss) {\n      svg.push('<style><![CDATA[' + String(embeddedFontCss).replace(/\\]\\]>/g, '] ]>') + ']]></style>');\n    }\n\n    if (Math.abs(curve) > 0.5) {\n      for (var i = 0; i < lines.length; i++) {\n        var baseY = curvedCenterYStart + i * lineHeight;\n        var controlY = curve >= 0 ? baseY - curvePx : baseY + curvePx;\n        svg.push('<path id=\"' + curveIdPrefix + i + '\" d=\"M ' + leftX.toFixed(1) + ' ' + baseY.toFixed(1) + ' Q ' + centerX.toFixed(1) + ' ' + controlY.toFixed(1) + ' ' + rightX.toFixed(1) + ' ' + baseY.toFixed(1) + '\" fill=\"none\"/>');\n      }\n    }\n\n    svg.push('</defs>');\n\n    if (strokeColor && strokeWidth > 0) {\n      svg.push('<g data-pb-text-paint=\"stroke\" fill=\"none\" stroke=\"' + strokeColor + '\" stroke-width=\"' + strokeWidth.toFixed(1) + '\" stroke-linejoin=\"round\" stroke-linecap=\"round\" font-family=\"' + fontFamily + '\" font-size=\"' + fontSize + '\" font-weight=\"' + fontWeight + '\" font-style=\"' + fontStyle + '\" letter-spacing=\"' + trackingPx.toFixed(2) + '\" text-anchor=\"' + groupTextAnchor + '\">');\n      pushTextNodes(true);\n      svg.push('</g>');\n    }\n\n    svg.push('<g data-pb-text-paint=\"fill\" fill=\"' + fill + '\" font-family=\"' + fontFamily + '\" font-size=\"' + fontSize + '\" font-weight=\"' + fontWeight + '\" font-style=\"' + fontStyle + '\" letter-spacing=\"' + trackingPx.toFixed(2) + '\" text-anchor=\"' + groupTextAnchor + '\">');\n    pushTextNodes(false);\n    svg.push('</g></svg>');\n    return svg.join('');\n  }\n\n  function escapeHtml(value) {\n    return String(value || '')\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  function escapeHtmlAttr(value) {\n    return escapeHtml(value);\n  }\n\n  function bindImageLayerNode(node) {\n    if (!node || node.__pbLayerBound) return;\n    node.__pbLayerBound = true;\n\n    function resolveLayer() {\n      var layerId = String(node.dataset.layerId || '');\n      if (!layerId) return null;\n      var dState = getDesignState(state.activePlacement, true);\n      return (dState.imageLayers || []).find(function (item) { return String(item.id) === layerId; }) || null;\n    }\n\n    node.addEventListener('pointerdown', function (event) {\n      var currentLayer = resolveLayer();\n      if (!currentLayer) return;\n      if (event.target.closest('[data-pb-layer-delete]')) return;\n      if (event.target.closest('[data-pb-layer-rotate]')) return;\n      var resizeHandle = event.target.closest('[data-pb-layer-resize]');\n      var shouldSwitchFromAiPanel = Boolean(els.aiPanel && !els.aiPanel.hidden);\n\n      event.preventDefault();\n      event.stopPropagation();\n      state.activeImageLayerId = currentLayer.id;\n      renderImageLayers(getDesignState(state.activePlacement, true));\n\n      // v325: if the AI panel is open and the customer clicks a canvas object,\n      // treat that first click as a panel switch instead of starting drag/resize.\n      if (shouldSwitchFromAiPanel) {\n        if (currentLayer.type === 'text') {\n          setTimeout(function () { openTextEditorForLayer(currentLayer.id, false); }, 0);\n        } else {\n          setTimeout(function () { openImageEditorForLayer(currentLayer.id); }, 0);\n        }\n        return;\n      }\n\n      if (resizeHandle) {\n        startImageLayerResize(event, currentLayer.id, resizeHandle.dataset.pbLayerResize || 'br');\n        if (currentLayer.type === 'text') {\n          setTimeout(function () { openTextEditorForLayer(currentLayer.id, false); }, 0);\n        } else {\n          setTimeout(function () { openImageEditorForLayer(currentLayer.id); }, 0);\n        }\n      } else {\n        startImageLayerDrag(event, currentLayer.id);\n        if (currentLayer.type === 'text') {\n          setTimeout(function () { openTextEditorForLayer(currentLayer.id, false); }, 0);\n        } else {\n          setTimeout(function () { openImageEditorForLayer(currentLayer.id); }, 0);\n        }\n      }\n    });\n\n    node.addEventListener('dblclick', function (event) {\n      var currentLayer = resolveLayer();\n      if (!currentLayer || currentLayer.type !== 'text') return;\n      event.preventDefault();\n      event.stopPropagation();\n      openTextEditorForLayer(currentLayer.id, false);\n    });\n\n    // Delete is handled by the delegated pointerdown listener on els.imageLayers.\n    var rotateButton = node.querySelector('[data-pb-layer-rotate]') || node.querySelector('.pb-image-action--rotate');\n    if (rotateButton) {\n      rotateButton.addEventListener('pointerdown', function (event) {\n        var currentLayer = resolveLayer();\n        if (!currentLayer) return;\n        event.preventDefault();\n        event.stopPropagation();\n        state.activeImageLayerId = currentLayer.id;\n        var shouldSwitchFromAiPanel = Boolean(els.aiPanel && !els.aiPanel.hidden);\n        renderImageLayers(getDesignState(state.activePlacement, true));\n        if (currentLayer.type === 'text') {\n          setTimeout(function () { openTextEditorForLayer(currentLayer.id, false); }, 0);\n        } else {\n          setTimeout(function () { openImageEditorForLayer(currentLayer.id); }, 0);\n        }\n        if (shouldSwitchFromAiPanel) return;\n        startImageLayerRotate(event, currentLayer.id);\n      });\n    }\n  }\n\n  var SNAP_GUIDE_POSITIONS_X = [25, 50, 75];\n  var SNAP_GUIDE_POSITIONS_Y = [25, 50, 75];\n  var SNAP_THRESHOLD_PCT = 1.8;\n  var ROTATION_SNAP_ANGLES = [0, 45, 90, 135, 180, 225, 270, 315];\n  var ROTATION_SNAP_THRESHOLD_DEG = 4;\n\n  function clearSnapGuides() {\n    if (els.snapGuideV) els.snapGuideV.hidden = true;\n    if (els.snapGuideH) els.snapGuideH.hidden = true;\n  }\n\n  function showSnapGuides(snapX, snapY) {\n    if (els.snapGuideV) {\n      if (snapX == null) els.snapGuideV.hidden = true;\n      else {\n        els.snapGuideV.hidden = false;\n        els.snapGuideV.style.left = snapX + '%';\n      }\n    }\n    if (els.snapGuideH) {\n      if (snapY == null) els.snapGuideH.hidden = true;\n      else {\n        els.snapGuideH.hidden = false;\n        els.snapGuideH.style.top = snapY + '%';\n      }\n    }\n  }\n\n  function getLayerSnapForAxis(pos, size, guides) {\n    var best = null;\n    guides.forEach(function (guide) {\n      [\n        { pos: guide, guide: guide, kind: 'start' },\n        { pos: guide - size / 2, guide: guide, kind: 'center' },\n        { pos: guide - size, guide: guide, kind: 'end' }\n      ].forEach(function (candidate) {\n        var delta = Math.abs(candidate.pos - pos);\n        if (delta <= SNAP_THRESHOLD_PCT && (!best || delta < best.delta)) {\n          best = {\n            pos: candidate.pos,\n            guide: candidate.guide,\n            delta: delta,\n            kind: candidate.kind\n          };\n        }\n      });\n    });\n    return best;\n  }\n\n  function uniqueSnapGuides(values) {\n    var sorted = (values || [])\n      .map(function (value) { return clamp(Number(value || 0), 0, 100); })\n      .sort(function (a, b) { return a - b; });\n\n    var unique = [];\n    sorted.forEach(function (value) {\n      if (!unique.length || Math.abs(unique[unique.length - 1] - value) > 0.25) {\n        unique.push(value);\n      }\n    });\n    return unique;\n  }\n\n  function getSnapGuidesForLayer(layer) {\n    var dState = getDesignState(state.activePlacement, true);\n    var xGuides = SNAP_GUIDE_POSITIONS_X.slice();\n    var yGuides = SNAP_GUIDE_POSITIONS_Y.slice();\n\n    (dState.imageLayers || []).forEach(function (other) {\n      if (!other || other.id === layer.id) return;\n\n      var otherX = Number(other.x || 0);\n      var otherY = Number(other.y || 0);\n      var otherW = Number(other.w || 0);\n      var otherH = Number(other.h || 0);\n\n      xGuides.push(otherX);\n      xGuides.push(otherX + otherW / 2);\n      xGuides.push(otherX + otherW);\n\n      yGuides.push(otherY);\n      yGuides.push(otherY + otherH / 2);\n      yGuides.push(otherY + otherH);\n    });\n\n    return {\n      x: uniqueSnapGuides(xGuides),\n      y: uniqueSnapGuides(yGuides)\n    };\n  }\n\n  function getSnappedLayerPosition(layer, proposedX, proposedY) {\n    if (!state.snapEnabled) {\n      clearSnapGuides();\n      return {\n        x: proposedX,\n        y: proposedY\n      };\n    }\n\n    var guides = getSnapGuidesForLayer(layer);\n    var snapX = getLayerSnapForAxis(proposedX, Number(layer.w || 0), guides.x);\n    var snapY = getLayerSnapForAxis(proposedY, Number(layer.h || 0), guides.y);\n\n    showSnapGuides(snapX ? snapX.guide : null, snapY ? snapY.guide : null);\n\n    return {\n      x: snapX ? snapX.pos : proposedX,\n      y: snapY ? snapY.pos : proposedY\n    };\n  }\n\n  function getSnappedRotation(rotation) {\n    var raw = normalizeRotation(rotation);\n    if (!state.snapEnabled) return raw;\n    var best = null;\n\n    ROTATION_SNAP_ANGLES.forEach(function (angle) {\n      var delta = Math.abs(raw - angle);\n      delta = Math.min(delta, 360 - delta);\n      if (delta <= ROTATION_SNAP_THRESHOLD_DEG && (!best || delta < best.delta)) {\n        best = { angle: angle, delta: delta };\n      }\n    });\n\n    return best ? best.angle : raw;\n  }\n\n  var activeImageDrag = null;\n  var activeImageResize = null;\n  var activeImageRotate = null;\n\n  function isImageLayerPointerActive(layerId) {\n    if (!layerId) return false;\n    return Boolean(\n      (activeImageDrag && activeImageDrag.layerId === layerId) ||\n      (activeImageResize && activeImageResize.layerId === layerId) ||\n      (activeImageRotate && activeImageRotate.layerId === layerId)\n    );\n  }\n\n  function startImageLayerDrag(event, layerId) {\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = (dState.imageLayers || []).find(function (item) { return item.id === layerId; });\n    if (!layer || layer.locked) return;\n\n    var node = els.imageLayers.querySelector('[data-layer-id=\"' + CSS.escape(layerId) + '\"]');\n    if (node && node.setPointerCapture) node.setPointerCapture(event.pointerId);\n\n    activeImageDrag = {\n      pointerId: event.pointerId,\n      x: event.clientX,\n      y: event.clientY,\n      layerId: layerId,\n      start: Object.assign({}, layer)\n    };\n    if (node) {\n      node.classList.add('is-dragging');\n      updateLayerDragMeasurements(node, layer);\n    }\n  }\n\n  function startImageLayerResize(event, layerId, handle) {\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = (dState.imageLayers || []).find(function (item) { return item.id === layerId; });\n    if (!layer || layer.locked) return;\n\n    // If a previous silent upscale is still in flight and the customer starts a\n    // new resize before it returns, postpone the hidden bitmap swap until this\n    // new resize is released as well.\n    if (layer.pbUpscaleBusy) layer.pbUpscaleResizeReleased = false;\n\n    var node = els.imageLayers.querySelector('[data-layer-id=\"' + CSS.escape(layerId) + '\"]');\n    if (node && node.setPointerCapture) node.setPointerCapture(event.pointerId);\n    if (node) {\n      node.classList.add('is-resizing');\n\n      // Show the current physical dimensions immediately on press. No drag is\n      // required; CSS keeps them visible only while .is-resizing is present.\n      var measureWidth = node.querySelector('.pb-image-measure--width');\n      var measureHeight = node.querySelector('.pb-image-measure--height');\n      if (measureWidth) measureWidth.textContent = getLayerWidthCm(layer);\n      if (measureHeight) measureHeight.textContent = getLayerHeightCm(layer);\n    }\n\n    activeImageResize = {\n      pointerId: event.pointerId,\n      x: event.clientX,\n      y: event.clientY,\n      layerId: layerId,\n      handle: handle,\n      start: Object.assign({}, layer)\n    };\n  }\n\n  function startImageLayerRotate(event, layerId) {\n    var dState = getDesignState(state.activePlacement, true);\n    var layer = (dState.imageLayers || []).find(function (item) { return item.id === layerId; });\n    if (!layer || layer.locked) return;\n\n    var node = els.imageLayers.querySelector('[data-layer-id=\"' + CSS.escape(layerId) + '\"]');\n    var rotateButton = node ? node.querySelector('[data-pb-layer-rotate]') : null;\n    if (rotateButton && rotateButton.setPointerCapture) rotateButton.setPointerCapture(event.pointerId);\n\n    var center = getImageLayerCenterClientPoint(layer);\n    var startAngle = Math.atan2(event.clientY - center.y, event.clientX - center.x) * 180 / Math.PI;\n\n    activeImageRotate = {\n      pointerId: event.pointerId,\n      layerId: layerId,\n      center: center,\n      startPointerAngle: startAngle,\n      startRotation: Number(layer.rotation || 0)\n    };\n  }\n\n  function getImageLayerCenterClientPoint(layer) {\n    var rect = els.printArea.getBoundingClientRect();\n    return {\n      x: rect.left + ((Number(layer.x || 0) + Number(layer.w || 0) / 2) / 100) * rect.width,\n      y: rect.top + ((Number(layer.y || 0) + Number(layer.h || 0) / 2) / 100) * rect.height\n    };\n  }\n\n  function getImageLayerNode(layerId) {\n    if (!els.imageLayers || !layerId) return null;\n    return els.imageLayers.querySelector('[data-layer-id=\"' + CSS.escape(String(layerId)) + '\"]');\n  }\n\n  // v257 performance: pointermove must never rebuild the complete layer DOM.\n  // Upscaled artwork can be tens of millions of pixels; recreating <img> on every\n  // mouse event forced Chrome to repeatedly re-rasterize/repaint it. Keep the\n  // existing decoded image node alive and update only geometry until pointerup.\n  function updateImageLayerNodeLive(layer, mode) {\n    if (!layer) return null;\n    var node = getImageLayerNode(layer.id);\n    if (!node) return null;\n\n    node.classList.add('is-selected', 'is-live-transform');\n    node.classList.toggle('is-resizing', mode === 'resize');\n    node.classList.toggle('is-dragging', mode === 'drag');\n    node.classList.toggle('is-rotating', mode === 'rotate');\n\n    // v258: update the exact persisted geometry during drag instead of using a\n    // temporary translate3d offset. The v257 compositor translation looked smooth,\n    // but the visual transform and the final left/top render could disagree on\n    // pointerup (especially with rotation/snapping), making the image appear to jump.\n    // Updating only this existing node is still cheap because we do NOT rebuild the\n    // layer DOM or recreate the large decoded <img> while the pointer is moving.\n    node.style.left = Number(layer.x || 0) + '%';\n    node.style.top = Number(layer.y || 0) + '%';\n    node.style.width = Number(layer.w || 0) + '%';\n    node.style.height = Number(layer.h || 0) + '%';\n    node.style.transform = 'rotate(' + Number(layer.rotation || 0) + 'deg)';\n\n    if (mode === 'drag') updateLayerDragMeasurements(node, layer);\n\n    if (mode === 'resize') {\n      var mw = node.querySelector('.pb-image-measure--width');\n      var mh = node.querySelector('.pb-image-measure--height');\n      if (mw) mw.textContent = getLayerWidthCm(layer);\n      if (mh) mh.textContent = getLayerHeightCm(layer);\n    }\n\n    applyImageLayerVisualClip(node, layer);\n    return node;\n  }\n\n  function moveImageLayerPointer(event) {\n    if (activeImageDrag && activeImageDrag.pointerId === event.pointerId) {\n      var dState = getDesignState(state.activePlacement, true);\n      var layer = (dState.imageLayers || []).find(function (item) { return item.id === activeImageDrag.layerId; });\n      if (!layer) return;\n      var rect = els.printArea.getBoundingClientRect();\n      var dx = ((event.clientX - activeImageDrag.x) / rect.width) * 100;\n      var dy = ((event.clientY - activeImageDrag.y) / rect.height) * 100;\n      var snappedPosition = getSnappedLayerPosition(\n        layer,\n        Number(activeImageDrag.start.x || 0) + dx,\n        Number(activeImageDrag.start.y || 0) + dy\n      );\n      layer.x = snappedPosition.x;\n      layer.y = snappedPosition.y;\n      constrainImageLayer(layer);\n      updateImageLayerNodeLive(layer, 'drag');\n    }\n\n    if (activeImageResize && activeImageResize.pointerId === event.pointerId) {\n      var dState2 = getDesignState(state.activePlacement, true);\n      var layer2 = (dState2.imageLayers || []).find(function (item) { return item.id === activeImageResize.layerId; });\n      if (!layer2) return;\n      var rect2 = els.printArea.getBoundingClientRect();\n      var dx2 = ((event.clientX - activeImageResize.x) / rect2.width) * 100;\n      var dy2 = ((event.clientY - activeImageResize.y) / rect2.height) * 100;\n      var resizeResult = resizeImageLayerFromHandle(layer2, activeImageResize.start, dx2, dy2, activeImageResize.handle);\n      activeImageResize.hitDpiLimit = Boolean(resizeResult && resizeResult.hitDpiLimit);\n      activeImageResize.requestedScale = resizeResult ? Number(resizeResult.requestedScale || 1) : 1;\n      activeImageResize.maxAllowedScale = resizeResult ? Number(resizeResult.maxAllowedScale || Infinity) : Infinity;\n\n      // v250: the moment the resize crosses the 150 DPI line, start a silent\n      // upscale in the background. The customer can keep resizing freely.\n      if (activeImageResize.hitDpiLimit && !layer2.pbUpscaleBusy) {\n        beginSilentUpscaleForResize(layer2, {\n          placement: state.activePlacement,\n          layerId: layer2.id,\n          handle: activeImageResize.handle,\n          start: Object.assign({}, activeImageResize.start),\n          requestedScale: activeImageResize.requestedScale,\n          maxAllowedScale: activeImageResize.maxAllowedScale\n        });\n      }\n\n      constrainImageLayer(layer2);\n      updateImageLayerNodeLive(layer2, 'resize');\n    }\n\n    if (activeImageRotate && activeImageRotate.pointerId === event.pointerId) {\n      var dState3 = getDesignState(state.activePlacement, true);\n      var layer3 = (dState3.imageLayers || []).find(function (item) { return item.id === activeImageRotate.layerId; });\n      if (!layer3) return;\n      var angle = Math.atan2(event.clientY - activeImageRotate.center.y, event.clientX - activeImageRotate.center.x) * 180 / Math.PI;\n      var rawRotation = activeImageRotate.startRotation + angle - activeImageRotate.startPointerAngle;\n      layer3.rotation = getSnappedRotation(rawRotation);\n      clearSnapGuides();\n      updateImageLayerNodeLive(layer3, 'rotate');\n    }\n  }\n\n  document.addEventListener('pointermove', moveImageLayerPointer);\n  document.addEventListener('pointerup', stopImageLayerPointer);\n  document.addEventListener('pointercancel', stopImageLayerPointer);\n\n  document.addEventListener('keydown', function (event) {\n    if (event.key !== 'Escape') return;\n\n    if (els.textEditorPanel && !els.textEditorPanel.hidden) {\n      closeTextEditor();\n      return;\n    }\n\n    if (els.sizeModal && !els.sizeModal.hidden) {\n      closeSizeModal();\n      return;\n    }\n\n    if (els.colorPanel && !els.colorPanel.hidden) {\n      closeColorPanel();\n      return;\n    }\n\n    if (els.aiPanel && !els.aiPanel.hidden) {\n      closeAiPanel();\n      return;\n    }\n\n    if (els.productDetails && !els.productDetails.hidden) {\n      closeProductDetailsPanelAndRestoreOrigin();\n    }\n  });\n\n  function stopImageLayerPointer(event) {\n    // Ignore another finger/pointer releasing while this interaction continues.\n    var activePointers = [activeImageResize, activeImageDrag, activeImageRotate].filter(Boolean);\n    if (!activePointers.length) return;\n    if (event && !activePointers.some(function(pointer) { return pointer.pointerId === event.pointerId; })) return;\n    // Commit the actual release coordinates before clearing the interaction or\n    // applying a pending upscale. The final pointermove can be coalesced/skipped.\n    if (event && event.type === 'pointerup' && Number.isFinite(event.clientX) && Number.isFinite(event.clientY)) {\n      moveImageLayerPointer(event);\n    }\n    var resizeSnapshot = activeImageResize ? Object.assign({}, activeImageResize) : null;\n    var dragSnapshot = activeImageDrag ? Object.assign({}, activeImageDrag) : null;\n    var rotateSnapshot = activeImageRotate ? Object.assign({}, activeImageRotate) : null;\n    var releasedLayerIds = [];\n\n    [resizeSnapshot, dragSnapshot, rotateSnapshot].forEach(function (snapshot) {\n      if (snapshot && snapshot.layerId && releasedLayerIds.indexOf(snapshot.layerId) < 0) {\n        releasedLayerIds.push(snapshot.layerId);\n      }\n    });\n\n    if (activeImageResize || activeImageDrag || activeImageRotate) {\n      activeImageResize = null;\n      activeImageDrag = null;\n      activeImageRotate = null;\n      clearSnapGuides();\n    }\n\n    // v252: a ready upscale may only be swapped in while the layer is completely\n    // idle. Resize can start the job, but if the customer immediately grabs the\n    // image to move or rotate it, the finished bitmap waits until that interaction\n    // is released too.\n    releasedLayerIds.forEach(function (layerId) {\n      var dState = getDesignState(state.activePlacement, true);\n      var layer = (dState.imageLayers || []).find(function (item) { return item.id === layerId; });\n      if (!layer || !layer.pbUpscaleBusy) return;\n      if (resizeSnapshot && resizeSnapshot.layerId === layerId) {\n        layer.pbUpscaleResizeReleased = true;\n      }\n      finishSilentUpscaleIfReady(layer, state.activePlacement);\n    });\n\n    var textResizeLayer = null;\n    if (resizeSnapshot && resizeSnapshot.layerId) {\n      var finalState = getDesignState(state.activePlacement, true);\n      var finalLayer = (finalState.imageLayers || []).find(function (item) { return item.id === resizeSnapshot.layerId; }) || null;\n      if (finalLayer && finalLayer.type === 'text') textResizeLayer = finalLayer;\n    }\n\n    if (textResizeLayer) {\n      // The live node already contains the exact final geometry from pointermove.\n      // Keep that decoded bitmap/node alive instead of rebuilding the entire stage.\n      var liveNode = getImageLayerNode(textResizeLayer.id);\n      if (liveNode) {\n        liveNode.classList.remove('is-live-transform', 'is-resizing', 'is-dragging', 'is-rotating');\n        liveNode.style.left = Number(textResizeLayer.x || 0) + '%';\n        liveNode.style.top = Number(textResizeLayer.y || 0) + '%';\n        liveNode.style.width = Number(textResizeLayer.w || 0) + '%';\n        liveNode.style.height = Number(textResizeLayer.h || 0) + '%';\n        liveNode.style.transform = 'rotate(' + Number(textResizeLayer.rotation || 0) + 'deg)';\n        applyImageLayerVisualClip(liveNode, textResizeLayer);\n      }\n      // v383: the same live SVG remains mounted during and after resize. Rebuild\n      // only its SVG attributes/path data for the final font size; never swap to PNG.\n      updateTextLayerNodeLive(textResizeLayer, true);\n      syncPrintAreaGuideVisibility();\n      renderPlacements();\n      return;\n    }\n\n    renderImageLayers(getDesignState(state.activePlacement, true));\n    renderPlacements();\n  }\n\n  function getUpscalePassScale() {\n    // Start at the exact 150-DPI threshold, but request 4x in one pass so the\n    // customer has plenty of headroom and normally never needs a second wait.\n    return 4;\n  }\n\n  function beginSilentUpscaleForResize(layer, request) {\n    if (!layer || layer.type === 'text' || layer.pbUpscaleBusy || !workerUrl) return false;\n\n    var originalWidth = Number(layer.naturalWidth || 0);\n    var originalHeight = Number(layer.naturalHeight || 0);\n    if (!originalWidth || !originalHeight || !layer.imageDataUrl) return false;\n\n    var token = makeProjectId ? makeProjectId() : ('upscale-' + Date.now() + '-' + Math.random().toString(36).slice(2));\n    request = Object.assign({}, request || {}, {\n      placement: request && request.placement ? request.placement : state.activePlacement,\n      layerId: layer.id,\n      sourceDataUrl: layer.imageDataUrl,\n      sourceWidth: originalWidth,\n      sourceHeight: originalHeight,\n      token: token\n    });\n\n    layer.pbUpscaleBusy = true;\n    layer.pbUpscaleResizeReleased = false;\n    layer.pbUpscalePendingResult = null;\n    layer.pbUpscalePendingError = '';\n    layer.pbUpscaleRequestToken = token;\n    layer.pbUpscaleRequest = request;\n\n    autoUpscaleImageForResize(request).catch(function (error) {\n      // autoUpscaleImageForResize stores the error on the layer. This catch is\n      // only a final guard so a rejected promise can never leak to the console.\n      console.error('[Printbolt] Silent auto-upscale failed', error);\n    });\n    return true;\n  }\n\n  function finishSilentUpscaleIfReady(layer, placement) {\n    if (!layer || !layer.pbUpscaleBusy || !layer.pbUpscaleResizeReleased) return false;\n\n    // v252: never replace the bitmap while the customer is physically interacting\n    // with this layer. A completed result simply stays pending until pointerup.\n    if (isImageLayerPointerActive(layer.id)) return false;\n\n    var request = layer.pbUpscaleRequest || {};\n    if (layer.pbUpscalePendingResult) {\n      var result = layer.pbUpscalePendingResult;\n\n      // If the image source was changed by another tool while the upscale was\n      // running, discard the stale result rather than replacing the new artwork.\n      if (request.sourceDataUrl && layer.imageDataUrl !== request.sourceDataUrl) {\n        clearSilentUpscaleState(layer);\n        return false;\n      }\n\n      applyImageLayerBitmap(\n        layer,\n        result.dataUrl,\n        result.width,\n        result.height,\n        layer.sourceFileName || 'bild.png'\n      );\n\n      if (layer.backgroundRemoved) {\n        layer.backgroundRemoveResultImageDataUrl = result.dataUrl;\n        layer.backgroundRemoveResultNaturalWidth = result.width;\n        layer.backgroundRemoveResultNaturalHeight = result.height;\n      } else {\n        layer.backgroundRemoveOriginalImageDataUrl = result.dataUrl;\n        layer.backgroundRemoveOriginalNaturalWidth = result.width;\n        layer.backgroundRemoveOriginalNaturalHeight = result.height;\n        layer.backgroundRemoveResultImageDataUrl = '';\n        layer.backgroundRemoveResultNaturalWidth = 0;\n        layer.backgroundRemoveResultNaturalHeight = 0;\n        layer.backgroundRemoveResultSourceFileName = '';\n      }\n\n      layer.pbUpscaled = true;\n      layer.pbUpscalePasses = Number(layer.pbUpscalePasses || 0) + 1;\n      clearSilentUpscaleState(layer);\n\n      // The geometry is intentionally untouched: the customer keeps exactly the\n      // size and position they dragged to; only the underlying bitmap changes.\n      var dpiInfo = getImageLayerEffectiveDpi(layer, placement || request.placement);\n      var dpi = Number(dpiInfo && dpiInfo.dpi || 0);\n      if (Number.isFinite(dpi) && dpi > 0 && dpi < MIN_IMAGE_DPI) {\n        // The customer may keep enlarging after this pass started. Keep their\n        // latest geometry and continue from the improved bitmap when one pass\n        // is insufficient. Bound retries and require real resolution growth.\n        var chainPass = Number(request.chainPass || 0);\n        var gainedResolution = result.width > Number(request.sourceWidth || 0) * 1.01\n          && result.height > Number(request.sourceHeight || 0) * 1.01;\n        var canGrow = Math.max(result.width, result.height) < 11880\n          && result.width * result.height < 35000000;\n        if (chainPass < 2 && gainedResolution && canGrow && beginSilentUpscaleForResize(layer, {\n          placement: placement || request.placement || state.activePlacement,\n          chainPass: chainPass + 1\n        })) {\n          // This continuation starts after release. A new drag will suspend\n          // application again through the existing pointer interaction guard.\n          layer.pbUpscaleResizeReleased = true;\n          if (state.activePlacement === (placement || request.placement || state.activePlacement)) {\n            renderImageLayers(getDesignState(state.activePlacement, true));\n            renderPlacements();\n            if (state.activeImageLayerId === layer.id) syncImageEditorControls(layer);\n          }\n          return true;\n        }\n        // Keep the existing print-quality limit for a exhausted/unsupported\n        // upscale; do not loop indefinitely or silently accept insufficient DPI.\n        enforceImageLayerMinDpi(layer, { minDpi: MIN_IMAGE_DPI, preserveCenter: true, placement: placement || request.placement });\n      }\n\n      var dState = getDesignState(placement || state.activePlacement, true);\n      if (state.activePlacement === (placement || state.activePlacement)) {\n        renderImageLayers(dState);\n        renderPlacements();\n        if (state.activeImageLayerId === layer.id) syncImageEditorControls(layer);\n          }\n      drainPendingBackgroundAction(layer, placement || state.activePlacement);\n      return true;\n    }\n\n    if (layer.pbUpscalePendingError) {\n      // Failure fallback requested by design: calculate the current effective DPI\n      // and reduce the layer by currentDPI / 150. That lands exactly on the\n      // largest printable size at 150 DPI, regardless of how far it was dragged.\n      clearSilentUpscaleState(layer, true);\n      enforceImageLayerMinDpi(layer, { minDpi: MIN_IMAGE_DPI, preserveCenter: true, placement: placement || request.placement });\n\n      var failState = getDesignState(placement || state.activePlacement, true);\n      if (state.activePlacement === (placement || state.activePlacement)) {\n        renderImageLayers(failState);\n        renderPlacements();\n        if (state.activeImageLayerId === layer.id) syncImageEditorControls(layer);\n        // Re-use the designer's existing low-resolution alert instead of adding\n        // a new error message. At exactly 150 DPI this alert is shown by design.\n          }\n      // Even when upscale fails, honour a background-removal click that was\n      // queued behind it. The layer has already been restored to exactly 150 DPI.\n      drainPendingBackgroundAction(layer, placement || state.activePlacement);\n      return true;\n    }\n\n    return false;\n  }\n\n  function clearSilentUpscaleState(layer, keepError) {\n    if (!layer) return;\n    var lastError = keepError ? String(layer.pbUpscalePendingError || '') : '';\n    layer.pbUpscaleBusy = false;\n    layer.pbUpscaleResizeReleased = false;\n    layer.pbUpscalePendingResult = null;\n    layer.pbUpscalePendingError = lastError;\n    layer.pbUpscaleRequestToken = '';\n    layer.pbUpscaleRequest = null;\n  }\n\n  async function autoUpscaleImageForResize(request) {\n    if (!request || !workerUrl) return false;\n\n    function getCurrentRequestLayer() {\n      var currentState = getDesignState(request.placement, true);\n      return (currentState.imageLayers || []).find(function (item) {\n        return item.id === request.layerId && item.type !== 'text' && item.pbUpscaleRequestToken === request.token;\n      }) || null;\n    }\n\n    var initialLayer = getCurrentRequestLayer();\n    if (!initialLayer) return false;\n\n    try {\n      var sourceBlob = await pbPrivateOriginalBlob(request.sourceDataUrl);\n      var upscaleUrl = workerUrl + '/api/printbolt/upscale-image'\n        + '?source_width=' + encodeURIComponent(request.sourceWidth)\n        + '&source_height=' + encodeURIComponent(request.sourceHeight)\n        + '&scale=' + encodeURIComponent(getUpscalePassScale());\n\n      var response = await pbAuthorizedFetch(upscaleUrl, {\n        method: 'POST',\n        headers: { 'Content-Type': sourceBlob.type || 'image/png' },\n        body: sourceBlob\n      });\n\n      if (!response.ok) {\n        var errorText = await response.text().catch(function () { return ''; });\n        var errorBody = null;\n        try { errorBody = errorText ? JSON.parse(errorText) : null; } catch (ignore) {}\n        var detail = errorBody && (errorBody.error || errorBody.ai_error || errorBody.fallback_error);\n        throw new Error(detail || errorText || pbT('upscale_failed', 'Upscale failed'));\n      }\n\n      var resultBlob = await response.blob();\n      if (!resultBlob || !resultBlob.size) throw new Error(pbT('upscale_returned_an_empty_image', 'Upscale returned an empty image.'));\n      var privateUpscaled = pbPrivateEnabled() ? await pbPrivateResult(resultBlob) : null;\n      var resultDataUrl = privateUpscaled ? privateUpscaled.dataUrl : await blobToDataUrl(resultBlob);\n      var resultImage = privateUpscaled ? { naturalWidth: privateUpscaled.width, naturalHeight: privateUpscaled.height } : await loadImage(resultDataUrl);\n\n      // v251: re-acquire from current design state. A deleted/replaced layer must\n      // never be mutated by a response from an older request.\n      var layer = getCurrentRequestLayer();\n      if (!layer) return false;\n\n      layer.pbUpscalePendingResult = {\n        dataUrl: resultDataUrl,\n        width: Number(resultImage.naturalWidth || resultImage.width || Math.round(request.sourceWidth * 4)),\n        height: Number(resultImage.naturalHeight || resultImage.height || Math.round(request.sourceHeight * 4))\n      };\n\n      finishSilentUpscaleIfReady(layer, request.placement);\n      return true;\n    } catch (error) {\n      var layer = getCurrentRequestLayer();\n      if (!layer) return false;\n      layer.pbUpscalePendingError = error && error.message ? error.message : String(error);\n      console.error('[Printbolt] Silent auto-upscale failed', error);\n      finishSilentUpscaleIfReady(layer, request.placement);\n      return false;\n    }\n  }\n\n  function enforceImageLayerMinDpi(layer, options) {\n    if (!layer || (layer.type || 'image') === 'text') return false;\n\n    options = options || {};\n    var dpiInfo = getImageLayerEffectiveDpi(layer, options.placement);\n    var currentDpi = Number(dpiInfo && dpiInfo.dpi || 0);\n    var minDpi = Number(options.minDpi || MIN_IMAGE_DPI || 150);\n\n    if (\n      !Number.isFinite(currentDpi) || currentDpi <= 0 ||\n      !Number.isFinite(minDpi) || minDpi <= 0 ||\n      currentDpi >= minDpi\n    ) {\n      return false;\n    }\n\n    var scale = currentDpi / minDpi;\n    if (!Number.isFinite(scale) || scale <= 0 || scale >= 1) return false;\n\n    var centerX = Number(layer.x || 0) + Number(layer.w || 0) / 2;\n    var centerY = Number(layer.y || 0) + Number(layer.h || 0) / 2;\n\n    layer.w = Math.max(1, Number(layer.w || 0) * scale);\n    layer.h = getImageLayerHeightPctForWidth(layer, layer.w, options.placement);\n\n    if (options.preserveCenter !== false) {\n      layer.x = centerX - Number(layer.w || 0) / 2;\n      layer.y = centerY - Number(layer.h || 0) / 2;\n    }\n\n    layer.pbAutoShrunkForDpi = true;\n    return true;\n  }\n\n  function getMaxResizeScaleForMinDpi(layer, start, minDpi) {\n    if (!layer || !start || (layer.type || 'image') === 'text') return Infinity;\n\n    var testLayer = Object.assign({}, layer, {\n      w: Number(start.w || layer.w || 0),\n      h: Number(start.h || layer.h || 0)\n    });\n    var dpiInfo = getImageLayerEffectiveDpi(testLayer);\n    var currentDpi = Number(dpiInfo && dpiInfo.dpi || 0);\n\n    if (!Number.isFinite(currentDpi) || currentDpi <= 0) return Infinity;\n\n    minDpi = Number(minDpi || MIN_IMAGE_DPI || 150);\n    if (!Number.isFinite(minDpi) || minDpi <= 0) return Infinity;\n\n    if (currentDpi <= minDpi) return 1;\n\n    return currentDpi / minDpi;\n  }\n\n  function resizeImageLayerFromHandle(layer, start, dx, dy, handle) {\n    var isRight = handle === 'tr' || handle === 'br';\n    var isBottom = handle === 'bl' || handle === 'br';\n\n    // Lock aspect ratio and resize from the opposite corner.\n    var startVectorX = isRight ? Number(start.w || 0) : -Number(start.w || 0);\n    var startVectorY = isBottom ? Number(start.h || 0) : -Number(start.h || 0);\n    var pointerVectorX = startVectorX + Number(dx || 0);\n    var pointerVectorY = startVectorY + Number(dy || 0);\n    var denom = startVectorX * startVectorX + startVectorY * startVectorY;\n    var requestedScale = denom ? ((pointerVectorX * startVectorX + pointerVectorY * startVectorY) / denom) : 1;\n\n    var maxAllowedScale = getMaxResizeScaleForMinDpi(layer, start, MIN_IMAGE_DPI);\n    // v250: DPI is no longer a hard resize clamp. The customer can keep dragging\n    // while a silent 4x upscale runs in the background.\n    var scale = clamp(requestedScale, 0.12, 8);\n    var hitDpiLimit = (layer.type || 'image') !== 'text' && Number.isFinite(maxAllowedScale) && requestedScale > maxAllowedScale + 0.002;\n\n    var anchorX = isRight ? Number(start.x || 0) : Number(start.x || 0) + Number(start.w || 0);\n    var anchorY = isBottom ? Number(start.y || 0) : Number(start.y || 0) + Number(start.h || 0);\n\n    if ((layer.type || 'image') === 'text') {\n      resizeTextLayerFromHandle(layer, start, scale, isRight, isBottom, anchorX, anchorY);\n      return { hitDpiLimit: false, requestedScale: requestedScale, maxAllowedScale: Infinity };\n    }\n\n    var newW = Number(start.w || 0) * scale;\n    var newH = getImageLayerHeightPctForWidth(layer, newW);\n\n    layer.w = newW;\n    layer.h = newH;\n    layer.x = isRight ? anchorX : anchorX - newW;\n    layer.y = isBottom ? anchorY : anchorY - newH;\n\n    return {\n      hitDpiLimit: hitDpiLimit,\n      requestedScale: requestedScale,\n      maxAllowedScale: maxAllowedScale\n    };\n  }\n\n  function resizeTextLayerFromHandle(layer, start, scale, isRight, isBottom, anchorX, anchorY) {\n    var startFontSize = Number(start.fontSize || layer.fontSize || 96);\n    var internalBounds = getTextInternalSizeBounds(getTextSizingTemplate());\n    var fontSize = clamp(startFontSize * scale, internalBounds.min, internalBounds.max);\n    var effectiveScale = startFontSize > 0 ? (fontSize / startFontSize) : scale;\n    layer.fontSize = fontSize;\n\n    // v310: resize text exactly like an image while the handle is dragged.\n    // Geometry is scaled from the pointer-down box itself instead of being\n    // re-measured from font metrics on every frame. What you see while dragging\n    // is therefore exactly the box that remains after pointerup.\n    var newW = clamp(Number(start.w || layer.w || 1) * effectiveScale, 1, MAX_TEXT_LAYER_SIZE);\n    var newH = clamp(Number(start.h || layer.h || 1) * effectiveScale, 1, MAX_TEXT_LAYER_SIZE);\n    var newX = isRight ? anchorX : anchorX - newW;\n    var newY = isBottom ? anchorY : anchorY - newH;\n\n    layer.w = newW;\n    layer.h = newH;\n    layer.x = newX;\n    layer.y = newY;\n    layer.pbManualTextGeometry = true;\n    layer.pbManualTextGeometryKey = getTextPreviewGeometryKey(layer);\n\n    if (layer.id === state.activeImageLayerId) {\n      var resizedPointSize = Math.round(\n        textInternalPxToPoints(layer.fontSize, getTextSizingTemplate())\n      );\n      if (els.textSize) els.textSize.value = String(resizedPointSize);\n      if (els.textSizeNumber) els.textSizeNumber.value = String(resizedPointSize);\n    }\n  }\n\n  function deleteImageLayer(layerId) {\n    var dState = getDesignState(state.activePlacement, true);\n    var deletingLayer = (dState.imageLayers || []).find(function (layer) { return layer.id === layerId; }) || null;\n    var activeBeforeDelete = getActiveLayer();\n    var shouldCloseTextEditor = activeBeforeDelete && activeBeforeDelete.id === layerId && activeBeforeDelete.type === 'text';\n    var shouldCloseImageEditor = activeBeforeDelete && activeBeforeDelete.id === layerId && activeBeforeDelete.type !== 'text';\n\n    // v251: deleting a layer permanently invalidates any in-flight silent upscale.\n    // The async response is only allowed to touch a layer that still exists and\n    // still owns the same request token.\n    if (deletingLayer) {\n      deletingLayer.pbUpscaleRequestToken = 'deleted-' + Date.now() + '-' + Math.random().toString(36).slice(2);\n      deletingLayer.pbUpscaleBusy = false;\n      deletingLayer.pbUpscaleResizeReleased = false;\n      deletingLayer.pbUpscalePendingResult = null;\n      deletingLayer.pbUpscalePendingError = '';\n      deletingLayer.pbUpscaleRequest = null;\n      deletingLayer.pbBackgroundRequestToken = 'deleted-bg-' + Date.now() + '-' + Math.random().toString(36).slice(2);\n      deletingLayer.pbBackgroundBusy = false;\n      deletingLayer.pbBackgroundActionPending = '';\n      deletingLayer.pbBackgroundActionPlacement = '';\n    }\n\n    if (activeImageResize && activeImageResize.layerId === layerId) activeImageResize = null;\n    if (activeImageDrag && activeImageDrag.layerId === layerId) activeImageDrag = null;\n    if (activeImageRotate && activeImageRotate.layerId === layerId) activeImageRotate = null;\n    clearSnapGuides();\n\n    dState.imageLayers = (dState.imageLayers || []).filter(function (layer) { return layer.id !== layerId; });\n    if (state.activeImageLayerId === layerId) state.activeImageLayerId = '';\n    dState.touched = hasPrimaryDesignContent(dState) || dState.imageLayers.length > 0;\n\n    if (shouldCloseTextEditor) closeTextEditor();\n    if (shouldCloseImageEditor) closeImageEditor();\n\n    renderDesign();\n    renderPlacements();\n  }\n\n  function normalizeRotation(value) {\n    var n = Number(value || 0) % 360;\n    if (n < 0) n += 360;\n    return Math.round(n * 10) / 10;\n  }\n\n  function fitImageLayerToNaturalAspect(layer, preferredWidthPct) {\n    layer.w = Number(preferredWidthPct || layer.w || 42);\n    layer.h = getImageLayerHeightPctForWidth(layer, layer.w);\n    constrainImageLayer(layer);\n  }\n\n  function centerImageLayer(layer) {\n    layer.x = (100 - layer.w) / 2;\n    layer.y = (100 - layer.h) / 2;\n  }\n\n  function constrainImageLayer(layer) {\n    if ((layer.type || 'image') === 'text') {\n      var oldW = Number(layer.w || 20);\n      var oldH = Number(layer.h || 10);\n      var centerX = Number(layer.x || 0) + oldW / 2;\n      var centerY = Number(layer.y || 0) + oldH / 2;\n      var preserveManualGeometry = Boolean(\n        (activeImageResize && activeImageResize.layerId === layer.id) ||\n        layer.pbManualTextGeometry === true\n      );\n\n      if (preserveManualGeometry) {\n        // v310: once a handle resize defines the box, do not silently replace it\n        // with freshly measured font/pixel bounds on render or pointerup.\n        layer.w = clamp(oldW, 1, MAX_TEXT_LAYER_SIZE);\n        layer.h = clamp(oldH, 1, MAX_TEXT_LAYER_SIZE);\n      } else {\n        updateTextLayerNaturalSize(layer);\n        var naturalTextBox = getTextLayerBoxPct(layer);\n        layer.w = clamp(Number(naturalTextBox.w || oldW), 1, MAX_TEXT_LAYER_SIZE);\n        layer.h = clamp(Number(naturalTextBox.h || oldH), 1, MAX_TEXT_LAYER_SIZE);\n        layer.x = centerX - layer.w / 2;\n        layer.y = centerY - layer.h / 2;\n      }\n\n      // Let the text box itself extend by its internal padding amount so the\n      // visible text can be positioned closer to the print-area edges.\n      // This keeps the actual glyphs inside the print area while avoiding an\n      // unnecessarily restrictive text box.\n      // Text layers should now behave like images when enlarged: they may become\n      // larger than the print area itself and extend beyond the guide lines.\n      // The visible artwork is clipped at the print-area edge, exactly like images.\n      var outsideX = Math.max(20, Number(layer.w || 0) * 0.85);\n      var outsideY = Math.max(12, Number(layer.h || 0) * 0.85);\n\n      layer.x = clamp(Number(layer.x || 0), -outsideX, 100 - layer.w + outsideX);\n      layer.y = clamp(Number(layer.y || 0), -outsideY, 100 - layer.h + outsideY);\n      return;\n    }\n\n    var maxImageSize = 200;\n    var minImageSize = Number(layer.pbRestoredImageMinSize) > 0 ? Math.min(5, Number(layer.pbRestoredImageMinSize)) : 5;\n\n    layer.w = clamp(Number(layer.w || 20), minImageSize, maxImageSize);\n    layer.h = getImageLayerHeightPctForWidth(layer, layer.w);\n    if (layer.h > maxImageSize) {\n      layer.h = maxImageSize;\n      layer.w = getImageLayerWidthPctForHeight(layer, layer.h);\n    }\n    layer.w = clamp(layer.w, minImageSize, maxImageSize);\n    layer.h = clamp(layer.h, minImageSize, maxImageSize);\n\n    // Normally keep image layers at or above 150 DPI. During v250's silent\n    // background upscale, however, allow the customer to temporarily resize below\n    // the threshold. On success the bitmap is replaced; on failure we explicitly\n    // calculate and restore the exact 150-DPI maximum size.\n    var isActivelyResizingThisLayer = Boolean(activeImageResize && activeImageResize.layerId === layer.id);\n    if (!isActivelyResizingThisLayer && !layer.pbUpscaleBusy) {\n      enforceImageLayerMinDpi(layer, { minDpi: MIN_IMAGE_DPI, preserveCenter: true });\n    }\n\n    // Image layers may now be placed outside the print-area guide lines.\n    // The visible artwork is clipped at the print-area edge so the customer sees\n    // what will actually remain inside the printable area.\n    var outsideX = Math.max(30, Number(layer.w || 0) * 0.95);\n    var outsideY = Math.max(18, Number(layer.h || 0) * 0.95);\n\n    layer.x = clamp(Number(layer.x || 0), -outsideX, 100 - layer.w + outsideX);\n    layer.y = clamp(Number(layer.y || 0), -outsideY, 100 - layer.h + outsideY);\n  }\n\n  function getImageLayerHeightPctForWidth(layer, widthPct, placement) {\n    var template = state.templatesByPlacement[placement || state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n    var imageRatio = Number(layer.naturalWidth || 0) / Number(layer.naturalHeight || 1);\n    if (!printAreaWidthPx || !printAreaHeightPx || !imageRatio) return Number(layer.h || 20);\n    return (Number(widthPct || 0) * printAreaWidthPx) / (printAreaHeightPx * imageRatio);\n  }\n\n  function getImageLayerWidthPctForHeight(layer, heightPct) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    var printAreaWidthPx = Number(template?.print_area_width || 0);\n    var printAreaHeightPx = Number(template?.print_area_height || 0);\n    var imageRatio = Number(layer.naturalWidth || 0) / Number(layer.naturalHeight || 1);\n    if (!printAreaWidthPx || !printAreaHeightPx || !imageRatio) return Number(layer.w || 20);\n    return (Number(heightPct || 0) * printAreaHeightPx * imageRatio) / printAreaWidthPx;\n  }\n\n  function getLayerWidthCm(layer) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    if (!template) return '0.0 cm';\n    var visible = getVisibleBoxPct(layer);\n    return formatCm(getPhysicalWidthCmForPct(template, visible.w));\n  }\n\n  function getLayerHeightCm(layer) {\n    var template = state.templatesByPlacement[state.activePlacement] || null;\n    if (!template) return '0.0 cm';\n    var visible = getVisibleBoxPct(layer);\n    return formatCm(getPhysicalHeightCmForPct(template, visible.h));\n  }\n\n  function setupDrag() {\n    var start = null;\n\n    els.design.addEventListener('pointerdown', function (event) {\n      if (event.target.closest('[data-pb-design-delete]')) return;\n      if (event.target.closest('[data-pb-design-rotate]')) return;\n      if (event.target.closest('[data-pb-design-resize]')) return;\n      if (!hasPrimaryDesignContent(getDesignState(state.activePlacement, true))) return;\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (!state.activePrimarySelected) {\n        state.activePrimarySelected = true;\n        state.activeImageLayerId = '';\n        renderDesign();\n        renderImageLayers(getDesignState(state.activePlacement, true));\n        return;\n      }\n\n      els.design.setPointerCapture(event.pointerId);\n      els.design.classList.add('is-dragging');\n      updateDesignMeasurements(getDesignState(state.activePlacement, true));\n      start = {\n        pointerId: event.pointerId,\n        x: event.clientX,\n        y: event.clientY,\n        design: Object.assign({}, getDesignState(state.activePlacement, true).design)\n      };\n    });\n\n    els.design.addEventListener('pointermove', function (event) {\n      if (!start || start.pointerId !== event.pointerId) return;\n      var dState = getDesignState(state.activePlacement, true);\n      var rect = els.printArea.getBoundingClientRect();\n      var dx = ((event.clientX - start.x) / rect.width) * 100;\n      var dy = ((event.clientY - start.y) / rect.height) * 100;\n      dState.design.x = Number(start.design.x || 0) + dx;\n      dState.design.y = Number(start.design.y || 0) + dy;\n      constrainDesignBounds(dState);\n      renderDesign();\n    });\n\n    function stopDrag() {\n      start = null;\n      els.design.classList.remove('is-dragging');\n      updateDesignMeasurements(getDesignState(state.activePlacement, true));\n    }\n    els.design.addEventListener('pointerup', stopDrag);\n    els.design.addEventListener('pointercancel', stopDrag);\n    els.design.addEventListener('lostpointercapture', stopDrag);\n  }\n\n  function setupResize() {\n    var start = null;\n\n    function stopResize() {\n      start = null;\n      els.design.classList.remove('is-resizing');\n    }\n\n    (els.designResizeHandles || []).forEach(function (handleEl) {\n      handleEl.addEventListener('pointerdown', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        state.activePrimarySelected = true;\n        state.activeImageLayerId = '';\n        if (handleEl.setPointerCapture) handleEl.setPointerCapture(event.pointerId);\n        els.design.classList.add('is-resizing');\n\n        // Refresh CM labels immediately when the resize button is pressed.\n        updateDesignMeasurements(getDesignState(state.activePlacement, true));\n\n        start = {\n          pointerId: event.pointerId,\n          x: event.clientX,\n          y: event.clientY,\n          handle: handleEl.dataset.pbDesignResize || 'br',\n          design: Object.assign({}, getDesignState(state.activePlacement, true).design)\n        };\n      });\n\n      handleEl.addEventListener('pointermove', function (event) {\n        if (!start || start.pointerId !== event.pointerId) return;\n        var dState = getDesignState(state.activePlacement, true);\n        var rect = els.printArea.getBoundingClientRect();\n        var dx = ((event.clientX - start.x) / rect.width) * 100;\n        var dy = ((event.clientY - start.y) / rect.height) * 100;\n        resizePrimaryDesignFromHandle(dState, start.design, dx, dy, start.handle);\n        constrainDesignBounds(dState);\n        renderDesign();\n      });\n\n      handleEl.addEventListener('pointerup', stopResize);\n      handleEl.addEventListener('pointercancel', stopResize);\n    });\n\n    if (els.designDelete) {\n      els.designDelete.addEventListener('click', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        resetActivePlacement();\n        state.activePrimarySelected = false;\n      });\n    }\n\n    var rotateState = null;\n    function stopRotate() {\n      rotateState = null;\n    }\n\n    if (els.designRotate) {\n      els.designRotate.addEventListener('pointerdown', function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n        state.activePrimarySelected = true;\n        state.activeImageLayerId = '';\n        var dState = getDesignState(state.activePlacement, true);\n        var center = getPrimaryDesignCenterClientPoint(dState.design);\n        var startAngle = Math.atan2(event.clientY - center.y, event.clientX - center.x) * 180 / Math.PI;\n        rotateState = {\n          pointerId: event.pointerId,\n          center: center,\n          startPointerAngle: startAngle,\n          startRotation: Number(dState.design.rotation || 0)\n        };\n        if (els.designRotate.setPointerCapture) els.designRotate.setPointerCapture(event.pointerId);\n      });\n\n      els.designRotate.addEventListener('pointermove', function (event) {\n        if (!rotateState || rotateState.pointerId !== event.pointerId) return;\n        var dState = getDesignState(state.activePlacement, true);\n        var angle = Math.atan2(event.clientY - rotateState.center.y, event.clientX - rotateState.center.x) * 180 / Math.PI;\n        dState.design.rotation = normalizeRotation(rotateState.startRotation + angle - rotateState.startPointerAngle);\n        renderDesign();\n      });\n\n      els.designRotate.addEventListener('pointerup', stopRotate);\n      els.designRotate.addEventListener('pointercancel', stopRotate);\n    }\n  }\n\n  function getPrimaryDesignCenterClientPoint(design) {\n    var rect = els.printArea.getBoundingClientRect();\n    return {\n      x: rect.left + ((Number(design.x || 0) + Number(design.w || 0) / 2) / 100) * rect.width,\n      y: rect.top + ((Number(design.y || 0) + Number(design.h || 0) / 2) / 100) * rect.height\n    };\n  }\n\n  function resizePrimaryDesignFromHandle(dState, start, dx, dy, handle) {\n    var isRight = handle === 'tr' || handle === 'br';\n    var isBottom = handle === 'bl' || handle === 'br';\n    var startVectorX = isRight ? Number(start.w || 0) : -Number(start.w || 0);\n    var startVectorY = isBottom ? Number(start.h || 0) : -Number(start.h || 0);\n    var pointerVectorX = startVectorX + Number(dx || 0);\n    var pointerVectorY = startVectorY + Number(dy || 0);\n    var denom = startVectorX * startVectorX + startVectorY * startVectorY;\n    var scale = denom ? ((pointerVectorX * startVectorX + pointerVectorY * startVectorY) / denom) : 1;\n    scale = clamp(scale, 0.12, 8);\n\n    var newW = Number(start.w || 0) * scale;\n    var newH;\n\n    if (dState.designType === 'image' && hasImageNaturalSize(dState)) newH = getImageHeightPctForWidth(dState, newW);\n    else newH = Number(start.h || 0) * scale;\n\n    var anchorX = isRight ? Number(start.x || 0) : Number(start.x || 0) + Number(start.w || 0);\n    var anchorY = isBottom ? Number(start.y || 0) : Number(start.y || 0) + Number(start.h || 0);\n\n    dState.design.w = newW;\n    dState.design.h = newH;\n    dState.design.x = isRight ? anchorX : anchorX - newW;\n    dState.design.y = isBottom ? anchorY : anchorY - newH;\n  }\n\n\n\n  function resetActivePlacement() {\n    state.designsByPlacement[state.activePlacement] = createEmptyDesignState();\n    state.activePrimarySelected = false;\n    renderDesign();\n    renderPlacements();\n  }\n\n  function openSizeModal() {\n    clearStatusIfDesignExists();\n\n    // Mobile \"Ber\u00E4kna pris\" should behave like \"V\u00E4lj storlek & antal\":\n    // open the quantity/size panel even before the customer has added a design.\n    // Add-to-cart still validates that a design exists before exporting print files.\n    setStatus('', false);\n    setSizeModalError('');\n\n    closeTextEditor();\n    closeImageEditor();\n    closeProductDetailsPanel();\n    closeColorPanel();\n\n    if (els.sidePanel && els.sizeModal && els.sizeModal.parentElement !== els.sidePanel) {\n      els.sidePanel.appendChild(els.sizeModal);\n    }\n\n    if (els.sidePanel) {\n      els.sidePanel.classList.add('is-size-panel-active');\n      els.sidePanel.classList.remove('is-size-modal-active');\n    }\n\n    root.classList.toggle('is-mobile-size-panel-open', isMobileEditorLayout());\n\n    renderSizeRows();\n    pbRefreshAutomaticDiscountContext();\n\n    // Start Turnstile/session verification as soon as the customer opens the\n    // size panel. By the time they select a quantity and confirm, this work is\n    // normally complete and is reused by every upload/finalize request.\n    pbWarmSessionInBackground().then(function(){return pbWarmServerExport();}).catch(function(){});\n    \n\n    if (els.sizeModal) {\n      els.sizeModal.classList.add('is-panel-mode');\n      els.sizeModal.hidden = false;\n    }\n  }\n\n  function closeSizeModal() {\n    root.classList.remove('is-mobile-size-panel-open');\n\n    if (els.sidePanel) {\n      els.sidePanel.classList.remove('is-size-panel-active');\n      els.sidePanel.classList.remove('is-size-modal-active');\n    }\n\n    if (els.sizeModal) {\n      els.sizeModal.classList.remove('is-panel-mode');\n      els.sizeModal.hidden = true;\n    }\n  }\n\n  function ensureSizeRowsScrollCue() {\n    if (!els.sizeModal || !els.sizeRows) return null;\n    var dialog = els.sizeModal.querySelector('.pb-size-modal__dialog');\n    if (!dialog) return null;\n\n    var cue = dialog.querySelector('[data-pb-size-scroll-cue]');\n    if (!cue) {\n      cue = document.createElement('span');\n      cue.className = 'pb-size-scroll-cue';\n      cue.dataset.pbSizeScrollCue = '';\n      cue.setAttribute('aria-hidden', 'true');\n      cue.innerHTML = '<svg viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"m7 10 5 5 5-5\"/></svg>';\n      cue.hidden = true;\n      dialog.appendChild(cue);\n    }\n\n    if (!els.sizeRows.__pbScrollCueBound) {\n      els.sizeRows.__pbScrollCueBound = true;\n      els.sizeRows.addEventListener('scroll', updateSizeRowsScrollCue, { passive: true });\n      window.addEventListener('resize', updateSizeRowsScrollCue, { passive: true });\n    }\n\n    return cue;\n  }\n\n  function updateSizeRowsScrollCue() {\n    if (!els.sizeRows) return;\n    var cue = ensureSizeRowsScrollCue();\n    if (!cue) return;\n\n    var mobile = isMobileEditorLayout();\n    var overflow = mobile && (els.sizeRows.scrollHeight > els.sizeRows.clientHeight + 3);\n    var atTop = els.sizeRows.scrollTop <= 3;\n    var atBottom = !overflow || (els.sizeRows.scrollTop + els.sizeRows.clientHeight >= els.sizeRows.scrollHeight - 4);\n\n    els.sizeRows.classList.toggle('has-scroll-above', overflow && !atTop);\n    els.sizeRows.classList.toggle('has-scroll-below', overflow && !atBottom);\n\n    cue.hidden = true;\n  }\n\n  function renderSizeRows() {\n    var variants = getVariantsForActiveColor();\n    var previousScrollTop = Number(els.sizeRows.scrollTop || 0);\n    els.sizeRows.innerHTML = '';\n\n    variants.forEach(function (variant) {\n      var id = String(variant.id);\n      var qty = Number(state.quantities[id] || 0);\n      var row = document.createElement('div');\n      row.className = 'pb-size-row' + (!variant.available ? ' is-disabled' : '');\n\n      var label = document.createElement('div');\n      label.className = 'pb-size-row__label';\n      label.textContent = getVariantSize(variant);\n\n      if (!variant.available) {\n        var stockLabel = document.createElement('span');\n        stockLabel.className = 'pb-size-row__stock';\n        stockLabel.textContent = pbT('ej_i_lager', 'Ej i lager');\n        label.appendChild(stockLabel);\n      }\n\n      var qtyBox = document.createElement('div');\n      qtyBox.className = 'pb-qty';\n\n      var minus = document.createElement('button');\n      minus.type = 'button';\n      minus.textContent = '\u2212';\n      minus.disabled = !variant.available || qty <= 0;\n      minus.addEventListener('click', function () {\n        state.quantities[id] = Math.max(0, Number(state.quantities[id] || 0) - 1);\n        renderSizeRows();\n      });\n\n      var input = document.createElement('input');\n      input.type = 'number';\n      input.min = '0';\n      input.value = String(qty);\n      input.disabled = !variant.available;\n      input.addEventListener('change', function () {\n        state.quantities[id] = Math.max(0, Math.floor(Number(input.value || 0)));\n        renderSizeRows();\n      });\n\n      var plus = document.createElement('button');\n      plus.type = 'button';\n      plus.textContent = '+';\n      plus.disabled = !variant.available;\n      plus.addEventListener('click', function () {\n        state.quantities[id] = Number(state.quantities[id] || 0) + 1;\n        renderSizeRows();\n      });\n\n      qtyBox.appendChild(minus);\n      qtyBox.appendChild(input);\n      qtyBox.appendChild(plus);\n      row.appendChild(label);\n      row.appendChild(qtyBox);\n      els.sizeRows.appendChild(row);\n    });\n\n    setSizeModalError('');\n    updateModalTotal();\n\n    window.requestAnimationFrame(function () {\n      var maxScrollTop = Math.max(0, els.sizeRows.scrollHeight - els.sizeRows.clientHeight);\n      els.sizeRows.scrollTop = Math.min(previousScrollTop, maxScrollTop);\n      updateSizeRowsScrollCue();\n    });\n  }\n\n  function setConfirmAddBusy(isBusy, label) {\n    if (!els.confirmAdd) return;\n\n    if (!els.confirmAdd.dataset.pbIdleText) {\n      els.confirmAdd.dataset.pbIdleText = els.confirmAdd.textContent || pbT('lagg_i_kundvagnen', 'L\u00E4gg i kundvagnen');\n    }\n\n    var active = Boolean(isBusy);\n    els.confirmAdd.classList.toggle('is-loading', active);\n    els.confirmAdd.setAttribute('aria-busy', active ? 'true' : 'false');\n\n    if (active) {\n      els.confirmAdd.disabled = true;\n      els.confirmAdd.textContent = label || pbT('jobbar', 'Jobbar\u2026');\n    } else {\n      els.confirmAdd.classList.remove('is-loading');\n      els.confirmAdd.removeAttribute('aria-busy');\n      els.confirmAdd.textContent = els.confirmAdd.dataset.pbIdleText || pbT('lagg_i_kundvagnen', 'L\u00E4gg i kundvagnen');\n    }\n  }\n\n  function isDirectDesignRevisionEdit() {\n    return Boolean(state.editDesignRef && state.editToken);\n  }\n\n  function handlePrimaryDesignCta(event) {\n    if (isDirectDesignRevisionEdit()) {\n      if (event) event.preventDefault();\n      return confirmAddToCart();\n    }\n    return openSizeModal();\n  }\n\n  function syncDirectEditUi() {\n    if (!isDirectDesignRevisionEdit()) return;\n    if (els.openSizeModal) {\n      els.openSizeModal.textContent = pbT('spara_andringar', 'Spara \u00E4ndringar');\n      els.openSizeModal.setAttribute('aria-label', pbT('spara_andringar', 'Spara \u00E4ndringar'));\n      els.openSizeModal.setAttribute('aria-live', 'polite');\n      els.openSizeModal.setAttribute('aria-atomic', 'true');\n    }\n    if (els.mobilePrice) {\n      els.mobilePrice.textContent = pbT('spara_andringar', 'Spara \u00E4ndringar');\n      els.mobilePrice.setAttribute('aria-label', pbT('spara_andringar', 'Spara \u00E4ndringar'));\n    }\n    if (els.confirmAdd) {\n      els.confirmAdd.dataset.pbIdleText = pbT('spara_andringar', 'Spara \u00E4ndringar');\n      els.confirmAdd.textContent = pbT('spara_andringar', 'Spara \u00E4ndringar');\n    }\n    renderRevisionControls();\n  }\n\n  function renderRevisionControls() {\n    if (!isDirectDesignRevisionEdit() || !els.openSizeModal) return;\n    var history = pbReadyRevisionHistory(state.revisionHistory);\n    var panel = root.querySelector('[data-pb-revision-panel]');\n    if (!panel) return;\n    var list = panel.querySelector('[data-pb-revision-list]');\n    if (!list) {\n      panel.innerHTML = '';\n      list = document.createElement('div');\n      list.className = 'pb-revision-chips';\n      list.setAttribute('data-pb-revision-list', '');\n      list.setAttribute('role', 'group');\n      list.setAttribute('aria-label', pbT('designversioner', 'Designversioner'));\n      panel.appendChild(list);\n    }\n    if (!history.length) {\n      panel.hidden = true;\n      list.innerHTML = '';\n      return;\n    }\n    panel.hidden = false;\n    list.innerHTML = '';\n    var currentRevision = String(state.currentRevision || '');\n    var openedRevision = String(state.openedRevision || state.editRevision || '');\n    history.forEach(function (entry, index) {\n      var revision = String(entry && (entry.revision || entry.revision_id || entry.id) || '');\n      if (!revision) return;\n      var versionLabel = entry && entry.revision ? String(entry.revision) : String(index + 1);\n      var entryRevisionId = String(entry && (entry.revision_id || entry.id) || '');\n      var isActive = currentRevision\n        ? entryRevisionId === currentRevision || revision === currentRevision\n        : Boolean(entry && entry.current);\n      var isOpened = revision === openedRevision || entryRevisionId === openedRevision;\n      var chip = document.createElement('button');\n      chip.type = 'button';\n      chip.className = 'pb-revision-chip' + (isActive ? ' is-active' : '') + (isOpened ? ' is-opened' : '');\n      chip.textContent = String(entry.label || entry.title || (pbT('version', 'Version ') + versionLabel));\n      chip.setAttribute('aria-pressed', isOpened ? 'true' : 'false');\n      chip.setAttribute('aria-label', isActive\n        ? (isOpened ? pbT('version', 'Version ') + versionLabel + pbT('aktiv_och_oppen', ', aktiv och \u00F6ppen') : pbT('oppna_version', '\u00D6ppna Version ') + versionLabel + pbT('aktiv', ', aktiv'))\n        : (isOpened ? pbT('version', 'Version ') + versionLabel + pbT('oppen', ', \u00F6ppen') : pbT('oppna_version', '\u00D6ppna Version ') + versionLabel));\n      if (isActive) chip.setAttribute('aria-current', 'true');\n      chip.addEventListener('click', function () {\n        if (isOpened) return;\n        var url = new URL(window.location.href);\n        url.searchParams.set('design', String(state.editDesignRef));\n        url.searchParams.set('token', String(state.editToken));\n        url.searchParams.set('revision', revision);\n        window.location.assign(url.href);\n      });\n      list.appendChild(chip);\n    });\n  }\n\n  function pbReadyRevisionHistory(entries) {\n    return (Array.isArray(entries) ? entries : []).filter(function (entry) {\n      var status = String(entry && entry.status || '').toLowerCase();\n      return !status || ['ready', 'validated', 'promoted', 'superseded'].includes(status);\n    }).sort(function (a, b) { return Number(a && a.revision || 0) - Number(b && b.revision || 0); });\n  }\n\n  function pbApplyRevisionHistoryPayload(data) {\n    if (!data || !Array.isArray(data.revision_history)) return false;\n    state.currentRevision = String(data.current_revision || state.currentRevision || '');\n    state.revisionHistory = pbReadyRevisionHistory(data.revision_history).map(function (entry) {\n      if (!state.currentRevision) return entry;\n      return Object.assign({}, entry, {\n        current: String(entry.revision_id || entry.id || '') === state.currentRevision\n      });\n    });\n    if (state.savedDesign) state.savedDesign.revisions = state.revisionHistory;\n    renderRevisionControls();\n    var promoted = String(data.current_revision || '') === String(state.editRevision || '');\n    if (promoted) {\n      if (state.savedDesign) state.savedDesign.currentRevision = state.currentRevision;\n    }\n    return promoted;\n  }\n\n  function pbScheduleRevisionHistoryRefresh(expectedRevision, attemptsLeft) {\n    if (pbRevisionHistoryRefreshTimer) clearTimeout(pbRevisionHistoryRefreshTimer);\n    pbRevisionHistoryRefreshTimer = setTimeout(async function () {\n      pbRevisionHistoryRefreshTimer = null;\n      if (!isDirectDesignRevisionEdit() || String(state.editRevision || '') !== String(expectedRevision || '')) return;\n      try {\n        var url = new URL('/api/designs/open', workerUrl + '/');\n        url.searchParams.set('design', String(state.editDesignRef));\n        url.searchParams.set('token', String(state.editToken));\n        url.searchParams.set('check_revision', String(expectedRevision));\n        var result = await pbJsonRequest(url.href, { method: 'GET', cache: 'no-store' }, 8000, false);\n        if (result.ok && result.data && result.data.ok) {\n          pbApplyRevisionHistoryPayload(result.data);\n          if (result.data.current_revision === expectedRevision) {\n            setStatus(pbT(\"design_sparad_aterbestallning\", \"Designen \u00E4r sparad och klar. Best\u00E4ll igen anv\u00E4nder den h\u00E4r versionen.\"));\n            showDirectSaveSuccess();\n            return;\n          }\n          if (result.data.save_status === 'invalid') {\n            resetDirectSaveCta();\n            setStatus(pbTranslatedError(result.data.save_error) || pbT(\"design_korrigering_ogiltig\", \"Korrigeringen kunde inte valideras. F\u00F6reg\u00E5ende f\u00E4rdiga version g\u00E4ller fortfarande.\"));\n            return;\n          }\n        }\n      } catch (refreshError) { /* A later attempt or manual reload can refresh history. */ }\n      if (attemptsLeft > 1) pbScheduleRevisionHistoryRefresh(expectedRevision, attemptsLeft - 1);\n      else {\n        resetDirectSaveCta();\n        setStatus(pbT(\"design_korrigering_obekraftad\", \"Korrigeringen \u00E4r \u00E4nnu inte bekr\u00E4ftad. \u00D6ppna designl\u00E4nken igen f\u00F6r att kontrollera vilken version som g\u00E4ller.\"));\n      }\n    }, 2000);\n  }\n\n  function getExtraPrintAreaCountForPlacements(placements) {\n    var count = Array.isArray(placements) ? placements.length : 0;\n    return Math.max(0, count - 1);\n  }\n\n  function getCurrentExtraPrintAreaCount() {\n    return getExtraPrintAreaCountForPlacements(getUsedPlacements());\n  }\n\n  function pbLoadAutomaticDiscountTiers() {\n    if (pbAutomaticDiscountTiersPromise) return pbAutomaticDiscountTiersPromise;\n    pbAutomaticDiscountTiersPromise = (async function () {\n      if (!workerUrl) return [];\n      try {\n        var result = await pbJsonRequest(new URL('/api/discount-tiers', workerUrl + '/').href,\n          { method: 'GET' }, 8000, false);\n        if (!result.ok || !result.data || !Array.isArray(result.data.tiers)) return [];\n        pbAutomaticDiscountTiers = result.data.tiers.map(function (tier) {\n          return { quantity: Number(tier && tier.quantity), percentage: Number(tier && tier.percentage) };\n        }).filter(function (tier) {\n          return Number.isInteger(tier.quantity) && tier.quantity > 0\n            && Number.isFinite(tier.percentage) && tier.percentage > 0 && tier.percentage <= 100;\n        }).sort(function (a, b) { return a.quantity - b.quantity; });\n      } catch (error) {\n        pbAutomaticDiscountTiers = [];\n      }\n      return pbAutomaticDiscountTiers;\n    })();\n    return pbAutomaticDiscountTiersPromise;\n  }\n\n  async function pbRefreshAutomaticDiscountContext() {\n    var tiersPromise = pbLoadAutomaticDiscountTiers();\n    try {\n      var cart = await pbReadCurrentCart();\n      pbCartDiscountBaseQuantity = (cart.items || []).reduce(function (sum, item) {\n        var properties = item && item.properties || {};\n        if (state.editCartGroupId && properties._pb_group_id === state.editCartGroupId) return sum;\n        return sum + Math.max(0, Number(item && item.quantity || 0));\n      }, 0);\n    } catch (error) {\n      pbCartDiscountBaseQuantity = 0;\n    }\n    await tiersPromise;\n    updateModalTotal();\n  }\n\n  function pbFormatDiscountPercentage(value) {\n    var rounded = Math.round(Number(value) * 100) / 100;\n    return Number.isInteger(rounded) ? String(rounded) : String(rounded).replace('.', ',');\n  }\n\n  function pbGetAutomaticDiscountProgress(selectedQuantity) {\n    var tiers = pbAutomaticDiscountTiers;\n    if (!Array.isArray(tiers) || !tiers.length) {\n      return { active: null, next: null, totalQuantity: 0 };\n    }\n\n    var totalQuantity = Math.max(0, Number(pbCartDiscountBaseQuantity || 0))\n      + Math.max(0, Number(selectedQuantity || 0));\n    var active = null;\n    var next = null;\n    tiers.forEach(function (tier) {\n      if (tier.quantity <= totalQuantity) active = tier;\n      else if (!next) next = tier;\n    });\n\n    return { active: active, next: next, totalQuantity: totalQuantity };\n  }\n\n  function pbUpdateAutomaticDiscountHint(progress) {\n    if (!els.bulkDiscountHint) return;\n    var active = progress && progress.active;\n    var next = progress && progress.next;\n    var totalQuantity = progress && progress.totalQuantity || 0;\n\n    var text = '';\n    if (!active && next) {\n      var firstRemaining = next.quantity - totalQuantity;\n      text = pbT(firstRemaining === 1 ? 'mangdrabatt_nasta_en' : 'mangdrabatt_nasta_flera',\n        firstRemaining === 1 ? 'L\u00E4gg till 1 artikel f\u00F6r {{ discount }} % rabatt' : 'L\u00E4gg till {{ count }} artiklar f\u00F6r {{ discount }} % rabatt',\n        { count: firstRemaining, discount: pbFormatDiscountPercentage(next.percentage) });\n    } else if (active && next) {\n      var remaining = next.quantity - totalQuantity;\n      text = pbT(remaining === 1 ? 'mangdrabatt_aktiv_nasta_en' : 'mangdrabatt_aktiv_nasta_flera',\n        remaining === 1 ? 'L\u00E4gg till 1 artikel f\u00F6r {{ next }} % rabatt' : 'L\u00E4gg till {{ count }} artiklar f\u00F6r {{ next }} % rabatt',\n        { count: remaining, next: pbFormatDiscountPercentage(next.percentage) });\n    }\n\n    els.bulkDiscountHint.textContent = text;\n    els.bulkDiscountHint.hidden = !text;\n  }\n\n  function pbDiscountedPriceCents(total, percentage) {\n    var safeTotal = Math.max(0, Number(total || 0));\n    var safePercentage = Math.max(0, Math.min(100, Number(percentage || 0)));\n    return Math.round(safeTotal * (1 - safePercentage / 100));\n  }\n\n  function pbUpdateModalPrice(total, progress) {\n    if (!els.modalTotal) return;\n    var active = progress && progress.active;\n    els.modalTotal.textContent = '';\n    els.modalTotal.classList.toggle('has-discount', Boolean(active));\n    if (!active) {\n      els.modalTotal.textContent = formatMoney(total);\n      return;\n    }\n\n    var original = document.createElement('span');\n    original.className = 'pb-size-modal__old-price';\n    original.textContent = formatMoney(total);\n    var discounted = document.createElement('span');\n    discounted.className = 'pb-size-modal__discount-price';\n    discounted.textContent = formatMoney(pbDiscountedPriceCents(total, active.percentage));\n    els.modalTotal.appendChild(original);\n    els.modalTotal.appendChild(discounted);\n  }\n\n  function makeCartGroupId() {\n    return 'pb_' + String(state.projectId || makeProjectId()).replace(/[^a-z0-9_-]/gi, '').slice(0, 42) + '_' + Date.now();\n  }\n\n  function updateModalTotal() {\n    var total = 0;\n    var qtyTotal = 0;\n    getSelectedCartVariants().forEach(function (entry) {\n      total += Number(entry.variant.price || 0) * entry.quantity;\n      qtyTotal += entry.quantity;\n    });\n\n    var extraPrintAreas = getCurrentExtraPrintAreaCount();\n    if (extraPrintAreas > 0 && qtyTotal > 0) {\n      total += extraPrintAreas * EXTRA_PRINT_AREA_PRICE_CENTS * qtyTotal;\n    }\n\n    // Mirror Shopify's minimum-quantity calculation exactly. Every paid extra\n    // print area is a real cart line and therefore counts when the automatic\n    // discount targets all items.\n    var discountProgress = pbGetAutomaticDiscountProgress(qtyTotal * (1 + extraPrintAreas));\n    pbUpdateModalPrice(total, discountProgress);\n    pbUpdateAutomaticDiscountHint(discountProgress);\n    els.confirmAdd.disabled = pbCartBusy || qtyTotal <= 0;\n    if (qtyTotal <= 0 || getUsedPlacements().length > 0) {\n      setSizeModalError('');\n    }\n    updateDisplayedProductPrice();\n  }\n\n  var pbCartBusy = false;\n  async function confirmAddToCart() {\n    if (pbCartBusy || pbUploadInProgress || pbLoadFailure.active) return;\n    var directEdit = isDirectDesignRevisionEdit();\n    if (!directEdit && pbCartReviewRequired) { pbOpenCart(); return; }\n    if (directEdit) resetDirectSaveCta();\n    var previousInert = root.inert;\n    root.inert = true;\n    pbCartBusy = true;\n    try {\n      setSizeModalError('');\n      var selectedVariants = directEdit ? [] : getSelectedCartVariants();\n      if (directEdit && !state.variant?.available) throw new Error(pbT('den_valda_fargen_och_storleken_ar_inte_i_lager_valj_en_annan_farg', 'Den valda f\u00E4rgen och storleken \u00E4r inte i lager. V\u00E4lj en annan f\u00E4rg.'));\n      if (!directEdit && !selectedVariants.length) throw new Error(pbT('valj_minst_en_storlek', 'V\u00E4lj minst en storlek.'));\n\n      var usedPlacements = getUsedPlacements();\n      if (!usedPlacements.length) throw new Error(pbT('lagg_till_text_eller_ladda_upp_motiv_forst', 'L\u00E4gg till text eller ladda upp motiv f\u00F6rst.'));\n      \n\n      setConfirmAddBusy(true, directEdit ? pbT('sparar_andringar', 'Sparar \u00E4ndringar\u2026') : (state.editCartGroupId ? pbT('uppdaterar_kundvagnen', 'Uppdaterar kundvagnen\u2026') : pbT('lagger_i_kundvagnen', 'L\u00E4gger i kundvagnen\u2026')));\n      if (directEdit) setDirectSaveCtaLabel(pbT('sparar_andringar', 'Sparar \u00E4ndringar\u2026'), 'is-saving');\n      els.openSizeModal.disabled = true;\n      setStatus(pbT('skapar_designfiler', 'Skapar designfiler\u2026'));\n\n      var placementResults = await pbAwaitAll(usedPlacements.map(async function (placement) {\n        var template = state.templatesByPlacement[placement] || selectLocalTemplate(placement);\n        var dState = getDesignState(placement, false);\n        if (!template || !dState) return null;\n\n        var label = getPlacementLabel(placement);\n        var technique = template.technique || (state.technique && state.technique !== 'auto' ? state.technique : 'dtg');\n\n        var editorObjectAssetsPromise = exportEditorObjectAssetsForPlacement(placement, template, dState);\n        // Every Spreadconnect print type uses the same fulfillment model: one cropped\n        // composite raster per printArea with an explicit physical position. Individual\n        // object assets are retained only for cart/editor restore.\n        var compositeAssetPromise = exportSpreadconnectCompositeAssetForPlacement(placement, template, dState);\n        \n\n        var exported = await pbAwaitAll([\n          editorObjectAssetsPromise,\n          compositeAssetPromise,\n          (pbPrivateEnabled() ? pbServerExport(placement,template,dState).then(function(r){ if(!r.mockup) throw new Error('Produktbilden saknas.'); return r.mockup.data_url; }) : exportMockupPngForPlacement(template,dState)).then(async function (png) {\n            if (!pbPrivateEnabled()) return png;\n            return { pb_mockup_preuploaded: await uploadImageFile(png,\n              makePlacementFilename(placement, 'mockup'), 'mockup', placement) };\n          })\n        ]);\n\n        var objectAssets = exported[0] || [];\n        var compositeAsset = exported[1] || null;\n        var mockupPng = exported[2] || '';\n        if (!objectAssets.length) {\n          throw new Error(pbT('tryckytan', 'Tryckytan ') + label + pbT('saknar_exporterbara_objekt', ' saknar exporterbara objekt.'));\n        }\n\n        setStatus(pbT('laddar_upp', 'Laddar upp ') + label + '\u2026');\n\n        var objectUploadsPromise = pbAwaitAll(objectAssets.map(async function (asset, index) {\n          var upload = await uploadImageFile(\n            asset.data_url,\n            makePlacementFilename(placement, 'object-' + (index + 1) + '-' + asset.object_type),\n            'print_file',\n            placement\n          );\n\n          var printUrl = upload.print_file_url || upload.preview_url || '';\n          if (!printUrl) {\n            throw new Error(label + pbT('objekt', ' \u00B7 objekt ') + (index + 1) + pbT('fick_ingen_publik_url', ' fick ingen publik URL.'));\n          }\n\n          var exactViewName = String(template.view_name || '').trim();\n          if (!exactViewName) {\n            throw new Error(label + pbT('saknar_exakt_spreadconnect_view_name_fran_produkt_api_t', ' saknar exakt Spreadconnect view_name fr\u00E5n produkt-API:t.'));\n          }\n\n          return {\n            placement: placement,\n            view_name: exactViewName,\n            view_id: String(template.view_id || ''),\n            label: label,\n            technique: technique,\n            print_file_url: printUrl,\n            preview_url: upload.preview_url || printUrl || '',\n            upload_status: upload.upload_status || '',\n            design_id: upload.design_id || '',\n            file_id: upload.file_id || '',\n            filename: upload.filename || makePlacementFilename(placement, 'object-' + (index + 1) + '-' + asset.object_type),\n            full_width: Number(asset.full_width || 0),\n            full_height: Number(asset.full_height || 0),\n            crop_x: Number(asset.crop && asset.crop.x || 0),\n            crop_y: Number(asset.crop && asset.crop.y || 0),\n            crop_width: Number(asset.crop && asset.crop.width || 0),\n            crop_height: Number(asset.crop && asset.crop.height || 0),\n            object_index: index,\n            original_asset: asset.original_asset || undefined,\n            object_id: asset.object_id || '',\n            object_type: asset.object_type || '',\n            source_filename: asset.source_filename || '',\n            position: asset.position || null,\n            submission_mode: !compositeAsset && pbSeparatePngTest(template) ? asset.submission_mode : 'editor-object',\n            source_object_count: !compositeAsset && pbSeparatePngTest(template) ? objectAssets.length : 0,\n            fulfillment_role: 'editor-object'\n          };\n        }));\n\n        var compositeUploadPromise = compositeAsset ? (async function () {\n          var upload = await uploadImageFile(\n            compositeAsset.data_url,\n            makePlacementFilename(placement, 'composite'),\n            'print_file',\n            placement\n          );\n          var printUrl = upload.print_file_url || upload.preview_url || '';\n          if (!printUrl) throw new Error(label + pbT('composite_fick_ingen_publik_url', ' \u00B7 composite fick ingen publik URL.'));\n          var exactViewName = String(template.view_name || '').trim();\n          if (!exactViewName) throw new Error(label + pbT('saknar_exakt_spreadconnect_view_name_fran_produkt_api_t', ' saknar exakt Spreadconnect view_name fr\u00E5n produkt-API:t.'));\n          return {\n            placement: placement,\n            view_name: exactViewName,\n            view_id: String(template.view_id || ''),\n            label: label,\n            technique: technique,\n            print_file_url: printUrl,\n            preview_url: upload.preview_url || printUrl || '',\n            upload_status: upload.upload_status || '',\n            design_id: upload.design_id || '',\n            file_id: upload.file_id || '',\n            filename: upload.filename || makePlacementFilename(placement, 'composite'),\n            full_width: Number(compositeAsset.full_width || 0),\n            full_height: Number(compositeAsset.full_height || 0),\n            crop_x: Number(compositeAsset.crop && compositeAsset.crop.x || 0),\n            crop_y: Number(compositeAsset.crop && compositeAsset.crop.y || 0),\n            crop_width: Number(compositeAsset.crop && compositeAsset.crop.width || 0),\n            crop_height: Number(compositeAsset.crop && compositeAsset.crop.height || 0),\n            object_index: -1,\n            object_id: compositeAsset.object_id || ('composite-' + placement),\n            object_type: 'composite',\n            source_filename: '',\n            position: compositeAsset.position || null,\n            submission_mode: 'composite-relative',\n            fulfillment_role: 'composite',\n            source_object_count: Number(objectAssets.length || 0)\n          };\n        })() : Promise.resolve(null);\n\n        var mockupUploadPromise = mockupPng && mockupPng.pb_mockup_preuploaded\n          ? Promise.resolve(mockupPng.pb_mockup_preuploaded) : uploadImageFile(\n          mockupPng,\n          makePlacementFilename(placement, 'mockup'),\n          'mockup',\n          placement\n        );\n\n        var settled = await pbAwaitAll([objectUploadsPromise, compositeUploadPromise, mockupUploadPromise]);\n        var objectUploads = settled[0] || [];\n        var compositeUpload = settled[1] || null;\n        var mockupUpload = settled[2] || {};\n        if (compositeUpload) objectUploads.push(compositeUpload);\n        var supplierPrimary = compositeUpload || (pbSeparatePngTest(template) ? objectUploads[0] : null);\n        if (!supplierPrimary) {\n          throw new Error(label + pbT('saknar_composite_for_spreadconnect_fulfillment', ' saknar composite f\u00F6r Spreadconnect fulfillment.'));\n        }\n        var mockupUrl = mockupUpload.preview_url || mockupUpload.print_file_url || '';\n        if (!mockupUrl) {\n          throw new Error(pbT('kunde_inte_skapa_produktens_mockup_for', 'Kunde inte skapa produktens mockup f\u00F6r ') + label + '.');\n        }\n\n        return {\n          placement: placement,\n          view_name: String(template.view_name || '').trim(),\n          view_id: String(template.view_id || ''),\n          label: label,\n          technique: technique,\n          print_file_url: supplierPrimary.print_file_url || '',\n          preview_url: supplierPrimary.preview_url || supplierPrimary.print_file_url || '',\n          mockup_url: mockupUrl,\n          mockup_file_id: mockupUpload.file_id || '',\n          upload_status: objectUploads.map(function (obj, idx) {\n            return placement + '_asset' + (idx + 1) + ':' + (obj.upload_status || '');\n          }).join(','),\n          mockup_status: mockupUpload.upload_status || '',\n          design_id: supplierPrimary.design_id || '',\n          filename: supplierPrimary.filename || makePlacementFilename(placement, 'composite'),\n          submission_mode: !compositeUpload && pbSeparatePngTest(template) ? 'separate-png-test-v1' : 'composite-relative',\n          design_json: makeDesignJsonForPlacement(placement, template, dState),\n          objects: objectUploads\n        };\n      }));\n\n      var uploadedPlacements = placementResults.filter(Boolean);\n      if (!uploadedPlacements.length) throw new Error(pbT('ingen_tryckyta_kunde_exporteras', 'Ingen tryckyta kunde exporteras.'));\n\n      var placementObjects = [];\n      uploadedPlacements.forEach(function (placementEntry) {\n        (placementEntry.objects || []).forEach(function (obj) {\n          placementObjects.push({\n            placement: obj.placement,\n            view_name: String(obj.view_name || placementEntry.view_name || '').trim(),\n            view_id: String(obj.view_id || placementEntry.view_id || ''),\n            label: placementEntry.label,\n            technique: obj.technique || placementEntry.technique,\n            technique_source: String((state.templatesByPlacement[obj.placement] || {}).technique_source || ''),\n            technique_verified: (state.templatesByPlacement[obj.placement] || {}).technique_verified === true,\n            print_file_dpi: Number((state.templatesByPlacement[obj.placement] || {}).print_file_dpi || 0),\n            print_file_url: obj.print_file_url,\n            file_id: obj.file_id,\n            full_width: Number(obj.full_width || 0),\n            full_height: Number(obj.full_height || 0),\n            crop_x: Number(obj.crop_x || 0),\n            crop_y: Number(obj.crop_y || 0),\n            crop_width: Number(obj.crop_width || 0),\n            crop_height: Number(obj.crop_height || 0),\n            production_area: (state.templatesByPlacement[obj.placement] || {}).production_area,\n            physical_width_mm: Number((state.templatesByPlacement[obj.placement] || {}).physical_width_mm || 0),\n            physical_height_mm: Number((state.templatesByPlacement[obj.placement] || {}).physical_height_mm || 0),\n            print_area_id: String((state.templatesByPlacement[obj.placement] || {}).print_area_id || ''),\n            print_type_id: String((state.templatesByPlacement[obj.placement] || {}).print_type_id || ''),\n            mockup_url: placementEntry.mockup_url,\n            filename: obj.filename,\n            object_index: obj.object_index,\n            original_asset: obj.original_asset || undefined,\n            object_id: obj.object_id,\n            object_type: obj.object_type,\n            source_filename: obj.source_filename,\n            position: obj.position || null,\n            submission_mode: String(obj.submission_mode || 'editor-object'),\n            fulfillment_role: String(obj.fulfillment_role || 'editor-object'),\n            source_object_count: Number(obj.source_object_count || 0)\n          });\n        });\n      });\n\n      if (directEdit) {\n        setStatus(pbT('sparar_andringar', 'Sparar \u00E4ndringar\u2026'));\n        var firstPlacement = uploadedPlacements[0] || {};\n        var revisionGroupId = String(state.editDesignGroupId || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 160);\n        if (revisionGroupId.length < 8) throw new Error(pbT('den_sparade_designen_saknar_ett_giltigt_grupp_id', 'Den sparade designen saknar ett giltigt grupp-ID.'));\n        var editableDesignJson = JSON.stringify({ project_id: state.projectId,\n          placements: uploadedPlacements.map(function (entry) { return entry.design_json; }) });\n        var revisionResult = await pbJsonRequest(workerUrl + '/api/designs/finalize', { method: 'POST',\n          headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({\n            variant_id: String(state.shopifyVariantId), design_ref: String(state.editDesignRef),\n            edit_token: String(state.editToken), group_id: revisionGroupId,\n            project_id: String(state.projectId || ''), editable_design_json: editableDesignJson,\n            design_json: editableDesignJson, placements_json: JSON.stringify(placementObjects),\n            mockup_preview_file_id: String(firstPlacement.mockup_file_id || '')\n          }) }, 60000, true,\n          pbT('designverifieringen_tog_for_lang_tid', 'Det tog f\u00F6r l\u00E5ng tid att spara designen. Din design finns kvar. F\u00F6rs\u00F6k igen.'));\n        var revisionData = revisionResult.data || {};\n        if (!revisionResult.ok || !revisionData.ok) throw new Error(revisionData.error || pbT('andringarna_kunde_inte_sparas', '\u00C4ndringarna kunde inte sparas.'));\n        if (String(revisionData.design_ref || '') !== String(state.editDesignRef) ||\n            String(revisionData.edit_token || '') !== String(state.editToken)) {\n          throw new Error(pbT('worker_returnerade_inte_samma_designreferens_och_redigeringskod', 'Worker returnerade inte samma designreferens och redigeringskod.'));\n        }\n        var savedHistoricalRevision = Boolean(state.isHistoricalRevision);\n        state.editRevision = String(revisionData.revision || state.editRevision || '');\n        state.openedRevision = state.editRevision;\n        state.isHistoricalRevision = false;\n        if (state.savedDesign) {\n          state.savedDesign.design = editableDesignJson;\n          state.savedDesign.placements = JSON.stringify(placementObjects);\n          state.savedDesign.revision = state.editRevision;\n          state.savedDesign.openedRevision = state.editRevision;\n          state.savedDesign.isHistorical = false;\n          state.savedDesign.status = String(revisionData.design_status || '');\n        }\n        try {\n          if (window.history && typeof window.history.replaceState === 'function') {\n            var stableEditUrl = new URL(window.location.href);\n            stableEditUrl.searchParams.delete('revision');\n            window.history.replaceState(window.history.state, '', stableEditUrl.href);\n          }\n        } catch (historyError) { /* URL cleanup is best effort only. */ }\n        var revisionStatus = String(revisionData.design_status || '').toLowerCase();\n        var revisionNumber = Number(revisionData.revision_number);\n        if (revisionStatus === 'ready' && Number.isSafeInteger(revisionNumber) && revisionNumber > 0) {\n          state.currentRevision = state.editRevision;\n          if (state.savedDesign) state.savedDesign.currentRevision = state.currentRevision;\n          var readyHistory = typeof pbReadyRevisionHistory === 'function'\n            ? pbReadyRevisionHistory(state.revisionHistory)\n            : (Array.isArray(state.revisionHistory) ? state.revisionHistory : []);\n          state.revisionHistory = readyHistory.filter(function (entry) {\n            return String(entry.revision_id || '') !== state.editRevision && Number(entry.revision) !== revisionNumber;\n          }).map(function (entry) { return Object.assign({}, entry, { current: false }); });\n          state.revisionHistory.push({ revision: revisionNumber, revision_id: state.editRevision,\n            status: 'promoted', current: true });\n          if (state.savedDesign) state.savedDesign.revisions = state.revisionHistory;\n          if (typeof renderRevisionControls === 'function') renderRevisionControls();\n        } else {\n          if (typeof renderRevisionControls === 'function') renderRevisionControls();\n          var revisionNote = root && typeof root.querySelector === 'function'\n            ? root.querySelector('[data-pb-revision-note]') : null;\n          if (revisionNote) revisionNote.textContent = pbT('den_nya_versionen_valideras_versionslistan_uppdateras_automatiskt', 'Den nya versionen valideras. Versionslistan uppdateras automatiskt.');\n          if (typeof pbScheduleRevisionHistoryRefresh === 'function') pbScheduleRevisionHistoryRefresh(state.editRevision, 6);\n        }\n        setStatus(savedHistoricalRevision\n          ? (revisionStatus === 'pending'\n            ? pbT('den_aldre_versionen_sparades_som_en_ny_revision_och_blir_aktuell_efter_validering', 'Den \u00E4ldre versionen sparades som en ny revision och blir aktuell efter validering\u2026')\n            : pbT('den_aldre_versionen_sparades_som_den_aktiva_revisionen', 'Den \u00E4ldre versionen sparades som den aktiva revisionen.'))\n          : (revisionStatus === 'pending' ? pbT('andringarna_sparades_och_valideras', '\u00C4ndringarna sparades och valideras\u2026') : pbT('andringarna_sparades_2', '\u00C4ndringarna sparades.')));\n        setConfirmAddBusy(false);\n        root.inert = previousInert;\n        if (revisionStatus === 'ready') showDirectSaveSuccess();\n        else setDirectSaveCtaLabel('Validerar korrigeringen\u2026', 'is-saving');\n        return;\n      }\n\n      setConfirmAddBusy(true, state.editCartGroupId ? pbT('uppdaterar_kundvagnen', 'Uppdaterar kundvagnen\u2026') : pbT('lagger_i_kundvagnen', 'L\u00E4gger i kundvagnen\u2026'));\n      setStatus(state.editCartGroupId ? pbT('uppdaterar_kundvagnen', 'Uppdaterar kundvagnen\u2026') : pbT('lagger_valda_storlekar_i_kundvagnen', 'L\u00E4gger valda storlekar i kundvagnen\u2026'));\n\n      var primary = uploadedPlacements[0];\n      var designLabel = uploadedPlacements.map(function (p) { return p.label; }).join(' + ');\n      var printAreaCount = uploadedPlacements.length;\n      var extraPrintAreas = getExtraPrintAreaCountForPlacements(uploadedPlacements);\n      var activePlacements = uploadedPlacements.map(function (p) { return p.placement; }).join(',');\n      var items = [];\n\n      selectedVariants.forEach(function (entry) {\n        var scMapping = resolveSpreadconnectVariant(entry.variant);\n        var cartGroupId = makeCartGroupId() + '_' + String(entry.variant.id || '').replace(/[^0-9a-z_-]/gi, '').slice(-10);\n\n        var checkoutPrintProperties = buildCheckoutPrintAreaProperties(uploadedPlacements);\n        var mainItemProperties = Object.assign({}, checkoutPrintProperties, {\n            '_pb_edit_url': '',\n            '_pb_preview_url': primary.mockup_url || primary.preview_url || primary.print_file_url || '',\n            '_pb_mockup_preview_file_id': String(primary.mockup_file_id || ''),\n            '_pb_design_revision': '',\n            '_pb_custom': 'true',\n            '_pb_supplier': 'spreadconnect',\n            '_pb_mode': primary.technique || (state.technique && state.technique !== 'auto' ? state.technique : 'dtg'),\n            '_pb_design_project_id': state.projectId,\n            '_pb_group_id': cartGroupId,\n            '_pb_sc_product_type_id': String(scMapping.productTypeId || ''),\n            '_pb_sc_appearance_id': String(scMapping.appearanceId || ''),\n            '_pb_sc_size_id': String(scMapping.sizeId || ''),\n            '_pb_placement': primary.placement,\n            '_pb_sc_view_name': String(primary.view_name || ''),\n            '_pb_sc_view_id': String(primary.view_id || ''),\n            '_pb_technique': primary.technique || 'dtg',\n            '_pb_print_file_url': primary.print_file_url || '',\n            '_pb_mockup_url': primary.mockup_url || '',\n            '_pb_print_areas': String(printAreaCount),\n            '_pb_extra_print_areas': String(extraPrintAreas),\n            '_pb_active_placements': activePlacements,\n            '_pb_design_order': activePlacements,\n            '_pb_extra_print_area_variant_id': extraPrintAreas > 0 ? String(EXTRA_PRINT_AREA_VARIANT_ID) : '',\n            '_pb_extra_print_area_price_cents': extraPrintAreas > 0 ? String(EXTRA_PRINT_AREA_PRICE_CENTS) : '',\n            '_pb_placements_json': JSON.stringify(placementObjects.map(function (p) {\n              return {\n                placement: p.placement,\n                view_name: p.view_name,\n                view_id: p.view_id,\n                label: p.label,\n                technique: p.technique,\n                technique_source: p.technique_source,\n                technique_verified: p.technique_verified,\n                print_file_dpi: p.print_file_dpi,\n                print_file_url: p.print_file_url,\n                file_id: p.file_id,\n                full_width: p.full_width,\n                full_height: p.full_height,\n                crop_x: p.crop_x,\n                crop_y: p.crop_y,\n                crop_width: p.crop_width,\n                crop_height: p.crop_height,\n                production_area: p.production_area,\n                physical_width_mm: p.physical_width_mm,\n                physical_height_mm: p.physical_height_mm,\n                print_area_id: p.print_area_id,\n                print_type_id: p.print_type_id,\n            mockup_url: p.mockup_url,\n                mockup_file_id: p.mockup_file_id,\n                filename: p.filename,\n                object_index: p.object_index,\n                original_asset: p.original_asset || undefined,\n                object_id: p.object_id,\n                object_type: p.object_type,\n                source_filename: p.source_filename,\n                position: p.position,\n                submission_mode: p.submission_mode,\n                fulfillment_role: p.fulfillment_role,\n                source_object_count: p.source_object_count\n              };\n            })),\n            '_pb_design_json': JSON.stringify({ project_id: state.projectId, placements: uploadedPlacements.map(function (p) { return p.design_json; }) }),\n            '_pb_upload_status': uploadedPlacements.map(function (p) {\n              return p.upload_status + (p.mockup_status ? ',mockup:' + p.mockup_status : '');\n            }).join('|')\n        });\n\n        items.push({\n          id: Number(entry.variant.id),\n          quantity: entry.quantity,\n          properties: mainItemProperties\n        });\n\n        if (extraPrintAreas > 0 && Number(entry.quantity || 0) > 0) {\n          items.push({\n            id: EXTRA_PRINT_AREA_VARIANT_ID,\n            quantity: Number(entry.quantity || 0) * extraPrintAreas,\n            properties: {\n              // Public checkout properties. The extra-print item belongs to this\n              // specific configured parent product. Only paid areas are listed here.\n              [pbT('produkt', 'Produkt')]: [\n                state.product && state.product.title ? String(state.product.title) : '',\n                entry.variant && entry.variant.title && !/default title/i.test(String(entry.variant.title))\n                  ? String(entry.variant.title)\n                  : ''\n              ].filter(Boolean).join(' \u00B7 '),\n              [pbT('tryck', 'Tryck')]: uploadedPlacements.slice(1).map(function (placementEntry) {\n                return getCartPlacementLabel(placementEntry.placement);\n              }).filter(Boolean).join(' \u00B7 '),\n\n              '_pb_fee': 'true',\n              '_pb_fee_type': 'extra_print_area',\n              '_pb_group_id': cartGroupId,\n              '_pb_design_project_id': state.projectId,\n              '_pb_fee_label': 'Tryck',\n              '_pb_for_print_areas': String(printAreaCount),\n              '_pb_extra_print_areas': String(extraPrintAreas),\n              '_pb_active_placements': activePlacements,\n              '_pb_design_order': activePlacements,\n              '_pb_related_product': state.product && state.product.title ? String(state.product.title) : '',\n              '_pb_related_variant_id': String(entry.variant.id || ''),\n              '_pb_related_variant_title': entry.variant.title || '',\n              '_pb_related_design': designLabel\n            }\n          });\n        }\n      });\n\n      return await pbCommitCart(items);\n    } catch (error) {\n      \n      var message = error && error.message ? error.message : pbT('nagot_gick_fel', 'N\u00E5got gick fel.');\n      setStatus(message, true);\n      setConfirmAddBusy(false);\n      if (directEdit) resetDirectSaveCta();\n      updateModalTotal();\n      setSizeModalError(message);\n      if (pbCartReviewRequired) { els.confirmAdd.textContent = pbT('oppna_kundvagnen', '\u00D6ppna kundvagnen'); els.confirmAdd.disabled = false; }\n      els.openSizeModal.disabled = false;\n      \n    } finally {\n      root.inert = previousInert;\n      pbCartBusy = false;\n      if (directEdit) {\n        if (els.openSizeModal) els.openSizeModal.disabled = false;\n        if (els.confirmAdd) els.confirmAdd.disabled = false;\n      } else {\n        els.confirmAdd.disabled = !pbCartReviewRequired && getSelectedCartVariants().length === 0;\n      }\n    }\n  }\n\n  async function renderPrintAreaCanvasForPlacement(template, dState, maxEdge) {\n    if ((dState.imageLayers || []).some(function(layer){return layer.pbUploadPending;})) throw new Error(pbT(\"bilden_laddas_fortfarande_upp\", \"Bilden laddas fortfarande upp.\"));\n    // Spreadconnect template resolver returns a physical print-area-derived PNG size\n    // (apparel target or 400+ DPI non-apparel target, max 4000 px edge).\n    var width = Math.max(1, Math.round(getTemplatePrintFileWidth(template) || (Number(template.print_area_width || 1000) * exportScale)));\n    var height = Math.max(1, Math.round(getTemplatePrintFileHeight(template) || (Number(template.print_area_height || 1000) * exportScale)));\n    if (Number.isFinite(maxEdge) && maxEdge > 0) {\n      var previewRatio = Math.min(1, maxEdge / Math.max(width, height));\n      width = Math.max(1, Math.round(width * previewRatio));\n      height = Math.max(1, Math.round(height * previewRatio));\n    }\n    var canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    var ctx = canvas.getContext('2d', { willReadFrequently: true });\n    ctx.clearRect(0, 0, width, height);\n\n    var d = dState.design;\n    var x = (d.x / 100) * width;\n    var y = (d.y / 100) * height;\n    var w = (d.w / 100) * width;\n    var h = (d.h / 100) * height;\n\n    if (dState.designType === 'image' && dState.imageDataUrl) {\n      var img = await loadImage(dState.imageDataUrl);\n      drawRotatedImageContain(ctx, img, x, y, w, h, Number(d.rotation || 0));\n    } else if (String(dState.text || '').trim()) {\n      drawRotatedTextFit(ctx, dState.text || pbT('din_design', 'DIN DESIGN'), x, y, w, h, Number(d.rotation || 0));\n    }\n\n    await drawImageLayersToCanvas(ctx, dState, width, height);\n    // Match an inset supplier shape to the viewport shown by the editor. The\n    // canvas itself clips hard rectangular edges; editable object assets stay separate.\n    if (template.production_area && template.soft_boundary &&\n        (template.production_area.offset_x_mm || template.production_area.offset_y_mm)) {\n      var maskSvg = buildSoftBoundaryObjectMaskSvg(template, { x: 0, y: 0, w: 100, h: 100, rotation: 0 }, false);\n      if (maskSvg) {\n        var maskImage = await loadImage('data:image/svg+xml;charset=utf-8,' + encodeURIComponent(maskSvg));\n        ctx.save();\n        ctx.globalCompositeOperation = 'destination-in';\n        ctx.drawImage(maskImage, 0, 0, width, height);\n        ctx.restore();\n      }\n    }\n    return canvas;\n  }\n\n  function getCanvasAlphaBounds(canvas, paddingPx) {\n    var ctx = canvas.getContext('2d', { willReadFrequently: true });\n    var width = canvas.width;\n    var height = canvas.height;\n    var pixels = ctx.getImageData(0, 0, width, height).data;\n    var minX = width;\n    var minY = height;\n    var maxX = -1;\n    var maxY = -1;\n\n    // Alpha threshold 1 keeps antialiased edges while ignoring fully transparent pixels.\n    for (var y = 0; y < height; y++) {\n      var row = y * width * 4;\n      for (var x = 0; x < width; x++) {\n        if (pixels[row + x * 4 + 3] > 1) {\n          if (x < minX) minX = x;\n          if (x > maxX) maxX = x;\n          if (y < minY) minY = y;\n          if (y > maxY) maxY = y;\n        }\n      }\n    }\n\n    if (maxX < minX || maxY < minY) return null;\n\n    // Preserve optional alpha-bound padding for callers that need it.\n    var pad = paddingPx === undefined || paddingPx === null\n      ? Math.max(2, Math.round(Math.max(width, height) / 2000))\n      : Math.max(0, Math.round(Number(paddingPx) || 0));\n\n    minX = Math.max(0, minX - pad);\n    minY = Math.max(0, minY - pad);\n    maxX = Math.min(width - 1, maxX + pad);\n    maxY = Math.min(height - 1, maxY + pad);\n\n    return {\n      x: minX,\n      y: minY,\n      width: maxX - minX + 1,\n      height: maxY - minY + 1\n    };\n  }\n\n\n  function getSpreadconnectRelativePositionFromCrop(crop, fullWidth, fullHeight) {\n    fullWidth = Number(fullWidth || 0);\n    fullHeight = Number(fullHeight || 0);\n    if (!(fullWidth > 0) || !(fullHeight > 0) || !crop) return null;\n\n    var offsetX = Number(crop.x || 0) / fullWidth;\n    var offsetY = Number(crop.y || 0) / fullHeight;\n    var width = Number(crop.width || 0) / fullWidth;\n    var height = Number(crop.height || 0) / fullHeight;\n\n    if (![offsetX, offsetY, width, height].every(Number.isFinite)) return null;\n    if (offsetX < 0 || offsetY < 0 || width <= 0 || height <= 0) return null;\n    if (offsetX > 1 || offsetY > 1 || width > 1 || height > 1) return null;\n    if ((offsetX + width) > 1.000001 || (offsetY + height) > 1.000001) return null;\n\n    // Keep enough precision for small objects while staying in the Spreadconnect\n    // relative Orders coordinate space.\n    var round = function (n) { return Math.round(n * 100000000) / 100000000; };\n    return {\n      offsetX: round(offsetX),\n      offsetY: round(offsetY),\n      width: round(width),\n      height: round(height)\n    };\n  }\n\n  function cropCanvasToBounds(sourceCanvas, bounds) {\n    var out = document.createElement('canvas');\n    out.width = Math.max(1, Math.round(Number(bounds.width || 1)));\n    out.height = Math.max(1, Math.round(Number(bounds.height || 1)));\n    var outCtx = out.getContext('2d');\n    outCtx.clearRect(0, 0, out.width, out.height);\n    outCtx.drawImage(\n      sourceCanvas,\n      Number(bounds.x || 0), Number(bounds.y || 0), out.width, out.height,\n      0, 0, out.width, out.height\n    );\n    return out;\n  }\n\n  async function renderEditorObjectOnPrintAreaCanvas(template, objectSpec) {\n    var width = Math.max(1, Math.round(getTemplatePrintFileWidth(template) || (Number(template.print_area_width || 1000) * exportScale)));\n    var height = Math.max(1, Math.round(getTemplatePrintFileHeight(template) || (Number(template.print_area_height || 1000) * exportScale)));\n    var canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    var ctx = canvas.getContext('2d', { willReadFrequently: true });\n    ctx.clearRect(0, 0, width, height);\n\n    var x = (Number(objectSpec.x || 0) / 100) * width;\n    var y = (Number(objectSpec.y || 0) / 100) * height;\n    var w = (Number(objectSpec.w || 0) / 100) * width;\n    var h = (Number(objectSpec.h || 0) / 100) * height;\n\n    if (objectSpec.kind === 'layer-text') {\n      var layer = objectSpec.layer;\n      if (!String(layer.text || '').trim()) return null;\n      await ensureDesignerFontReadyByFamily(layer.fontFamily || '');\n      var embeddedFontCss = await getEmbeddedFontCssForFamily(layer.fontFamily || '');\n      var textImg = await loadImage(getTextLayerSvgDataUrl(layer, embeddedFontCss));\n      drawRotatedImageContain(ctx, textImg, x, y, w, h, Number(layer.rotation || 0), Boolean(layer.flipX));\n    } else if (objectSpec.kind === 'layer-image') {\n      var imageLayer = objectSpec.layer;\n      if (!imageLayer.imageDataUrl) return null;\n      var layerImg = await loadImage(imageLayer.imageDataUrl);\n      drawRotatedImageContain(ctx, layerImg, x, y, w, h, Number(imageLayer.rotation || 0), Boolean(imageLayer.flipX));\n    } else if (objectSpec.kind === 'primary-image') {\n      if (!objectSpec.imageDataUrl) return null;\n      var primaryImg = await loadImage(objectSpec.imageDataUrl);\n      drawRotatedImageContain(ctx, primaryImg, x, y, w, h, Number(objectSpec.rotation || 0));\n    } else if (objectSpec.kind === 'primary-text') {\n      if (!String(objectSpec.text || '').trim()) return null;\n      drawRotatedTextFit(ctx, objectSpec.text, x, y, w, h, Number(objectSpec.rotation || 0));\n    } else {\n      return null;\n    }\n\n    // Editor restore assets are measured from the unmasked object so their saved geometry\n    // stays identical to what the customer positioned in the designer.\n    return canvas;\n  }\n\n  async function exportEditorObjectAssetsForPlacement(placement, template, dState) {\n    if (pbPrivateEnabled()) return (await pbServerExport(placement, template, dState)).objects;\n    // Cart/editor restore: export every editable text/image separately. These assets are\n    // never sent as Spreadconnect fulfillment configurations; they only preserve editable\n    // source objects when the customer reopens a cart design.\n    var specs = [];\n\n    if (hasPrimaryDesignContent(dState)) {\n      var primary = dState.design || { x: 0, y: 0, w: 100, h: 100, rotation: 0 };\n      if (dState.designType === 'image' && dState.imageDataUrl) {\n        specs.push({\n          kind: 'primary-image',\n          object_id: 'primary-design',\n          object_type: 'image',\n          source_filename: dState.sourceFileName || '',\n          imageDataUrl: dState.imageDataUrl,\n          x: primary.x, y: primary.y, w: primary.w, h: primary.h,\n          rotation: primary.rotation\n        });\n      } else if (String(dState.text || '').trim()) {\n        specs.push({\n          kind: 'primary-text',\n          object_id: 'primary-design',\n          object_type: 'text',\n          source_filename: '',\n          text: dState.text || '',\n          x: primary.x, y: primary.y, w: primary.w, h: primary.h,\n          rotation: primary.rotation\n        });\n      }\n    }\n\n    (dState.imageLayers || []).forEach(function (layer) {\n      if ((layer.type || 'image') === 'text') {\n        if (!String(layer.text || '').trim()) return;\n        specs.push({\n          kind: 'layer-text',\n          object_id: String(layer.id || makeLayerId()),\n          object_type: 'text',\n          source_filename: '',\n          layer: layer,\n          x: layer.x, y: layer.y, w: layer.w, h: layer.h\n        });\n      } else {\n        if (!layer.imageDataUrl) return;\n        specs.push({\n          kind: 'layer-image',\n          object_id: String(layer.id || makeLayerId()),\n          object_type: 'image',\n          source_filename: layer.sourceFileName || '',\n          layer: layer,\n          x: layer.x, y: layer.y, w: layer.w, h: layer.h\n        });\n      }\n    });\n\n    var assets = [];\n    for (var i = 0; i < specs.length; i++) {\n      var spec = specs[i];\n      var fullCanvas = await renderEditorObjectOnPrintAreaCanvas(template, spec);\n      if (!fullCanvas) continue;\n\n      var bounds = getCanvasAlphaBounds(fullCanvas, 0);\n      if (!bounds) continue;\n\n      var position = getSpreadconnectRelativePositionFromCrop(bounds, fullCanvas.width, fullCanvas.height);\n      if (!position) {\n        throw new Error(pbT('kunde_inte_berakna_spreadconnect_position_for_objekt', 'Kunde inte ber\u00E4kna Spreadconnect-position f\u00F6r objekt ') + (i + 1) + '.');\n      }\n\n      var croppedCanvas = cropCanvasToBounds(fullCanvas, bounds);\n      assets.push({\n        placement: placement,\n        object_id: spec.object_id,\n        object_type: spec.object_type,\n        source_filename: spec.source_filename || '',\n        data_url: croppedCanvas.toDataURL('image/png'),\n        full_width: fullCanvas.width,\n        full_height: fullCanvas.height,\n        crop: {\n          x: bounds.x,\n          y: bounds.y,\n          width: bounds.width,\n          height: bounds.height\n        },\n        position: position,\n        submission_mode: 'editor-object'\n      });\n    }\n\n    if (!assets.length) throw new Error(pbT('tryckytan_saknar_synligt_innehall', 'Tryckytan saknar synligt inneh\u00E5ll.'));\n    return assets;\n  }\n\n  function getSpreadconnectCompositeMinimumEdge(template) {\n    var configuredMinimum = Number(template && template.print_file_min_edge || 0);\n    var technique = normalizeTechniqueId(template && template.technique || '');\n    var printTypeId = String(template && template.print_type_id || '').trim();\n    if (configuredMinimum > 0) return Math.max(1, Math.round(configuredMinimum));\n    return technique === 'sublimation' || ['10', '25'].indexOf(printTypeId) >= 0 ? 1000 : 0;\n  }\n\n  function getCanvasMinimumDimensionPlan(width, height, minimumEdge, maximumEdge) {\n    width = Math.max(1, Math.round(Number(width || 1)));\n    height = Math.max(1, Math.round(Number(height || 1)));\n    minimumEdge = Math.max(0, Math.round(Number(minimumEdge || 0)));\n    maximumEdge = Math.max(minimumEdge || 1, Math.round(Number(maximumEdge || 6000)));\n    var requiredScale = minimumEdge > 0 ? Math.max(1, minimumEdge / width, minimumEdge / height) : 1;\n    var maximumScale = maximumEdge / Math.max(width, height);\n    var scale = Math.min(requiredScale, maximumScale);\n    if (!Number.isFinite(scale) || scale <= 0) scale = 1;\n    var contentWidth = Math.max(1, Math.min(maximumEdge, Math.ceil(width * scale)));\n    var contentHeight = Math.max(1, Math.min(maximumEdge, Math.ceil(height * scale)));\n    var outputWidth = Math.min(maximumEdge, Math.max(minimumEdge, contentWidth));\n    var outputHeight = Math.min(maximumEdge, Math.max(minimumEdge, contentHeight));\n    return {\n      width: outputWidth,\n      height: outputHeight,\n      content_width: contentWidth,\n      content_height: contentHeight,\n      scale: scale\n    };\n  }\n\n  function cropCanvasBoundsForProduction(sourceCanvas, bounds, minimumEdge, maximumEdge) {\n    var plan = getCanvasMinimumDimensionPlan(bounds.width, bounds.height, minimumEdge, maximumEdge);\n    var scale = Number(plan.scale || 1);\n    var fullWidth = sourceCanvas.width * scale;\n    var fullHeight = sourceCanvas.height * scale;\n    var contentX = Number(bounds.x || 0) * scale;\n    var contentY = Number(bounds.y || 0) * scale;\n    var contentWidth = Number(bounds.width || 0) * scale;\n    var contentHeight = Number(bounds.height || 0) * scale;\n    var clamp = function (value, min, max) { return Math.min(Math.max(value, min), max); };\n    var cropX = clamp(contentX - ((plan.width - contentWidth) / 2), 0, Math.max(0, fullWidth - plan.width));\n    var cropY = clamp(contentY - ((plan.height - contentHeight) / 2), 0, Math.max(0, fullHeight - plan.height));\n    var out = document.createElement('canvas');\n    out.width = plan.width;\n    out.height = plan.height;\n    var outCtx = out.getContext('2d');\n    outCtx.clearRect(0, 0, out.width, out.height);\n    outCtx.imageSmoothingEnabled = true;\n    if ('imageSmoothingQuality' in outCtx) outCtx.imageSmoothingQuality = 'high';\n    outCtx.drawImage(\n      sourceCanvas,\n      cropX / scale, cropY / scale, plan.width / scale, plan.height / scale,\n      0, 0, out.width, out.height\n    );\n    var crop = { x: cropX, y: cropY, width: out.width, height: out.height };\n    return {\n      canvas: out,\n      full_width: fullWidth,\n      full_height: fullHeight,\n      crop: crop,\n      position: getSpreadconnectRelativePositionFromCrop(crop, fullWidth, fullHeight)\n    };\n  }\n\n  async function exportSpreadconnectCompositeAssetForPlacement(placement, template, dState) {\n    if (pbPrivateEnabled()) return (await pbServerExport(placement, template, dState)).composite;\n    // Positioned print types use the v530-compatible alpha crop and an explicit physical\n    // position. Sublimation crops are enlarged uniformly until both PNG dimensions meet the\n    // supplier's 1000 px minimum. Extremely wide or tall artwork is capped at 6000 px and gets\n    // only the transparent padding needed on the short edge. The crop metadata preserves the\n    // customer's exact millimetre placement without submitting the complete blank print-area\n    // canvas, which Spreadconnect can reject with an opaque HTTP 500.\n    var fullCanvas = await renderPrintAreaCanvasForPlacement(template, dState);\n    var bounds = getCanvasAlphaBounds(fullCanvas, 0);\n    if (!bounds) throw new Error(pbT('tryckytan_saknar_synligt_innehall_for_composite_export', 'Tryckytan saknar synligt inneh\u00E5ll f\u00F6r composite-export.'));\n\n    // v589: print type 21 receives no position in the Orders API. Its raster must\n    // therefore retain the complete print area, including transparent margins.\n    // An alpha crop would discard the customer's scale and offset (order #15010).\n    if (String(template && template.print_type_id || '').trim() === '21') {\n      bounds = { x: 0, y: 0, width: fullCanvas.width, height: fullCanvas.height };\n    }\n\n    var prepared = cropCanvasBoundsForProduction(\n      fullCanvas,\n      bounds,\n      getSpreadconnectCompositeMinimumEdge(template),\n      6000\n    );\n    var productionCanvas = prepared.canvas;\n    // v590: a transparent full-area canvas did not preserve the button layout\n    // in supplier preview (#15010 R3). Anchor the complete paper-print raster\n    // with opaque white, so alpha trimming cannot remove its margins. Do this\n    // only on the supplier export; editable layers retain their transparency.\n    if (String(template && template.print_type_id || '').trim() === '21') {\n      var paperCtx = productionCanvas.getContext('2d');\n      paperCtx.save();\n      paperCtx.globalCompositeOperation = 'destination-over';\n      paperCtx.fillStyle = '#ffffff';\n      paperCtx.fillRect(0, 0, productionCanvas.width, productionCanvas.height);\n      paperCtx.restore();\n    }\n    var position = prepared.position;\n    if (!position) throw new Error(pbT('kunde_inte_berakna_composite_position_for_spreadconnect', 'Kunde inte ber\u00E4kna composite-position f\u00F6r Spreadconnect.'));\n    return {\n      placement: placement,\n      object_id: 'composite-' + String(placement || 'printarea'),\n      object_type: 'composite',\n      source_filename: '',\n      data_url: productionCanvas.toDataURL('image/png'),\n      full_width: prepared.full_width,\n      full_height: prepared.full_height,\n      crop: prepared.crop,\n      position: position,\n      submission_mode: 'composite-relative',\n      fulfillment_role: 'composite'\n    };\n  }\n\n  async function exportMockupPngForPlacement(template, dState, previewEdge) {\n    var templateWidth = Math.max(1, Number(template.template_width || 1000));\n    var templateHeight = Math.max(1, Number(template.template_height || 1000));\n    var maxMockupSize = previewEdge === 480 ? 480 : 1400;\n    var ratio = Math.min(maxMockupSize / templateWidth, maxMockupSize / templateHeight, 1);\n    var width = Math.round(templateWidth * ratio);\n    var height = Math.round(templateHeight * ratio);\n\n    var canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n    var ctx = canvas.getContext('2d');\n\n    ctx.fillStyle = template.background_color || '#eeeeee';\n    ctx.fillRect(0, 0, width, height);\n\n    if (template.background_url) {\n      var bg = await loadMockupSourceImage(template.background_url);\n      drawImageCover(ctx, bg, 0, 0, width, height);\n    }\n\n    if (template.image_url) {\n      var productImg = await loadMockupSourceImage(template.image_url);\n      drawImageContain(ctx, productImg, 0, 0, width, height);\n    }\n\n    var paLeft = Number(template.print_area_left || 0) * ratio;\n    var paTop = Number(template.print_area_top || 0) * ratio;\n    var paWidth = Number(template.print_area_width || 0) * ratio;\n    var paHeight = Number(template.print_area_height || 0) * ratio;\n    var mockupTemplate = template;\n    if (pbPrivateEnabled()) {\n      var sourceW = getTemplatePrintFileWidth(template), sourceH = getTemplatePrintFileHeight(template);\n      var previewRatio = Math.min(1, 1400 / Math.max(sourceW, sourceH));\n      mockupTemplate = Object.assign({}, template, { print_file_width: Math.max(1, Math.round(sourceW * previewRatio)), print_file_height: Math.max(1, Math.round(sourceH * previewRatio)) });\n    }\n    var printCanvas = await renderPrintAreaCanvasForPlacement(mockupTemplate, dState, previewEdge === 480 ? Math.max(1, Math.ceil(Math.max(paWidth, paHeight))) : undefined);\n    ctx.drawImage(\n      printCanvas,\n      0, 0, printCanvas.width, printCanvas.height,\n      paLeft, paTop, paWidth, paHeight\n    );\n\n    var result = canvas.toDataURL('image/png');\n    printCanvas.width = 1; printCanvas.height = 1;\n    canvas.width = 1; canvas.height = 1;\n    return result;\n  }\n\n  // Keep the three independent PNG streams moving without flooding Shopify Files.\n  var PB_UPLOAD_CONCURRENCY = 3;\n  var pbUploadActive = 0;\n  var pbUploadQueue = [];\n\n  function pbDrainUploadQueue() {\n    while (pbUploadActive < PB_UPLOAD_CONCURRENCY && pbUploadQueue.length) {\n      var job = pbUploadQueue.shift();\n      pbUploadActive += 1;\n      Promise.resolve().then(job.task).then(job.resolve, job.reject).finally(function () {\n        pbUploadActive -= 1;\n        pbDrainUploadQueue();\n      });\n    }\n  }\n\n  function pbScheduleUpload(task) {\n    return new Promise(function (resolve, reject) {\n      pbUploadQueue.push({ task: task, resolve: resolve, reject: reject });\n      pbDrainUploadQueue();\n    });\n  }\n\n  // Keep compatibility uploads of large PNG bodies serial for this editor.\n  // Ordinary small uploads still use the existing three parallel upload slots.\n  var pbLargePngUploadTail = Promise.resolve();\n  function pbQueueLargePngUpload(task) {\n    var pending = pbLargePngUploadTail.then(task);\n    pbLargePngUploadTail = pending.then(function () {}, function () {});\n    return pending;\n  }\n\n  // Cache only confirmed uploads in this mounted editor, never design/cart writes.\n  // Session + content + purpose prevent reuse after a session or artwork change.\n  // Keep only small response records (no PNG bytes), for at most ten minutes.\n  var pbCompletedUploads = new Map();\n  var pbPendingUploads = new Map();\n  async function pbUploadCacheKey(blob, uploadKind, placement) {\n    if (!window.crypto || !window.crypto.subtle || !blob.arrayBuffer) return '';\n    try {\n      var bytes = await blob.arrayBuffer();\n      var digest = await window.crypto.subtle.digest('SHA-256', bytes);\n      return [pbSession && pbSession.token || '', state.projectId || '', uploadKind || 'design', placement || '',\n        Array.from(new Uint8Array(digest), function (b) { return b.toString(16).padStart(2, '0'); }).join('')].join('|');\n    } catch (_) { return ''; } // Older browsers can still upload normally.\n  }\n\n  function uploadImageFile(dataUrl, filename, uploadKind, placement) {\n    if (pbPrivateEnabled() && dataUrl && dataUrl.pb_preuploaded) return Promise.resolve(Object.assign({}, dataUrl.pb_preuploaded));\n    return pbScheduleUpload(async function () {\n      var blob = await dataUrlToBlob(dataUrl);\n      if (blob.type !== 'image/png' || !blob.size) throw new Error(pbT('bildfilen_maste_vara_en_png', 'Bildfilen m\u00E5ste vara en PNG.'));\n      await pbEnsureSession();\n      var cacheKey = await pbUploadCacheKey(blob, uploadKind, placement);\n      var now = Date.now();\n      pbCompletedUploads.forEach(function (entry, key) {\n        if (entry.expiresAt <= now) pbCompletedUploads.delete(key);\n      });\n      var cached = cacheKey && pbCompletedUploads.get(cacheKey);\n      if (cached) return Object.assign({}, cached.body);\n      // Editor and production PNGs can be byte-identical for a single motif.\n      // Share only the file response; callers retain their own role/geometry.\n      var pending = cacheKey && pbPendingUploads.get(cacheKey);\n      if (pending) return Object.assign({}, await pending);\n      var task = (async function () {\n        if (blob.size > 64 * 1024 * 1024) throw new Error(pbT('bildfil_for_stor', 'Filen \u00E4r f\u00F6r stor.'));\n        var sendPng = function () { return pbJsonRequest(workerUrl + '/api/designs?upload_kind=' + encodeURIComponent(uploadKind || 'design') + (blob.size > 9 * 1024 * 1024 ? '&server_compress=1' : ''), {\n          method: 'POST', headers: { 'Content-Type': 'image/png' }, body: blob\n        }, 120000, true,\n          pbT('bilduppladdningen_tog_for_lang_tid', 'Bilden kunde inte laddas upp i tid. Din design finns kvar. Kontrollera anslutningen och f\u00F6rs\u00F6k igen.')); };\n        var result = await (blob.size > 9 * 1024 * 1024 ? pbQueueLargePngUpload(sendPng) : sendPng());\n        var body = result.data;\n        if (!result.ok || !body.ok) throw new Error(pbTranslatedError(body.error) || pbT('kunde_inte_spara_bildfilen', 'Kunde inte spara bildfilen.'));\n        if (cacheKey && body.file_id && (body.print_file_url || body.preview_url)) {\n          while (pbCompletedUploads.size >= 32) pbCompletedUploads.delete(pbCompletedUploads.keys().next().value);\n          pbCompletedUploads.set(cacheKey, { body: Object.assign({}, body), expiresAt: Date.now() + 10 * 60 * 1000 });\n        }\n        return body;\n      })();\n      if (cacheKey) pbPendingUploads.set(cacheKey, task);\n      try { return Object.assign({}, await task); }\n      finally {\n        if (cacheKey && pbPendingUploads.get(cacheKey) === task) pbPendingUploads.delete(cacheKey);\n      }\n    });\n  }\n\n  function makeDesignJsonForPlacement(placement, template, dState) {\n    return {\n      placement: placement,\n      label: getPlacementLabel(placement),\n      type: dState.designType,\n      text: dState.designType === 'text' ? dState.text : '',\n      x_pct: round(dState.design.x),\n      y_pct: round(dState.design.y),\n      w_pct: round(dState.design.w),\n      h_pct: round(dState.design.h),\n      rotation: Number(dState.design.rotation || 0),\n      image_natural_width: Number(dState.imageNaturalWidth || 0),\n      image_natural_height: Number(dState.imageNaturalHeight || 0),\n      source_filename: dState.sourceFileName || '',\n      image_layers: (dState.imageLayers || []).filter(function(layer) { return !layer.pbUploadPending; }).map(function (layer) {\n        return {\n          id: layer.id,\n          type: layer.type || 'image',\n          text: layer.type === 'text' ? (layer.text || '') : '',\n          font_family: layer.fontFamily || '',\n          color: layer.color || '',\n          font_weight: layer.fontWeight || '400',\n          bold_ranges: layer.type === 'text' ? getTextLayerBoldRanges(layer).map(function (range) { return [range.start, range.end]; }) : [],\n          font_style: layer.fontStyle || 'normal',\n          align: layer.align || 'center',\n          font_size: Number(layer.fontSize || 96),\n          font_size_pt: Number(textInternalPxToPoints(layer.fontSize, template).toFixed(2)),\n          curve: Number(layer.curve || 0),\n          outline: layer.outline || 'none',\n          outline_size: Number(layer.outlineSize || 6),\n          letter_spacing: Number(layer.letterSpacing || 100),\n          locked: Boolean(layer.locked),\n          flip_x: Boolean(layer.flipX),\n          uppercase: layer.uppercase !== false,\n          source_filename: layer.sourceFileName || '',\n          x_pct: round(layer.x),\n          y_pct: round(layer.y),\n          w_pct: round(layer.w),\n          h_pct: round(layer.h),\n          rotation: Number(layer.rotation || 0),\n          image_natural_width: Number(layer.naturalWidth || 0),\n          image_natural_height: Number(layer.naturalHeight || 0)\n        };\n      }),\n      template_index: template ? template.index : null,\n      print_area: template ? {\n        width: getTemplatePrintFileWidth(template),\n        height: getTemplatePrintFileHeight(template),\n        dpi: getTemplatePrintFileDpi(template),\n        preview_width: template.print_area_width,\n        preview_height: template.print_area_height,\n        preview_left: template.print_area_left,\n        preview_top: template.print_area_top,\n        production_area: template.production_area,\n        physical_width_mm: Number(template.physical_width_mm || 0),\n        physical_height_mm: Number(template.physical_height_mm || 0),\n        print_area_id: template.print_area_id || '',\n        placement_source: template.placement_source || ''\n      } : null\n    };\n  }\n\n  function syncPlacementDesignOrder() {\n    var currentlyUsed = state.placements.filter(function (placement) {\n      var d = getDesignState(placement, false);\n      return hasDesignContent(d) && (state.templatesByPlacement[placement] || selectLocalTemplate(placement));\n    });\n\n    var usedMap = {};\n    currentlyUsed.forEach(function (placement) {\n      usedMap[String(placement)] = true;\n    });\n\n    // If a print area is emptied completely, remove it from the active order.\n    state.placementDesignOrder = (state.placementDesignOrder || []).filter(function (placement) {\n      return Boolean(usedMap[String(placement)]);\n    });\n\n    // New areas are appended the first time they contain real customer design content.\n    // renderPlacements() runs immediately after the normal add/edit actions, so this\n    // records the actual order the customer starts using the areas in.\n    currentlyUsed.forEach(function (placement) {\n      if (state.placementDesignOrder.indexOf(placement) === -1) {\n        state.placementDesignOrder.push(placement);\n      }\n    });\n\n    return state.placementDesignOrder.slice();\n  }\n\n  function getUsedPlacements() {\n    return syncPlacementDesignOrder().filter(function (placement) {\n      return state.templatesByPlacement[placement] || selectLocalTemplate(placement);\n    });\n  }\n\n  function hasDesignContent(dState) {\n    if (!dState) return false;\n    if ((dState.imageLayers || []).length > 0) return true;\n    if (!dState.touched) return false;\n    if (dState.designType === 'image') return Boolean(dState.imageDataUrl);\n    return Boolean(String(dState.text || '').trim());\n  }\n\n  function updateMobileEmptyActions() {\n    if (!els.mobileEmptyActions) return;\n\n    // Keep the empty-state actions visible for the currently selected print area\n    // until that specific print area actually contains design content.\n    // Content on another placement must not hide these actions.\n    var activeDesignState = getDesignState(state.activePlacement, false);\n    var hasDesignInActivePrintArea = hasDesignContent(activeDesignState);\n\n    els.mobileEmptyActions.hidden = hasDesignInActivePrintArea;\n\n    // v237: print-area dimensions must never hide the actions.\n    root.classList.remove('is-mobile-empty-actions-hidden-small-printfield');\n  }\n\n    function clearStatusIfDesignExists() {\n    if (!els.status) return;\n    var hasAnyDesign = state.placements.some(function (placement) {\n      return hasDesignContent(getDesignState(placement, false));\n    });\n\n    if (hasAnyDesign) {\n      setStatus('', false);\n    }\n  }\n\n  function getSelectedCartVariants() {\n    var variantsById = {};\n    (state.product?.variants || []).forEach(function (variant) {\n      variantsById[String(variant.id)] = variant;\n    });\n\n    return Object.keys(state.quantities).map(function (id) {\n      return { variant: variantsById[id], quantity: Math.max(0, Math.floor(Number(state.quantities[id] || 0))) };\n    }).filter(function (entry) {\n      return entry.variant && entry.quantity > 0;\n    });\n  }\n\n  function getVariantsForActiveColor() {\n    var variants = (state.product?.variants || []).filter(function (variant) {\n      return getVariantColor(variant) === state.activeColor;\n    });\n\n    if (!variants.length) variants = state.product?.variants || [];\n\n    return variants.slice().sort(function (a, b) {\n      return getSizeRank(getVariantSize(a)) - getSizeRank(getVariantSize(b));\n    });\n  }\n\n  function getVariantOptions(variant) {\n    if (Array.isArray(variant?.options)) return variant.options;\n    return [variant?.option1, variant?.option2, variant?.option3].filter(function (value) { return value !== null && value !== undefined; });\n  }\n\n  function getVariantColor(variant) {\n    var options = getVariantOptions(variant);\n    if (state.colorOptionIndex >= 0 && options[state.colorOptionIndex]) return String(options[state.colorOptionIndex]);\n    return pbT('standard', 'Standard');\n  }\n\n  function getVariantSize(variant) {\n    var options = getVariantOptions(variant);\n    if (state.sizeOptionIndex >= 0 && options[state.sizeOptionIndex]) return String(options[state.sizeOptionIndex]);\n    if (variant?.title && variant.title !== 'Default Title') return String(variant.title);\n    return 'One Size';\n  }\n\n  function getVariantImage(variant) {\n    return variant?.featured_image?.src || variant?.featured_media?.preview_image?.src || '';\n  }\n\n  function getProductImage() {\n    return state.product?.featured_image || state.product?.images?.[0] || '';\n  }\n\n\n  function getPlacementLabel(placement) {\n    var key = String(placement || '').toLowerCase();\n    var map = {\n      front: pbT('fram', 'Fram'),\n      back: pbT('bak', 'Bak'),\n      left: pbT('vanster', 'V\u00E4nster'),\n      right: pbT('hoger', 'H\u00F6ger'),\n      sleeve_left: pbT('vanster_arm', 'V\u00E4nster \u00E4rm'),\n      sleeve_right: pbT('hoger_arm', 'H\u00F6ger \u00E4rm'),\n      hood_left: pbT('vanster_huva', 'V\u00E4nster huva'),\n      hood_right: pbT('hoger_huva', 'H\u00F6ger huva'),\n      neck_inner: pbT('nacketikett_insida', 'Nacketikett insida'),\n      neck_outer: pbT('nacketikett_utsida', 'Nacketikett utsida'),\n      embroidery_front: pbT('fram', 'Fram'),\n      embroidery_back: pbT('bak', 'Bak'),\n      embroidery_left: pbT('vanster', 'V\u00E4nster'),\n      embroidery_right: pbT('hoger', 'H\u00F6ger')\n    };\n    return map[key] || key.replace(/_/g, ' ').replace(/^./, function (c) { return c.toUpperCase(); });\n  }\n\n\n  function buildCheckoutPrintAreaProperties(uploadedPlacements) {\n    var result = {};\n    var firstPlacement = (uploadedPlacements || []).find(function (entry) {\n      return entry && entry.placement;\n    });\n\n    if (!firstPlacement) return result;\n\n    var label = getCartPlacementLabel(firstPlacement.placement);\n    if (!label) return result;\n\n    // Public Shopify property. uploadedPlacements is already sorted by the order\n    // the customer started designing the areas, so this is the included first area.\n    result[pbT('tryck', 'Tryck')] = label;\n    return result;\n  }\n\n  // Customer-facing cart/checkout wording. Keep the shorter labels in the designer\n  // thumbnails, but use full placement names when confirming what the customer buys.\n  function getCartPlacementLabel(placement) {\n    var key = String(placement || '').toLowerCase();\n    var map = {\n      front: pbT('framsida', 'Framsida'),\n      back: pbT('baksida', 'Baksida'),\n      left: pbT('vanster_sida', 'V\u00E4nster sida'),\n      right: pbT('hoger_sida', 'H\u00F6ger sida'),\n      sleeve_left: pbT('vanster_arm', 'V\u00E4nster \u00E4rm'),\n      sleeve_right: pbT('hoger_arm', 'H\u00F6ger \u00E4rm'),\n      hood_left: pbT('vanster_huva', 'V\u00E4nster huva'),\n      hood_right: pbT('hoger_huva', 'H\u00F6ger huva'),\n      neck_inner: pbT('nacketikett_insida', 'Nacketikett insida'),\n      neck_outer: pbT('nacketikett_utsida', 'Nacketikett utsida'),\n      embroidery_front: pbT('framsida', 'Framsida'),\n      embroidery_back: pbT('baksida', 'Baksida'),\n      embroidery_left: pbT('vanster_sida', 'V\u00E4nster sida'),\n      embroidery_right: pbT('hoger_sida', 'H\u00F6ger sida')\n    };\n    return map[key] || getPlacementLabel(placement);\n  }\n\n  function makePlacementFilename(placement, kind) {\n    var product = String(state.product?.title || state.handle || 'printbolt').toLowerCase()\n      .replace(/\u00E5/g, 'a').replace(/\u00E4/g, 'a').replace(/\u00F6/g, 'o')\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-+|-+$/g, '')\n      .slice(0, 38) || 'printbolt';\n    var cleanPlacement = String(placement || 'front').replace(/[^a-zA-Z0-9_-]+/g, '-');\n    return product + '-' + cleanPlacement + '-' + (kind || 'file') + '-' + state.projectId.slice(-6) + '.png';\n  }\n\n\n  async function drawImageLayersToCanvas(ctx, dState, areaWidth, areaHeight, offsetX, offsetY) {\n    offsetX = Number(offsetX || 0);\n    offsetY = Number(offsetY || 0);\n\n    var layers = dState.imageLayers || [];\n    for (var i = 0; i < layers.length; i++) {\n      var layer = layers[i];\n      var x = offsetX + (Number(layer.x || 0) / 100) * areaWidth;\n      var y = offsetY + (Number(layer.y || 0) / 100) * areaHeight;\n      var w = (Number(layer.w || 0) / 100) * areaWidth;\n      var h = (Number(layer.h || 0) / 100) * areaHeight;\n\n      if ((layer.type || 'image') === 'text') {\n        if (!String(layer.text || '').trim()) continue;\n        await ensureDesignerFontReadyByFamily(layer.fontFamily || '');\n        var embeddedFontCss = await getEmbeddedFontCssForFamily(layer.fontFamily || '');\n        var textImg = await loadImage(getTextLayerSvgDataUrl(layer, embeddedFontCss));\n        drawRotatedImageContain(ctx, textImg, x, y, w, h, Number(layer.rotation || 0), Boolean(layer.flipX));\n        continue;\n      }\n\n      if (!layer.imageDataUrl) continue;\n      var img = await loadImage(layer.imageDataUrl);\n      drawRotatedImageContain(ctx, img, x, y, w, h, Number(layer.rotation || 0), Boolean(layer.flipX));\n    }\n  }\n\n  function drawRotatedImageContain(ctx, img, x, y, w, h, rotation, flipX) {\n    ctx.save();\n    var cx = x + w / 2;\n    var cy = y + h / 2;\n    ctx.translate(cx, cy);\n    ctx.rotate((Number(rotation || 0) * Math.PI) / 180);\n    if (flipX) ctx.scale(-1, 1);\n    drawImageContain(ctx, img, -w / 2, -h / 2, w, h);\n    ctx.restore();\n  }\n\n  function drawRotatedTextFit(ctx, text, x, y, w, h, rotation, options) {\n    ctx.save();\n    var cx = x + w / 2;\n    var cy = y + h / 2;\n    ctx.translate(cx, cy);\n    ctx.rotate((Number(rotation || 0) * Math.PI) / 180);\n    drawTextFit(ctx, text, -w / 2, -h / 2, w, h, options);\n    ctx.restore();\n  }\n\n  function drawTextFit(ctx, text, x, y, w, h, options) {\n    ctx.save();\n    options = options || {};\n    ctx.fillStyle = options.color || '#ffffff';\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n\n    var lines = String(text || '').replace(/\\r/g, '').split('\\n').filter(function (line, _index, arr) {\n      return line.length > 0 || arr.length === 1;\n    });\n    if (!lines.length) lines = [''];\n\n    var size = Math.floor(h / Math.max(1.25, lines.length * 1.08));\n    var fontWeight = options.fontWeight || '900';\n    var fontFamily = options.fontFamily || 'Arial, Helvetica, sans-serif';\n    ctx.font = fontWeight + ' ' + size + 'px ' + fontFamily;\n\n    function maxLineWidth() {\n      var max = 0;\n      for (var i = 0; i < lines.length; i++) {\n        var measureText = options.uppercase === false ? String(lines[i] || '') : String(lines[i] || '').toUpperCase();\n        max = Math.max(max, ctx.measureText(measureText).width);\n      }\n      return max;\n    }\n\n    while (size > 12 && (maxLineWidth() > w * 0.92 || (size * lines.length * 1.1) > h * 0.92)) {\n      size -= 2;\n      var fontWeight = options.fontWeight || '900';\n    var fontFamily = options.fontFamily || 'Arial, Helvetica, sans-serif';\n    ctx.font = fontWeight + ' ' + size + 'px ' + fontFamily;\n    }\n\n    var lineHeight = size * 1.08;\n    var totalHeight = lineHeight * lines.length;\n    var startY = y + (h / 2) - (totalHeight / 2) + (lineHeight / 2);\n\n    for (var j = 0; j < lines.length; j++) {\n      var drawLine = options.uppercase === false ? String(lines[j] || '') : String(lines[j] || '').toUpperCase();\n      ctx.fillText(drawLine, x + w / 2, startY + j * lineHeight);\n    }\n    ctx.restore();\n  }\n\n  function drawImageContain(ctx, img, x, y, w, h) {\n    var ratio = Math.min(w / img.width, h / img.height);\n    var dw = img.width * ratio;\n    var dh = img.height * ratio;\n    ctx.drawImage(img, x + (w - dw) / 2, y + (h - dh) / 2, dw, dh);\n  }\n\n  function drawImageCover(ctx, img, x, y, w, h) {\n    var ratio = Math.max(w / img.width, h / img.height);\n    var dw = img.width * ratio;\n    var dh = img.height * ratio;\n    ctx.drawImage(img, x + (w - dw) / 2, y + (h - dh) / 2, dw, dh);\n  }\n\n  function makeMockupSafeImageUrl(src) {\n    var raw = String(src || '').trim();\n    if (!raw) return raw;\n\n    try {\n      var parsed = new URL(raw, state.designerPageUrl || window.location.href);\n      var host = String(parsed.hostname || '').toLowerCase();\n      var isSpreadconnectImage =\n        host === 'image.spreadshirtmedia.net' ||\n        host.endsWith('.spreadshirtmedia.net') ||\n        host === 'image.spreadshirtmedia.com' ||\n        host.endsWith('.spreadshirtmedia.com');\n\n      if (isSpreadconnectImage) {\n        return workerUrl + '/api/printbolt/image-proxy?src=' + encodeURIComponent(parsed.href);\n      }\n    } catch (_) {}\n\n    return raw;\n  }\n\n  async function loadMockupSourceImage(src) {\n    var safeSrc = makeMockupSafeImageUrl(src);\n    if (!safeSrc) throw new Error(pbT('mockupbild_saknar_url', 'Mockupbild saknar URL.'));\n    return loadImage(safeSrc, true);\n  }\n\n  function loadImage(src, useCors) {\n    return new Promise(function (resolve, reject) {\n      var img = new Image();\n      if (useCors) img.crossOrigin = 'anonymous';\n      img.onload = function () { resolve(img); };\n      img.onerror = function () { reject(new Error(pbT('kunde_inte_ladda_bild', 'Kunde inte ladda bild: ') + src)); };\n      img.src = src;\n    });\n  }\n\n  function formatMoney(cents) {\n    var value = Number(cents || 0) / 100;\n    var currency = String(state.currency || (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'SEK').toUpperCase();\n    var locale = pbLocale;\n\n    try {\n      return new Intl.NumberFormat(locale, {\n        style: 'currency',\n        currency: currency,\n        currencyDisplay: 'symbol'\n      }).format(value);\n    } catch (error) {\n      return value.toLocaleString('sv-SE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' ' + currency;\n    }\n  }\n\n  function getSizeRank(size) {\n    var normalized = String(size || '').toUpperCase().replace(/\\s+/g, '');\n    var order = ['XXS', 'XS', 'S', 'M', 'L', 'XL', '2XL', 'XXL', '3XL', 'XXXL', '4XL', 'XXXXL', '5XL'];\n    var idx = order.indexOf(normalized);\n    return idx >= 0 ? idx : 999;\n  }\n\n  function clamp(value, min, max) {\n    return Math.min(max, Math.max(min, Number(value) || 0));\n  }\n\n  function round(value) {\n    return Math.round(Number(value) * 100) / 100;\n  }\n\n  function makeProjectId() {\n    if (crypto && crypto.randomUUID) return crypto.randomUUID();\n    return 'pb-' + Date.now() + '-' + Math.random().toString(16).slice(2);\n  }\n\n  \n  var pbLoadFailure = { active: false, busy: false, until: 0, retried: false, error: null, operation: null, resolve: null, panel: null, timer: null, disposed: false, inert: new Map() };\n\n  function pbFailureText(node, text) {\n    if (node.textContent !== text) node.textContent = text;\n  }\n\n  function pbCreateFailurePanel() {\n    if (pbLoadFailure.panel) return;\n    var panel = document.createElement('section');\n    panel.className = 'pb-recovery';\n    panel.setAttribute('aria-label', 'Designverktygets status');\n    panel.innerHTML = '<div><p data-pb-outage hidden>Tillf\u00E4llig driftst\u00F6rning</p><h2 tabindex=\"-1\">Designverktyget kan inte laddas just nu</h2><p data-pb-failure-message role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"></p><button type=\"button\">F\u00F6rs\u00F6k igen</button><p data-pb-countdown role=\"timer\" aria-live=\"off\"></p></div>';\n    var style = document.createElement('style');\n    style.textContent = '.pb-customizer.pb-customizer[data-pb-load-failed=\"true\"]{position:relative!important;display:grid!important;place-items:center!important;min-height:65vh!important;height:auto!important;padding:32px 20px!important;box-sizing:border-box!important;background:#f4f4f2!important;overflow:auto!important}.pb-customizer.pb-customizer[data-pb-load-failed=\"true\"]::before{display:none!important}.pb-customizer.pb-customizer[data-pb-load-failed=\"true\"]>*:not(.pb-recovery){display:none!important}.pb-customizer.pb-customizer[data-pb-load-failed=\"true\"]>.pb-recovery{display:block!important;position:relative!important;visibility:visible!important;opacity:1!important;pointer-events:auto!important;width:100%;max-width:480px;padding:36px 20px;box-sizing:border-box;text-align:center;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;color:#111827}.pb-customizer>.pb-recovery[hidden],.pb-recovery [hidden]{display:none!important}.pb-recovery h2{font-size:clamp(23px,4vw,30px);line-height:1.25;margin:0 0 16px}.pb-recovery p{font-size:15px;line-height:1.6;margin:12px 0}.pb-recovery button{display:block;margin:24px auto 0;padding:13px 24px;min-height:48px;background:#111827;color:#fff;border:1px solid #111827;border-radius:6px;font-family:inherit;font-size:15px;font-weight:600;line-height:1.4;cursor:pointer}.pb-recovery button:disabled{opacity:.5;cursor:wait}.pb-recovery :focus-visible{outline:3px solid #315cc8;outline-offset:4px}.pb-recovery [data-pb-outage]{font-weight:600;color:#795411}.pb-recovery [data-pb-countdown]{min-height:24px;font-size:13px}@media(max-width:749px){.pb-customizer.pb-customizer[data-pb-load-failed=\"true\"]{min-height:100dvh!important}.pb-customizer.pb-customizer[data-pb-load-failed=\"true\"]>.pb-recovery{padding:24px 4px}}';\n    document.head.appendChild(style);\n    root.appendChild(panel);\n    pbLoadFailure.panel = panel;\n    panel.querySelector('button').addEventListener('click', pbRetryFailedLoad);\n    root.addEventListener('click', function (event) {\n      if (pbLoadFailure.active && !panel.contains(event.target)) { event.preventDefault(); event.stopImmediatePropagation(); }\n    }, true);\n    window.addEventListener('pagehide', function (event) {\n      if (!event.persisted) { pbLoadFailure.disposed = true; clearInterval(pbLoadFailure.timer); }\n    });\n  }\n\n  function pbRenderLoadFailure() {\n    if (!pbLoadFailure.active || pbLoadFailure.disposed || !root.isConnected) return;\n    var panel = pbLoadFailure.panel;\n    var error = pbLoadFailure.error || {};\n    var seconds = Math.max(0, Math.ceil((pbLoadFailure.until - Date.now()) / 1000));\n    panel.querySelector('[data-pb-outage]').hidden = !error.pbServiceUnavailable;\n    pbFailureText(panel.querySelector('[data-pb-failure-message]'), pbLoadFailure.busy ? 'F\u00F6rs\u00F6ker igen\u2026' : pbLoadFailure.retried ? 'Det fungerar fortfarande inte. F\u00F6rs\u00F6k igen vid ett senare tillf\u00E4lle.' : error.pbUnsupported ? 'Den h\u00E4r produkten saknar en verifierad tryckyta. V\u00E4lj en annan produkt.' : error.pbServiceUnavailable ? 'Vi har just nu tekniska problem med designverktyget. V\u00E4nligen f\u00F6rs\u00F6k igen senare.' : 'Designverktyget kunde inte startas. V\u00E4nligen f\u00F6rs\u00F6k igen senare.');\n    var countdown = panel.querySelector('[data-pb-countdown]');\n    countdown.id = 'pb-retry-countdown-' + root.id;\n    pbFailureText(countdown, seconds ? 'Du kan f\u00F6rs\u00F6ka igen om ' + seconds + ' sekunder.' : pbLoadFailure.busy ? 'F\u00F6rs\u00F6ket p\u00E5g\u00E5r\u2026' : '');\n    var button = panel.querySelector('button');\n    button.setAttribute('aria-describedby', countdown.id);\n    button.disabled = pbLoadFailure.busy || seconds > 0;\n  }\n\n  function pbShowLoadFailure(error, operation, resolve) {\n    if (pbLoadFailure.disposed || !root.isConnected) return;\n    pbCreateFailurePanel();\n    pbLoadFailure.active = true;\n    pbLoadFailure.error = error;\n    pbLoadFailure.operation = operation;\n    pbLoadFailure.resolve = resolve || null;\n    pbLoadFailure.retried = false;\n    root.dataset.pbLoadFailed = 'true';\n    pbLoadFailure.panel.hidden = false;\n    Array.from(root.children).forEach(function (child) {\n      if (child === pbLoadFailure.panel || child.tagName === 'SCRIPT' || child.tagName === 'STYLE') return;\n      if (!pbLoadFailure.inert.has(child)) pbLoadFailure.inert.set(child, child.inert);\n      child.inert = true;\n    });\n    pbRenderLoadFailure();\n    clearInterval(pbLoadFailure.timer);\n    pbLoadFailure.timer = setInterval(function () {\n      if (!root.isConnected || pbLoadFailure.disposed) { clearInterval(pbLoadFailure.timer); return; }\n      pbRenderLoadFailure();\n    }, 250);\n    pbLoadFailure.panel.querySelector('h2').focus({ preventScroll: true });\n  }\n\n  function pbClearLoadFailure() {\n    var hadFocus = pbLoadFailure.panel && pbLoadFailure.panel.contains(document.activeElement);\n    pbLoadFailure.active = false;\n    pbLoadFailure.error = null;\n    pbLoadFailure.retried = false;\n    delete root.dataset.pbLoadFailed;\n    if (pbLoadFailure.panel) pbLoadFailure.panel.hidden = true;\n    pbLoadFailure.inert.forEach(function (inert, child) { child.inert = inert; });\n    pbLoadFailure.inert.clear();\n    clearInterval(pbLoadFailure.timer);\n    if (hadFocus) { root.setAttribute('tabindex', '-1'); root.focus({ preventScroll: true }); }\n  }\n\n  async function pbRetryFailedLoad() {\n    if (!pbLoadFailure.active || pbLoadFailure.busy || pbLoadFailure.disposed || Date.now() < pbLoadFailure.until) return;\n    pbLoadFailure.busy = true;\n    pbLoadFailure.retried = true;\n    pbLoadFailure.until = Date.now() + 15000;\n    pbRenderLoadFailure();\n    try {\n      await pbLoadFailure.operation();\n      if (pbLoadFailure.disposed || !root.isConnected) return;\n      var resume = pbLoadFailure.resolve;\n      if (resume) { pbLoadFailure.resolve = null; pbClearLoadFailure(); resume(); }\n    } catch (error) {\n      if (pbLoadFailure.disposed || !root.isConnected) return;\n      pbLoadFailure.error = error;\n    } finally {\n      pbLoadFailure.busy = false;\n      pbRenderLoadFailure();\n    }\n  }\n\n  function pbShowCriticalBootFailure(error) {\n    // This handler is called only by the existing terminal boot catch.\n    // A rejected boot cannot produce a usable editor, regardless of which\n    // required dependency failed. Never invoke it for an intermediate retry.\n    if (!error || typeof error !== 'object') error = new Error(String(error || 'Designer unavailable'));\n    var key = 'pb-designer-boot-retry:' + window.location.pathname + window.location.search;\n    try {\n      var lastAttempt = Number(sessionStorage.getItem(key) || 0);\n      pbLoadFailure.until = Math.max(pbLoadFailure.until, lastAttempt + 15000);\n    } catch (_) {}\n    pbShowLoadFailure(error, function () {\n      try { sessionStorage.setItem(key, String(Date.now())); } catch (_) {}\n      window.location.reload();\n      return new Promise(function () {});\n    });\n    if (lastAttempt && Date.now() - lastAttempt < 300000) { pbLoadFailure.retried = true; pbRenderLoadFailure(); }\n    return true;\n  }\n\n  function pbDependencyError(error, status) {\n    error.pbServiceUnavailable = [500, 502, 503, 504].includes(status);\n    return error;\n  }\n\n  function pbCriticalTemplateError(error, status) {\n    error.pbCriticalTemplate = true;\n    error.pbServiceUnavailable = [500, 502, 503, 504].includes(status);\n    return error;\n  }\n\n  boot().catch(function (error) {\n    if (pbShowCriticalBootFailure(error)) return;\n    if (root) root.classList.remove('is-initializing');\n    setLoading(false);\n    setStageLoading(false);\n    setStatus(error.message || String(error), true);\n    if (els.status) {\n      var retry = document.createElement('button');\n      retry.type = 'button'; retry.className = 'pb-btn pb-btn--secondary';\n      retry.textContent = pbT('aterhamtning_ladda_om', 'F\u00F6rs\u00F6k igen');\n      retry.addEventListener('click', function() { window.location.reload(); });\n      els.status.appendChild(retry);\n    }\n  });\n  }\n\n  function bootAllPrintboltDesigners() {\n    document.querySelectorAll('.pb-customizer').forEach(mountPrintboltDesigner);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', bootAllPrintboltDesigners);\n  } else {\n    bootAllPrintboltDesigners();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["url", "layer", "child", "getPlacementNavigationTarget", "setMobileAddPressing", "toHex", "history", "round", "clamp"]
}
