{
  "version": 3,
  "sources": ["/cdn/shop/t/7/assets/hd-canvas.js?cb=20261025b"],
  "sourcesContent": ["(function(){\n// \u9632\u5FA1\u6027\u542F\u52A8\uFF1A\u524D\u9762\u4EFB\u4F55\u811A\u672C\u629B\u9519\u90FD\u88AB\u5168\u5C40 onerror \u541E\u6389\uFF0C\u4FDD\u8BC1 design-canvas \u4ECD\u80FD\u542F\u52A8\u3002\n// params \u63D0\u524D\u5EFA\u597D\uFF0C\u907F\u514D\u4E0B\u6E38 ReferenceError\uFF082026-08-17 \u5B9E\u9645\u51FA\u73B0\u8FC7 params is not defined\uFF0C\u6E90\u4E8E\u65E7\u7F13\u5B58\u9875\u9762\uFF09\u3002\ntry {\n  window.__pfmParams = new URLSearchParams(location.search);\n  window.addEventListener('error', function(ev){\n    // Log but do not let one rogue error block the rest of the page.\n    if (ev && ev.error) console.warn('[pfm] swallowed error:', ev.error.message || ev.message);\n    return true; // suppress default\n  });\n  window.onerror = function(msg, src, line, col, err){\n    console.warn('[pfm] onerror:', msg, '@', line+':'+col);\n    return true; // swallow so other init code keeps running\n  };\n} catch(_){}\n// 2026-08-18: Bridge URL \u53EF\u7531\u4E3B\u9898\u7F16\u8F91\u5668\u914D\u7F6E\uFF08schema bridge_url\uFF09\uFF0C\u672A\u8BBE\u5219\u56DE\u843D\u751F\u4EA7\u5730\u5740\u3002\n// 2026-08-19: params \u63D0\u5347\u4E3A\u9876\u5C42 var\uFF08\u66FE\u56E0 IIFE \u5185 var \u4E0D\u53EF\u89C1\u5BFC\u81F4 ReferenceError\uFF09\u3002\nvar B=(window.__hdBridgeFallback||'https://bridge.highdeep.net'),canvas,product,undoStack=[],redoStack=[],showGrid=true,currentPlacement='front',currentTech='DTG',params=window.__pfmParams||new URLSearchParams(location.search);\n\n/* 2026-10-12\uFF08\u7532 \u00B7 \u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u6D4F\u89C8\u5668\u7FFB\u8BD1\u515C\u5E95 \u2014\u2014 \u529F\u80FD\u6309\u94AE\u7EDF\u4E00 document \u7EA7\u4E8B\u4EF6\u59D4\u6258\uFF08\u5168\u5C40\u5355\u4F8B\uFF09\u3002\n   \uD83D\uDD34 \u6839\u56E0\uFF1A\u7FFB\u8BD1\u5F15\u64CE\uFF08Chrome/Google \u53CA\u540C\u7C7B\uFF09\u628A\u6587\u672C\u8282\u70B9\u5305\u8FDB <font>\u3001\u5E76\u91CD\u65B0\u89E3\u6790/\u514B\u9686\u88AB\u7FFB\u8BD1\u6807\u7B7E\u4E0A\u7684\n      \u76D1\u542C\u5668 \u21D2 \u76F4\u63A5 addEventListener \u7684\u6309\u94AE\uFF08\u64A4\u9500 / \u91CD\u505A / Buy it now\u2026\uFF09\u4F1A\u4E22\u76D1\u542C\u5668 \u21D2 \u70B9\u4E86\u6CA1\u53CD\u5E94\u3002\n   \u21D2 \u59D4\u6258\u6302\u5728 document\uFF0C\u7528 e.composedPath() \u4ECE\u70B9\u51FB\u70B9\u5411\u5916\u627E\u5E26 id \u7684\u5143\u7D20\n      \u21D2 \u4E2D\u95F4\u88AB\u585E\u591A\u5C11 <font>\u3001\u6309\u94AE\u662F\u5426\u88AB\u91CD\u6392\u90FD\u4E0D\u5F71\u54CD \u21D2 \u4E0E\u662F\u5426\u7FFB\u8BD1\u65E0\u5173\u3002\n   \u26A0\uFE0F \u540C\u4E00 id \u53EF\u7ED1\u591A\u4E2A handler\uFF08\u7B49\u4EF7\u300C\u4E00\u4E2A\u5143\u7D20\u6302\u591A\u4E2A listener\u300D\uFF09\uFF1Bhandler \u7684 this = \u547D\u4E2D\u5143\u7D20\u3002\n   \u26A0\uFE0F \u5E42\u7B49\u5355\u4F8B\uFF1Adesign-canvas \u4E0E main-product \u5404\u5E26\u4E00\u4EFD\uFF0C\u8FD0\u884C\u65F6\u53EA\u751F\u6548\u4E00\u4EFD\uFF08\u6539\u5219\u540C\u6539\uFF0C\u7981\u4E0D\u4E00\u81F4\uFF09\u3002 */\n(function(){\n  if(window.__hdAct) return;\n  var M={};\n  function find(e){\n    var p=(e.composedPath&&e.composedPath())||[],i,n;\n    for(i=0;i<p.length;i++){ n=p[i]; if(n&&n.id&&M[n.id]) return n; }\n    var t=e.target;                          /* \u65E7\u5185\u6838\u65E0 composedPath \u65F6\u7528 parentNode \u515C\u5E95 */\n    while(t){ if(t.id&&M[t.id]) return t; t=t.parentNode; }\n    return null;\n  }\n  document.addEventListener('click',function(e){\n    var n=find(e); if(!n) return;\n    var a=M[n.id];\n    for(var i=0;i<a.length;i++){ try{ a[i].call(n,e,n); }catch(err){ console.warn('[hdAct] '+n.id,err&&err.message); } }\n  });\n  window.__hdAct={ bind:function(id,fn){ (M[id]||(M[id]=[])).push(fn); } };\n})();\n\n/* 2026-10-12: \u7D20\u6750\u5E93\u5DF2\u5916\u7F6E\u5230 assets/pf-lib.js \u21D2 \u8FD9\u91CC\u6CE8\u5165\u4F9D\u8D56\u6865\uFF08\u7981\u8DE8 IIFE \u76F4\u63A5\u5F15\u7528\uFF09\u3002 */\nwindow.__hdLibDeps = { b: B, toast: showToast, add: addImage, load: hdcoLoad };\n/* 2026-10-14: onboarding \u5F39\u7A97\u5DF2**\u5916\u7F6E**\u5230 assets/hd-signup.js\uFF08\u5168\u7AD9\u552F\u4E00\u5B9E\u73B0\uFF09\u3002\n   HTML = snippets/hd-signup.liquid\uFF08layout \u5168\u7AD9\u6E32\u67D3\u4E00\u6B21\uFF0C\u6545\u672C section \u4E0D\u518D\u6709\u8FD9\u6BB5 DOM\uFF09\uFF1B\n   \u6837\u5F0F = assets/hd-signup.css\uFF1B\u903B\u8F91 = window.__hdSignup\u3002\n   \u672C\u6587\u4EF6\u4E0D\u518D\u58F0\u660E HDCO_KEY/HDCO_SKIP_MS \u4E0E _hdco* \u72B6\u6001\uFF0C\u4E5F\u4E0D\u5728\u9876\u5C42\u76F4\u63A5 bind/show \u2014\u2014\n   \u6539\u4E3A\u5728\u6587\u4EF6\u540E\u6BB5\u8BBE\u7F6E\u4E09\u6761\u63A5\u7EBF\uFF08__hdSignupBoot / __hdSignupOnSave / __hdSignupIsPending\uFF09\uFF0C\n   \u7531\u5916\u7F6E\u6A21\u5757 defer \u52A0\u8F7D\u5B8C\u6210\u540E\u56DE\u8C03\u3002 */\n// \u767D\u540D\u5355\u8865\u4E01\uFF1A`isGrid`/`isPreview`/`pfmName` \u5FC5\u987B\u8FDB toJSON \u2014\u2014 \u4E22\u4E86 isGrid \u64A4\u9500\u540E grid \u53E0\u4E24\u5C42\uFF0C\n// \u4E22\u4E86 isPreview \u9884\u89C8\u5C42\u6B8B\u7559\uFF1B\u4E22 pfmName \u5219\u6539\u7684\u540D\u5B57\u8FC7\u4E0D\u4E86 undo\u3002\n// 2026-08-30: fabric \u6539 defer \u52A0\u8F7D \u2192 \u8865\u4E01\u4E0D\u80FD\u5728\u9876\u5C42\u6267\u884C\uFF0C\u6539\u4E3A\u51FD\u6570\uFF0C\u5728 init setTimeout \u5F00\u5934\u8C03\u7528\u3002\nfunction hdPatchFabricSerialization(){\n  /* 2026-10-14: \u4E24\u5904\u52A0\u56FA \u2014\u2014\n     \u2460 \u767D\u540D\u5355\u8865 `selectable`/`evented`\uFF1Afabric **\u9ED8\u8BA4\u4E0D\u5E8F\u5217\u5316**\u8FD9\u4E24\u4E2A\u5B57\u6BB5\uFF08\u5B9E\u6D4B toObject \u8F93\u51FA\u91CC\u6CA1\u6709\uFF09\uFF0C\n        \u4E8E\u662F\u4EFB\u4F55\u4ECE JSON \u590D\u6D3B\u7684\u6253\u5370\u533A\u6846\u90FD\u4F1A\u53D8\u56DE\u300C\u53EF\u9009\u4E2D/\u53EF\u62D6\u52A8/\u53EF\u65CB\u8F6C\u300D\u3002\n     \u2461 \u539F\u5B9E\u73B0\u53EA\u8BD5\u4E00\u6B21\u4E14**\u9759\u9ED8\u8DF3\u8FC7**\uFF08fabric \u672A\u5C31\u7EEA\u5C31\u6C38\u8FDC\u4E0D\u6253\u8865\u4E01 \u21D2 \u4E4B\u540E\u6240\u6709 toJSON \u4E22 isGrid\uFF0C\n        \u6B63\u662F\u8001\u8349\u7A3F\u91CC grid \u53D8\u666E\u901A\u5BF9\u8C61\u7684\u6839\u6E90\uFF09\u3002\u6539\u4E3A\u6709\u754C\u91CD\u8BD5 + \u5931\u8D25\u544A\u8B66\u3002 */\n  if (window.fabric && fabric.Object && fabric.Object.prototype.toObject) {\n    if (fabric.Object.prototype.__hdPatchDone) return;\n    var _hdOrigToObject = fabric.Object.prototype.toObject;\n    fabric.Object.prototype.toObject = function (propertiesToInclude) {\n      /* 2026-10-14\uFF1A\u5E8F\u5217\u5316\u767D\u540D\u5355\u8865\u3010ARC / \u6587\u5B57\u8DEF\u5F84 / \u5F62\u72B6\u79CD\u7C7B\u3011\u7684\u81EA\u5B9A\u4E49\u5C5E\u6027\u3002\n         \u6F0F\u4E86\u5B83\u4EEC \u21D2 \u5B58\u8349\u7A3F\u4E0E\u3010\u64A4\u9500\u5FEB\u7167\u3011\u4E24\u5904\u90FD\u4F1A\u4E22\uFF08\u5171\u7528 toObject\uFF09\u21D2 \u6062\u590D\u540E t.pfmArcDeg \u4E3A undefined\uFF0C\n         \u518D\u78B0\u4E00\u6B21\u6587\u672C\u9762\u677F\u4EFB\u4E00\u63A7\u4EF6 \u21D2 applyArcToText \u7528\u3010\u5168\u5C40\u9ED8\u8BA4\u5F27\u5EA6\u3011\u91CD\u7B97\u5F27\u7EBF \u21D2 \u8DEF\u5F84\u957F\u5EA6\u4E0E\u6587\u5B57\u5BBD\u4E0D\u5339\u914D\n         \u21D2 fabric \u628A\u5B57\u7B26\u56DE\u7ED5\u5230\u8DEF\u5F84\u53E6\u4E00\u7AEF \u21D2 \u5B57\u7B26\u4E71\u5E8F\uFF08\u7528\u6237\u62A5\u300C\u7ED8\u753B\u533A\u7834\u788E\u300D\uFF09\u3002\n         pfmPathKind='custom' \u4E22\u5931\u8FD8\u4F1A\u8BA9\u300C\u6587\u5B57\u6CBF\u81EA\u5B9A\u4E49\u8DEF\u5F84\u300D\u88AB\u5706\u5F27\u8986\u76D6\u3002 */\n      var _r = _hdOrigToObject.call(this, (propertiesToInclude || []).concat([\n        'isGrid','isPreview','pfmName','__pfmBgCut','__pfmPat','selectable','evented',\n        'pfmArcDeg','pfmArcDir','pfmPathKind','pfmShapeKind','_pfmOrigUrl','_pfmOrigW','_pfmOrigH','_pfmShadows'\n      ]));\n      /* 2026-10-15 **\u6839\u672C\u89E3\u6CD5**\uFF1A**\u8BA9 path \u4E0D\u8FDB\u5FEB\u7167**\u3002\n         fabric \u4ECE JSON \u590D\u6D3B\u7684 path \u662F\u300C\u88F8\u5BF9\u8C61\u300D\uFF08constructor=Object\uFF0C\u4E0D\u662F fabric.Path \u5B9E\u4F8B\uFF09\n         \u21D2 \u6E32\u67D3\u65F6 `e.isNotVisible is not a function` \u5D29\u3001\u6587\u5B57\u9519\u4E71/\u4E0D\u53EF\u89C1\uFF08\u7528\u6237\u62A5\u300C\u753B\u5E03\u7834\u88C2\u300D\uFF09\u3002\n         \u6539\u4E3A\u53EA\u5B58 pfmArcDeg/pfmArcDir\uFF08\u7B80\u5355\u503C\uFF0C\u53EF\u9760\uFF09\uFF1B\u6062\u590D\u65F6\u7531 pfmRebuildArcs \u7EDF\u4E00\u91CD\u5EFA\u771F\u5B9E fabric.Path\u3002\n         \u8FD9\u6837\u5FEB\u7167\u91CC\u3010\u6C38\u8FDC\u6CA1\u6709 path\u3011\u21D2 \u4E0D\u5B58\u5728\u597D\u574F\u5224\u65AD\uFF0C\u4E5F\u4E0D\u53D7\u65F6\u5E8F/\u5BF9\u8C61\u66FF\u6362\u5E72\u6270\u3002 */\n      try{ if(_r && _r.path !== undefined){ delete _r.path; delete _r.pathSide; delete _r.pathAlign; delete _r.pathStartOffset; } }catch(e){}\n      return _r;\n    };\n    fabric.Object.prototype.__hdPatchDone = true;\n    return;\n  }\n  var _n = (hdPatchFabricSerialization._n = (hdPatchFabricSerialization._n || 0) + 1);\n  if (_n <= 25) { setTimeout(hdPatchFabricSerialization, 200); }\n  else { try { console.error('[pfm] fabric \u5E8F\u5217\u5316\u8865\u4E01\u5931\u8D25\uFF1Afabric \u59CB\u7EC8\u672A\u5C31\u7EEA'); } catch (e) {} }\n}\n// esc()/ft() come from assets/app-utils.js (window.HD)\nvar esc = HD.esc, ft = HD.ft;\nvar printAreaSpecs={};\nvar originalPrintAreaSpecs={};\nvar _pfmNoSpecWarned={}; // 2026-10-14: \u300C\u8BE5\u9762\u6CA1\u6709\u6253\u5370\u533A\u300D\u63D0\u793A\u53BB\u91CD\uFF08\u6BCF\u9762\u53EA\u63D0\u793A\u4E00\u6B21\uFF09\n/* 2026-09-13: \u628A\u6253\u5370\u533A\u89C4\u683C\u66B4\u9732\u5230 window\u3002\u8C03\u8BD5\u9762\u677F IIFE \u4E0E\u65B0\u8BBE\u8BA1\u53F0 IIFE \u90FD\u770B\u4E0D\u5230\u672C\u4F5C\u7528\u57DF\uFF0C\n   ?debug=1 \u9762\u677F\u6B64\u524D\u76F4\u63A5 ReferenceError\uFF08= \u8BE5\u8BCA\u65AD\u5DE5\u5177\u4E00\u76F4\u662F\u574F\u7684\uFF09\u3002\n   \u26A0\uFE0F \u5FC5\u987B\u7528 getter\uFF1AprintAreaSpecs \u4F1A\u5728\u52A0\u8F7D\u4EA7\u54C1\u65F6\u88AB**\u6574\u4F53\u91CD\u65B0\u8D4B\u503C**\uFF08\u76F4\u63A5\u6302\u5F15\u7528\u4F1A\u62FF\u5230\u65E7\u5BF9\u8C61\uFF09\u3002 */\nwindow.__pfmPrintArea = function(){ return printAreaSpecs; };\n/* 2026-09-15 \u6279\u6B21A\uFF1A\u5185\u5BB9\u8FB9\u754C\u516C\u5171\u539F\u8BED \u2014\u2014 \u56FE\u7247\u53BB\u6389\u900F\u660E\u7559\u767D\u540E\u7684**\u753B\u5E03\u5750\u6807**\u76D2\u3002\n   \u63A5\u5165\u70B9\u5206\u6279\uFF1A\u2460 hd-align.js boxOf() \u5DF2\u63A5\uFF1B\u2461 \u8D8A\u754C/\u843D\u4F4D 4 \u5904\u5F85\u5B9A\uFF08\u89C1\u51FD\u6570\u5934\u6CE8\u91CA\uFF09\u3002 */\nwindow.__pfmContentBox = pfmContentBox;\n// \u591A\u9762\u8BBE\u8BA1\u5B58\u50A8\uFF1Aplacement key \u2192 { json, hasArt }\u3002\u6BCF\u4E2A\u9762\u5404\u81EA\u4FDD\u5B58 fabric \u72B6\u6001\uFF0C\n// \u4F7F Front/Back/Sleeve \u5207\u6362\u65F6\u5404\u81EA\u4FDD\u7559\u5DF2\u753B\u5185\u5BB9\uFF08\u591A\u9762\u5370\u5237\u652F\u6301\uFF09\u3002\nvar placementArt={};\nvar placementUndo={};\nvar placementRedo={};\n\nfunction showLoading(){\n  var el=q('pfmLoading'); if(el) el.classList.add('active');\n  /* 2026-10-14\uFF1A\u9996\u5C4F\u906E\u7F69**\u9ED8\u8BA4\u5C31\u663E\u793A**\uFF08CSS .pfm-boot{display:flex}\uFF09\u2014\u2014 \u539F\u6765\u9760\u8FD9\u91CC\u52A0 .on \u624D\u51FA\u73B0\uFF0C\n     \u800C\u672C\u51FD\u6570\u8981\u7B49 loadProduct \u624D\u8DD1 \u21D2 \u9875\u9762\u5F00\u5934\u51E0\u79D2\u767D\u5C4F\uFF08\u7528\u6237\u5B9E\u6D4B\u300C\u6CA1\u6709\u6700\u4F18\u5148\u663E\u793A\u300D\uFF09\u3002\n     \u8BED\u4E49\u5DF2\u53CD\u8FC7\u6765\uFF1AJS \u53EA\u8D1F\u8D23**\u9690\u85CF**\uFF08.hide\uFF09\u3002\u8FD9\u91CC\u987A\u624B\u6E05\u6389\u53EF\u80FD\u5B58\u5728\u7684 .hide\uFF08\u5982\u4E8C\u6B21\u52A0\u8F7D\u4EA7\u54C1\uFF09\u3002 */\n  var b=q('pfmBootLoading'); if(b) b.classList.remove('hide');\n}\nfunction hideLoading(){\n  var el=q('pfmLoading'); if(el) el.classList.remove('active');\n  var b=q('pfmBootLoading'); if(b) b.classList.add('hide');\n}\n\n/* 2026-10-14\uFF08\u9996\u5C4F\u52A0\u8F7D\u6761\uFF09\uFF1A**\u6210\u529F\u8DEF\u5F84**\u6539\u8D70\u300C\u5C31\u7EEA\u95E8\u300D\u2014\u2014\n   \u6570\u636E\u5230\u4F4D \u2260 \u56FE\u5230\u4F4D\uFF1A\u539F\u5B9E\u73B0\u5728\u4EA7\u54C1\u6570\u636E\u4E00\u5230\u624B\u5C31\u9690\u85CF\u63D0\u793A\uFF0C\u800C**\u5404\u89D2\u5EA6\u7684\u4EA7\u54C1\u56FE**\u3001**\u753B\u5E03/\u4F5C\u54C1\u91CC\u7684\u56FE\u7247**\n   \u8FD8\u5728\u4E0B\u8F7D \u21D2 \u7528\u6237\u770B\u5230\u7684\u662F\"\u63D0\u793A\u6CA1\u4E86\u3001\u56FE\u8FD8\u6CA1\u51FA\u6765\"\uFF08\u89C2\u611F\"\u6162\u4E00\u62CD\"\uFF09\u3002\n   \u73B0\u8981\u6C42\u300C\u6570\u636E + \u5404\u89D2\u5EA6\u6210\u54C1\u56FE + \u753B\u5E03\u4E0A\u7684\u56FE\u7247\u5BF9\u8C61\u300D\u5168\u90E8 ready \u624D\u771F\u6B63\u9690\u85CF\uFF1B**10s \u515C\u5E95**\n   \uFF08\u67D0\u5F20\u56FE 404/\u8D85\u65F6\u4E5F\u4E0D\u80FD\u628A\u7528\u6237\u6C38\u8FDC\u6321\u5728\u52A0\u8F7D\u6001\uFF09\u3002\n   \u26A0\uFE0F \u5931\u8D25\u5206\u652F\uFF08loadProduct \u7684 catch\u3001template \u5931\u8D25\uFF09**\u4ECD\u76F4\u63A5 hideLoading()**\uFF0C\u4E0D\u7B49\u56FE\u3002 */\nfunction hideLoadingWhenImagesReady(){\n  try{\n    var urls = [];\n    /* \u2460 \u5404\u89D2\u5EA6\u7684\u6210\u54C1\u56FE\uFF08\u670D\u52A1\u7AEF\u5DF2\u751F\u6210\u7684\uFF09 */\n    var pp = (product && product._prodPreview) || {};\n    Object.keys(pp).forEach(function(k){ if(pp[k]) urls.push(pp[k]); });\n    /* \u2461 \u753B\u5E03\u4E0A\u7684\u56FE\u7247\u5BF9\u8C61\uFF08\u8349\u7A3F/\u4F5C\u54C1\u6062\u590D\u51FA\u6765\u7684\u3001\u7528\u6237\u4E0A\u4F20\u7684\uFF09 */\n    if(canvas && canvas.getObjects){\n      canvas.getObjects().forEach(function(o){\n        if(!o || o.type !== 'image') return;\n        var el = o._element;\n        if(el && el.src) urls.push(el.src);\n        else if(o.src) urls.push(o.src);\n      });\n    }\n    /* \u2462 \u5F53\u524D\u9762\u7684\u4EA7\u54C1\u56FE\uFF08CSS \u80CC\u666F\u56FE\uFF09 */\n    var z = document.getElementById('pfmZoomLayer');\n    if(z){\n      var cs = window.getComputedStyle(z).backgroundImage || '';\n      var m = /url\\([\"']?([^\"')]+)/.exec(cs);\n      if(m && m[1] && m[1].indexOf('data:') !== 0) urls.push(m[1]);\n    }\n    urls = urls.filter(function(u,i){ return u && urls.indexOf(u) === i; });\n    if(!urls.length){ hideLoading(); return; }\n    var total = urls.length, done = 0, finished = false;\n    function fin(){ if(finished) return; done++; if(done >= total){ finished = true; hideLoading(); } }\n    setTimeout(function(){ if(!finished){ finished = true; hideLoading(); } }, 4000);   /* 2026-10-14\uFF1A10s\u21924s\uFF08\u5B9E\u6D4B\u6302 15 \u79D2\u592A\u4E45\uFF1B\u56FE\u6CA1\u5230\u9F50\u5C31\u5148\u653E\u884C\uFF09 */\n    urls.forEach(function(u){\n      var im = new Image();\n      im.onload = fin; im.onerror = fin;\n      im.src = u;\n    });\n  }catch(e){ hideLoading(); }\n}\n\n// ===== ALPHA SCAN\uFF1A\u4ECE ghost PNG \u627E\u8863\u670D\u53EF\u89C1\u8FB9\u754C =====\n/* 2026-08-22: \u8F7B\u91CF toast\uFF08\u975E\u963B\u585E\u8B66\u544A\uFF0C\u5982\u4F4E\u5206\u8FA8\u7387\u56FE\uFF09\u3002\n   \uD83D\uDD34\uD83D\uDD34 2026-10-10\uFF08\u00A71011r \u7532\uFF09\uFF1A\u539F\u5B9E\u73B0\u628A\u63D0\u793A append \u8FDB `#pfmCanvasInner` \u2014\u2014 \u8BE5\u5BB9\u5668**\u53EA\u5728\u7F16\u8F91\u6001\n   \uFF08\u8BBE\u8BA1\u677F #pfmBoard\uFF09\u53EF\u89C1**\uFF0C\u800C\u8C03\u7528\u65B9\uFF08Add to Cart / Save design / Mockups\uFF09\u5168\u5728**\u5C55\u793A\u6001 #pfmStage**\uFF1B\n   \u4E24\u8005\u4E92\u65A5 \u21D2 \u63D0\u793A\u6052\u88AB\u585E\u8FDB 0\u00D70 \u4E14 overflow:hidden \u7684\u9690\u85CF\u5BB9\u5668\uFF1A\u7EBF\u4E0A\u5B9E\u6D4B toast rect [0,0,0,0]\u3001\n   inView=false\uFF0C**\u5C55\u793A\u6001 11 \u5904\u63D0\u793A 100% \u9759\u9ED8**\uFF08\u542B Add to cart failed / Export failed\uFF09\u3002\n   \u73B0\u6539\u4E3A\u59D4\u6258\u7AD9\u5185\u552F\u4E00 toast \u5B9E\u73B0 `hdcoToast`\uFF08.hdco-toast = position:fixed;top:18px;\n   z-index:2147483999\uFF09\u2014\u2014 \u4EFB\u4F55\u72B6\u6001/\u8BBE\u5907\u90FD\u53EF\u89C1\uFF0C\u4E14**\u4E0D\u518D\u5F15\u5165\u7B2C\u4E8C\u4EFD\u5B9E\u73B0**\u3002\n   type \u6620\u5C04\u4E3A\u524D\u7F00\u56FE\u6807\uFF08\u539F\u7C7B\u578B\u5E95\u8272\u968F\u4E4B\u9000\u5F79\uFF09\u3002\u26A0\uFE0F \u7981\u6B62\u518D\u628A\u63D0\u793A\u6302\u5230\u8BBE\u8BA1\u677F\u5185/\u7EDD\u5BF9\u5B9A\u4F4D\u5BB9\u5668\u4E0A\u3002 */\nfunction hdToastIcon(type){\n  /* \u9ED8\u8BA4\u6863\uFF08\u4E0D\u4F20 type / \u672A\u77E5\u503C\uFF09\u6CBF\u7528\u6539\u524D\u7684\u300C\u62A5\u8B66\u300D\u8BED\u4E49 \u2014\u2014 \u4E0E\u65E7\u5B9E\u73B0 C[type]||'#e74c3c' \u540C\u53E3\u5F84\u3002 */\n  var I={info:'\\u2139\\uFE0F',ok:'\\u2705',warn:'\\u26A0\\uFE0F',error:'\\u274C'};\n  return I[type]||I.error;\n}\nfunction showToast(msg, type){\n  var txt=hdToastIcon(type)+' '+msg;\n  try{\n    var t=document.getElementById('hdcoToast');\n    if(t && typeof hdcoToast==='function'){ hdcoToast(txt); return; }\n  }catch(e){}\n  /* \u515C\u5E95\uFF1Atoast \u5143\u7D20\u7F3A\u5931\uFF08\u7ED3\u6784\u6027\u56DE\u5F52\uFF09\u65F6**\u7EDD\u4E0D\u80FD\u9759\u9ED8** \u2014\u2014 \u9000\u56DE alert\uFF0C\u4FDD\u8BC1\u4E00\u5B9A\u6709\u53CD\u9988\u3002 */\n  try{ alert(msg); }catch(e){}\n}\nfunction getImageBounds(imgUrl, callback) {  var img = new Image();\n  img.crossOrigin = 'anonymous';\n  img.onload = function() {\n    var w = img.naturalWidth, h = img.naturalHeight;\n    var c = document.createElement('canvas');\n    c.width = w; c.height = h;\n    var ctx = c.getContext('2d');\n    ctx.drawImage(img, 0, 0);\n    var data = ctx.getImageData(0, 0, w, h).data;\n    var minX = w, maxX = 0, minY = h, maxY = 0;\n    for (var y = 0; y < h; y++) {\n      for (var x = 0; x < w; x++) {\n        if (data[(y * w + x) * 4 + 3] > 10) {\n          if (x < minX) minX = x; if (x > maxX) maxX = x;\n          if (y < minY) minY = y; if (y > maxY) maxY = y;\n        }\n      }\n    }\n    callback({ left: minX, top: minY, right: maxX, bottom: maxY, w: w, h: h });\n  };\n  img.onerror = function() { callback(null); };\n  img.src = imgUrl;\n}\n\n/* ===== \u5185\u5BB9\u8FB9\u754C\uFF082026-09-15 \u6279\u6B21A \u00B7 \u516C\u5171\u539F\u8BED\uFF09=====\n   PNG \u5E38\u6709\u56DB\u5468\u900F\u660E\u7559\u767D \u2014\u2014 \u6309\u300C\u77E9\u5F62\u300D\u53BB\u5BF9\u9F50/\u5224\u65AD\uFF0C\u4F1A\u8BA9**\u770B\u5F97\u89C1\u7684\u56FE\u6848**\u6CA1\u5BF9\u9F50\uFF1A\n   \u5B9E\u6D4B\u4E00\u5F20\u4E0A\u4E0B\u8FB9\u8DDD\u4E0D\u5747\u7684\u56FE\uFF0C\u77E9\u5F62\u7CBE\u786E\u5C45\u4E2D\u540E\u53EF\u89C1\u5185\u5BB9\u4ECD\u504F 17 \u5C4F\u5E55px\uFF0C\u7528\u6237\u5F53 bug \u62A5\u3002\n   `__pfmContentBox(obj)` \u8FD4\u56DE**\u753B\u5E03\u5750\u6807**\u4E0B\u7684\u5185\u5BB9\u76D2\uFF1A\n     \u00B7 \u56FE\u7247\uFF08type==='image'\uFF09\u2192 alpha \u626B\u63CF\u771F\u5B9E\u975E\u900F\u660E\u8303\u56F4\n     \u00B7 \u5176\u5B83\u5BF9\u8C61 / \u65CB\u8F6C\u5BF9\u8C61 / \u626B\u63CF\u5931\u8D25 / \u65E0\u7559\u767D \u2192 \u56DE\u9000 getBoundingRect\uFF08\u4E0E\u65E7\u884C\u4E3A\u4E00\u81F4\uFF09\n   \u26A0\uFE0F \u6027\u80FD\uFF1A\u626B\u63CF\u524D\u964D\u91C7\u6837\u5230\u6700\u957F\u8FB9 __PFM_CB_MAX\uFF084000px \u539F\u56FE\u4E5F\u53EA\u626B 256\u00B2 \u2248 65k \u6B21\uFF09\uFF0C\n      \u5E76\u7F13\u5B58\u5728\u5BF9\u8C61\u4E0A\uFF08key \u542B src \u5C3E\u6BB5 + \u539F\u59CB\u5C3A\u5BF8 + crop \u21D2 \u6362\u56FE/\u88C1\u5207\u624D\u5931\u6548\uFF09\u3002\n   \u26A0\uFE0F \u65CB\u8F6C\u5BF9\u8C61\u76F4\u63A5\u56DE\u9000\uFF1A\u5185\u5BB9\u76D2\u6620\u5C04\u5230\u753B\u5E03\u8981\u8003\u8651\u65CB\u8F6C\uFF0C\u98CE\u9669\u9AD8\u6536\u76CA\u4F4E\u3002\n   \u26A0\uFE0F \u4E0E\u5DF2\u6709 getImageBounds() \u7684\u5173\u7CFB\uFF1A\u90A3\u4E2A\u662F\u300C\u5168\u5206\u8FA8\u7387 + \u53EA\u7528\u4E8E\u4EA7\u54C1 ghost \u56FE\u300D\u7684\u4E00\u6B21\u6027\u626B\u63CF\uFF0C\n      \u7ED3\u679C\u5199\u8FDB product._ghostBounds \u540E**\u4ECE\u672A\u88AB\u8BFB\u53D6**\uFF08\u6B7B\u4EE3\u7801\uFF09\u3002\u6B64\u5904**\u4E0D\u590D\u7528\u5B83** \u2014\u2014\n      \u5168\u5206\u8FA8\u7387\u626B\u63CF\u5728\u62D6\u52A8\u65F6\u4E0D\u53EF\u7528\uFF1B\u4E24\u8005\u7528\u9014\u4E0D\u540C\uFF0C\u6545\u4FDD\u7559\u5404\u81EA\u5B9E\u73B0\u3002\n   \u63A5\u5165\u70B9\uFF08\u5206\u6279\uFF09\uFF1A\u2460 hd-align.js boxOf() \u5DF2\u63A5 \u00B7 \u2461 \u8D8A\u754C/\u843D\u4F4D 4 \u5904\u5F85\u5B9A */\nvar PFM_CB_MAX = 256;\nfunction pfmImageContentBox(obj){\n  var el = obj._element; if(!el) return null;\n  var W = el.naturalWidth || el.width, H = el.naturalHeight || el.height;\n  if(!(W > 0) || !(H > 0)) return null;\n  /* fabric \u7684 width/height \u662F**\u88C1\u526A\u540E**\u5C3A\u5BF8\uFF0CcropX/cropY \u662F\u88C1\u526A\u8D77\u70B9 */\n  var cw = obj.width || W, ch = obj.height || H;\n  var cx0 = obj.cropX || 0, cy0 = obj.cropY || 0;\n  var key = String(el.src || '').slice(-80) + '|' + W + 'x' + H + '|' + cx0 + ',' + cy0 + ',' + cw + ',' + ch;\n  if(obj._pfmCBKey === key) return obj._pfmCB || null;\n  var sc = Math.max(cw, ch) > PFM_CB_MAX ? PFM_CB_MAX / Math.max(cw, ch) : 1;\n  var sw = Math.max(1, Math.round(cw * sc)), sh = Math.max(1, Math.round(ch * sc));\n  var cv = document.createElement('canvas'); cv.width = sw; cv.height = sh;\n  var ctx = cv.getContext('2d');\n  ctx.drawImage(el, cx0, cy0, cw, ch, 0, 0, sw, sh);\n  var d = ctx.getImageData(0, 0, sw, sh).data;   /* \u753B\u5E03\u88AB\u6C61\u67D3\u65F6\u4F1A\u629B -> \u5916\u5C42 try \u515C\u4F4F\u56DE\u9000 */\n  var minX = sw, maxX = -1, minY = sh, maxY = -1;\n  for(var y = 0; y < sh; y++){\n    var row = y * sw;\n    for(var x = 0; x < sw; x++){\n      if(d[(row + x) * 4 + 3] > 8){\n        if(x < minX) minX = x; if(x > maxX) maxX = x;\n        if(y < minY) minY = y; if(y > maxY) maxY = y;\n      }\n    }\n  }\n  var box = (maxX < 0) ? null : { l: minX / sc, t: minY / sc, r: (maxX + 1) / sc, b: (maxY + 1) / sc };\n  obj._pfmCBKey = key; obj._pfmCB = box;\n  return box;\n}\nfunction pfmContentBox(obj){\n  if(!obj) return null;\n  var rect = null;\n  try { rect = obj.getBoundingRect(true, true); } catch(e){ return null; }\n  if(!rect || !(rect.width > 0) || !(rect.height > 0)) return rect;\n  if(obj.type !== 'image' || !obj._element) return rect;     /* \u53EA\u6709\u56FE\u7247\u6709\u300C\u900F\u660E\u7559\u767D\u300D */\n  if(Math.abs(obj.angle || 0) > 0.01) return rect;           /* \u65CB\u8F6C\u89C1\u4E0A */\n  try {\n    var box = pfmImageContentBox(obj); if(!box) return rect;\n    var w0 = obj.width || 0, h0 = obj.height || 0;\n    if(!(w0 > 0) || !(h0 > 0)) return rect;\n    var sx = Math.abs(obj.scaleX || 1), sy = Math.abs(obj.scaleY || 1);\n    var l = box.l, r = box.r, t = box.t, b = box.b;\n    if((obj.scaleX || 1) < 0){ l = w0 - box.r; r = w0 - box.l; }   /* \u6C34\u5E73\u7FFB\u8F6C */\n    if((obj.scaleY || 1) < 0){ t = h0 - box.b; b = h0 - box.t; }   /* \u5782\u76F4\u7FFB\u8F6C */\n    var out = { left: rect.left + l * sx, top: rect.top + t * sy, width: (r - l) * sx, height: (b - t) * sy };\n    if(out.width > 0.5 && out.height > 0.5) return out;\n  } catch(e){}\n  return rect;\n}\n\n/* \u9884\u626B hook\uFF082026-09-15 \u6279\u6B21A-3\uFF09\uFF1A\u56FE\u7247\u4E00\u5165\u753B\u5E03\u5C31\u5728**\u7A7A\u95F2\u65F6**\u7B97\u597D\u5185\u5BB9\u8FB9\u754C\u3002\n   \u539F\u56E0\uFF1A\u9996\u6B21 alpha \u626B\u63CF\u5B9E\u6D4B 2000\u00D72000 \u56FE\u8981 **62ms**\uFF08\u74F6\u9888\u662F drawImage \u7F29\u653E\uFF0C\u4E0D\u662F 65k \u6B21\u5FAA\u73AF\uFF09\uFF0C\n   \u82E5\u843D\u5728**\u9996\u6B21\u62D6\u52A8\u90A3\u4E00\u5E27**\u5C31\u662F\u4E00\u6B21\u660E\u663E\u6389\u5E27\uFF0860fps \u9884\u7B97 16.7ms\uFF09\uFF1B\u7F13\u5B58\u547D\u4E2D\u540E\u5355\u6B21\u4EC5 1.84\u00B5s\u3002\n   \u5E42\u7B49\uFF1A__pfmCBHook \u6807\u5FD7\uFF1Bcanvas \u672A\u5C31\u7EEA\u65F6\u6BCF 200ms \u91CD\u8BD5\uFF08\u6700\u591A 30s\uFF09\u3002 */\n(function(){\n  if(window.__pfmCBHook) return;\n  var tries = 0;\n  var t = setInterval(function(){\n    tries++;\n    if(tries > 150){ clearInterval(t); return; }\n    if(!canvas || !canvas.on) return;\n    clearInterval(t);\n    window.__pfmCBHook = true;\n    canvas.on('object:added', function(e){\n      var o = e && e.target;\n      if(!o || o.type !== 'image' || !o._element) return;\n      var run = function(){ try { pfmContentBox(o); } catch(err){} };\n      if(window.requestIdleCallback) window.requestIdleCallback(run, { timeout: 1500 });\n      else setTimeout(run, 250);\n    });\n  }, 200);\n})();\n\n// ========== PRODUCT BACKGROUND (CSS layer, not part of fabric canvas) ==========\n/* 2026-10-25\uFF1Aghost alpha \u9608\u503C\uFF08\u53EA\u7559\u5E3D\u515C\uFF09\u3002\n   ghost \u7684 alpha \u5206\u533A\uFF1A\u5E3D\u515C\u2248254\uFF08\u4E0D\u900F\u660E\uFF09\u3001\u8863\u8EAB\u2248131\uFF08\u534A\u900F\u660E\uFF09\u3002\u6574\u5F20\u53E0\u4F1A\u628A\u56FE\u6848\u538B\u6697\uFF1B\n   \u8FD9\u91CC\u628A alpha \u2264 200 \u7684\u50CF\u7D20\u7F6E\u900F\u660E \u21D2 \u524D\u666F\u53EA\u5269\u300C\u5E3D\u515C/\u8863\u8EAB\u8FB9\u7F18\u300D\u21D2 \u56FE\u6848\u6E05\u6670 + \u5E3D\u515C\u906E\u6321\u3002\n   image-proxy \u5DF2\u5E26 Access-Control-Allow-Origin:* \u21D2 canvas \u53EF\u8BFB\u50CF\u7D20\u3002\u7ED3\u679C\u6309 URL \u7F13\u5B58\uFF08\u5185\u5B58\uFF09\u3002 */\nvar _ghostCutCache = {};\nfunction cutGhost(url, cb) {\n  if (!url) { cb(''); return; }\n  if (_ghostCutCache[url]) { cb(_ghostCutCache[url]); return; }\n  try {\n    var img = new Image();\n    img.crossOrigin = 'anonymous';\n    img.onload = function () {\n      try {\n        var c = document.createElement('canvas');\n        c.width = img.naturalWidth || img.width;\n        c.height = img.naturalHeight || img.height;\n        var ctx = c.getContext('2d');\n        ctx.drawImage(img, 0, 0);\n        var d = ctx.getImageData(0, 0, c.width, c.height);\n        var px = d.data;\n        for (var i = 3; i < px.length; i += 4) { if (px[i] <= 200) px[i] = 0; }\n        ctx.putImageData(d, 0, 0);\n        var out = c.toDataURL('image/png');\n        _ghostCutCache[url] = out;\n        cb(out);\n      } catch (e) { cb(url); }   /* \u8BFB\u50CF\u7D20\u5931\u8D25\uFF08CORS \u5F02\u5E38\uFF09\u21D2 \u56DE\u9000\u539F\u56FE\uFF0C\u4E0D\u963B\u585E */\n    };\n    img.onerror = function () { cb(url); };\n    img.src = url;\n  } catch (e) { cb(url); }\n}\nfunction loadProductBackground(ghostUrl, bgUrl, bgColor){\n  // 2026-08-30: \u4EA7\u54C1\u56FE\u80CC\u666F\u8BBE\u5728\u7F29\u653E\u5C42\uFF08zoomLayer\uFF09\u4E0A \u2014 \u767D\u6846\u4E0D\u52A8\uFF0C\u4EA7\u54C1\u56FE\u968F\u5C42\u7F29\u653E\n  var inner = q('pfmCanvasInner');\n  var layer = q('pfmZoomLayer');\n  var bg = q('pfmProductBg');\n  if(!inner || !bg) return;\n  var host = layer || inner; // \u4EA7\u54C1\u56FE\u80CC\u666F\u5BBF\u4E3B\uFF1A\u4F18\u5148\u7F29\u653E\u5C42\n  function pimg(u, w){\n    if(!u) return '';\n    // 2026-09-09: \u670D\u52A1\u5668\u672C\u5730\u6210\u54C1\u56FE\uFF08prodimg/* 1000px\uFF09\u76F4\u63A5\u9759\u6001\u76F4\u8FDE \u2014\u2014 \u8DF3\u8FC7 image-proxy sharp \u7F29\u653E\n    // \uFF08\u5207\u9762/\u9996\u9762\u66F4\u5FEB\uFF1Bimage-proxy \u53EA\u7528\u4E8E\u5916\u90E8 CDN \u6E90\u4E0B\u91C7\u6837\uFF09\u3002\u6CE8\u610F u \u53EF\u80FD\u5DF2\u5E26 image-proxy \u524D\u7F00 \u2192 \u8981\u53BB\u6389\u3002\n    if (u.indexOf('/image-proxy?') === -1 && u.indexOf('bridge.highdeep.net/prodimg/') !== -1) return u;\n    var raw = u.indexOf('/image-proxy?') !== -1 ? (function(){ try { return decodeURIComponent((u.split('url=')[1]||'').split('&')[0]); } catch(e){ return u; } })() : u;\n    // 2026-09-07 DROP \u540C\u6B3E\u94FE\u8DEF\uFF1A\u4E00\u5F8B\u7ECF image-proxy\uFF08\u767D\u540D\u5355\u542B bridge.highdeep.net\uFF09\uFF0C\u53EF\u5E26 &w= \u4E0B\u91C7\u6837\u51CF\u5C0F\u4F20\u8F93\uFF1B\n    // ghost \u53E0\u5C42\u8C03\u7528\u4E0D\u4F20 w\uFF08\u4FDD\u539F\u5C3A\u5BF8\u4EE5\u5BF9\u9F50\u6253\u5370\u533A\uFF09\u3002\n    var out = B + '/image-proxy?url=' + encodeURIComponent(raw);\n    if (w) out += '&w=' + w;\n    return out;\n  }\n  // Mockup gallery image resilience: auto-retry (2 tries with cache-bust) then a\n  // manual Retry button. Declared on window so inline onerror handlers can reach it.\n  window.hdMockupImgError = function(img){\n    try{\n      var fail=parseInt(img.getAttribute('data-fail')||'0',10);\n      if(fail<2){\n        img.setAttribute('data-fail',String(fail+1));\n        img.src=(img.getAttribute('data-src')||'')+'&r='+Date.now()+(fail+1);\n      } else {\n        img.style.display='none';\n        var err=img.parentNode && img.parentNode.querySelector('.pfm-mockup-err');\n        if(err){ err.style.display='flex'; }\n      }\n    }catch(e){ /* never throw from an error handler */ }\n  };\n  window.hdRetryMockup = function(btn){\n    try{\n      var item=btn.closest ? btn.closest('.pfm-mockup-item') : (btn.parentNode&&btn.parentNode.parentNode);\n      var img=item && item.querySelector('img.pfm-mockup-img');\n      var err=item && item.querySelector('.pfm-mockup-err');\n      if(img){\n        img.setAttribute('data-fail','0');\n        img.src=(img.getAttribute('data-src')||'')+'&r='+Date.now();\n        img.style.display='';\n      }\n      if(err){ err.style.display='none'; }\n    }catch(e){}\n    return false;\n  };\n  // 2026-09-01: mockup carousel \u2014 thumbnail strip + labelled main image.\n  // placement \u2192 display label; front_large/back_large show as \"Front\"/\"Back\".\n  window.hdMockupItems=[];\n  window.hdPlacementLabel=function(p){\n    if(!p) return 'Mockup';\n    var m={front:'Front',back:'Back',front_large:'Front',back_large:'Back',\n      left_sleeve:'Left Sleeve',right_sleeve:'Right Sleeve',left:'Left',right:'Right',\n      wrist:'Wrist'};\n    if(m[p]) return m[p];\n    return p.replace(/_/g,' ').replace(/\\b\\w/g,function(c){return c.toUpperCase();});\n  };\n  window.hdSelectMockup=function(i){\n    try{\n      var it=window.hdMockupItems[i]; if(!it) return;\n      var main=document.getElementById('pfmMockupMain');\n      var badge=document.getElementById('pfmMockupBadge');\n      if(main){\n        main.setAttribute('data-src',it.src); main.setAttribute('data-fail','0');\n        main.src=it.src; main.style.display='';\n      }\n      if(badge) badge.textContent=it.label;\n      var thumbs=document.querySelectorAll('.pfm-carousel-thumbs img');\n      for(var j=0;j<thumbs.length;j++){\n        thumbs[j].className=(j===i)?'pfm-mockup-thumb active':'pfm-mockup-thumb';\n      }\n      if(main&&main.parentNode){\n        var err=main.parentNode.querySelector('.pfm-mockup-err');\n        if(err) err.style.display='none';\n      }\n      try{ if(typeof window.__mcArrowSync==='function') window.__mcArrowSync(); }catch(e){}\n    }catch(e){}\n  };\n  if(bgUrl){\n    host.style.backgroundImage = 'url(' + pimg(bgUrl, 900) + ')'; // 2026-09-07: host \u56FE\u7ECF image-proxy \u4E0B\u91C7\u6837\u81F3 900px\uFF08DROP \u540C\u6B3E\uFF0C\u5FEB\u663E\uFF09\n    host.style.backgroundSize = 'cover';\n    host.style.backgroundPosition = 'center';\n  } else {\n    host.style.backgroundImage = 'none';\n  }\n  host.style.backgroundColor = bgColor || '#fff';\n  /* 2026-10-15\uFF1A\u628A\u521A\u8D34\u4E0A\u7684\u5E95\u56FE**\u540C\u6B65\u5230\u5C55\u793A\u53F0\u90A3\u5F20\u56FE**\u3002\n     \uD83D\uDD34 \u5B9E\u6D4B\u6839\u56E0\uFF1A\u7528\u6237\u770B\u5230\u7684\u8863\u670D\u662F IMG#pfmStageImg\uFF08\u7531 stagePreview() \u66F4\u65B0\uFF09\uFF0C\u800C\u672C\u51FD\u6570\u53EA\u5199\n     #pfmZoomLayer \u7684 CSS background \u2014\u2014 \u8BE5\u5C42\u5B9E\u6D4B box=[0,0,0,0]\uFF08\u4E0D\u53EF\u89C1\uFF09\u21D2 \u6362\u8272\u540E\u753B\u9762\u4E0D\u52A8\u3002\n     stagePreview() \u5E42\u7B49\uFF08\u540C URL \u4E0D\u91CD\u8BBE\uFF09\uFF0C\u4E14 data-pfm-hero \u9996\u56FE\u4F18\u5316\u6709\u5B88\u536B \u21D2 \u65E0\u526F\u4F5C\u7528\u3002 */\n  try{ if(typeof window.__pfmStagePreview === 'function') window.__pfmStagePreview(); }catch(e){}\n  // Layer 1: \u4EA7\u54C1 ghost PNG \u53E0\u52A0\u3002onmodel \u6A21\u677F\uFF08\u542B shadows \u5C42\uFF09**\u8DF3\u8FC7**\u53E0\u52A0 \u2014\u2014 \u989C\u8272\u56FE\u5DF2\u662F\u5B8C\u6574 mockup\uFF0C\n  // \u53E0 shadows \u4F1A\u9519\u4F4D\uFF08\u4F8B\uFF1Aracerback \u80CC\u5FC3\u900F\u660E\u80A9\u90E8\uFF09\u3002ghost \u53EA\u7528\u4E8E flat-lay \u6A21\u677F\uFF08\u8272\u56FE\u4E0E ghost \u5206\u5C42\uFF09\u3002\n  var isOnModel = ghostUrl && /shadows|on_body/i.test(ghostUrl);\n  if(ghostUrl && !isOnModel){\n    var _gu = pimg(ghostUrl);\n    bg.style.backgroundSize = 'cover';\n    bg.style.backgroundPosition = 'center';\n    bg.style.backgroundRepeat = 'no-repeat';\n    /* 2026-10-25\uFF1A\u53EA\u628A\u300C\u5E3D\u515C\u300D\u90E8\u5206\u5F53\u524D\u666F\uFF08alpha>200\uFF09\uFF0C\u8863\u8EAB\u534A\u900F\u660E\u533A\u7F6E\u900F\u660E \u21D2 \u56FE\u6848\u4E0D\u88AB\u538B\u6697\u3002 */\n    try { bg.style.setProperty('z-index', '11', 'important'); } catch (e) {}\n    try { bg.style.pointerEvents = 'none'; } catch (e) {}\n    /* 2026-10-25\uFF1Aalpha \u9608\u503C\u6539\u4E3A**\u670D\u52A1\u7AEF**\u5904\u7406\uFF08image-proxy?cut=200\uFF0C\u89C1 server.js\uFF09\u2014\u2014\n       \u524D\u7AEF\u96F6\u5EF6\u8FDF\u3001\u591A\u7528\u6237\u5171\u4EAB\u78C1\u76D8\u7F13\u5B58\uFF1B\u6B64\u524D\u5728\u524D\u7AEF canvas \u73B0\u7B97\u8981 ~1s\uFF0C\u9996\u6B21\u5207\u9762\u4F1A\u51FA\u73B0\u300C\u56FE\u6848\u76D6\u5E3D\u515C\u300D\u7A7A\u7A97\u3002 */\n    try {\n      var _guCut = _gu + ((_gu.indexOf('?') >= 0) ? '&' : '?') + 'cut=200';\n      bg.style.backgroundImage = 'url(' + _guCut + ')';\n      window.__pfmFgUrl = _guCut;\n      if (typeof window.__pfmStageArt === 'function') window.__pfmStageArt();\n    } catch (e) { try { bg.style.backgroundImage = 'url(' + _gu + ')'; } catch (e2) {} }\n    getImageBounds(_gu, function(bounds) {\n      if (bounds && product) {\n        product._ghostBounds = bounds;\n        var spec = printAreaSpecs[currentPlacement] || printAreaSpecs['front'] || Object.values(printAreaSpecs)[0];\n        if (spec) resizeCanvasToPrintArea(spec);\n      }\n    });\n  } else {\n    bg.style.backgroundImage = 'none';\n    /* \u65E0 ghost\uFF08onmodel \u6A21\u677F/\u7F3A\u56FE\uFF09\u21D2 \u6062\u590D\u5230\u753B\u5E03\u4E4B\u4E0B\uFF0C\u4FDD\u6301\u539F\u884C\u4E3A\uFF08\u96F6\u56DE\u5F52\uFF09 */\n    try { bg.style.setProperty('z-index', '1', 'important'); } catch (e) {}\n    /* 2026-10-25\uFF1A**\u6E05\u6389\u4E0A\u4E00\u4E2A\u9762\u7684\u5E3D\u515C URL** \u2014\u2014 \u5426\u5219\u5207\u5230 Front/\u8896\u5B50\u540E\uFF0C\u5C55\u793A\u53F0(stageArt)\n       \u4ECD\u6309\u65E7 __pfmFgUrl \u8D34 Back \u7684\u5E3D\u515C \u21D2 \u7528\u6237\u5B9E\u6D4B\u300C\u54EA\u4E2A\u89D2\u5EA6\u90FD\u6709\u5E3D\u5B50\u300D\u3002\n       \u65E0 positioning \u7684\u9762\u5FC5\u987B\u663E\u5F0F\u7F6E\u7A7A\u5E76\u7ACB\u5373\u91CD\u7ED8\u5C55\u793A\u53F0\u3002 */\n    try { window.__pfmFgUrl = ''; } catch (e) {}\n    try { if (typeof window.__pfmStageArt === 'function') window.__pfmStageArt(); } catch (e) {}\n  }\n}\n\nvar params = window.__pfmParams || new URLSearchParams(location.search);\nvar pid=params.get('product_id'),selColor=params.get('color')||'';\n/* 2026-10-12: \u76EE\u5F55\u9875\u9009\u4E2D\u7684**\u5C3A\u7801**\uFF08\u9501\u6B7B\u7528\uFF09\u3002\u5E26\u5B83\u8FDB\u6765\u540E\uFF1A\u9009\u53D8\u4F53/\u52A0\u8D2D\u90FD\u6309\u300C\u8272+\u7801\u300D\u7CBE\u786E\u547D\u4E2D\uFF0C\n   \u4E0D\u518D\"\u6309\u989C\u8272\u731C\u4E00\u4E2A\u7801\"\uFF08\u5B9E\u6D4B 15 \u8272\u91CC 10 \u4E2A\u4F1A\u88AB\u731C\u6210 2XL/3XL\uFF0C\u7528\u6237\u5B8C\u5168\u65E0\u6CD5\u63A7\u5236\uFF09\u3002 */\nvar selSize=String(params.get('size')||'').trim();\n/* 2026-10-28\uFF1A\u6027\u522B\u4F20\u9012 \u2014\u2014 \u76EE\u5F55\u9875\u6309\u7537/\u5973/\u7AE5\u5206\u7C7B\u5E26 section \u8FDB\u6765\uFF1B\u6295\u7A3F/\u4E0B\u5355\u968F\u8BA2\u5355\u5C5E\u6027\u56DE\u4F20\uFF0C\u51FA\u56FE\u6309\u6B64\u9009\u6A21\u7279\u3002 */\nvar section=String(params.get('section')||'').trim();\nvar currentVariantId=null;\nfunction q(id){return document.getElementById(id)}\n\n// DEBUG MODE \u2014 silently enabled when ?debug=1 in URL; renders specs panel at bottom-right\nif(params.get('debug')){\n  // Optional tiny \"debug on\" tag (comment-out if you don't want it)\n  var dbgTag=document.createElement('div');\n  dbgTag.style.cssText='position:fixed;top:6px;right:8px;z-index:999999;background:#000;color:#0f0;font:11px/1.2 monospace;padding:3px 6px;border-radius:var(--pf-r-sm);opacity:.85';\n  dbgTag.textContent='DEBUG ON';\n  document.body.appendChild(dbgTag);\n}\n\n// 2026-08-30: \u8FD4\u56DE\u7EDF\u4E00\u8C03\u516C\u5171\u51FD\u6570 HD.goBack()\uFF08app-utils.js\uFF09\u2014 \u672C\u5730\u91CD\u590D\u5B9E\u73B0\u5DF2\u5220\u9664\n\n// ============= INIT CANVAS =============\nfunction initCanvas(){\n  // Placeholder size; resized to print area when product loads\n  var w=600,h=600;\n  // 2026-08-30: controlsAboveOverlay:true \u2014 \u63A7\u5236\u70B9\u753B\u5728 clipPath \u4E4B\u540E\uFF08\u5BF9\u8C61\u5728\u6253\u5370\u533A\u5916\u4ECD\u5B8C\u6574\u53EF\u89C1\u53EF\u64CD\u4F5C\uFF09\uFF0C\n  // \u5BF9\u8C61\u5185\u5BB9\u672C\u8EAB\u4ECD\u88AB\u88C1\u526A\u30022026-09-01: enableRetinaScaling:false \u2014 DPR3 \u624B\u673A\u4E0B retina \u4F1A\u653E\u5927\u5230 9000\u00B2\n  // (309MB) \u9020\u6210\u6BCF\u64CD\u4F5C\u5361\u987F\uFF0C\u5173\u95ED\u540E\u4F4D\u56FE 3000\u00B2(36MB, -89%)\u3002\u5BFC\u51FA\u4E0D\u53D7\u5F71\u54CD\uFF08toDataURL multiplier \u4E34\u65F6\u8986\u76D6\uFF09\u3002\n  canvas=new fabric.Canvas('pfmCanvas',{width:w,height:h,selection:false,preserveObjectStacking:true,renderOnAddRemove:false,controlsAboveOverlay:true,enableRetinaScaling:false}); /* 2026-09-03: selection:false \u7981\u6846\u9009\u2014\u2014\u7A7A\u767D\u62D6\u52A8\u4E0D\u518D\u62D6\u51FA\u84DD\u8272\u591A\u9009\u6846\uFF1B\u5BF9\u8C61\u70B9\u9009/\u62D6\u52A8/\u7F29\u653E\u624B\u67C4\u4E0D\u53D7\u5F71\u54CD\uFF08\u5C42\u7BA1\u7406\u8D70 Layers \u9762\u677F\uFF09 */\n  window.__pfmCanvas = canvas; // TEMP: diagnostic exposure for placement-switch bug hunt\n  var inner = q('pfmCanvasInner');\n  if(inner){ inner.style.width=w+'px'; inner.style.height=h+'px'; }\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF08\u7528\u6237\uFF1A\u300C\u6837\u5F0F\u8FD8\u662F\u4E0D\u4E00\u6837\u554A\uFF0C\u4E0D\u662F\u505A\u6210\u516C\u5171\u51FD\u6570\uFF0C\u8C03\u7528\u5417\uFF1F\u300D\uFF09\uFF1A\n     \u63A7\u5236\u70B9\u65CF\u7684**\u6837\u5F0F**\uFF08\u989C\u8272/\u7EBF\u578B/\u5F62\u72B6/\u5C3A\u5BF8/\u5404\u70B9\u5F62\u6001\uFF09\u4E0E**\u5C4F\u5E55\u6052\u5B9A**\u7EDF\u4E00\u6536\u53E3\u5230\n     assets/pfm-sel.js \u7684 PFMSEL\uFF1B\u5E38\u91CF\u771F\u6E90\u5728 CSS \u53D8\u91CF --pf-sel-*\uFF08pf-tokens.css\uFF09\uFF0C\n     \u753B\u677F\u4FA7 hd-canvas.css \u5F15\u7528\u540C\u4E00\u6279\u53D8\u91CF \u21D2 \u4E24\u4FA7\u50CF\u7D20\u7EA7\u540C\u6B3E\u3002\n     \u6539\u524D\u8FD9\u91CC\u5199\u6B7B\uFF1A\u5360\u4F4D 60/90 + \u9752\u8272 #00D4FF + \u865A\u7EBF [6,4] + \u5B9E\u5FC3\u5706\u70B9 + withConnection:false\uFF08\u65E0\u65CB\u8F6C\u6746\uFF09\uFF0C\n     \u4E0E\u753B\u677F\uFF08#534AB7 \u5B9E\u7EBF + \u5706\u89D2\u65B9\u5757\u89D2 + \u6D45\u5E95\u63CF\u8FB9\u8FB9\u70B9 + \u767D\u5E95\u5706\u65CB\u8F6C\u70B9 + 23px \u65CB\u8F6C\u6746\uFF09\u5B8C\u5168\u662F\u4E24\u5957\u3002\n     \u26A0\uFE0F \u5404\u70B9\u5C3A\u5BF8/\u6846\u7EBF\u4ECD\u5728\u4EA7\u54C1\u52A0\u8F7D\u540E\u7531 resizeCanvasToPrintArea / pfmApplyLayer \u6309\u5C4F\u5E55\u7F29\u653E\u91CD\u7B97\u3002 */\n  if(window.PFMSEL && PFMSEL.applyFabric){\n    PFMSEL.applyFabric(fabric, { screenScale: pfmScreenScale });\n    pfmApplyControlSize();   /* \u7ACB\u523B\u6309\u5F53\u524D\u5C4F\u5E55\u7F29\u653E\u843D\u4E00\u6B21\u5C3A\u5BF8\uFF08\u6539\u524D\u8FD9\u91CC\u662F\u5199\u6B7B\u7684 60/90 \u5360\u4F4D\u503C\uFF09 */\n  } else {\n    try{ console.warn('[pfm] assets/pfm-sel.js \u672A\u52A0\u8F7D \u21D2 \u63A7\u5236\u70B9\u4F7F\u7528 fabric \u9ED8\u8BA4\u6837\u5F0F'); }catch(e){}\n  }\n  drawGrid();\n  /* 2026-09-13: \u753B\u5E03\u4E0A\u7684\u6D6E\u52A8\u5220\u9664\u94AE\u5DF2\u4E0B\u7EBF \u2014\u2014 \u4E0E Actions \u91CC\u7684 Delete \u529F\u80FD\u91CD\u590D\uFF0C\n     \u4E14\u5728\u624B\u673A\u4E0A\u4F1A\u88AB\u63A8\u5230\u753B\u5E03\u8FB9\u7F18\u3001\u906E\u6321\u5185\u5BB9\u3002\u539F\u5220\u9664\u903B\u8F91\uFF08\u542B discardActiveObject \u9632\u9009\u4E2D\u6B8B\u7559\n     + syncTextPanel\uFF09\u5DF2\u5408\u5E76\u8FDB Actions \u7684 del \u5206\u652F\u3002 */\n  canvas.on('object:modified',function(){saveState();updateLayers();updateFloatToolbar();scheduleBounds();if(typeof syncTextPanel==='function')syncTextPanel()});\n  canvas.on('object:added',function(e){if(!_suppressSave)saveState();updateLayers();scheduleBounds();try{if(window.__pfmInstallMultiShadow&&e&&e.target)window.__pfmInstallMultiShadow(e.target)}catch(err){}});\n  canvas.on('selection:created',function(){updateFloatToolbar();if(typeof syncTextPanel==='function')syncTextPanel();pfmSyncGridVisibility();pfmLayerSyncSel();try{window.__pfmSyncBars&&window.__pfmSyncBars()}catch(e){}});\n  canvas.on('selection:updated',function(){updateFloatToolbar();if(typeof syncTextPanel==='function')syncTextPanel();pfmSyncGridVisibility();pfmLayerSyncSel();try{window.__pfmSyncBars&&window.__pfmSyncBars()}catch(e){}});\n  canvas.on('selection:cleared',function(){updateFloatToolbar();pfmSyncGridVisibility();pfmLayerSyncSel();try{window.__pfmSyncBars&&window.__pfmSyncBars()}catch(e){}});\n  canvas.on('mouse:down',function(e){if(e.target&&!e.target.isGrid)updateFloatToolbar()});\n\n  /* ===== 2026-09-14\uFF1A\u79FB\u52A8\u7AEF\u62D6\u52A8\u6027\u80FD\u4F18\u5316 =====\n     \u753B\u5E03\u4F4D\u56FE 3000\u00B2\uFF089M \u50CF\u7D20\uFF09\u800C\u663E\u793A\u533A\u4EC5 808\u00B2 \u2192 \u79FB\u52A8\u7AEF GPU \u5408\u6210\u5403\u7D27\uFF0C\u62D6\u52A8\u6389\u5E27\u3002\n     \u62D6\u52A8\u671F\u95F4\u505A\u4E24\u4EF6\u4F4E\u98CE\u9669\u7684\u4E8B\uFF1A\u2460 \u8DF3\u8FC7\u6BCF\u5E27\u547D\u4E2D\u68C0\u6D4B\uFF08skipTargetFind\uFF09\n     \u2461 \u7ED9\u5BB9\u5668\u52A0 .pfm-dragging\uFF0C\u7531 CSS \u628A canvas \u63D0\u5347\u4E3A\u72EC\u7ACB\u5408\u6210\u5C42\u3002\n     \u677E\u624B\u5373\u6062\u590D\uFF0C\u4E0D\u5F71\u54CD\u4EFB\u4F55\u65E2\u6709\u884C\u4E3A\u3002 */\n  function pfmDragOptimize(on){\n    try{\n      canvas.skipTargetFind = !!on;\n      var _inner = q('pfmCanvasInner');\n      if(_inner && _inner.classList) _inner.classList.toggle('pfm-dragging', !!on);\n    }catch(e){}\n  }\n  canvas.on('mouse:down',function(e){ if(e.target && !e.target.isGrid) pfmDragOptimize(true); });\n  canvas.on('mouse:up',function(){ pfmDragOptimize(false); });\n\n  /* ?perf=1 \u65F6\u663E\u793A\u5B9E\u65F6\u5E27\u7387\uFF08\u6392\u67E5\u79FB\u52A8\u7AEF\u6389\u5E27\u7528\uFF1B\u9ED8\u8BA4\u4E0D\u663E\u793A\uFF0C\u96F6\u5F71\u54CD\uFF09\u3002\n     \u663E\u793A\uFF1AFPS / \u5E27\u65F6\u95F4 / \u5BF9\u8C61\u6570 / \u753B\u5E03\u5C3A\u5BF8 \u2014\u2014 \u771F\u673A\u62D6\u52A8\u65F6\u76F4\u63A5\u8BFB\u6570\u3002 */\n  try{\n    if((window.__pfmParams||new URLSearchParams(location.search)).get('perf')){\n      var _pf=document.createElement('div');\n      _pf.style.cssText='position:fixed;left:8px;top:8px;z-index:99999;background:#111;color:#0f0;font:12px/1.35 monospace;padding:7px 11px;border-radius:var(--pf-r-sm);pointer-events:none;white-space:pre';\n      (document.body||document.documentElement).appendChild(_pf);\n      var _fr=[],_lt=0,_worst=0;\n      (function _tick(t){\n        if(_lt){ var d=t-_lt; _fr.push(d); if(d>_worst)_worst=d; if(_fr.length>90)_fr.shift(); }\n        _lt=t;\n        if(_fr.length>10){\n          var a=0,i; for(i=0;i<_fr.length;i++)a+=_fr[i]; a/=_fr.length;\n          _pf.textContent='FPS '+(1000/a).toFixed(0)+'  ('+a.toFixed(1)+'ms)\\nworst '+_worst.toFixed(0)+'ms  drop>20ms '+\n            _fr.filter(function(x){return x>20;}).length+'/'+_fr.length+\n            '\\nobjs '+canvas.getObjects().length+'   canvas '+canvas.width+'\u00B2';\n        }\n        requestAnimationFrame(_tick);\n      })(performance.now());\n    }\n  }catch(e){}\n}\n\n// \u753B\u5E03\u8986\u76D6**\u6574\u4EF6\u8863\u670D**\uFF08\u6A21\u677F\uFF09\uFF0C\u4EA7\u54C1 ghost \u94FA\u6EE1 wrapper\uFF1B\u6253\u5370\u533A\u5355\u72EC\u7528 canvas._pfmPrintArea \u8DDF\u8E2A\uFF0C\n// \u4F9B\u8D8A\u754C\u8B66\u544A + printfile \u88C1\u5207\u30022026-08-30: \u5220\u6253\u5370\u533A\u8FB9\u754C\u9650\u5236\uFF08canvas=\u6574\u4EF6\u8863\u670D\uFF0C\u4E0D\u518D\u9650\u5B9A\u6253\u5370\u533A\uFF09\u3002\nfunction resizeCanvasToPrintArea(spec){\n  if(!canvas || !spec || !spec.width || !spec.height) return;\n  // Actual printfile resolution (crop multiplier for export, e.g. 1800x2400 @150dpi)\n  var printW = spec.printWidth || spec.width;\n  var printH = spec.printHeight || spec.height;\n  // Template-relative coords (where the print area sits on the garment ghost image)\n  var areaW = spec.width, areaH = spec.height;\n  var templateW = spec.templateWidth || areaW;\n  var templateH = spec.templateHeight || areaH;\n  // \u7528\u753B\u5E03\u533A\u5BBD\u5EA6\uFF08\u5DF2\u6263 padding/margin\uFF09\u800C\u975E\u6574\u89C6\u53E3\u30022026-08-30: clientWidth \u542B padding \u4F1A\u628A\u753B\u5E03\u6491\u5230\u6EA2\u51FA\n  // \uFF08784 \u2192 \u5185\u5BB9\u533A 744\uFF09\u3002\n  var areaEl = q('pfmCanvasArea');\n  var _padL = 0, _padR = 0;\n  if(areaEl){\n    var _cs = getComputedStyle(areaEl);\n    _padL = parseFloat(_cs.paddingLeft) || 0;\n    _padR = parseFloat(_cs.paddingRight) || 0;\n  }\n  var availableW = areaEl ? (areaEl.clientWidth - _padL - _padR) : Math.min(1100, window.innerWidth * 0.94);\n  var maxW = Math.min(1100, availableW);\n  // 2026-09-10: \u300C\u9AD8\u5EA6\u7EA6\u675F\u300D\u2014\u2014 \u753B\u5E03\u5FC5\u987B\u6574\u5757\u53EF\u89C1\uFF1A\u53EA\u6309\u5BBD\u5EA6\u7B97\u4F1A\u8BA9 inner \u9AD8\u5EA6\u8D85\u51FA\u753B\u5E03\u533A\uFF0C\u88AB flex \u538B\u6241/\u51FA\u6EDA\u52A8\u6761\u3002\n  // \u6B63\u65B9\u5F62\u6A21\u677F\u5FC5\u987B\u540C\u65F6\u53D7\u53EF\u7528\u9AD8\u5EA6\u9650\u5236\uFF0C\u5426\u5219\u4EA7\u54C1\u56FE\u88AB cover \u88C1\u6389\u4E0A\u4E0B\u3002\n  var _padT = 0, _padB = 0, _availH = 0;\n  if(areaEl){\n    var _csH = getComputedStyle(areaEl);\n    _padT = parseFloat(_csH.paddingTop) || 0;\n    _padB = parseFloat(_csH.paddingBottom) || 0;\n    _availH = areaEl.clientHeight - _padT - _padB;\n  }\n  // \u9762\u677F\u9690\u85CF/\u5C1A\u672A\u5E03\u5C40\u65F6 clientHeight \u53EF\u80FD\u662F 0 \u2192 \u9000\u56DE\u7EAF\u5BBD\u5EA6\u7EA6\u675F\uFF1B\u8FC7\u5C0F\u65F6\u7ED9 200px \u4E0B\u9650\uFF08\u5B81\u53EF\u8F7B\u5FAE\u6EDA\u52A8\uFF0C\u4E0D\u8981\u753B\u5E03\u53D8\u90AE\u7968\uFF09\n  var maxH;\n  /* \uD83D\uDD34 2026-09-19: \u624B\u673A\u7AEF maxH **\u4E25\u683C = \u53EF\u7528\u9AD8\u5EA6**\u3002\u539F\u5B9E\u73B0 `Math.max(_availH,200)` \u7684 200px \u4E0B\u9650\n     \uFF08\u539F\u610F\"\u5B81\u53EF\u8F7B\u5FAE\u6EDA\u52A8\u4E5F\u4E0D\u8981\u753B\u5E03\u53D8\u90AE\u7968\"\uFF09\u5728 _availH \u2264 200 \u65F6\u5FC5\u7136\u8BA9\u753B\u5E03\u9AD8\u4E8E\u53EF\u89C6\u533A \u21D2 \u753B\u5E03\u533A\u51FA\u73B0\n     \u6EDA\u52A8\u6761 \u21D2 \u624B\u6307\u5728\u753B\u5E03\u4E0A\u6ED1\u52A8\u4F1A\u628A\u6574\u5F20\u4EA7\u54C1\u56FE\u6EDA\u8D70\uFF08\u7528\u6237\u62A5\u300C\u80CC\u666F\u56FE\u4F1A\u968F\u753B\u9762\u6ED1\u52A8\u300D\uFF09\u3002\n     \u5E03\u5C40\u672A\u5C31\u7EEA\uFF08clientHeight \u2264 80\uFF0C\u5982\u753B\u677F\u521A\u6253\u5F00/\u4EA7\u54C1\u52A0\u8F7D\u4E2D\uFF09\u4E5F\u4E0D\u518D\u8D70 99999\uFF0C\u6539\u7528\u89C6\u53E3\u4F30\u7B97\uFF0C\n     \u7B49 ResizeObserver \u5728\u5E03\u5C40\u7A33\u5B9A\u540E\u91CD\u7B97\u3002**\u684C\u9762\u7AEF\u903B\u8F91\u4E00\u5B57\u4E0D\u6539**\u3002 */\n  var _isTouchLayout = false;\n  try{ _isTouchLayout = !!(window.__pfmTouchLayout && window.__pfmTouchLayout()); }catch(e){}\n  if(_isTouchLayout){\n    maxH = _availH > 80 ? _availH : Math.round(window.innerHeight * 0.45);\n  }else{\n    maxH = _availH > 80 ? Math.max(_availH, 200) : 99999;\n  }\n  var targetScale = Math.min(1, maxW / templateW, maxH / templateH);\n  /* 2026-10-29\uFF1A\u624B\u673A\u7AEF\u62BD\u5C49\u6253\u5F00\u65F6\uFF0C\u753B\u5E03\u7F29\u5230 60%\uFF08\u7528\u6237\uFF1A\u70B9\u5E95\u90E8\u529F\u80FD \u2192 \u8863\u670D\u753B\u677F\u7F29\u5C0F\u3001\u6536\u8D77\u6062\u590D\uFF0C\u5E45\u5EA6 0.6\uFF09\u3002\n     \u914D\u5408 CSS \u62BD\u5C49\u9AD8\u5EA6\u516C\u5F0F\u628A 100vw \u6539 60vw \u21D2 \u62BD\u5C49\u9876\u8FB9\u4E0A\u79FB\u3001\u5360\u6EE1\u753B\u5E03\u7F29 60% \u540E\u7684\u5269\u4F59\u7A7A\u95F4\u3002\n     \u53EA\u5F71\u54CD\u663E\u793A\uFF08targetInnerW/H\uFF09\uFF1Bcanvas \u5185\u90E8\u903B\u8F91\u5C3A\u5BF8 templateW/H \u4E0D\u53D8 \u21D2 \u5BFC\u51FA/\u751F\u4EA7\u4E0D\u53D7\u5F71\u54CD\u3002\n     \u89E6\u53D1\u91CD\u7B97 = hd-edit.js bindDrawerResize\uFF08MutationObserver \u76EF #pfmProps class\uFF0C40ms \u540E\u6D3E\u53D1 resize\uFF09\u3002 */\n  if (_isTouchLayout) {\n    var _pfmProps = q('pfmProps');\n    if (_pfmProps && _pfmProps.classList.contains('pfm-open')) targetScale *= 0.6;\n  }\n  var targetInnerW = Math.round(templateW * targetScale);\n  var targetInnerH = Math.round(templateH * targetScale);\n\n  /* \uD83D\uDD34 2026-10-13\uFF08\u7532 \u00B7 \u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u5E42\u7B49\u5B88\u536B \u2014\u2014 \u53C2\u6570\u4E0E\u4E0A\u6B21\u5B8C\u5168\u4E00\u81F4\u65F6**\u4E0D\u518D\u8C03\u7528 setDimensions**\u3002\n     \u6839\u56E0\uFF1A\u672C\u51FD\u6570\u5148\u8C03 setDimensions \u8BBE backstore \u5C3A\u5BF8\uFF08**\u4F1A\u91CD\u7F6E\u4F4D\u56FE**\uFF09\uFF0C\u518D pfmApplyClip()/drawGrid() \u91CD\u753B\uFF1B\n     \u800C**\u7ED9 canvas \u8D4B width \u4F1A\u91CD\u7F6E\u4F4D\u56FE**\uFF08\u5373\u4F7F\u503C\u76F8\u540C\uFF0C\u89C4\u8303\u5982\u6B64\uFF09\u21D2 \u5728 setDimensions \u4E0E drawGrid \u7684 renderAll \u4E4B\u95F4\n     \u5B58\u5728\u4E00\u5E27**\u7A7A\u4F4D\u56FE** \u21D2 \u9732\u51FA\u5BB9\u5668\u5E95\u56FE\uFF08#pfmZoomLayer \u7684 background-image = **\u6574\u5E45\u6A21\u677F\u56FE**\uFF0Cproduct 71 \u7684 3000\u00B2\n     \u6A21\u677F**\u542B\u6B63+\u80CC\u9762\u89C6\u56FE**\uFF09\u21D2 \u8868\u73B0\u4E3A\u300C\u7F16\u8F91\u65F6\u95EA\u4E00\u4E0B\u80CC\u540E\u7684\u56FE\u7247\u300D\u3002\n     \u89E6\u53D1\uFF1A\u8C03\u7528\u65B9 getImageBounds \u7684**\u5F02\u6B65\u56DE\u8C03**\uFF08\u672C\u6587\u4EF6 584 \u884C\uFF09\u5728\u5E95\u56FE\u52A0\u8F7D\u5B8C\u6210\u540E**\u91CD\u5165**\u672C\u51FD\u6570\uFF0Cspec \u4E0E\u5F53\u524D\u4E00\u81F4\n     \u21D2 \u7EAF\u5C5E\u91CD\u590D\u6E05\u56FE + \u91CD\u7ED8 \u21D2 \u5FC5\u95EA\u3002\n     \u5B88\u536B\u53EA\u770B\u300C\u6A21\u677F\u5C3A\u5BF8 + \u76EE\u6807\u663E\u793A\u5C3A\u5BF8 + \u6253\u5370\u533A\u300D\u662F\u5426\u53D8\u5316\uFF1A\u53D8\uFF08\u9996\u5E27 / \u7A97\u53E3 resize / \u5207\u9762 spec \u4E0D\u540C\uFF09\u21D2 \u7167\u5E38\u6267\u884C\uFF1B\n     \u4E0D\u53D8 \u21D2 \u8DF3\u8FC7 setDimensions\uFF08**\u4E0D\u518D\u6E05\u7A7A\u4F4D\u56FE**\uFF09\uFF1B\u4E0B\u9762 pfmApplyClip/drawGrid/pfmSyncGridVisibility \u4ECD\u7167\u5E38\u8DD1\u3002 */\n  var inner = q('pfmCanvasInner');\n  /* 2026-10-29\uFF1Atouch \u5F62\u6001\u753B\u5E03\u6709\u8FC7\u6E21\u52A8\u753B\uFF0C\u8BFB clientWidth \u4F1A\u62FF\u5230\u65E7\u503C \u21D2 _rzKey \u4E0D\u7A33\u3001\u8FC7\u6E21\u4E2D\u53CD\u590D setDimensions\n     \u6253\u65AD\u52A8\u753B\u3002touch \u4E0B ~ \u6BB5\u6539\u7528\u76EE\u6807\u503C targetInnerW\uFF0C\u5E42\u7B49\u5B88\u536B\u624D\u80FD\u7A33\u4F4F\uFF1B\u684C\u9762\u7AEF\u4E0D\u53D8\u3002 */\n  var _rzKey = templateW+'x'+templateH+'@'+targetInnerW+'x'+targetInnerH\n             +'#'+spec.left+','+spec.top+','+areaW+','+areaH+'/'+printW+'x'+printH\n             +'~'+(inner?(_isTouchLayout ? (targetInnerW+'x'+targetInnerH) : (inner.clientWidth+'x'+inner.clientHeight)):'');\n  var _rzSame = (canvas._pfmResizeKey === _rzKey);\n  canvas._pfmResizeKey = _rzKey;\n\n  // Apply wrapper size first, then read back its real rendered size to guarantee alignment\n  if(!_rzSame && inner){ inner.style.width=targetInnerW+'px'; inner.style.height=targetInnerH+'px'; }\n\n  var actualInnerW = (inner && _isTouchLayout) ? targetInnerW : (inner ? inner.clientWidth : targetInnerW);\n  var actualInnerH = (inner && _isTouchLayout) ? targetInnerH : (inner ? inner.clientHeight : targetInnerH);\n\n  // Canvas = WHOLE garment: logical size = template, CSS display = wrapper (0,0 origin).\n  var canvasCssScale = actualInnerW / templateW;\n  if(!_rzSame){\n    canvas.setDimensions({width: templateW, height: templateH});\n    canvas.setDimensions({width: actualInnerW, height: actualInnerH},{cssOnly:true});\n  }\n  canvas._pfmDisplayScale = canvasCssScale;\n  canvas._pfmPrintWidth = printW;\n  canvas._pfmPrintHeight = printH;\n  // Print-area rectangle in TEMPLATE (canvas) coords \u2014 drives the out-of-area warning\n  // (checkPrintBounds) and the printfile crop (exportAllPlacements).\n  /* 2026-10-22\uFF08\u7532\uFF09\uFF1A\u6253\u5370\u533A\u6846\u53D8\u5316\u65F6\u91CD\u6392\u8BBE\u8BA1\u5BF9\u8C61\uFF0C\u4FDD\u6301\u76F8\u5BF9\u6253\u5370\u533A\u5DE6\u4E0A\u89D2\u7684\u6BD4\u4F8B\u4F4D\u7F6E\u3002\n     \u6839\u56E0\uFF1A\u7F51\u7EDC\u4E0D\u4F73\u65F6\u5148\u6309 fallback \u6846\uFF08isFallback\uFF09\u753B\u6846\uFF0Cprintfiles \u771F\u6570\u636E\u5230\u8FBE\u540E\u6846\u4F4D\u7F6E/\u5927\u5C0F\u53D8\u4E86\uFF0C\n     \u4F46\u8D34\u7EB8\u8FD8\u505C\u5728\u65E7\u6846\u5750\u6807\u4E0B \u21D2 \u6253\u5370\u533A\u6846\u4F4D\u7F6E/\u5927\u5C0F\u4E0D\u5BF9\u3002\u8FD9\u91CC\u5728\u300C\u6846\u53D8\u5316\u300D\u65F6\u6309\u6BD4\u4F8B\u5E73\u79FB\u8D34\u7EB8\uFF08\u5C3A\u5BF8\u4E0D\u53D8\uFF09\u3002\n     \u5207\u9762\u5207\u6362\u65F6\u753B\u5E03\u5DF2 clear\uFF08\u65E0\u5BF9\u8C61\u53EF\u6392\uFF09\u3001\u7A97\u53E3 resize \u53EA\u6539 CSS \u7F29\u653E\u4E0D\u6539\u6A21\u677F\u5750\u6807\uFF08_moved=false\uFF09\u21D2 \u5747\u4E0D\u53D7\u5F71\u54CD\u3002 */\n  var _pfmOldPa = canvas._pfmPrintArea;\n  canvas._pfmPrintArea = { left: spec.left, top: spec.top, width: areaW, height: areaH, templateW: templateW, templateH: templateH };\n  if (_pfmOldPa && _pfmOldPa.width && _pfmOldPa.height) {\n    var _pfmMoved = (_pfmOldPa.left !== spec.left || _pfmOldPa.top !== spec.top || _pfmOldPa.width !== areaW || _pfmOldPa.height !== areaH);\n    if (_pfmMoved) {\n      var _pfmRx = areaW / _pfmOldPa.width;\n      var _pfmRy = areaH / _pfmOldPa.height;\n      canvas.getObjects().forEach(function (_o) {\n        if (_o.isGrid || _o.isPreview) return;\n        _o.set({\n          left: spec.left + (_o.left - _pfmOldPa.left) * _pfmRx,\n          top: spec.top + (_o.top - _pfmOldPa.top) * _pfmRy\n        });\n        _o.setCoords();\n      });\n      canvas.requestRenderAll();\n    }\n  }\n\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF1A\u63A7\u5236\u70B9\u65CF\uFF08\u89C6\u89C9\u76F4\u5F84 8px / \u547D\u4E2D\u533A 22px / \u65CB\u8F6C\u70B9\u95F4\u8DDD 32px / \u6846\u7EBF 3px\uFF09\n     \u7684\u5C4F\u5E55\u6052\u5B9A\u7EDF\u4E00\u8D70 `pfmApplyControlSize()`\uFF08\u5185\u90E8\u53D6 `pfmScreenScale()` = CSS \u7F29\u653E \u00D7 **\u6574\u4F53\u7F29\u653E**\uFF09\u3002\n     \u6539\u524D\u8FD9\u91CC\u53EA\u9664\u4E86 `canvasCssScale`\uFF0C\u6F0F\u4E86\u6574\u4F53\u7F29\u653E \u21D2 \u653E\u5927\u753B\u5E03\u65F6\u63A7\u5236\u6846\u6574\u4F53\u53D8\u5927\u3002\n     \uFF08\u672C\u5757\u4E0E `pfmApplyLayer()` \u91CC\u90A3\u6B21\u8C03\u7528\u662F**\u540C\u4E00\u4E2A\u51FD\u6570** \u21D2 \u4E00\u6761\u89C4\u5219\u53EA\u7559\u4E00\u4EFD\u5B9E\u73B0\u3002\uFF09 */\n  pfmApplyControlSize();\n\n  var container = inner && inner.querySelector('.canvas-container');\n  if(container){\n    container.style.position='absolute';\n    container.style.left='0px'; container.style.top='0px';\n    container.style.width=actualInnerW+'px'; container.style.height=actualInnerH+'px';\n    var upper=container.querySelector('.upper-canvas');\n    if(upper){ upper.style.pointerEvents='auto'; upper.style.width=actualInnerW+'px'; upper.style.height=actualInnerH+'px'; }\n    var lower=container.querySelector('.lower-canvas');\n    if(lower){ lower.style.width=actualInnerW+'px'; lower.style.height=actualInnerH+'px'; }\n  }\n  // 2026-08-30: \u753B\u5E03\u89C6\u89C9\u88C1\u526A\uFF08\u6240\u89C1\u5373\u6240\u5F97\uFF09\u2014 \u8D85\u51FA\u6253\u5370\u533A\u7684\u5185\u5BB9\u4E0D\u663E\u793A\uFF08\u5BF9\u8C61\u4ECD\u53EF\u62D6\u52A8/\u9009\u4E2D\uFF09\n  pfmApplyClip();\n  drawGrid();\n  pfmSyncGridVisibility(); // 2026-08-30: \u6253\u5370\u533A\u8FB9\u6846\u8DDF\u968F\u9009\u4E2D\u72B6\u6001\u663E\u793A/\u9690\u85CF\n  /* 2026-10-14\uFF08\u7532\uFF09\uFF1A\u5370\u533A**\u521A\u5C31\u7EEA** \u21D2 \u7ACB\u523B\u653E\u51FA\u6392\u961F\u7684\u8D34\u56FE\uFF08\u4E0D\u5FC5\u7B49 250ms \u8F6E\u8BE2\u90A3\u4E00\u62CD\uFF09\u3002\n     \u26A0\uFE0F \u5FC5\u987B\u653E\u5728\u672B\u884C\uFF1A\u6B64\u523B clipPath / \u7F51\u683C / \u63A7\u5236\u70B9\u5C3A\u5BF8\u90FD\u5DF2\u843D\u5B9A\uFF0C\u65B0\u52A0\u5165\u7684\u5BF9\u8C61\u4E0D\u4F1A\u88AB\u91CD\u6392\u3002 */\n  try{ if(typeof _pfmFlushImgQueue === 'function') _pfmFlushImgQueue(); }catch(e){}\n}\n\n// 2026-08-30: \u552F\u4E00 clipPath \u8BBE\u7F6E\u6E90 \u2014 \u628A\u753B\u5E03\u6E32\u67D3\u88C1\u526A\u5230\u6253\u5370\u533A\u77E9\u5F62\u3002\n// loadFromJSON \u6062\u590D/\u64A4\u9500/\u91CD\u505A\u540E\u5FC5\u987B\u91CD\u65B0\u8C03\u7528\uFF08fabric \u6062\u590D\u53EF\u80FD\u6E05\u6389 canvas.clipPath\uFF09\nfunction pfmApplyClip(){\n  if(!canvas) return;\n  var pa = canvas._pfmPrintArea;\n  if(pa){\n    canvas.clipPath = new fabric.Rect({\n      left: pa.left, top: pa.top, width: pa.width, height: pa.height,\n      absolutePositioned: true, originX: 'left', originY: 'top',\n      selectable: false, evented: false\n    });\n  } else {\n    canvas.clipPath = null;\n  }\n  if(canvas.requestRenderAll) canvas.requestRenderAll();\n}\n\n// 2026-08-30: \u9009\u4E2D\u5BF9\u8C61\u65F6\u663E\u793A\u6253\u5370\u533A\u8FB9\u6846\uFF08\u865A\u7EBF\u6846+\u5341\u5B57\u7EBF\uFF09\uFF0C\u5426\u5219\u9690\u85CF\n// \u7ED1\u5B9A selection:created/updated/cleared\uFF1BdrawGrid/restoreState \u540E\u4E5F\u540C\u6B65\u4E00\u6B21\nfunction pfmSyncGridVisibility(){\n  if(!canvas) return;\n  var show = !!canvas.getActiveObject();\n  canvas.getObjects().forEach(function(o){\n    if(o.isGrid && o.visible !== show) o.set('visible', show);\n  });\n  if(canvas.requestRenderAll) canvas.requestRenderAll();\n}\n\n// ===== GRID / PRINT AREA =====\n// 2026-08-30: canvas=\u6574\u4EF6\u8863\u670D \u2014\u2014 grid \u53EA\u753B\u6253\u5370\u533A\u4F4D\u7F6E\u7684\u53C2\u7167\uFF08\u865A\u7EBF\u6846+\u5341\u5B57\u7EBF\uFF09\uFF0C\n// \u4E0D\u518D\u753B canvas \u8FB9\u754C\u6846\u3001\u4E0D\u518D\u753B\u534A\u900F\u660E\u586B\u5145\u5E95\uFF08\u4E0D\u9650\u5236\u8BBE\u8BA1\uFF09\u3002\n/* 2026-10-14: \u6253\u5370\u533A\u6846\u5BF9\u8C61\u4E00\u5F8B\u300C\u6052\u4E0D\u53EF\u4EA4\u4E92\u300D\u3002\n   \u26A0\uFE0F \u53EA\u5728\u5185\u5B58\u91CC\u8BBE selectable/evented **\u4E0D\u591F** \u2014\u2014 fabric \u4E0D\u5E8F\u5217\u5316\u8FD9\u4E24\u4E2A\u5B57\u6BB5\uFF0C\u4ECE JSON \u590D\u6D3B\u7684\u6846\u4F1A\u53D8\u56DE\n   \u53EF\u9009/\u53EF\u62D6/\u53EF\u8F6C\uFF08\u7528\u6237\u5B9E\u6D4B\u300C\u6062\u590D\u8BBE\u8BA1\u540E\u6253\u5370\u533A\u88AB\u8F6C\u6B6A\u300D\uFF09\u3002\u6545\u53CC\u4FDD\u9669\uFF1A\n   \u2460 \u8FD9\u91CC\u8865 lock* + hasControls\uFF1B\u2461 \u8FD8\u539F\u8DEF\u5F84\u7EDF\u4E00\u300C\u4E22\u5F03\u65E7\u6846 + drawGrid() \u91CD\u753B\u300D\uFF08\u89C1 restoreState\uFF09\u3002 */\nfunction _pfmLockGrid(o){\n  try{\n    o.set({selectable:false,evented:false,hasControls:false,perPixelTargetFind:false,\n      lockMovementX:true,lockMovementY:true,lockRotation:true,lockScalingX:true,lockScalingY:true});\n  }catch(e){}\n  o.isGrid=true;\n  return o;\n}\nfunction drawGrid(){\n  canvas.getObjects().forEach(function(o){if(o.isGrid)canvas.remove(o)});\n  if(!showGrid||!canvas){canvas&&canvas.renderAll();return}\n  var pa=canvas._pfmPrintArea;\n  if(!pa){canvas.renderAll();return}\n  var w=pa.width, h=pa.height, lx=pa.left, ty=pa.top;\n  var glow='rgba(0,0,0,0.55) 0 0 6px';\n  // 2026-09-04: \u6253\u5370\u533A\u6307\u793A\u7EBF\u300C\u5C4F\u5E55\u6052\u5B9A\u300D\u2014\u2014 \u903B\u8F91\u5BBD = 3 / _pfmDisplayScale\uFF08\u540C\u63A7\u5236\u70B9 cornerSize \u516C\u5F0F\uFF09\uFF0C\n  // \u5426\u5219\u9AD8\u5206\u8FA8\u7387\u6A21\u677F\u4F1A\u663E\u7EC6\u3002\u76EE\u6807\u89C6\u89C9 3px\uFF082026-09-10 \u52A0\u7C97 2\u21923\uFF09\u3002\n  var _sc = pfmScreenScale();   /* 2026-10-04: \u542B**\u6574\u4F53\u7F29\u653E**\uFF08\u6539\u524D\u53EA\u9664 CSS \u7F29\u653E \u21D2 \u653E\u5927\u65F6\u6307\u793A\u7EBF\u53D8\u7C97\uFF09 */\n  var gridSW = Math.max(1, Math.round(3 / _sc));\n  var dash = [Math.max(2, Math.round(6 / _sc)), Math.max(2, Math.round(3 / _sc))];\n  var sw = gridSW, inset = sw / 2;\n  var left=lx, top=ty, right=lx+w, bottom=ty+h;\n  var borderOpt={stroke:'#1FBDB7',strokeWidth:sw,strokeDashArray:dash,fill:'',shadow:glow,strokeLineCap:'butt',strokeLineJoin:'miter',strokeMiterLimit:2};\n  var border=new fabric.Path('M '+left+' '+top+' L '+right+' '+top+' L '+right+' '+bottom+' L '+left+' '+bottom+' Z', borderOpt);\n  canvas.add(_pfmLockGrid(border));\n  var cx=lx+w/2, cy=ty+h/2;\n  var l1=new fabric.Line([cx,ty,cx,ty+h],{stroke:'#1FBDB7',strokeWidth:gridSW,strokeDashArray:dash,shadow:glow});canvas.add(_pfmLockGrid(l1));\n  var l2=new fabric.Line([lx,cy,lx+w,cy],{stroke:'#1FBDB7',strokeWidth:gridSW,strokeDashArray:dash,shadow:glow});canvas.add(_pfmLockGrid(l2));\n  pfmSyncGridVisibility(); // 2026-08-30: \u6253\u5370\u533A\u8FB9\u6846\u8DDF\u968F\u9009\u4E2D\u72B6\u6001\u663E\u793A/\u9690\u85CF\uFF08\u6240\u6709 drawGrid \u8C03\u7528\u70B9\u81EA\u52A8\u751F\u6548\uFF09\n  canvas.renderAll();\n}\n\n// ===== HISTORY\uFF08\u6BCF placement \u4E00\u4EFD\uFF09=====\n// 2026-09-01: saveState 300ms \u9632\u6296\u5408\u5E76 + \u6808\u9876\u53BB\u91CD\uFF1B\u9632\u6296\u56DE\u8C03\u7528\u6355\u83B7\u7684 plc\u3001\u4E0D\u518D\u8BFB canvas\uFF08\u9632\u5207\u9762\u540E\u4E32\u6808\uFF09\u3002\n// 2026-09-01: undo/redo \u91CD\u5EFA\u671F\u95F4\u5FC5\u987B\u6291\u5236 object:added \u81EA\u52A8 saveState \u2014\u2014 \u91CD\u5EFA\u5FEB\u7167\u53EA\u542B grid \u4E0D\u542B\u7528\u6237\u56FE\u7247\uFF0C\n// \u5165\u6808\u4F1A\u5BFC\u81F4\u300C\u8FDE\u7EED\u4E24\u6B21 undo \u56FE\u7247\u6C38\u4E45\u6D88\u5931\u300D\u56DE\u5F52\uFF08P1-1 \u5F15\u5165\uFF09\u3002\nvar _saveTimer = null;\nvar _suppressSave = false;\n/* \u2500\u2500 2026-10-14\uFF1A\u5E8F\u5217\u5316\u767D\u540D\u5355\u3010\u9632\u56DE\u5F52\u81EA\u68C0\u3011\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   `fabric.Object.prototype.toObject`\uFF08\u89C1\u672C\u6587\u4EF6\u4E0A\u65B9\u8865\u4E01\uFF09\u7528\u7684\u662F\u3010\u6B63\u5411\u767D\u540D\u5355\u3011\u21D2\n   \u5F80\u5BF9\u8C61\u4E0A\u65B0\u52A0\u7684\u81EA\u5B9A\u4E49\u5C5E\u6027\u4F1A\u88AB\u3010\u9759\u9ED8\u4E22\u5F03\u3011\uFF1A\u4E0D\u62A5\u9519\u3001\u4E0D\u629B\u5F02\u5E38\uFF0C\u53EA\u5728\"\u91CD\u8FDB\u9875\u9762 / \u64A4\u9500\u4E4B\u540E\n   \u67D0\u4E2A\u529F\u80FD\u574F\u6389\"\u65F6\u624D\u66B4\u9732\u3002\u5DF2\u6709\u4E24\u6B21\u5148\u4F8B \u2014\u2014 `pfmName`\u3001`pfmArcDeg`/`pfmArcDir`\uFF082026-10-14\n   \u7528\u6237\u62A5\u300C\u7ED8\u753B\u533A\u7834\u788E\u300D\u7684\u6839\u56E0\uFF09\u3002\n   \u672C\u81EA\u68C0\u5728\u5B58\u5FEB\u7167\u65F6\u62BD\u67E5\uFF1A\u5BF9\u8C61\u4E0A\u3010\u81EA\u6709\u3011\u3001\u540D\u5B57\u4EE5 `_*pfm` \u5F00\u5934\u3001\u53C8\u4E0D\u5728 `toObject()` \u7ED3\u679C\u91CC\u7684\n   \u5C5E\u6027 \u21D2 \u63A7\u5236\u53F0\u70B9\u540D\uFF0C\u6307\u660E\u8BE5\u767B\u8BB0\u5230\u767D\u540D\u5355\u3001\u8FD8\u662F\u8BE5\u767B\u8BB0\u4E3A\"\u8FD0\u884C\u65F6\u7F13\u5B58\"\u3002\n   \u00B7 \u8282\u6D41 5s \u00B7 \u53EA\u8DD1\u5728 saveState\uFF08\u975E\u70ED\u8DEF\u5F84\uFF09\u00B7 \u5168\u7A0B try \u5305\u88F9 \u21D2 \u7EDD\u4E0D\u5F71\u54CD\u4E3B\u6D41\u7A0B\u3002\n   \uD83D\uDD34 \u4EE5\u540E\u65B0\u589E\u81EA\u5B9A\u4E49\u5C5E\u6027\uFF1A\u4F18\u5148\u767B\u8BB0\u5230\u4E0A\u65B9 toObject \u767D\u540D\u5355\uFF1B\u786E\u5B9E\u53EA\u662F\u8FD0\u884C\u65F6\u7F13\u5B58 \u21D2 \u767B\u8BB0\u5230 PFM_RUNTIME_ONLY\u3002 */\nvar _pfmAuditAt = 0;\nvar PFM_RUNTIME_ONLY = {\n  _pfmNoClick: 1, _pfmCB: 1, _pfmCBKey: 1,   /* \u8FDE\u70B9\u4FDD\u62A4 / \u5305\u56F4\u76D2\u7F13\u5B58\uFF08\u5E26 key \u6821\u9A8C\uFF0C\u4F1A\u81EA\u6108\uFF09 */\n  _pfmS0: 1, _pfmW0: 1,                      /* \u5C3A\u5BF8\u57FA\u51C6\uFF08\u4E22\u5931\u540E\u6309\u5F53\u524D scale \u91CD\u5EFA\uFF0C\u6539\u524D\u884C\u4E3A\uFF09 */\n  __pfmFxSafe: 1,                            /* \u6EE4\u955C\u5B89\u5168\u5224\u5B9A\u7F13\u5B58\uFF08\u53EF\u91CD\u7B97\uFF09 */\n  _pfmOrigW: 1, _pfmOrigH: 1                 /* \u7D20\u6750\u5E93\u539F\u56FE\u5C3A\u5BF8\uFF1A\u4EC5 addImage \u65F6\u7528\u4E8E DPI \u5224\u5B9A\uFF08\u5BFC\u51FA\u8D70 _pfmOrigUrl\uFF09 */\n};\nfunction pfmAuditSerializedProps(){\n  try {\n    var now = Date.now();\n    if (now - _pfmAuditAt < 5000) return;\n    _pfmAuditAt = now;\n    if (!canvas || !canvas.getObjects) return;\n    var miss = {}, names = [];\n    canvas.getObjects().forEach(function(o){\n      if (!o || o.isGrid || o.isPreview) return;\n      var keys; try { keys = Object.keys(o); } catch (e) { return; }\n      var json = null;   /* \u61D2\u5E8F\u5217\u5316\uFF1A\u53EA\u6709\u771F\u7684\u547D\u4E2D\u53EF\u7591\u5C5E\u6027\u624D\u4ED8\u51FA\u8FD9\u6B21\u6210\u672C */\n      keys.forEach(function(k){\n        if (!/^_*pfm/i.test(k)) return;\n        if (PFM_RUNTIME_ONLY[k]) return;\n        if (json === null) { try { json = o.toObject(); } catch (e) { json = {}; } }\n        if (!(k in json)) {\n          if (!miss[k]) { miss[k] = []; names.push(k); }\n          if (miss[k].indexOf(o.type) < 0) miss[k].push(o.type || '?');\n        }\n      });\n    });\n    if (names.length) {\n      console.warn('[hd] \u5E8F\u5217\u5316\u767D\u540D\u5355\u53EF\u80FD\u6F0F\u9879 \u2014\u2014 \u8FD9\u4E9B\u81EA\u5B9A\u4E49\u5C5E\u6027\u4E0D\u4F1A\u8FDB\u8349\u7A3F/\u64A4\u9500\u5FEB\u7167\uFF0C\u6062\u590D\u540E\u4F1A\u4E22: '\n        + names.map(function(k){ return k + '(' + miss[k].join('/') + ')'; }).join(', ')\n        + ' \u21D2 \u8BF7\u767B\u8BB0\u5230 hd-canvas.js \u7684 toObject \u767D\u540D\u5355\uFF08\u6216\u52A0\u5165 PFM_RUNTIME_ONLY\uFF09');\n    }\n  } catch (e) { /* \u81EA\u68C0\u81EA\u8EAB\u7EDD\u4E0D\u5192\u6CE1 */ }\n}\ntry{ window.__pfmAuditSerializedProps = pfmAuditSerializedProps; }catch(e){}\n\nfunction saveState(){\n  var plc = currentPlacement;\n  try{ pfmAuditSerializedProps(); }catch(e){}   /* 2026-10-14\uFF1A\u767D\u540D\u5355\u9632\u56DE\u5F52\u81EA\u68C0\uFF08\u8282\u6D41 5s\uFF09 */\n  /* 2026-10-25\uFF1A**\u5E8F\u5217\u5316\u79FB\u51FA\u70ED\u8DEF\u5F84** \u2014\u2014 \u6ED1\u6746\u62D6\u52A8\u65F6\u672C\u51FD\u6570\u6BCF\u5E27\u88AB\u8C03\uFF08Scale \u6ED1\u6746 rAF / Shadow \u624B\u8C03\uFF09\uFF0C\n     \u539F\u5B9E\u73B0\u5728\u8FD9\u91CC**\u7ACB\u5373** canvas.toJSON()\uFF08\u540C\u6B65\u5E8F\u5217\u5316\u6574\u5757\u753B\u5E03\u6240\u6709\u5BF9\u8C61\uFF09\u21D2 \u624B\u673A\u4E0A\u6BCF\u5E27\u8DD1\u4E0D\u5B8C\u6389\u5E27\uFF08\u5361\u987F\u4E3B\u56E0\uFF09\u3002\n     \u6539\u4E3A 300ms \u9632\u6296\u540E\u624D\u5E8F\u5217\u5316\uFF1A\u62D6\u52A8\u4E2D\u96F6\u5E8F\u5217\u5316\u3001\u505C\u987F\u540E\u53EA\u5B58\u4E00\u6B21\u7EC8\u6001\uFF08\u4E0E\u539F setTimeout \u9632\u6296\u8BED\u4E49\u4E00\u81F4\uFF0C\u64A4\u9500\u6808\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002\n     flushPendingSave / restore \u4ECD\u5404\u81EA toJSON\uFF0C\u4E0D\u4F9D\u8D56\u8FD9\u91CC\u7684\u5373\u65F6\u5FEB\u7167\u3002 */\n  clearTimeout(_saveTimer);\n  _saveTimer = setTimeout(function(){\n    var snap = JSON.stringify(canvas.toJSON());\n    var st = placementUndo[plc] || (placementUndo[plc] = []);\n    if(st.length && st[st.length-1] === snap) return; // \u4E0E\u6808\u9876\u76F8\u540C \u2192 \u53BB\u91CD\u4E0D\u5165\u6808\n    st.push(snap);\n    if(st.length>30)st.shift();\n    placementRedo[plc]=[];\n    if(currentPlacement === plc) markPlacementArt(); // \u4EC5\u672A\u5207\u6362 placement \u624D\u5237\u7F29\u7565\u56FE/\u6807\u8BB0\n  }, 300);\n}\n// 2026-09-01 FIX(\u6839\u56E0): undo/redo \u524D\u5148 flush pending \u5FEB\u7167\uFF0C\u4FDD\u6301\u300C\u6808\u9876=\u5F53\u524D\u753B\u5E03\u300D\u4E0D\u53D8\u91CF\u3002\n// \u5426\u5219\u6808\u9876(\u65E7)\u2260\u753B\u5E03(\u65B0)\uFF0Cpop \u540E restore \u5230\u66F4\u65E9\u7684 grid-only \u5FEB\u7167 \u2192 \u56FE\u7247\u300C\u6D88\u5931\u300D\u3002\nfunction flushPendingSave(){\n  if(!_saveTimer) return;\n  clearTimeout(_saveTimer);\n  _saveTimer = null;\n  var plc = currentPlacement;\n  var st = placementUndo[plc] || (placementUndo[plc] = []);\n  var snapNow = JSON.stringify(canvas.toJSON()); // \u6B64\u523B\u753B\u5E03\u5185\u5BB9\u5373\u5F53\u524D\u72B6\u6001\n  if(st.length && st[st.length-1] === snapNow) return;\n  st.push(snapNow);\n  if(st.length>30)st.shift();\n  placementRedo[plc]=[]; // \u65B0\u64CD\u4F5C\u6253\u65AD redo \u94FE\n  if(currentPlacement === plc) markPlacementArt();\n}\n/* 2026-10-14 \uD83D\uDD34\uD83D\uDD34 \u6253\u5370\u533A\u6846\u51C0\u5316\uFF08\u552F\u4E00\u5B9E\u73B0\uFF09\u3002\n   \u8FD8\u539F\u8DEF\u5F84\uFF08restoreState = \u5168\u7AD9\u552F\u4E00 loadFromJSON \u70B9\uFF1A\u64A4\u9500/\u91CD\u505A/\u5207\u9762\u5916\u7684\u8349\u7A3F\u6062\u590D/\u4E91\u7AEF\u5DE5\u7A0B\uFF09\u4F1A\u628A JSON \u91CC\u7684\n   \u6846\u5E26\u56DE\u753B\u5E03\uFF0C\u800C\uFF1A\u2460 fabric \u4E0D\u5E8F\u5217\u5316 selectable/evented \u21D2 \u5E26\u56DE\u7684\u6846**\u53EF\u9009\u4E2D/\u53EF\u62D6\u52A8/\u53EF\u65CB\u8F6C**\uFF08\"\u6062\u590D\u8BBE\u8BA1\u540E\n   \u6253\u5370\u533A\u88AB\u8F6C\u6B6A\"\uFF09\uFF1B\u2461 \u66F4\u8001\u7684\u6570\u636E\u8FDE isGrid \u90FD\u6CA1\u6709 \u21D2 drawGrid() \u5220\u4E0D\u6389 \u21D2 \u6C38\u4E45\u591A\u4E00\u4E2A\u5047\u6846\uFF0C\u4E14\u4F1A\u88AB\n   exportAllPlacements \u5F53\u6210\u4F5C\u54C1\u52A0\u8FDB\u79BB\u5C4F\u753B\u5E03\uFF08**\u53EF\u80FD\u88AB\u5370\u5230\u8863\u670D\u4E0A**\uFF09\u3002\n   \u5224\u636E\uFF08\u4EFB\u4E00\u547D\u4E2D\u5373\u4E22\u5F03\uFF09\uFF1AisGrid===true \uFF5C \u9752\u8272 #1FBDB7 + \u65E0 fill + path/line + \u6709\u865A\u7EBF + \u6709\u9634\u5F71\n   \uFF08\u540E 5 \u6761\u540C\u65F6\u6210\u7ACB\u5168\u7AD9\u53EA\u7531 drawGrid() \u4EA7\u751F \u2014\u2014 \u7528\u6237\u624B\u753B\u7684\u7EBF\u4E0D\u4F1A\u5168\u4E2D\uFF09\u3002 */\nfunction pfmStripGridObjects(){\n  var n=0;\n  try{\n    canvas.getObjects().slice().forEach(function(o){\n      if(!o) return;\n      var hit = !!o.isGrid;\n      if(!hit && o.stroke==='#1FBDB7' && !o.fill && (o.type==='path'||o.type==='line') && o.strokeDashArray && o.shadow) hit=true;\n      if(hit){ canvas.remove(o); n++; }\n    });\n  }catch(e){}\n  return n;\n}\n/* 2026-10-15\uFF1AARC \u91CD\u5EFA\uFF08\u5168\u5C40\uFF0C\u4F9B doUndo/doRedo \u5EF6\u8FDF\u8C03\u7528\uFF09\u3002\n   \u64A4\u9500/\u91CD\u505A\u540E\u6587\u5B57\u7684 path \u662F\u300C\u88F8\u5BF9\u8C61\u300D\u21D2 fabric _render \u5D29\u6E83 / \u6587\u5B57\u4E0D\u53EF\u89C1\u3002\n   \u51E1 pfmArcDir\u2208{up,down} \u7684\u6587\u5B57 \u21D2 \u7528\u5EA6\u6570\u91CD\u5EFA\u6B63\u89C4 fabric.Path\uFF1B\u574F path \u4E00\u5E76\u4E22\u5F03\u3002 */\nfunction pfmRebuildArcs(){\n  /* 2026-10-15 v5\uFF1A\u8F6E\u8BE2\u7248 \u2014\u2014 loadFromJSON \u5F02\u6B65\uFF0CpfmArcDir \u53EF\u80FD\u665A\u4E8E setTimeout \u6062\u590D\u3002\n     \u7528\u5148\u6062\u590D\u7684 pfmArcDeg \u5224\u300C\u8BE5\u6709\u5F27\u300D\uFF1B\u65B9\u5411\u8FD8\u6CA1\u5230\u5C31**\u91CD\u8BD5**\uFF0C\u6700\u591A 20 \u6B21\u00D7100ms\u3002 */\n  var _tries = 0;\n  (function _run(){\n    _tries++;\n    var _fixed = 0, _pending = 0;\n    var _old = _suppressSave; _suppressSave = true;   /* \u91CD\u5EFA o.set \u89E6\u53D1 object:modified\u2192saveState \u4F1A\u6C61\u67D3\u64A4\u9500\u6808 */\n    try{\n      if(canvas && canvas.getObjects){\n        canvas.getObjects().forEach(function(o){\n          try{\n            /* 2026-10-15 \u4FEE\u6B63\u5224\u636E\uFF1A**\u53EA\u6709 path \u5B58\u5728\u4E14\u662F\u300C\u574F\u5BF9\u8C61\u300D\u65F6\u624D\u91CD\u5EFA**\u3002\n               \u539F\u5224\u636E\u7528 `pfmArcDeg \u662F\u6570\u5B57` \u21D2 \u64A4\u9500\u5230\u300C\u65E0\u5F27\u300D\u72B6\u6001\u65F6\uFF08\u5FEB\u7167\u91CC pfmArcDeg \u4ECD\u662F\u9ED8\u8BA4 52\uFF09\n               \u4F1A\u628A\u5F27**\u52A0\u56DE\u53BB** \u21D2 \u64A4\u9500/\u91CD\u505A\u8BED\u4E49\u88AB\u7834\u574F\uFF08\u7528\u6237\u62A5\u300C\u4E00\u65E6\u7528 ARC\uFF0C\u64A4\u9500\u91CD\u505A\u5C31\u9519\u300D\uFF09\u3002\n               \u73B0\u5728\uFF1Apath \u4E3A\u7A7A\uFF08\u64A4\u9500\u5230\u65E0\u5F27\uFF09\u21D2 \u4EC0\u4E48\u90FD\u4E0D\u505A\uFF1Bpath \u6B63\u5E38 \u21D2 \u4E0D\u52A8\uFF1Bpath \u662F\u88F8\u5BF9\u8C61 \u21D2 \u624D\u91CD\u5EFA\u3002 */\n            /* 2026-10-15 **\u6839\u672C\u89E3\u6CD5**\uFF1Apath \u5DF2\u4E0D\u8FDB\u5FEB\u7167 \u21D2 \u6062\u590D\u540E\u3010\u5FC5\u7136\u3011\u8981\u91CD\u5EFA\u3002\n               \u5224\u636E\u7528 pfmArcDir\uFF08\u53EA\u5728\u300C\u6709\u5F27\u300D\u65F6\u624D\u88AB arcPath \u5199\u5165\uFF1B\u65E0\u5F27\u5FEB\u7167\u5B9E\u8BC1\u4E3A undefined\uFF09\n               \u21D2 \u64A4\u9500\u5230\u300C\u65E0\u5F27\u300D\u65F6\u4E0D\u4F1A\u8BEF\u52A0\u5F27\uFF0C\u91CD\u505A\u5230\u300C\u6709\u5F27\u300D\u65F6\u5FC5\u5B9A\u91CD\u5EFA\u3002 */\n            if(o.type==='i-text' || o.type==='text'){\n              var _dir = o.pfmArcDir;\n              if(_dir==='up' || _dir==='down'){\n                var _a = (window.__hdText && window.__hdText.arcPath) ? window.__hdText.arcPath(o, _dir) : null;\n                if(_a){\n                  o.set({ path:_a, pathSide:'center', pathAlign:'center', pathStartOffset:0, textAlign:'center', dirty:true });\n                  _pfmArcBBoxFix(o);   /* 2026-10-24: \u91CD\u5EFA\u540E\u4E5F\u6491\u9AD8\u5305\u56F4\u76D2 */\n                  if(o.setCoords) o.setCoords();\n                  _fixed++;\n                }\n              }\n            }\n          }catch(e){}\n        });\n        if(_fixed){\n          try{ canvas.renderAll(); }catch(e){}\n          /* 2026-10-15\uFF1A\u91CD\u5EFA\u6539\u4E86\u753B\u5E03 \u21D2 **\u628A\u6808\u9876\u5FEB\u7167\u540C\u6B65\u6210\u91CD\u5EFA\u540E\u7684\u72B6\u6001**\u3002\n             \u5426\u5219\u6808\u9876\u4ECD\u662F\u300C\u91CD\u5EFA\u524D\u300D\u7684\u5F71\u5B50\u72B6\u6001 \u21D2 \u4E0B\u6B21\u64A4\u9500\u5148 pop \u6389\u5B83\uFF08\u753B\u5E03\u770B\u7740\u6CA1\u53D8\uFF09\n             \u21D2 \u7528\u6237\u5FC5\u987B**\u70B9\u4E24\u6B21**\u64A4\u9500/\u91CD\u505A\u624D\u751F\u6548\uFF08\u7528\u6237\u5B9E\u6D4B\uFF1A\u6587\u5B57\u8981\u70B9\u4E24\u6B21\uFF09\u3002 */\n          try{\n            var _plc = (typeof currentPlacement !== 'undefined') ? currentPlacement : null;\n            var _st = _plc ? placementUndo[_plc] : null;\n            if(_st && _st.length){ _st[_st.length-1] = JSON.stringify(canvas.toJSON()); }\n          }catch(e){}\n        }\n      }\n    }catch(e){}finally{ _suppressSave = _old; }\n    /* 2026-10-15\uFF1A**\u65E0\u6761\u4EF6\u591A\u8F6E\u91CD\u8BD5** \u2014\u2014 path \u4F1A\u5728\u6062\u590D\u5B8C\u6210\u540E**\u66F4\u665A**\u624D\u53D8\u6210\u88F8\u5BF9\u8C61\n       \uFF08\u5B9E\u6D4B\uFF1A\u524D\u4E24\u8F6E o.path \u8FD8\u662F fabric.Path \u21D2 _bad=0 \u21D2 \u4E0D\u4FEE\uFF1B\u4E4B\u540E\u624D\u574F\uFF09\u3002\n       \u56FA\u5B9A\u91CD\u8BD5 10 \u8F6E \u00D7200ms \u2248 2s\uFF0C\u8986\u76D6\u90A3\u4E2A\u65F6\u95F4\u7A97\u3002\u6BCF\u8F6E\u90FD\u6709 cache \u5224\u636E\uFF0C\u6B63\u5E38\u72B6\u6001\u4E0D\u505A\u4EFB\u4F55\u6539\u52A8\u3002 */\n    if(_tries < 10){ setTimeout(_run, 200); }\n  })();\n}\n\n/* 2026-10-15\uFF1A**\u753B\u5E03\u5C3A\u5BF8\u81EA\u6108**\uFF08\u64A4\u9500/\u91CD\u505A\u540E\u5FC5\u8C03\uFF09\u3002\n   \uD83D\uDD34 \u5B9E\u6D4B\u6839\u56E0\uFF08\u63A2\u9488\u6293\u5230\uFF09\uFF1A\u64A4\u9500/\u91CD\u505A\u8FC7\u7A0B\u4E2D\u753B\u5E03\u5BB9\u5668\u77AC\u95F4 0\u00D70\uFF08\u5207\u9762/\u9762\u677F\u5F00\u5408\u5BFC\u81F4 #pfmBoard \u9690\u85CF\uFF09\uFF0C\n   fabric \u6062\u590D\u65F6\u628A canvas CSS \u5C3A\u5BF8\u8BBE\u6210**\u9519\u8BEF\u503C 1100\u00D71100**\uFF08\u5BB9\u5668\u5B9E\u9645 ~734\uFF09\u21D2\n   \u5370\u533A\u6846/T\u6064/\u6587\u5B57\u5168\u90E8\u9519\u4F4D = \u7528\u6237\u62A5\u300C\u753B\u5E03\u7834\u88C2\u300D\u3002\u6570\u636E\u5C42\uFF08\u5BF9\u8C61\u5750\u6807/\u5370\u533A/vt\uFF09\u5168\u7A0B\u6B63\u5E38 \u21D2 \u4E4B\u524D\u63A2\u9488\u6D4B\u4E0D\u5230\u3002\n   \u21D2 \u4FEE\u6CD5\uFF1A\u8F6E\u8BE2\u7B49\u5BB9\u5668\u6062\u590D\u5C3A\u5BF8\uFF08>50px\uFF09\u540E\uFF0C\u5F3A\u5236 resizeCanvasToPrintArea \u6309\u771F\u5B9E\u5BB9\u5668\u91CD\u7B97\u3002 */\nfunction pfmFixCanvasSize(){\n  var _tries = 0;\n  (function _run(){\n    _tries++;\n    var _old = _suppressSave; _suppressSave = true;   /* resize \u4E5F\u89E6\u53D1 object:added/modified \u2192 \u9632\u6C61\u67D3\u64A4\u9500\u6808 */\n    try{\n      if(canvas && canvas.lowerCanvasEl){\n        var _wrap = document.getElementById('pfmZoomLayer');\n        var _wr = _wrap ? _wrap.getBoundingClientRect() : null;\n        var _w = _wr ? _wr.width : 0;\n        if(_w > 50){\n          /* 2026-10-15\uFF1A**\u53EA\u5728\u5C3A\u5BF8\u771F\u7684\u4E0D\u5BF9\u65F6\u624D\u91CD\u7B97** \u2014\u2014 resizeCanvasToPrintArea \u4F1A**\u91CD\u5EFA\u753B\u5E03\u5BF9\u8C61**\n             \uFF08\u6362\u65B0\u5B9E\u4F8B\uFF09\u21D2 \u4F1A\u628A\u521A\u91CD\u5EFA\u597D\u7684 ARC path \u4E00\u5E76\u4F5C\u5E9F\uFF08\u5B9E\u6D4B _bad \u6052 0\u3001\u63A2\u9488\u6D4B\u5230\u7684 path \u975E Path\uFF09\u3002\n             \u5224\u636E\uFF1Acanvas \u7684 CSS \u5BBD\u4E0E\u5BB9\u5668\u5BBD\u76F8\u5DEE >2px \u624D\u7B97\u300C\u574F\u300D\u3002 */\n          var _lo = canvas.lowerCanvasEl;\n          var _curW = _lo ? _lo.getBoundingClientRect().width : 0;\n          if(Math.abs(_curW - _w) > 2){\n            var _spec = (typeof printAreaSpecs !== 'undefined') && printAreaSpecs[currentPlacement];\n            if(_spec){ resizeCanvasToPrintArea(_spec); }\n          }\n          try{ canvas.renderAll(); }catch(e2){}\n          _suppressSave = _old;\n          return;\n        }\n      }\n    }catch(e){}finally{ _suppressSave = _old; }\n    if(_tries < 20){ setTimeout(_run, 100); }\n  })();\n}\n\nfunction restoreState(json){\n  _suppressSave = true; // 2026-09-01: \u91CD\u5EFA\u671F\u95F4 object:added \u4E0D\u518D\u81EA\u52A8 saveState\uFF0C\u9632\u300C\u91CD\u5EFA\u5FEB\u7167\u300D\u6C61\u67D3\u64A4\u9500\u6808\n  canvas.loadFromJSON(json, function(){\n    try{\n      var _drop = pfmStripGridObjects();   // 2026-10-14: \u5148\u51C0\u5316\uFF08\u987B\u5728 applyControlStyle \u4E4B\u524D\uFF0C\u514D\u5F97\u7ED9\u5F85\u4E22\u5F03\u7684\u6846\u5957\u6837\u5F0F\uFF09\n      canvas.getObjects().forEach(function(o){\n        /* 2026-10-15\uFF1AapplyControlStyle \u5BF9\u6062\u590D\u51FA\u6765\u7684\u300C\u88F8\u5BF9\u8C61\u300D\u4F1A\u629B\u5F02\u5E38 \u21D2 \u4E00\u65E6\u629B\u5C31\u4E2D\u65AD\u6574\u4E2A\u5FAA\u73AF\uFF0C\n           \u540E\u9762\u7684\u903B\u8F91\u5168\u8DF3\u8FC7\u3002\u52A0 try \u8BA9\u5B83\u53EA\u8DF3\u8FC7**\u5F53\u524D\u5BF9\u8C61**\uFF0C\u4E0D\u62D6\u7D2F\u522B\u7684\u3002 */\n        try{ if(!o.isGrid) applyControlStyle(o); }catch(e){}\n      });\n      /* 2026-10-15\uFF1A**ARC \u5FEB\u7167\u5F80\u8FD4\u4FEE\u590D v3**\uFF08\u72EC\u7ACB\u5FAA\u73AF\uFF0C\u4E0D\u518D\u4F9D\u8D56\u4E0A\u9762\u90A3\u4E2A\u5FAA\u73AF\u8DD1\u5B8C\uFF09\u3002\n           \u6839\u56E0\uFF08\u5B9E\u6D4B\uFF09\uFF1A\u64A4\u9500/\u91CD\u505A\u540E\u6587\u5B57 `path` \u6062\u590D\u6210\u300C\u88F8\u5BF9\u8C61\u300D\u2014\u2014 type='path' \u4F46**\u4E0D\u662F\n           fabric.Path \u5B9E\u4F8B**\u3001\u7F3A isNotVisible \u21D2 fabric `_render` \u629B\n           `TypeError: e.isNotVisible is not a function` \u21D2 \u6587\u5B57\u4E0D\u53EF\u89C1 / \u753B\u9762\u7834\u88C2\u3002\n           \u21D2 \u51E1 `pfmArcDir` \u660E\u786E up/down\uFF08= \u8BE5\u6709\u5F27\uFF09\u7684\u6587\u5B57\uFF0C**\u65E0\u6761\u4EF6\u7528\u5EA6\u6570\u91CD\u5EFA path**\uFF1B\n             \u574F path \u4E00\u5E76\u88AB\u8986\u76D6\u3002\u64A4\u9500\u540E pfmArcDir \u4E3A undefined \u21D2 \u4E0D\u4F1A\u8BEF\u52A0\u5F27\u3002 */\n      try{\n        canvas.getObjects().forEach(function(o){\n          try{\n            if(o.type==='i-text' || o.type==='text'){\n              var _dir = o.pfmArcDir;\n              if(_dir==='up' || _dir==='down'){\n                var _a = (window.__hdText && window.__hdText.arcPath) ? window.__hdText.arcPath(o, _dir) : null;\n                if(_a){\n                  o.set({ path:_a, pathSide:'center', pathAlign:'center', pathStartOffset:0, textAlign:'center', dirty:true });\n                  _pfmArcBBoxFix(o);   /* 2026-10-24: \u91CD\u5EFA\u540E\u4E5F\u6491\u9AD8\u5305\u56F4\u76D2 */\n                  if(o.setCoords) o.setCoords();\n                } else {\n                  o.set({ path:null, pathSide:null, pathAlign:null, pathStartOffset:0, textAlign:'left', dirty:true });\n                }\n              } else if(o.path && !(o.path instanceof fabric.Path) && !(o.path instanceof fabric.Object)){\n                o.set({ path:null, pathSide:null, pathAlign:null, pathStartOffset:0, textAlign:'left', dirty:true });\n              }\n            }\n          }catch(e){}\n        });\n      }catch(e){}\n      pfmApplyClip(); // 2026-08-30: loadFromJSON \u6062\u590D\u540E\u91CD\u8BBE\u89C6\u89C9\u88C1\u526A\n      drawGrid();     // 2026-10-14: \u91CD\u5EFA**\u552F\u4E00\u6743\u5A01**\u7684\u6253\u5370\u533A\u6846\uFF08_pfmPrintArea \u672A\u5C31\u7EEA\u65F6\u5176\u5185\u90E8\u81EA\u5E26 early-return\uFF09\n      pfmSyncGridVisibility(); // 2026-08-30: \u6253\u5370\u533A\u8FB9\u6846\u8DDF\u968F\u9009\u4E2D\u72B6\u6001\n      /* 2026-10-15\uFF1A**\u5728\u771F\u6B63\u7684\u300C\u6062\u590D\u5B8C\u6210\u300D\u65F6\u523B\u91CD\u5EFA** \u2014\u2014 setTimeout(120ms) \u4F1A\u8DD1\u5728 loadFromJSON \u56DE\u8C03**\u4E4B\u524D**\n         \uFF08\u5B9E\u6D4B\uFF1A\u90A3\u6B21 o.path \u8FD8\u662F fabric.Path \u21D2 \u5224\u4E3A\u300C\u4E0D\u574F\u300D\u21D2 \u4E0D\u91CD\u5EFA\uFF1B\u56DE\u8C03\u8DD1\u5B8C\u540E path \u624D\u53D8\u6210\u88F8\u5BF9\u8C61 \u21D2 \u518D\u6CA1\u4EBA\u4FEE\uFF09\u3002\n         \u6B64\u5904 _suppressSave \u4ECD\u4E3A true\uFF08\u5916\u5C42 finally \u4E4B\u524D\uFF09\u21D2 \u91CD\u5EFA\u4E0D\u4F1A\u6C61\u67D3\u64A4\u9500\u6808\u3002 */\n      try{ pfmRebuildArcs(); }catch(e){}\n      try{ pfmFixCanvasSize(); }catch(e){}\n      if(_drop) try{ console.log('[grid] restore: dropped '+_drop+' print-area object(s)'); }catch(e){}\n    }finally{\n      _suppressSave = false; // \u65E0\u8BBA\u6210\u529F\u5931\u8D25\u90FD\u6062\u590D\uFF0C\u9632\u6B62\u6807\u5FD7\u5361\u6B7B\u5BFC\u81F4\u540E\u7EED\u4E0D\u8BB0\u5F55\u5386\u53F2\n    }\n    canvas.renderAll();\n  });\n}\nfunction doUndo(){\n  flushPendingSave(); // 2026-09-01 FIX: \u5148\u843D\u76D8 pending\uFF0C\u4FDD\u6301\u6808\u9876=\u5F53\u524D\u753B\u5E03\n  var st=placementUndo[currentPlacement]||[];\n  if(st.length<2)return;\n  (placementRedo[currentPlacement]=(placementRedo[currentPlacement]||[])).push(st.pop());\n  restoreState(JSON.parse(st[st.length-1]));\n  /* 2026-10-15\uFF1A**\u5148\u6302\u5B9A\u65F6\u5668\u518D updateLayers** \u2014\u2014 updateLayers() \u82E5\u629B\u5F02\u5E38\uFF0C\u540E\u9762\u7684 setTimeout \u5C31\u6C38\u8FDC\u4E0D\u4F1A\u6267\u884C\n     \uFF08\u5B9E\u6D4B\u75C7\u72B6\uFF1A\u64A4\u9500/\u91CD\u505A\u540E pfmRebuildArcs \u5B8C\u5168\u6CA1\u88AB\u8C03\u7528 \u21D2 ARC \u7684\u574F path \u4ECE\u4E0D\u4FEE\u590D\uFF09\u3002 */\n  setTimeout(function(){ try{ pfmRebuildArcs(); pfmFixCanvasSize(); }catch(e){} }, 120);\n  try{ updateLayers(); }catch(e){}\n}\nfunction doRedo(){\n  flushPendingSave(); // 2026-09-01 FIX: \u540C\u4E0A\uFF0C\u5148\u843D\u76D8 pending \u518D\u91CD\u505A\n  var rs=placementRedo[currentPlacement]||[];\n  if(!rs.length)return;\n  var s=rs.pop();\n  (placementUndo[currentPlacement]=(placementUndo[currentPlacement]||[])).push(s);\n  restoreState(JSON.parse(s));\n  /* 2026-10-15\uFF1A\u540C doUndo \u2014\u2014 \u5148\u6302\u5B9A\u65F6\u5668\u518D updateLayers\uFF0C\u9632 updateLayers \u629B\u5F02\u5E38\u541E\u6389\u5B9A\u65F6\u5668 */\n  setTimeout(function(){ try{ pfmRebuildArcs(); pfmFixCanvasSize(); }catch(e){} }, 120);\n  try{ updateLayers(); }catch(e){}\n}\nwindow.__hdAct.bind('pfmBtnUndo',function(){ doUndo(); });\nwindow.__hdAct.bind('pfmBtnRedo',function(){ doRedo(); });\n\n/* ===== 2026-09-16: \u952E\u76D8\u5FEB\u6377\u952E =====\n   \u4E0E\u9876\u680F/\u5DE5\u5177\u6761\u6309\u94AE**\u5171\u7528\u540C\u4E00\u4EFD\u52A8\u4F5C\u5B9E\u73B0**\uFF08doUndo/doRedo/pfmDoAction\uFF09\uFF0C\u7981\u7B2C\u4E8C\u4EFD\u3002\n   \u653E\u884C\u6761\u4EF6\uFF1Aboard \u672A\u6253\u5F00 / \u7126\u70B9\u5728\u8F93\u5165\u63A7\u4EF6 / \u7ED8\u677F\u6216 mockup \u5F39\u7A97\u6253\u5F00 / \u5E26 alt\u3002\n   \u65B9\u5411\u952E\u5FAE\u8C03\u4ECD\u5F52 assets/hd-align.js\uFF08\u5B83\u81EA\u5E26 ctrl/meta/alt \u653E\u884C\uFF09\u2014\u2014 \u6B64\u5904\u4E0D\u78B0\u65B9\u5411\u952E\u3002 */\n(function(){\n  function boardOn(){\n    var b=q('pfmBoard'); if(!b) return false;\n    if(getComputedStyle(b).display==='none') return false;\n    var r=b.getBoundingClientRect(); return r.width>2 && r.height>2;\n  }\n  function modalOn(){\n    var ids=['pfmDrawModal','pfmMockupModal'],i,m;\n    for(i=0;i<ids.length;i++){ m=q(ids[i]); if(m && getComputedStyle(m).display!=='none') return true; }\n    return false;\n  }\n  function typing(e){\n    var t=e.target; if(!t) return false;\n    if(t.isContentEditable) return true;\n    return /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName||'');\n  }\n  function onKey(e){\n    try{\n      if(!boardOn() || modalOn() || typing(e) || e.altKey) return;\n      var k=String(e.key||'').toLowerCase(), mod=e.ctrlKey||e.metaKey;\n      if(mod && k==='z' && !e.shiftKey){ e.preventDefault(); doUndo(); return; }\n      if(mod && (k==='y' || (k==='z' && e.shiftKey))){ e.preventDefault(); doRedo(); return; }\n      if(mod && k==='d'){ e.preventDefault(); pfmDoAction('dup'); return; }\n      /* 2026-09-16: \u526A\u8D34\u677F C / V / X\uFF08\u5B9E\u73B0\u5728 assets/hd-edit.js\uFF0C\u4E00\u4EFD\u5B9E\u73B0\uFF1B\u5B88\u536B\u6CBF\u7528\u672C\u5757\uFF09 */\n      if(mod && (k==='c' || k==='x' || k==='v')){\n        e.preventDefault();\n        if(window.__pfmClipboard) window.__pfmClipboard(k);\n        return;\n      }\n      /* \uD83D\uDD34 \u8282\u70B9\u7F16\u8F91\u6001\u4E0B\u8BA9\u884C\u7ED9 assets/hd-pen.js \u2014\u2014 \u5B83\u8981\u5220\u7684\u662F\u300C\u9009\u4E2D\u7684\u8282\u70B9\u300D\uFF0C\u4E0D\u662F\u6574\u6761\u8DEF\u5F84\u3002\n         \u672C\u5757\u5728**\u89E3\u6790\u671F**\u6CE8\u518C\uFF0C\u65E9\u4E8E defer \u7684 hd-pen\uFF0C\u82E5\u4E0D\u5728\u8FD9\u91CC return\uFF0Chd-pen \u7684\u8282\u70B9\u5220\u9664\n         \u6C38\u8FDC\u8D62\u4E0D\u4E86\uFF08\u5B9E\u6D4B\uFF1A\u7F16\u8F91\u6001\u6309 Delete \u4F1A\u628A\u6574\u6761\u8DEF\u5F84\u5220\u6389\uFF0C5 \u4E2A\u8282\u70B9 \u2192 \u5BF9\u8C61\u76F4\u63A5\u6D88\u5931\uFF09\u3002 */\n      if(!mod && (k==='delete' || k==='backspace')\n         && window.__hdPen && window.__hdPen.editTarget()) return;\n      if(!mod && (k==='delete' || k==='backspace')){ e.preventDefault(); pfmDoAction('del'); return; }\n      if(!mod && k==='escape'){\n        e.preventDefault();\n        canvas.discardActiveObject(); canvas.renderAll();\n        updateFloatToolbar(); pfmSyncGridVisibility(); pfmLayerSyncSel();\n        return;\n      }\n    }catch(err){}\n  }\n  document.addEventListener('keydown', onKey);\n})();\n\n// \u5FEB\u7167\u6E05\u6D17\u5668\uFF08\u552F\u4E00\u5B9E\u73B0\uFF0C\u7981\u6B62\u6563\u843D\u7B2C\u4E8C\u4EFD\uFF09\uFF1Aplacement \u5FEB\u7167\u53EA\u80FD\u542B\u771F\u5B9E\u7528\u6237 art\u3002\n// grid \u6BCF\u9762\u91CD\u753B\uFF08drawGrid\uFF09\u3001isPreview \u662F\u77AC\u6001\u9884\u89C8\u5C42 \u2014\u2014 \u4EFB\u4E00\u4E2A\u5B58\u8FDB placementArt \u90FD\u4F1A\u5728\u4E0B\u6B21\u5207\u9762\u65F6\u53D8\u6210\u6B8B\u7559\n// \uFF08\"not fully cleared\"\uFF09\u3002\nfunction stripTransientObjects(snap){\n  if(snap && Array.isArray(snap.objects)){\n    snap.objects = snap.objects.filter(function(o){ return !(o.isGrid) && !(o.isPreview); });\n  }\n  return snap;\n}\n// \u53CC\u7F13\u51B2\u7F29\u7565\u56FE\uFF1A\u628A\u5F53\u524D\u753B\u5E03\u6E32\u6210\u5C0F JPEG\uFF08\u767D\u5E95 \u2014\u2014 \u8BBE\u8BA1\u753B\u5E03\u900F\u660E\u800C JPEG \u65E0 alpha\uFF09\uFF0C\u5207\u9762\u65F6\u77AC\u65F6\u663E\u793A\uFF1B\n// \u4EFB\u4F55\u5931\u8D25\u8FD4\u56DE ''\uFF0C\u906E\u7F69\u4F18\u96C5\u4FDD\u6301\u9690\u85CF\u3002\nfunction makeCanvasThumb(c){\n  try{\n    if(!c || !c.getElement || !c.width) return '';\n    var maxW = 480;\n    var scale = Math.min(1, maxW / c.width);\n    var oc = document.createElement('canvas');\n    oc.width = Math.max(1, Math.round(c.width * scale));\n    oc.height = Math.max(1, Math.round(c.height * scale));\n    var ctx = oc.getContext('2d');\n    ctx.fillStyle = '#ffffff';\n    ctx.fillRect(0, 0, oc.width, oc.height);\n    ctx.drawImage(c.getElement(), 0, 0, oc.width, oc.height);\n    return oc.toDataURL('image/jpeg', 0.7);\n  }catch(e){ return ''; }\n}\n// Track whether the current face has any real (non-grid) art\nfunction markPlacementArt(){\n  if(!placementArt[currentPlacement]) placementArt[currentPlacement]={json:null,hasArt:false};\n  var hasArt=canvas.getObjects().some(function(o){return !o.isGrid && !o.isPreview});\n  placementArt[currentPlacement].hasArt=hasArt;\n  // 2026-09-01: \u7A7A\u9762\u4E0D\u751F\u6210\u7F29\u7565\u56FE\uFF08\u7EAF\u767D\u56FE\u65E0\u610F\u4E49\uFF0C\u7701\u6BCF\u6B21 50ms\uFF09\uFF1Bretina \u5173\u95ED\u540E\u6E90\u56FE 9000\u00B2\u21923000\u00B2\uFF0C\u751F\u6210\u6210\u672C\u540C\u6B65\u5927\u964D\u3002\n  placementArt[currentPlacement].thumb=hasArt?makeCanvasThumb(canvas):'';\n  if(hasArt){\n    // Strip grid + preview objects from snapshot so saved faces don't carry stale\n    // grid or transient preview layers.\n    // NOTE: canvas.toJSON() returns an OBJECT \u2014 do not JSON.parse it.\n    var snap = stripTransientObjects(canvas.toJSON());\n    placementArt[currentPlacement].json = JSON.stringify(snap);\n  }\n  updatePlacementDots();\n}\nfunction placementHasArt(p){ return !!(placementArt[p]&&placementArt[p].hasArt); }\nfunction updatePlacementDots(){\n  document.querySelectorAll('#pfmPlacements .pfm-chip').forEach(function(ch){\n    var dot=ch.querySelector('.pfm-pdot');\n    if(!dot){ dot=document.createElement('span'); dot.className='pfm-pdot'; ch.appendChild(dot); }\n    dot.style.display=placementHasArt(ch.dataset.p)?'inline-block':'none';\n  });\n  /* 2026-10-12: dot \u72B6\u6001\u4E00\u53D8\u5C31\u63A8\u7ED9\u5C55\u793A\u53F0 View \u884C\uFF08#pfmStageFaces\uFF09\u2014\u2014\n     \u5B83\u662F syncStageChips() \u4ECE #pfmPlacements **\u590D\u5236**\u51FA\u6765\u7684\uFF0C\u4E0D\u63A8\u5C31\u6C38\u8FDC\u505C\u5728\u65E7\u72B6\u6001\u3002\n     \u26A0\uFE0F syncStageChips \u4E0D\u56DE\u8C03\u672C\u51FD\u6570 \u21D2 \u65E0\u9012\u5F52\u3002 */\n  try{ if(window.__pfmSyncStageChips) window.__pfmSyncStageChips(); }catch(e){}\n}\n\n// ============= OBJECT ACTIONS TOOLBAR (fixed in sidebar) =============\nfunction updateFloatToolbar(){\n  var section=q('pfmActionsSection'); if(!section) return;\n  var obj=canvas.getActiveObject();\n  var ok=!!(obj && !obj.isGrid);\n  /* 2026-09-13: Actions **\u5168\u7AEF\u5E38\u9A7B** \u2014\u2014 \u624B\u673A\u7AEF\u5DF2\u642C\u5230\u753B\u5E03\u4E0A\u65B9\uFF08\u89C1 8e-2 \u6BB5 placeActions\uFF09\uFF0C\n     \u684C\u9762\u7AEF\u4E5F\u4E00\u5E76\u5E38\u9A7B\u3002\u672A\u9009\u4E2D\u5BF9\u8C61\u65F6\u6574\u5757\u7F6E\u7070\u7981\u7528\uFF08.pfm-fbtn:disabled + hd-image.css \u7684\n     .pfm-img-btn:disabled\uFF09\uFF0C\u800C\u4E0D\u662F\u9690\u85CF \u2192 \u907F\u514D\u300C\u9009\u4E2D / \u53D6\u6D88\u300D\u65F6\u9762\u677F\u9AD8\u5EA6\u53CD\u590D\u8DF3\u52A8\u3002 */\n  section.style.display = 'block';\n  var btns=section.querySelectorAll('.pfm-fbtn');\n  for(var i=0;i<btns.length;i++) btns[i].disabled = !ok;\n}\n/* 2026-09-13: \u66B4\u9732\u7ED9\u300C\u65B0\u8BBE\u8BA1\u53F0 IIFE\u300D\u7684 placeActions\uFF08\u8DE8 IIFE \u7981\u6B62\u76F4\u63A5\u5F15\u7528 \u2014\u2014 \u66FE\u56E0\u6B64\n   \u5728\u642C\u8FC1\u540E\u56DE\u8C03\u91CC ReferenceError: updateFloatToolbar is not defined\uFF09\u3002 */\ntry{ window.__pfmUpdateFloat = updateFloatToolbar; }catch(e){}\n/* 2026-09-16: \u52A8\u4F5C\u62BD\u6210\u51FD\u6570 \u2014\u2014 \u300C\u5DE5\u5177\u6761\u6309\u94AE\u300D\u4E0E\u300C\u952E\u76D8\u5FEB\u6377\u952E\u300D\u5171\u7528\u540C\u4E00\u4EFD\u5B9E\u73B0\uFF08\u7981\u7B2C\u4E8C\u4EFD\uFF09\u3002 */\nfunction pfmDoAction(act){\n  var obj=canvas.getActiveObject();if(!obj||obj.isGrid)return false;\n  if(act==='flipH'){obj.set('flipX',!obj.flipX);canvas.renderAll();saveState()}\n  else if(act==='flipV'){obj.set('flipY',!obj.flipY);canvas.renderAll();saveState()}\n  else if(act==='dup'){obj.clone(function(c){c.set({left:obj.left+15,top:obj.top+15});applyControlStyle(c);canvas.add(c);canvas.setActiveObject(c);canvas.renderAll();saveState();updateLayers()})}\n  else if(act==='del'){\n    /* 2026-09-16: \u591A\u9009\u65F6 obj \u662F ActiveSelection \u2014\u2014 `canvas.remove(selection)` **\u4E0D\u4F1A\u79FB\u9664\u5176\u5B50\u5BF9\u8C61**\n       \uFF08\u6240\u4EE5 Ctrl+X / Delete \u5BF9\u591A\u9009\u4E00\u76F4\u662F\u65E0\u6548\u7684\uFF09\u3002\u6539\u4E3A\u4E0B\u94BB\u540E\u9010\u4E2A\u79FB\u9664\u3002 */\n    var _kids = (obj.type==='activeSelection' && obj.getObjects) ? obj.getObjects().slice() : [obj];\n    canvas.discardActiveObject();\n    for(var _i=0;_i<_kids.length;_i++){ if(_kids[_i] && !_kids[_i].isGrid) canvas.remove(_kids[_i]); }\n    canvas.renderAll();   /* canvas \u4E3A renderOnAddRemove:false \u2192 remove \u4E0D\u81EA\u52A8\u91CD\u7ED8\uFF0C\u7F3A\u6B64\u884C\u4F1A\u6B8B\u5F71 */\n    saveState(); updateLayers(); updateFloatToolbar();\n    if(typeof syncTextPanel==='function') syncTextPanel();\n  }\n  else return false;\n  return true;\n}\nq('pfmFloatToolbar').addEventListener('click',function(e){\n  var btn=e.target.closest('.pfm-fbtn');if(!btn)return;\n  pfmDoAction(btn.dataset.action);\n});\n\n// ============= ADD DESIGN =============\nvar _pfmWarnTimer = null;\nfunction checkPrintBounds(){\n  // 2026-08-30: canvas=\u6574\u4EF6\u8863\u670D \u2014 \u8B66\u544A\u8FB9\u754C\u6539\u4E3A\u6253\u5370\u533A\u77E9\u5F62\uFF08_pfmPrintArea\uFF09\uFF0C\n  // \u5BF9\u8C61\u8D85\u51FA\u6253\u5370\u533A\uFF08\u4F1A\u88AB\u5370\u5237\u88C1\u526A\uFF09\u5373\u8B66\u544A\uFF1B\u653E\u6253\u5370\u533A\u5916/\u8863\u670D\u5185\u4E0D\u518D\u9650\u5236\n  var pa=canvas._pfmPrintArea, warn=false;\n  if(pa){\n    var px=pa.left, py=pa.top, pw=pa.width, ph=pa.height;\n    canvas.getObjects().forEach(function(o){\n      if(o.isGrid) return;\n      var b = o.getBoundingRect();\n      if(b.left < px-2 || b.top < py-2 || (b.left+b.width) > px+pw+2 || (b.top+b.height) > py+ph+2) warn = true;\n    });\n  }\n  var el = q('pfmPrintWarning');\n  if(!el) return;\n  if(warn){\n    el.classList.add('show');\n    clearTimeout(_pfmWarnTimer);\n    _pfmWarnTimer = setTimeout(function(){ el.classList.remove('show'); }, 3000);\n  } else {\n    el.classList.remove('show');\n  }\n}\n// 2026-08-30: checkPrintBounds \u9632\u6296 \u2014 80ms \u5185\u591A\u6B21\u8BF7\u6C42\u5408\u5E76\u4E3A\u4E00\u6B21\uFF08placement \u5207\u6362/\u6062\u590D\u5BC6\u96C6\u8C03\u7528\u65F6\u51CF\u5C11\u65E0\u8C13\u904D\u5386\u6E32\u67D3\uFF09\nvar _pfmBoundsTimer = null;\nfunction scheduleBounds(){\n  clearTimeout(_pfmBoundsTimer);\n  _pfmBoundsTimer = setTimeout(checkPrintBounds, 80);\n}\n// \u628A\u5B8C\u5168\u843D\u5728\u753B\u5E03\u5916\u7684\u8BBE\u8BA1\u5BF9\u8C61\u62C9\u56DE\u53EF\u89C1\u533A \u2014\u2014 \u5207\u9762\u53EF\u80FD\u8FD8\u539F\u51FA\u4E0E\u5F53\u524D\u753B\u5E03\u5C3A\u5BF8\u4E0D\u5339\u914D\u7684\u5750\u6807\uFF0C\n// \u5426\u5219 art \u4F1A\u300C\u6D88\u5931\u300D\u800C checkPrintBounds \u8FD8\u8BEF\u62A5\u300C\u8D85\u51FA\u6253\u5370\u533A\u300D\u3002\nfunction normalizeOffcanvasObjects(){\n  var w = canvas.width, h = canvas.height;\n  canvas.getObjects().forEach(function(o){\n    if(o.isGrid) return;\n    var b = o.getBoundingRect();\n    var outside = (b.left >= w-1 || b.top >= h-1 || (b.left+b.width) <= 1 || (b.top+b.height) <= 1);\n    if(!outside) return;\n    // Scale down if it's bigger than the canvas, then center via bounding-box delta.\n    if(b.width > w*0.95 || b.height > h*0.95){\n      var s = Math.min(w*0.9/b.width, h*0.9/b.height, 1);\n      if(isFinite(s) && s>0){ o.set({scaleX:(o.scaleX||1)*s, scaleY:(o.scaleY||1)*s}); b=o.getBoundingRect(); }\n    }\n    var dx = (w - b.width)/2 - b.left;\n    var dy = (h - b.height)/2 - b.top;\n    o.set({ left: o.left + dx, top: o.top + dy });\n  });\n}\n/* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF1A\u63A7\u5236\u70B9**\u6837\u5F0F**\u7684\u552F\u4E00\u771F\u6E90\u5165\u53E3\u3002\n   \u771F\u6E90\u672C\u4F53 = CSS \u53D8\u91CF --pf-sel-*\uFF08assets/pf-tokens.css\uFF09\uFF1B\n   \u8BFB\u53D6\u5668 = assets/pfm-sel.js \u7684 PFMSEL.tokens()\uFF1B\n   \u753B\u677F\u4FA7\uFF08hd-canvas.css\uFF09\u76F4\u63A5\u5F15\u7528\u540C\u4E00\u6279\u53D8\u91CF \u21D2 \u4E24\u4FA7\u4E0D\u53EF\u80FD\u518D\u5404\u5199\u4E00\u5957\u3002\n   \u26A0\uFE0F initCanvas \u8DD1\u5728 DOMContentLoaded\uFF08\u665A\u4E8E\u5168\u90E8 defer \u811A\u672C\uFF09\u21D2 \u6B63\u5E38\u5FC5\u5DF2\u5C31\u7EEA\uFF1B\n      \u4E07\u4E00\u8BE5 asset \u52A0\u8F7D\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u4E0E pf-tokens.css \u4E00\u81F4\u7684\u9ED8\u8BA4\u503C\u5E76\u544A\u8B66\u4E00\u6B21 \u2014\u2014\n      **\u5B81\u53EF\u6837\u5F0F\u56DE\u65E7\u503C\uFF0C\u4E5F\u4E0D\u80FD\u8BA9\u6574\u53F0\u8BBE\u8BA1\u53F0\u629B\u5F02\u5E38\u6302\u6389**\u3002 */\nvar _selTokWarned = 0;\nfunction _selTok(){\n  if(window.PFMSEL && PFMSEL.tokens) return PFMSEL.tokens();\n  if(!_selTokWarned){\n    _selTokWarned = 1;\n    try{ console.warn('[pfm] assets/pfm-sel.js \u672A\u52A0\u8F7D \u21D2 \u63A7\u5236\u70B9\u56DE\u9000\u9ED8\u8BA4\u6837\u5F0F'); }catch(e){}\n  }\n  return { color:'#534AB7', edgeFill:'#EEEDFE', rotFill:'#fff', bw:1, rotBw:2,\n           corner:14, edge:11, rot:18, stem:23, touch:28, radius:6, dash:null };\n}\n// 2026-08-30: \u63A7\u5236\u70B9\u5C3A\u5BF8\u4E0E\u753B\u5E03\u663E\u793A\u5C3A\u5BF8\u5173\u8054\uFF08\u65B9\u6848B\uFF09\u2014\u2014 \u552F\u4E00\u516C\u5F0F\u6E90\uFF0C\u7981\u6B62\u6563\u843D\u7B2C\u4E8C\u4EFD\u3002\n// \u5C4F\u5E55px: mouse=clamp(\u753B\u5E03\u663E\u793A\u5BBD\u00D72%,10,28)\uFF0Ctouch=clamp(mouse\u00D71.4,22,40)\uFF1B\u8FD4\u56DE\u753B\u5E03\u903B\u8F91 px\uFF08\u00F7 \u663E\u793A\u7F29\u653E _sc\uFF09\u3002\nfunction pfmCornerLogical(dispW, _sc){\n  /* 2026-09-15: \u63A7\u5236\u70B9\u6539\u4E3A**\u56FA\u5B9A\u5C4F\u5E55\u5C3A\u5BF8**\u3002\u539F\u516C\u5F0F m = dispW \u00D7 0.02\uFF0810~28px \u6D6E\u52A8\uFF09\n     \u8BA9\u63A7\u5236\u70B9\u968F\u5C4F\u5E55\u53D8\u5927\u800C\u53D8\u5927 \u2014\u2014 \u5E73\u677F 16px \u6BD4\u624B\u673A 10px \u5927 60%\uFF0C\u8DE8\u8BBE\u5907\u89C2\u611F\u4E0D\u4E00\u81F4\uFF0C\n     \u7528\u6237\u5B9E\u6D4B\u53CD\u9988\u300C\u592A\u5927\u300D\u3002\u4E09\u9879\u73B0\u5168\u90E8\u56FA\u5B9A\u4E3A\u5C4F\u5E55\u5E38\u91CF\uFF08\u7531\u7528\u6237\u4ECE\u5BF9\u6BD4\u56FE\u9010\u6863\u9009\u5B9A\uFF09\uFF1A\n       \u00B7 cornerSize      \u89C6\u89C9\u76F4\u5F84 8px   \u2014\u2014 fabric **\u7ED8\u5236**\u7528\n       \u00B7 touchCornerSize \u547D\u4E2D\u533A 22px   \u2014\u2014 **\u4E0D\u968F\u89C6\u89C9\u7F29\u5C0F**\uFF0C\u624B\u6307\u7167\u6837\u70B9\u5F97\u4E2D\n         \uFF08fabric \u4E24\u5957\u5C3A\u5BF8\u672C\u5C31\u5206\u79BB\uFF1A\u7ED8\u5236\u770B cornerSize\u3001\u547D\u4E2D\u6D4B\u8BD5\u770B touchCornerSize\uFF09\n       \u00B7 rotateGap       \u65CB\u8F6C\u70B9\u504F\u79FB 32px \u2014\u2014 \u539F\u4E3A\u5199\u6B7B\u7684 offsetY:-120\uFF08**\u903B\u8F91\u503C**\uFF01\uFF09\n         \u5176\u5C4F\u5E55\u95F4\u8DDD\u968F\u753B\u5E03 CSS \u7F29\u653E\u6F02\u79FB\uFF1A\u624B\u673A\u4EC5 14.6px\uFF08\u65CB\u8F6C\u70B9\u4E0E\u9876\u90E8\u4E2D\u70B9\u624B\u67C4\u51E0\u4E4E\u53E0\u4F4F\uFF09\u3001\n         \u5E73\u677F 31.8px\u3001\u684C\u9762 25px\u3002\u6539\u4E3A\u5C4F\u5E55\u6052\u5B9A\u503C\u540E\u4E09\u7AEF\u4E00\u81F4\u3002\n     dispW \u53C2\u6570\u4FDD\u7559\u5728\u7B7E\u540D\u91CC\uFF08\u8C03\u7528\u65B9\u4E0D\u53D8\uFF09\uFF0C\u73B0\u4E0D\u518D\u53C2\u4E0E\u8BA1\u7B97\u3002 */\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF1A\u4E09\u4E2A\u5C4F\u5E55\u5E38\u91CF**\u4E0D\u518D\u662F\u672C\u51FD\u6570\u79C1\u6709\u7684\u6570\u5B57** \u2014\u2014 \u6539\u8BFB\u6837\u5F0F\u771F\u6E90\n     \uFF08--pf-sel-corner/touch/stem\uFF09\uFF0C\u4E0E\u753B\u677F\u540C\u6B3E\uFF1A14 / 28 / 23\u3002\n     \u6539\u524D\u662F 8 / 22 / 32\uFF08\u53EA\u5C5E\u4E8E\u8BBE\u8BA1\u53F0\uFF09\uFF0C\u4E0E\u753B\u677F\uFF0814 / 28 / 23\uFF09\u4E24\u5957 \u21D2 \u7528\u6237\u5B9E\u6D4B\"\u6837\u5F0F\u8FD8\u662F\u4E0D\u4E00\u6837\"\u3002\n     \u26A0\uFE0F rotateGap \u540C\u65F6\u662F**\u65CB\u8F6C\u6746\u957F\u5EA6**\uFF08fabric \u7684\u8FDE\u7EBF\u753B\u5230 offsetY \u5904\uFF0C\u753B\u677F ::before \u4E5F\u662F 23px\uFF09\u3002 */\n  var _T = _selTok();\n  var s = Math.max(0.001, _sc||1);\n  return { cornerSize: Math.round(_T.corner / s), touchCornerSize: Math.round(_T.touch / s), rotateGap: Math.round(_T.stem / s) };\n}\n/* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF08\u7528\u6237\u62A5\u300C\u8BBE\u8BA1\u53F0\u4E0A\u4F20\u56FE\u7247\u7684\u63A7\u5236\u6846\uFF0C\u753B\u5E03\u653E\u5927\u65F6\u5B83\u4E5F\u653E\u5927\u4E86\u300D\uFF09\uFF1A\n   **\u5C4F\u5E55\u6052\u5B9A\u53CD\u7F29\u653E\u7684\u552F\u4E00\u771F\u6E90**\u3002\u5FC5\u987B\u540C\u65F6\u542B\u4E24\u4E2A\u7F29\u653E\uFF1A\n     \u2460 `_pfmDisplayScale`  \u2014\u2014 \u753B\u5E03 CSS \u7F29\u653E\uFF08\u6A21\u677F\u5206\u8FA8\u7387 \u2192 \u5C4F\u5E55\u663E\u793A\u5C3A\u5BF8\uFF09\n     \u2461 `pfmZoomLevel`      \u2014\u2014 \u6574\u4F53\u89C6\u56FE\u7F29\u653E\uFF08`#pfmZoomLayer` \u7684 `scale()`\uFF0C50%\u2013300%\uFF0C\u6EDA\u8F6E/\u634F\u5408\uFF09\n   \u6539\u524D\u5404\u5904**\u53EA\u9664\u4E86 \u2460**\uFF0C\u6F0F\u4E86 \u2461 \u21D2 \u4E00\u653E\u5927\u63A7\u5236\u70B9/\u6846\u7EBF/\u6307\u793A\u7EBF\u5168\u90E8\u8DDF\u7740\u53D8\u5927\u3002\n   \u5B9E\u6D4B\uFF08`_t_deskctrl.js`\uFF0Cproduct 71\uFF0Czoom 1.77\u00D7\uFF09\uFF1A\n     \u63A7\u5236\u70B9 8.1px \u2192 14.35px \u00B7 \u547D\u4E2D\u533A 22 \u2192 39px \u00B7 \u6846\u7EBF 3 \u2192 5.3px \u2014\u2014 \u6B63\u597D \u00D71.77\u3002\n   \u26A0\uFE0F \u4EFB\u4F55\"\u671F\u671B\u5C4F\u5E55\u5C3A\u5BF8\u6052\u5B9A\"\u7684\u91CF\uFF08\u63A7\u5236\u70B9/\u6846\u7EBF/\u65CB\u8F6C\u70B9\u95F4\u8DDD/\u6307\u793A\u7EBF/\u865A\u7EBF\u8282\u8DDD\uFF09\u90FD\u5FC5\u987B\u8D70\u8FD9\u4E2A\u51FD\u6570\uFF0C\n     \u4E0D\u8981\u518D\u5404\u81EA\u5199 `Math.max(0.001, canvas._pfmDisplayScale)`\uFF08\u90A3\u6B63\u662F\u6F0F \u2461 \u7684\u5199\u6CD5\uFF09\u3002 */\nfunction pfmScreenScale(){\n  var c = canvas;\n  var dz = (c && c._pfmDisplayScale) || 1;\n  var z = (typeof pfmZoomLevel === 'number' && pfmZoomLevel > 0) ? pfmZoomLevel : 1;\n  return Math.max(0.001, dz * z);\n}\n/* \u63A7\u5236\u70B9\u65CF\uFF08\u89C6\u89C9\u76F4\u5F84 / \u547D\u4E2D\u533A / \u65CB\u8F6C\u70B9\u95F4\u8DDD / \u9009\u4E2D\u6846\u7EBF\u5BBD\uFF09\u7684**\u552F\u4E00\u6536\u53E3**\u3002\n   \u26A0\uFE0F fabric \u7684 cornerSize \u8981**\u9010\u4E2A\u5BF9\u8C61\u5199\u5B9E\u4F8B\u503C**\uFF08\u5386\u53F2\u5B9E\u73B0\u5982\u6B64\uFF09\u21D2 \u53EA\u6539\u539F\u578B\u5BF9\u5DF2\u5EFA\u5BF9\u8C61\u65E0\u6548\uFF0C\n      \u5FC5\u987B\u904D\u5386 `canvas.getObjects()` \u91CD\u8BBE\uFF08\u8FD9\u91CC\u7167\u65E7\uFF09\u3002\n   \u2705 \u5199\u524D\u6BD4\u5BF9\uFF1A\u503C\u6CA1\u53D8\u5C31\u6574\u5757\u8DF3\u8FC7\uFF08`pfmApplyLayer` \u6BCF\u6B21\u5E73\u79FB\u90FD\u4F1A\u8C03\u5B83 \u21D2 \u4E0D\u7136\u767D\u8DD1\uFF09\u3002 */\nfunction pfmApplyControlSize(){\n  if(!canvas || !canvas.getObjects) return false;\n  var _sc = pfmScreenScale();\n  var _cl = pfmCornerLogical((canvas.getWidth && canvas.getWidth()) || 0, _sc);\n  var _ch = false;\n  if(fabric.Object.prototype.cornerSize !== _cl.cornerSize){\n    fabric.Object.prototype.cornerSize = _cl.cornerSize; _ch = true;\n  }\n  if(fabric.Object.prototype.touchCornerSize !== _cl.touchCornerSize){\n    fabric.Object.prototype.touchCornerSize = _cl.touchCornerSize; _ch = true;\n  }\n  /* \u65CB\u8F6C\u70B9\u4E0E\u9876\u90E8\u4E2D\u70B9\u624B\u67C4\u7684\u95F4\u8DDD\uFF08\u5C4F\u5E55 32px\uFF09\u2014\u2014 \u540C\u4E3A\u903B\u8F91\u503C\uFF0C\u5FC5\u987B\u6309\u540C\u4E00\u56E0\u5B50\u53CD\u7B97 */\n  try {\n    var _mtrP = fabric.Object.prototype.controls && fabric.Object.prototype.controls.mtr;\n    var _wantGap = -_cl.rotateGap;\n    if (_mtrP && _mtrP.offsetY !== _wantGap) { _mtrP.offsetY = _wantGap; _ch = true; }\n  } catch(e){}\n  /* \u9009\u4E2D\u6846\u7EBF\u5BBD\uFF1A2026-10-04 \u8D77\u7531\u771F\u6E90\u7ED9\uFF08--pf-sel-bw = 1px\uFF0C\u4E0E\u753B\u677F\u540C\u6B3E\uFF1B\u6B64\u524D\u662F\u5199\u6B7B\u7684 3px\uFF09\u3002\n     \u26A0\uFE0F fabric \u7684 borderScaleFactor **\u540C\u65F6\u51B3\u5B9A\u65CB\u8F6C\u6746\u7C97\u7EC6** \u21D2 \u6846\u7EBF\u4E0E\u6746\u5929\u7136\u540C\u6B3E\u3002 */\n  var _wantBsf = Math.max(1, Math.round(_selTok().bw / _sc));\n  if(fabric.Object.prototype.borderScaleFactor !== _wantBsf){\n    fabric.Object.prototype.borderScaleFactor = _wantBsf; _ch = true;\n  }\n  canvas.getObjects().forEach(function(o){\n    if(!o.isGrid && o.cornerSize !== _cl.cornerSize){\n      o.set({ cornerSize: _cl.cornerSize, touchCornerSize: _cl.touchCornerSize });\n      o.setCoords();\n      _ch = true;\n    }\n  });\n  return _ch;\n}\n/* \u6253\u5370\u533A\u6307\u793A\u7EBF\uFF08\u865A\u7EBF\u6846 + \u4E2D\u5FC3\u5341\u5B57\uFF09\u7684\u7EBF\u5BBD/\u865A\u7EBF\u8282\u8DDD \u2014\u2014 \u540C\u6837\u5C4F\u5E55\u6052\u5B9A\uFF0C\u540C\u6837\u6F0F\u4E86\u6574\u4F53\u7F29\u653E\u3002\n   \u26A0\uFE0F \u8FD9\u91CC**\u53EA\u6539\u73B0\u6709 isGrid \u5BF9\u8C61\u7684\u63CF\u8FB9**\uFF08\u4E0D remove/add\uFF09\u21D2 \u634F\u5408\u7F29\u653E\u65F6\u6BCF\u5E27\u8C03\u7528\u4E5F\u4E0D\u6296\u3002 */\nfunction pfmApplyGridStroke(){\n  if(!canvas || !canvas.getObjects) return false;\n  var _sc = pfmScreenScale();\n  var gridSW = Math.max(1, Math.round(3 / _sc));\n  var dash = [Math.max(2, Math.round(6 / _sc)), Math.max(2, Math.round(3 / _sc))];\n  var _ch = false;\n  canvas.getObjects().forEach(function(o){\n    if(!o.isGrid) return;\n    if(o.strokeWidth !== gridSW){ o.set('strokeWidth', gridSW); _ch = true; }\n    var d = o.strokeDashArray || [];\n    if(d[0] !== dash[0] || d[1] !== dash[1]){ o.set('strokeDashArray', dash); _ch = true; }\n  });\n  return _ch;\n}\nfunction applyControlStyle(obj){\n  // Keep handles a constant on-screen size regardless of canvas CSS scaling.\n  var _sc = pfmScreenScale();   /* 2026-10-04: \u542B**\u6574\u4F53\u7F29\u653E**\uFF08\u539F\u4E3A\u53EA\u9664 CSS \u7F29\u653E\uFF09 */\n  var _selT = _selTok();        /* 2026-10-04\uFF1A\u989C\u8272/\u7EBF\u578B\u771F\u6E90\uFF08\u4E0E\u753B\u677F\u540C\u4E00\u6279\u53D8\u91CF\uFF09 */\n  var cl = pfmCornerLogical((canvas && canvas.getWidth() * _sc) || 0, _sc);\n  obj.set({\n    cornerSize: cl.cornerSize,\n    touchCornerSize: cl.touchCornerSize,\n    /* 2026-10-04\uFF1A\u539F\u5148\u5199\u6B7B\u9752\u8272 #1FBDB7 + \u7EE7\u627F\u539F\u578B\u7684\u865A\u7EBF [6,4] \u21D2 \u4E0E\u753B\u677F\uFF08#534AB7 \u5B9E\u7EBF\uFF09\u4E24\u5957\u3002\n       \u6539\u4E3A\u771F\u6E90\uFF1B\u5177\u4F53\u6BCF\u4E2A\u63A7\u5236\u70B9\u7684\u5F62\u72B6\u7531 assets/pfm-sel.js#renderControl \u6309\u540C\u4E00\u6279\u5E38\u91CF\u753B\u3002 */\n    cornerColor: _selT.color,\n    cornerStrokeColor: _selT.color,\n    transparentCorners: false,\n    cornerStyle: 'circle',\n    borderColor: _selT.color,\n    borderDashArray: _selT.dash,\n    // 2026-09-04: borderScaleFactor \u7531 resizeCanvasToPrintArea \u539F\u578B\u7EDF\u4E00\uFF08\u5C4F\u5E55\u6052\u5B9A\uFF09\uFF0C\u6B64\u5904\u4E0D\u518D\u5199\u6B7B 5\n    padding: 6\n  });\n  return obj;\n}\n/* ===== 2026-10-14\uFF08\u7532\uFF09\uFF1A\u5370\u533A\u5C31\u7EEA\u5B88\u536B\uFF08\u7528\u6237\u62A5\u300C\u7ED8\u753B\u533A\u57DF\u4F1A\u9519\u4E71\u300D\uFF09=====\n   \uD83D\uDD34\uD83D\uDD34 \u75C5\u7076\uFF1A\u8D34\u56FE**\u65E9\u4E8E** resizeCanvasToPrintArea \u65F6 canvas._pfmPrintArea \u8FD8\u662F\u7A7A\n   \u21D2 addImage \u9000\u5316\u6210\u300C\u6309 canvas \u5C3A\u5BF8\uFF08\u521D\u59CB\u5360\u4F4D 600\u00D7600\uFF09\u5C45\u4E2D\u6446\u56FE\u300D\u21D2 \u56FE\u6848\u843D\u5728\u5DE6\u4E0A\uFF1B\n   \u4E4B\u540E\u4EA7\u54C1\u52A0\u8F7D\u5B8C\u3001\u753B\u5E03\u6362\u6210\u6574\u4EF6\u8863\u670D\u5C3A\u5BF8\uFF0C**\u56FE\u6848\u5750\u6807\u4E0D\u8DDF\u7740\u91CD\u7B97** \u21D2 \u6C38\u4E45\u504F\u4F4D\u3001\u8DD1\u51FA\u5370\u533A\u3002\n   \u9884\u70ED\u8DEF\u5F84\uFF08_runPreload\uFF09\u7528\u7684\u662F**\u56FA\u5B9A 1.6s \u5B9A\u65F6**\uFF08\u4E0D\u662F\u7B49\u5C31\u7EEA\u4FE1\u53F7\uFF09\u21D2 \u6162\u7684\u65F6\u5019\u5FC5\u8E29 \u21D2 \u5076\u53D1\u3002\n   \u4FEE\u6CD5\uFF1A\u5370\u533A\u6CA1\u5C31\u7EEA\u5C31**\u6392\u961F**\uFF0C\u5C31\u7EEA\uFF08\u6216 \u226415s \u515C\u5E95\u653E\u884C\uFF09\u540E\u518D\u8D34 \u2014\u2014 \u4E0D\u6539\u4EFB\u4F55\u5E03\u5C40/\u5750\u6807\u53E3\u5F84\u3002 */\nvar _pfmImgQueue = [], _pfmImgWaitT = null, _pfmImgWaitN = 0;\nfunction _pfmFlushImgQueue(){\n  if(!_pfmImgQueue.length) return;\n  if(!canvas || !canvas._pfmPrintArea) return;            /* \u4ECD\u672A\u5C31\u7EEA \u21D2 \u7EE7\u7EED\u7559\u7740 */\n  var _q = _pfmImgQueue.slice(); _pfmImgQueue.length = 0;\n  for(var _i=0;_i<_q.length;_i++){ try{ addImage(_q[_i].url, _q[_i].opts); }catch(e){ console.warn('[pfm] queued addImage failed:', e && e.message); } }\n}\nfunction _pfmWaitPrintArea(){\n  if(_pfmImgWaitT) return;\n  _pfmImgWaitN = 0;\n  _pfmImgWaitT = setInterval(function(){\n    _pfmImgWaitN++;\n    if(canvas && canvas._pfmPrintArea){ clearInterval(_pfmImgWaitT); _pfmImgWaitT=null; _pfmFlushImgQueue(); return; }\n    if(_pfmImgWaitN > 60){                                 /* 15s \u4ECD\u672A\u5C31\u7EEA \u21D2 \u653E\u884C\uFF08\u6309\u65E7\u884C\u4E3A\u8D34\uFF0C\u7EDD\u4E0D\u80FD\u300C\u56FE\u6C38\u8FDC\u4E0D\u51FA\u73B0\u300D\uFF09*/\n      clearInterval(_pfmImgWaitT); _pfmImgWaitT=null;\n      var _q = _pfmImgQueue.slice(); _pfmImgQueue.length = 0;\n      for(var _i=0;_i<_q.length;_i++){ try{ _pfmAddImageNow(_q[_i].url, _q[_i].opts); }catch(e){} }\n    }\n  }, 250);\n}\nfunction addImage(url, opts){\n  /* \u5370\u533A\u672A\u5C31\u7EEA \u21D2 \u6392\u961F\uFF08**\u4E0D\u662F**\u6309\u5360\u4F4D\u5C3A\u5BF8\u786C\u8D34 \u2014\u2014 \u90A3\u6B63\u662F\u9519\u4E71\u7684\u6765\u6E90\uFF09\u3002 */\n  if(!canvas || !canvas._pfmPrintArea){ _pfmImgQueue.push({url:url, opts:opts}); _pfmWaitPrintArea(); return; }\n  return _pfmAddImageNow(url, opts);\n}\nfunction _pfmAddImageNow(url, opts){\n  /* 2026-09-14: \u8BBE\u8BA1\u56FE\u6765\u81EA bridge.highdeep.net\uFF08\u4E0E\u7AD9\u70B9**\u8DE8\u57DF**\uFF09\u2014\u2014fabric \u4E0D\u58F0\u660E\n     crossOrigin \u65F6\u56FE\u7247\u4E0D\u5E26 CORS \u8BF7\u6C42\uFF0C\u753B\u5E03\u4F1A\u88AB\u6C61\u67D3 \u2192 \u4E4B\u540E\u4EFB\u4F55 toDataURL() \u90FD\u629B\n     SecurityError\uFF08\u8868\u73B0\u4E3A\u300CAdd to Cart \u70B9\u4E86\u6BEB\u65E0\u53CD\u5E94\u300D\uFF09\u3002\u540C\u6587\u4EF6 getImageBounds()\n     \u65E9\u5DF2\u6B63\u786E\u8BBE\u7F6E crossOrigin\uFF0C\u6B64\u5904\u6B64\u524D\u9057\u6F0F\u3002data:/blob: \u540C\u6E90\u8F93\u5165\u4E0D\u53D7\u5F71\u54CD\u3002 */\n  fabric.Image.fromURL(url,function(img){\n    /* 2026-10-10\uFF08\u7532\uFF09\uFF1A\u56FE\u7247**\u4E0B\u8F7D\u5B8C\u6210**\u5373\u56DE\u8C03\u672C\u51FD\u6570 \u21D2 \u5148\u7ED9\u8C03\u7528\u65B9\u4E00\u6B21\u300C\u52A0\u8F7D\u7ED3\u675F\u300D\u901A\u77E5\n       \uFF08\u7D20\u6750\u5E93\u636E\u6B64\u6536\u6389\u683C\u5B50\u4E0A\u7684\u8F6C\u5708\uFF09\u3002\u653E\u5728\u6700\u524D\uFF1A\u5373\u4FBF\u4E0B\u9762\u67D0\u6B65\u629B\u9519\uFF0C\u4E5F\u4E0D\u4F1A\u628A\u8C03\u7528\u65B9\u9501\u5728 loading\u3002\n       img \u4E3A\u7A7A = \u52A0\u8F7D\u5931\u8D25 \u21D2 \u8D70 onError\u3002\u4E24\u4E2A\u56DE\u8C03\u90FD\u7F3A\u7701\u4E0D\u4F20 \u21D2 \u65E2\u6709\u8C03\u7528\u65B9\u96F6\u56DE\u5F52\u3002 */\n    if(!img){ if(opts&&opts.onError) opts.onError(); return; }\n    if(opts&&opts.onLoad) opts.onLoad();\n    /* 2026-10-15\uFF1A\u7D20\u6750\u5E93\u9884\u89C8\u6863 \u2014\u2014 \u8BB0\u539F\u56FE URL/\u5C3A\u5BF8\uFF1B\u753B\u5E03\u663E\u793A\u7528\u9884\u89C8\u6863(1200px)\uFF0C\u5BFC\u51FA\u6309 _pfmOrigUrl \u53D6\u539F\u56FE \u21D2 \u96F6\u56DE\u5F52 */\n    if(opts && opts.origUrl){ img._pfmOrigUrl = opts.origUrl; if(opts.origW) img._pfmOrigW = opts.origW; if(opts.origH) img._pfmOrigH = opts.origH; }\n    // 2026-08-30: canvas=\u6574\u4EF6\u8863\u670D \u2014 \u9ED8\u8BA4\u5C3A\u5BF8/\u4F4D\u7F6E\u53C2\u7167\u6253\u5370\u533A\uFF08\u56FE\u7247\u9ED8\u8BA4\u653E\u5165\u6253\u5370\u533A\u4E2D\u5FC3\uFF09\n    var pa=canvas._pfmPrintArea;\n    var cw = pa ? pa.width : canvas.width, ch = pa ? pa.height : canvas.height;\n    var ox = pa ? pa.left : 0, oy = pa ? pa.top : 0;\n    if(cw<=10||ch<=10) cw=800, ch=800;\n    // 2026-09-01: fit within 90% of the PRINT AREA on BOTH axes (keep aspect ratio,\n    // never overflow the dashed print box). Old rule allowed 150% height overflow.\n    var s = Math.min(cw * 0.9 / img.width, ch * 0.9 / img.height);\n    if(!isFinite(s)||s<=0) s=1;\n    // 2026-08-22: \u56FE\u7247\u8D28\u91CF\u68C0\u67E5 \u2014\u2014 \u4F4D\u56FE\u88AB\u653E\u5927\u8D85\u8FC7\u6253\u5370\u5206\u8FA8\u7387\u5C31\u4F1A\u5370\u7CCA\u3002\u6709\u6548 DPI = printDpi / scaleFactor\n    // \uFF08s=1 \u2192 1:1\uFF1Bs=2 \u2192 \u534A DPI\uFF1Bs=0.5 \u2192 \u53CC\u500D DPI\uFF09\u3002\n    try {\n      var spec = printAreaSpecs[currentPlacement] || printAreaSpecs['front'] || Object.values(printAreaSpecs)[0];\n      var pDpi = (spec && spec.printDpi) || 150;\n      var isVector = /^data:image\\/svg|\\.svg(\\?|$)/i.test(url || '');\n      /* \u9884\u89C8\u6863 img.width=1200px\uFF0C\u4F46\u5BFC\u51FA\u7528\u539F\u56FE \u21D2 DPI \u5224\u5B9A\u6309\u3010\u539F\u56FE\u5C3A\u5BF8\u3011\u7B97\uFF0C\u5426\u5219\u8BEF\u62A5\u7CCA */\n      var _ow = (opts && opts.origW) || img.width;\n      var _oh = (opts && opts.origH) || img.height;\n      var _sReal = Math.min(cw * 0.9 / _ow, ch * 0.9 / _oh);\n      if (_sReal > 1.05 && !isVector && !(opts && opts.isClipart)) {          // original scaled UP beyond 1:1 print res\uFF082026-10-28\uFF1A\u8D34\u7EB8\u662F\u77E2\u91CF\u6E90\u6805\u683C\u5316\uFF0C\u8DF3\u8FC7\u8FD9\u6761\u4F4E\u6E05\u7167\u7247\u63D0\u793A\uFF09\n        var effDpi = Math.round(pDpi / _sReal);\n        if (effDpi < pDpi * 0.8) {\n          showToast('\u26A0\uFE0F Image may print blurry \u2014 effective ' + effDpi + ' DPI vs ' + pDpi + ' needed. Use a higher-res image for crisp prints.', 'warn');\n        }\n      }\n    } catch(e){}\n    img.set({\n      left: ox + cw/2 - img.width*s/2,\n      top: oy + ch/2 - img.height*s/2,\n      scaleX: s, scaleY: s,\n      selectable: true,\n      hasControls: true,\n      hasBorders: true,\n      hasRotatingPoint: true,\n      lockMovementX: false,\n      lockMovementY: false,\n      lockScalingX: false,\n      lockScalingY: false,\n      lockRotation: false\n    });\n    applyControlStyle(img);\n    /* 2026-09-19: opts.noSelect \u2014\u2014 \u65B0\u589E\u56FE\u6848/\u56FE\u7247**\u4E0D\u81EA\u52A8\u9009\u4E2D**\uFF08\u7528\u6237\u8981\u6C42\uFF1A\u4E0D\u8981\u56E0\u4E3A\u9ED8\u8BA4\u9009\u4E2D\n       \u5C31\u628A\u5E95\u680F\u8E22\u8FDB\u5BF9\u8C61\u7EC4\uFF0C\u8FDE\u7EED\u6DFB\u52A0\u4F1A\u88AB\u6253\u65AD\uFF09\u3002\u60F3\u8C03\u6574\u65F6\u70B9\u753B\u5E03\u4E0A\u7684\u56FE\u6848 = \u4E3B\u52A8\u9009\u4E2D\u3002 */\n    canvas.add(img);\n    if(!(opts&&opts.noSelect)) canvas.setActiveObject(img);\n    canvas.renderAll();saveState();updateLayers();\n  },{crossOrigin:'anonymous'});\n}\n// Arc helper: ADAPTIVE path \u2014 measure text width with fabric itself so the path\n// is always at least as long as the text (no overlap at any font size)\n/* 2026-10-24(\u7532): \u5F27\u5EA6\u6587\u5B57\u7684\u5305\u56F4\u76D2\u4FEE\u6B63 \u2014\u2014 fabric \u7528 path \u7684\u7EC6\u6761\u9AD8\u5EA6\u5F53\u9AD8\u5EA6 \u21D2 \u6846\u53D8\u7EC6\u6761\u3002\n   \u8FD9\u91CC\u628A\u9AD8\u5EA6\u6491\u5230\u300C\u5B57\u53F7\u884C\u9AD8 + \u77E2\u9AD8\u300D\uFF1B\u53EA\u5F71\u54CD\u9009\u6846\u663E\u793A\uFF0C\u4E0D\u6539\u6E32\u67D3/\u5BFC\u51FA\u3002 */\nfunction _pfmArcBBoxFix(o){\n  if(!o || !o.path) return;\n  if(o._pfmOrigNTDims) return;                 /* \u5DF2\u88C5\u8FC7 */\n  if(typeof o._getNonTransformedDimensions !== 'function') return;\n  o._pfmOrigNTDims = o._getNonTransformedDimensions;\n  o._getNonTransformedDimensions = function(){\n    var d = o._pfmOrigNTDims.call(this) || { x: this.width || 0, y: this.height || 0 };\n    var sag = Math.abs(parseFloat(this.pfmArcSag) || 0);\n    var fh = (parseFloat(this.fontSize) || 100) * 1.2;\n    var need = sag + fh;\n    return { x: d.x, y: Math.max(d.y, need) };\n  };\n}\nfunction _pfmArcBBoxUnfix(o){\n  if(!o || !o._pfmOrigNTDims) return;\n  o._getNonTransformedDimensions = o._pfmOrigNTDims;\n  o._pfmOrigNTDims = null;\n  o.pfmArcSag = 0;\n}\nfunction applyArcToText(t,arc){\n  if(!t) return;\n  /* 2026-10-14: 'path' = \u81EA\u5B9A\u4E49\u5F62\u72B6\u8DEF\u5F84\uFF08Text on path\uFF09\u2014\u2014 \u4FDD\u6301\u8DEF\u5F84\u4E0D\u52A8\uFF0C\u522B\u7528\u5706\u5F27\u8986\u76D6\u5B83 */\n  if(arc==='path') return;\n  if(!arc||arc==='none'){\n    if(t.path){t.set({path:null,pathSide:null,pathAlign:null,pathStartOffset:0,textAlign:'left',dirty:true})}\n    _pfmArcBBoxUnfix(t);   /* 2026-10-24: \u53BB\u5F27 \u21D2 \u5305\u56F4\u76D2\u6062\u590D\u539F\u6837 */\n    t.pfmPathKind=null;   /* 2026-10-14: \u79BB\u5F00\u81EA\u5B9A\u4E49\u8DEF\u5F84 */\n    return;\n  }\n  /* 2026-10-14: \u5F27\u8DEF\u5F84\u751F\u6210\u5DF2\u5916\u7F6E\u5230 assets/hd-text.js\uFF08\u5706\u5F27\u626B\u89D2\u6A21\u578B\uFF1B\u672C\u6587\u4EF6\u8D34 256KB \u9876\uFF09 */\n  var path=null;\n  try{ if(window.__hdText&&window.__hdText.arcPath) path=window.__hdText.arcPath(t,arc); }catch(e){}\n  if(!path) return;\n  t.pfmPathKind=null;   /* 2026-10-14: \u8F6C\u4E3A\u5706\u5F27 \u21D2 \u5DF2\u4E0D\u662F\u81EA\u5B9A\u4E49\u8DEF\u5F84 */\n  t.set({path:path,pathSide:'center',pathAlign:'center',pathStartOffset:0,textAlign:'center',dirty:true});\n  _pfmArcBBoxFix(t);   /* 2026-10-24: \u6491\u9AD8\u5305\u56F4\u76D2\uFF08\u53EA\u5F71\u54CD\u9009\u6846\uFF09 */\n  if(t.setCoords) t.setCoords();\n}\nfunction addText(txt,font,size,color,outlineW,outlineC,arc){\n  font=font||'Arial';size=size||36;color=color||'#000';outlineW=outlineW||0;outlineC=outlineC||'#fff';arc=arc||'none';\n  // 2026-08-30: \u6587\u5B57\u9ED8\u8BA4\u653E\u6253\u5370\u533A\u4E2D\u5FC3\uFF08canvas=\u6574\u4EF6\u8863\u670D\u540E\uFF09\n  var _pa=canvas._pfmPrintArea;\n  var _cx=_pa?_pa.left+_pa.width/2:canvas.width/2, _cy=_pa?_pa.top+_pa.height/2:canvas.height/2;\n  /* 2026-09-14 \u6279\u6B214c\uFF1A\u5BF9\u8C61\u300C\u6784\u9020\u300D\u59D4\u6258\u7ED9 assets/hd-text.js\uFF08\u8D1F\u8D23\u6BB5\u843D\u6298\u884C + \u5B57\u95F4\u8DDD/\u884C\u8DDD/\u5BF9\u9F50\uFF09\u3002\n     \u4EC5\u6784\u9020\u59D4\u6258 \u2014\u2014 \u5165\u753B\u5E03 / \u9009\u4E2D / \u5165\u64A4\u9500\u6808 / \u5237\u65B0\u56FE\u5C42\u4ECD\u8D70\u4E0B\u9762\u540C\u4E00\u4EFD\u6D41\u7A0B\uFF0C\u4E0D\u505A\u7B2C\u4E8C\u4EFD\u5B9E\u73B0\u3002 */\n  var text=null;\n  try{ if(window.__hdText&&window.__hdText.build) text=window.__hdText.build(txt,{font:font,size:size,color:color,outlineW:outlineW,outlineC:outlineC,arc:arc}); }catch(e){}\n  if(!text) text=new fabric.IText(txt||'Your Text',{fontSize:size,fontFamily:font,fill:color,stroke:outlineC,strokeWidth:outlineW});\n  text.set({left:_cx,top:_cy,originX:'center',originY:'center'});\n  canvas.add(text);\n  applyArcToText(text,arc);\n  applyControlStyle(text);\n  canvas.setActiveObject(text);canvas.renderAll();saveState();updateLayers();\n}\n\n// ============= CLIPARTS =============\n// 2026-10-15\uFF1A\u6574\u5757\u5DF2\u5916\u7F6E\u5230 assets/hd-cliparts.js\uFF08\u6570\u636E\u6570\u7EC4 + clipartAttrs + renderClipartGrid\uFF09\u3002\n// \u4F9D\u8D56 window.__pfmCanvas / window.__hdLibDeps.add / \u81EA\u5E26 q()\uFF1B\u5BFC\u51FA window.renderClipartGrid\u3002\n// \u4E0B\u65B9 DOMContentLoaded \u5185\u4E3A\u5B88\u536B\u5F0F\u8C03\u7528\uFF08\u540C __hdDraw \u6A21\u5F0F\uFF09\u3002\n// ============= LAYERS =============\n// 2026-09-13 \u56FE\u5C42\u7B2C 1 \u6279\uFF1A\u91CD\u547D\u540D / \u9690\u85CF / \u9501\u5B9A + \u9009\u4E2D\u6001\u540C\u6B65\nvar _pfmLayerRenaming = null; // \u6B63\u5728\u7F16\u8F91\u7684\u5217\u8868\u7D22\u5F15\uFF1B\u975E null \u65F6\u51BB\u7ED3\u91CD\u5EFA\uFF0C\u5426\u5219 inline \u8F93\u5165\u6846\u4F1A\u88AB\u51B2\u6389\nfunction pfmLayerObjs(){ return canvas.getObjects().filter(function(o){return !o.isGrid}); }\nfunction pfmLayerLabel(o){\n  if(o.pfmName) return o.pfmName;\n  if(o.type==='i-text') return 'Text: '+((o.text||'').slice(0,12)||'\u2026');\n  if(o.type==='image') return 'Image';\n  if(o.type==='group') return 'Group ('+o.getObjects().length+')';\n  return o.type;\n}\nfunction pfmLayerLocked(o){\n  return !!(o.lockMovementX && o.lockScalingX && o.hasControls===false);\n}\nfunction pfmLayerEyeSvg(hidden){\n  return '<svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" style=\"pointer-events:none\">'\n    +'<path d=\"M1.5 8s2.5-4.5 6.5-4.5S14.5 8 14.5 8 12 12.5 8 12.5 1.5 8 1.5 8z\"/><circle cx=\"8\" cy=\"8\" r=\"2\"/>'\n    +(hidden?'<path d=\"M2.5 13.5 13.5 2.5\"/>':'')+'</svg>';\n}\nfunction pfmLayerLockSvg(locked){\n  return '<svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" style=\"pointer-events:none\">'\n    +'<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6.5\" rx=\"1.2\"/>'\n    +(locked?'<path d=\"M5.5 7V5a2.5 2.5 0 0 1 5 0v2\"/>':'<path d=\"M5.5 7V5a2.5 2.5 0 0 1 5 0\"/>')+'</svg>';\n}\nfunction pfmLayerPenSvg(){\n  return '<svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\" style=\"pointer-events:none\">'\n    +'<path d=\"M11.3 2.5a1.5 1.5 0 0 1 2.2 2.1L5.6 12.4l-2.9.7.7-2.9z\"/><path d=\"M10.2 3.6l2.2 2.2\"/></svg>';\n}\n// \u53EA\u5207 .sel \u7C7B\u3001\u4E0D\u91CD\u5EFA\u5217\u8868\uFF08\u91CD\u5EFA\u4F1A\u6253\u65AD\u91CD\u547D\u540D\u7F16\u8F91\uFF09\nfunction pfmLayerSyncSel(){\n  var list=q('pfmLayersList'); if(!list) return;\n  var rev=pfmLayerObjs().slice().reverse();\n  var idx=rev.indexOf(canvas.getActiveObject());\n  list.querySelectorAll('.pfm-layer-item').forEach(function(el){\n    if(parseInt(el.dataset.idx)===idx) el.classList.add('sel'); else el.classList.remove('sel');\n  });\n}\n// \u9690\u85CF = \u4E0D\u6E32\u67D3 = \u4E0D\u5BFC\u51FA\uFF08\u5DF2\u771F\u673A\u9A8C\u8BC1 toDataURL \u4F1A\u6392\u9664\uFF0C\u6545\u6B64\u5904\u63D0\u793A\u6587\u6848\u5FC5\u987B\u5199\u660E\uFF09\nfunction pfmLayerSetVisible(o,v){\n  o.set('visible',v);\n  canvas.renderAll(); updateLayers(); saveState();\n  try{ hdcoToast(v?'Layer shown':'Layer hidden (not exported)'); }catch(e){}\n}\n// \u9501\u5B9A\u7528 Canva \u8BED\u4E49\uFF1A\u4FDD\u7559 selectable\uFF08\u53EF\u4ECE\u5217\u8868/\u753B\u5E03\u9009\u4E2D\u786E\u8BA4\u662F\u54EA\u5C42\uFF09\uFF0C\u53EA\u5173\u79FB\u52A8\u7F29\u653E\u5E76\u53BB\u6389\u63A7\u5236\u70B9\nfunction pfmLayerSetLocked(o,v){\n  o.set({lockMovementX:v,lockMovementY:v,lockScalingX:v,lockScalingY:v,lockRotation:v,hasControls:!v});\n  if(v && canvas.getActiveObject()===o) canvas.discardActiveObject();\n  canvas.renderAll(); updateLayers(); saveState();\n  try{ hdcoToast(v?'Locked (cannot drag)':'Unlocked'); }catch(e){}\n}\nfunction pfmLayerStartRename(item,obj){\n  if(_pfmLayerRenaming!==null) return;\n  var nm=item.querySelector('.pfm-layer-name'); if(!nm||!nm.parentNode) return;\n  _pfmLayerRenaming=parseInt(item.dataset.idx);\n  var inp=document.createElement('input');\n  inp.type='text'; inp.className='pfm-layer-rename'; inp.maxLength=40;\n  inp.value=obj.pfmName||pfmLayerLabel(obj);\n  inp.setAttribute('placeholder','Layer name'); inp.setAttribute('aria-label','Layer name');\n  nm.parentNode.replaceChild(inp,nm);\n  inp.focus(); inp.select();\n  var done=false;\n  function finish(save){\n    if(done) return; done=true;\n    var v=inp.value;\n    if(save){\n      v=(v||'').replace(/^\\s+|\\s+$/g,'');\n      if(v) obj.pfmName=v.slice(0,40); else delete obj.pfmName;\n      _pfmLayerRenaming=null;\n      updateLayers(); saveState();\n    }else{\n      _pfmLayerRenaming=null; updateLayers();\n    }\n  }\n  inp.addEventListener('keydown',function(e){\n    if(e.key==='Enter'){ e.preventDefault(); finish(true); }\n    else if(e.key==='Escape'){ e.preventDefault(); finish(false); }\n  });\n  inp.addEventListener('blur',function(){ finish(true); });\n}\n// 2026-09-13 \u56FE\u5C42\u7B2C 2 \u6279\uFF1A\u591A\u9009 / \u6210\u7EC4 / \u89E3\u7EC4 \u2014\u2014 \u903B\u8F91\u5916\u7F6E\u5728 assets/hd-layers.js\nfunction hdLayersBridge(){\n  var L=window.__hdLayers; if(!L) return;\n  L.init({\n    objs:function(){ return pfmLayerObjs(); },\n    refresh:function(){ updateLayers(); },\n    group:function(kids){\n      var g=new fabric.Group(kids);\n      kids.forEach(function(o){ canvas.remove(o); });\n      canvas.add(g); canvas.setActiveObject(g);\n    },\n    ungroup:function(g){\n      var kids=g.getObjects().slice();\n      g._restoreObjectsState();\n      canvas.remove(g);\n      kids.forEach(function(o){ canvas.add(o); });\n    },\n    done:function(){ canvas.renderAll(); updateLayers(); saveState(); }\n  });\n}\n// 2026-09-13 \u56FE\u7247\u540E\u5904\u7406\uFF08\u53BB\u5E95/\u6EE4\u955C/\u6DF7\u5408\u6A21\u5F0F\uFF09\u2014\u2014 \u903B\u8F91\u5916\u7F6E\u5728 assets/hd-image.js\nfunction hdImageBridge(){\n  var I=window.__hdImage; if(!I) return;\n  I.init({\n    canvas:function(){ return canvas; },\n    render:function(){ canvas.renderAll(); },\n    save:function(){ saveState(); },\n    toast:function(m){ hdcoToast(m); }\n  });\n}\n// 2026-09-14 \u6279\u6B211\uFF1A\u77E2\u91CF\u5F62\u72B6\u5F15\u64CE \u2014\u2014 \u903B\u8F91\u5916\u7F6E\u5728 assets/hd-vector.js\nfunction hdVectorBridge(){\n  var V=window.__hdVector; if(!V) return;\n  V.init({\n    canvas:function(){ return canvas; },\n    add:function(obj,opts){ return window.__pfmAddObject ? window.__pfmAddObject(obj,opts) : null; },\n    render:function(){ canvas.renderAll(); },\n    save:function(){ saveState(); }\n  });\n}\n// 2026-09-14 \u6279\u6B214b\uFF1A\u667A\u80FD\u53C2\u8003\u7EBF + \u5438\u9644 \u2014\u2014 \u903B\u8F91\u5916\u7F6E\u5728 assets/hd-align.js\n// \uFF08\u6279\u6B214a \u5BF9\u9F50\u9762\u677F\u5DF2\u4E8E 2026-09-15 \u79FB\u9664\uFF0C\u5BF9\u5E94\u6837\u5F0F\u8868\u4E00\u5E76\u5220\u9664\uFF09\nfunction hdAlignBridge(){\n  var A=window.__hdAlign; if(!A) return;\n  A.init({\n    canvas:function(){ return canvas; },\n    render:function(){ canvas.renderAll(); },\n    save:function(){ saveState(); },\n    toast:function(m){ hdcoToast(m); }\n  });\n}\n/* defer \u811A\u672C\uFF08hd-align.js\uFF09\u6267\u884C\u665A\u4E8E\u672C\u5185\u8054\u811A\u672C \u2192 \u7ED9\u5B83\u4E00\u4E2A\u4E3B\u52A8\u62C9\u53D6\u4F9D\u8D56\u7684\u5165\u53E3\u3002 */\ntry{ window.__pfmAlignBoot = hdAlignBridge; }catch(e){}\n// 2026-09-14 \u6279\u6B214c\uFF1A\u6587\u5B57\u5C5E\u6027\u6269\u5C55 \u2014\u2014 \u903B\u8F91\u5916\u7F6E\u5728 assets/hd-text.js\nfunction hdTextBridge(){\n  var T=window.__hdText; if(!T) return;\n  T.init({\n    canvas:function(){ return canvas; },\n    render:function(){ canvas.renderAll(); },\n    save:function(){ saveState(); }\n  });\n}\n/* defer \u811A\u672C\uFF08hd-text.js\uFF09\u6267\u884C\u665A\u4E8E\u672C\u5185\u8054\u811A\u672C \u2192 \u4E3B\u52A8\u62C9\u53D6\u4F9D\u8D56\u7684\u5165\u53E3 */\ntry{ window.__pfmTextBoot = hdTextBridge; }catch(e){}\n// 2026-09-14 \u6279\u6B213\uFF1A\u8D1D\u585E\u5C14\u94A2\u7B14 + \u8282\u70B9\u7F16\u8F91 \u2014\u2014 \u903B\u8F91\u5916\u7F6E\u5728 assets/hd-pen.js\nfunction hdPenBridge(){\n  var P=window.__hdPen; if(!P) return;\n  P.init({\n    canvas:function(){ return canvas; },\n    add:function(obj,opts){ return window.__pfmAddObject ? window.__pfmAddObject(obj,opts) : null; },\n    render:function(){ canvas.renderAll(); },\n    save:function(){ saveState(); },\n    toast:function(m){ hdcoToast(m); }\n  });\n}\n/* defer \u811A\u672C\uFF08hd-pen.js\uFF09\u6267\u884C\u665A\u4E8E\u672C\u5185\u8054\u811A\u672C \u2192 \u4E3B\u52A8\u62C9\u53D6\u4F9D\u8D56\u7684\u5165\u53E3 */\ntry{ window.__pfmPenBoot = hdPenBridge; }catch(e){}\nfunction updateLayers(){\n  hdLayersBridge();\n  hdImageBridge();\n  hdVectorBridge();\n  hdAlignBridge();\n  hdTextBridge();\n  hdPenBridge();\n  var list=q('pfmLayersList'); if(!list) return;\n  if(_pfmLayerRenaming!==null) return; // \u7F16\u8F91\u4E2D\uFF1A\u51BB\u7ED3\u91CD\u5EFA\n  var objs=pfmLayerObjs();\n  // 2026-11-02: Layers \u5165\u53E3\u6570\u5B57\u89D2\u6807 = \u5F53\u524D\u5370\u9762\u5BF9\u8C61\u6570\uFF080 \u65F6\u9690\u85CF\uFF09\n  var _cnt=q('pfmLayersCount');\n  if(_cnt){ var _n=objs.length; if(_n>0){ _cnt.textContent=_n; _cnt.style.display=''; } else { _cnt.style.display='none'; } }\n  list.innerHTML=objs.slice().reverse().map(function(o,i){\n    var hidden=(o.visible===false), locked=pfmLayerLocked(o), _L=window.__hdLayers, _pk=_L?_L.isPicked(i):false;\n    return '<div class=\"pfm-layer-item'+(hidden?' off':'')+(_pk?' pfm-picked':'')+(_L&&_L.multiOn()?' pfm-multi':'')+'\" data-idx=\"'+i+'\">'\n      +(_L?_L.checkHtml(i):'')\n      +'<span class=\"pfm-layer-drag\" title=\"Drag to reorder\">\u2630</span>'\n      +'<span class=\"pfm-layer-name\" title=\"Double-click to rename\">'+esc(pfmLayerLabel(o))+'</span>'\n      +'<button class=\"pfm-layer-btn\" data-act=\"rename\" type=\"button\" title=\"Rename\">'+pfmLayerPenSvg()+'</button>'\n      +'<button class=\"pfm-layer-btn'+(hidden?' dim':'')+'\" data-act=\"vis\" type=\"button\" title=\"'+(hidden?'Show':'Hide')+'\">'+pfmLayerEyeSvg(hidden)+'</button>'\n      +'<button class=\"pfm-layer-btn'+(locked?' act':' dim')+'\" data-act=\"lock\" type=\"button\" title=\"'+(locked?'Unlock':'Lock')+'\">'+pfmLayerLockSvg(locked)+'</button>'\n      +(_L&&_L.delHtml?_L.delHtml():'')\n      +'</div>';\n  }).join('');\n  list.querySelectorAll('.pfm-layer-item').forEach(function(item){\n    var rev=pfmLayerObjs().slice().reverse();\n    var obj=rev[parseInt(item.dataset.idx)];\n    // \u70B9\u884C = \u9009\u4E2D\uFF08\u62D6\u62FD\u521A\u7ED3\u675F\u65F6\u6291\u5236\u4E00\u6B21\uFF0C\u907F\u514D\u62D6\u5B8C\u53C8\u9009\u4E2D\uFF09\n    item.addEventListener('click',function(){\n      if(item._pfmNoClick){ item._pfmNoClick=false; return; }\n      if(!obj) return;\n      if(window.__hdLayers && window.__hdLayers.multiOn()){ window.__hdLayers.toggle(parseInt(item.dataset.idx,10)); return; }\n      canvas.setActiveObject(obj); canvas.renderAll();\n      pfmLayerSyncSel(); updateFloatToolbar();\n    });\n    // \u773C\u775B / \u9501\n    item.querySelectorAll('.pfm-layer-btn').forEach(function(btn){\n      btn.addEventListener('click',function(e){\n        e.stopPropagation();\n        if(!obj) return;\n        var act=btn.dataset.act;\n        if(act==='vis') pfmLayerSetVisible(obj, obj.visible===false);\n        else if(act==='rename') pfmLayerStartRename(item,obj);\n        else if(act==='pick' && window.__hdLayers){ window.__hdLayers.toggle(parseInt(item.dataset.idx,10)); }\n        else pfmLayerSetLocked(obj, !pfmLayerLocked(obj));\n      });\n    });\n    // \u53CC\u51FB\u540D\u79F0 \u2192 inline \u91CD\u547D\u540D\n    var nm=item.querySelector('.pfm-layer-name');\n    if(nm) nm.addEventListener('dblclick',function(e){ e.stopPropagation(); if(obj) pfmLayerStartRename(item,obj); });\n    // 2026-09-13: \u81EA\u5B9E\u73B0\u62D6\u62FD\u6392\u5E8F\uFF08Pointer Events\uFF09\uFF0C\u53D6\u4EE3 HTML5 DnD \u2014\u2014\n    // \u2460 draggable \u4F1A\u8BA9 Chrome \u541E\u6389\u5B50\u5143\u7D20 dblclick\uFF08\u6539\u540D\u66FE\u56E0\u6B64\u5931\u6548\uFF09\u2461 HTML5 DnD \u5B8C\u5168\u4E0D\u54CD\u5E94\u89E6\u6478\u3002\n    // \u9F20\u6807\u53EF\u62D6\u6574\u884C\uFF086px \u9608\u503C\u5206\u6D41\u70B9\u51FB\u9009\u4E2D\uFF09\uFF1B\u89E6\u6478\u9650 \u2630 \u624B\u67C4 \u2014\u2014 \u884C\u4E0A\u4E0D\u80FD\u8BBE touch-action:none\uFF0C\u5426\u5219\u9762\u677F\u65E0\u6CD5\u6EDA\u52A8\u3002\n    item.addEventListener('pointerdown',function(e){\n      if(e.target && e.target.closest && e.target.closest('.pfm-layer-btn')) return;\n      if(e.pointerType==='mouse' && e.button!==0) return;\n      var onHandle=!!(e.target && e.target.closest && e.target.closest('.pfm-layer-drag'));\n      if(e.pointerType!=='mouse' && !onHandle) return;\n      var lst=q('pfmLayersList'); if(!lst) return;\n      var rows=Array.prototype.slice.call(lst.querySelectorAll('.pfm-layer-item'));\n      if(rows.length<2) return;\n      var self=parseInt(item.dataset.idx), overIdx=-1, started=false;\n      var sx=e.clientX, sy=e.clientY;\n      function idxAt(y){\n        for(var i=0;i<rows.length;i++){\n          var r=rows[i].getBoundingClientRect();\n          if(y < r.top + r.height/2) return i;\n        }\n        return rows.length-1;\n      }\n      function markOver(y){\n        var t=idxAt(y);\n        if(t===overIdx) return;\n        overIdx=t;\n        rows.forEach(function(r){r.classList.remove('drag-over')});\n        if(t!==self && rows[t]) rows[t].classList.add('drag-over');\n      }\n      function onMove(ev){\n        if(!started){\n          if(Math.abs(ev.clientY-sy)<6 && Math.abs(ev.clientX-sx)<6) return;\n          started=true;\n          item.classList.add('dragging');\n        }\n        markOver(ev.clientY);\n      }\n      function onUp(ev){\n        document.removeEventListener('pointermove',onMove,true);\n        document.removeEventListener('pointerup',onUp,true);\n        document.removeEventListener('pointercancel',onUp,true);\n        item.classList.remove('dragging');\n        rows.forEach(function(r){r.classList.remove('drag-over')});\n        if(!started) return;   // \u6CA1\u79FB\u52A8 \u2192 \u4FDD\u6301\u539F\u70B9\u51FB\u884C\u4E3A\uFF08\u9009\u4E2D\u5BF9\u8C61\uFF09\n        item._pfmNoClick=true;\n        setTimeout(function(){ item._pfmNoClick=false; },350);\n        var to=idxAt(ev.clientY);\n        if(to!==self) moveLayer(self,to);\n      }\n      document.addEventListener('pointermove',onMove,true);\n      document.addEventListener('pointerup',onUp,true);\n      document.addEventListener('pointercancel',onUp,true);\n    });\n  });\n  if(window.__hdLayers) window.__hdLayers.sync();\n}\n// Reorder canvas objects so the layer at fromListIdx moves to toListIdx (list top = frontmost)\nfunction moveLayer(fromListIdx,toListIdx){\n  var objs=canvas.getObjects().filter(function(o){return !o.isGrid});\n  var n=objs.length;\n  if(fromListIdx===toListIdx||fromListIdx<0||fromListIdx>=n||toListIdx<0||toListIdx>=n)return;\n  var fromObj=objs[n-1-fromListIdx];\n  var arr=canvas._objects;\n  var fi=arr.indexOf(fromObj);\n  if(fi<0)return;\n  arr.splice(fi,1);\n  var objs2=canvas.getObjects().filter(function(o){return !o.isGrid});\n  var toObj=objs2[n-1-toListIdx];\n  var ti=arr.indexOf(toObj);\n  if(ti<0){arr.push(fromObj)}\n  else{arr.splice(ti,0,fromObj)}\n  canvas.renderAll();updateLayers();saveState();\n}\n\n// ===== PRODUCT LOADING =====\n// \u540E\u7AEF\u65E0 flat-template \u6570\u636E\u65F6\u7684\u515C\u5E95\uFF1A\u7528\u76F8\u5BF9 printArea(x/y/w/h 0-1) \u00D7 ghost \u539F\u5C3A\u5BF8\u751F\u6210 specs\uFF0C\n// \u4FDD\u8BC1\u8BBE\u8BA1\u53F0\u4ECD\u53EF\u7528\u4E14\u4E0D\u53D8\u5F62\u3002\nfunction buildFallbackSpecs(pa, ghostUrl){\n  var src = ghostUrl.indexOf('http')===0 ? (B ? B+'/image-proxy?url='+encodeURIComponent(ghostUrl) : ghostUrl) : ghostUrl;\n  var img = new Image();\n  img.crossOrigin = 'anonymous';\n  img.onload = function(){\n    var iw = img.naturalWidth || img.width, ih = img.naturalHeight || img.height;\n    if(!iw || !ih) return;\n    var specs = {};\n    Object.keys(pa).forEach(function(k){\n      var r = pa[k];\n      if(!r || !r.w || !r.h) return;\n      var placement = (k==='default') ? 'front' : k;\n      specs[placement] = {\n        left: Math.round((r.x||0)*iw),\n        top: Math.round((r.y||0)*ih),\n        width: Math.round(r.w*iw),\n        height: Math.round(r.h*ih),\n        templateWidth: iw, templateHeight: ih,\n        printWidth: Math.round(r.w*iw),\n        printHeight: Math.round(r.h*ih),\n        printDpi: 150,\n        isFallback: true\n      };\n    });\n    if(Object.keys(specs).length){\n      printAreaSpecs = specs;\n      originalPrintAreaSpecs = JSON.parse(JSON.stringify(printAreaSpecs));\n      var spec = printAreaSpecs[currentPlacement] || printAreaSpecs['front'] || Object.values(printAreaSpecs)[0];\n      if(spec) resizeCanvasToPrintArea(spec);\n    }\n  };\n  img.onerror = function(){ console.warn('[canvas] product bg image failed to load:', src); };\n  img.src = src;\n}\nfunction loadProduct(id){\n  pid=id;\n  showLoading();\n  /* 2026-10-14: \u6362\u4EA7\u54C1/\u91CD\u8F7D\u5FC5\u987B\u5148\u6E05\u6389\u4E0A\u4E00\u4E2A\u4EA7\u54C1\u7684\u5370\u533A\u4E0E\u5C3A\u5BF8\u7F13\u5B58 \u2014\u2014 \u5426\u5219\u65B0\u4EA7\u54C1\u7684\u89C4\u683C\u53D6\u5931\u8D25\u65F6\u4F1A\n     \u6CBF\u7528\u65E7\u4EA7\u54C1\u7684 _pfmPrintArea\uFF08\u6846\u753B\u9519\u4F4D\u7F6E + \u5BFC\u51FA\u88C1\u9519\u8303\u56F4 + \u8D8A\u754C\u5224\u65AD\u5168\u9519\uFF09\u3002 */\n  try{ if(canvas){ canvas._pfmPrintArea=null; canvas._pfmResizeKey=null; } }catch(e){}\n  // 2026-08-19: \u4EA7\u54C1\u8BE6\u60C5\u7F13\u5B58 hd_prod_v2_<id>\uFF08\u6A21\u677F\u53E6\u6709 hd_tpl_v2_*\uFF09\u2192 \u4E8C\u6B21\u6253\u5F00\u8BBE\u8BA1\u53F0\u79D2\u5F00\u3002\n  // 2026-09-04: v2 \u952E\u540D\u4E00\u6B21\u6027\u4F5C\u5E9F\u65E7 schema \u7F13\u5B58\uFF08\u53EA\u6362\u952E\u4E0D\u5220\u6570\u636E\uFF0C\u4E0D\u78B0 hd_draft_*/hdCreatorProfile\uFF09\u3002\n  var CACHE_KEY='hd_prod_v2_'+id;\n  // \u6821\u9A8C placements \u5B8C\u6574\u6027\uFF1A\u7F3A\u5931/\u7A7A\u7684\u4EA7\u54C1\u6570\u636E\u4E0D\u8BFB\u4E0D\u5199\uFF08\u9632\u810F\u7F13\u5B58\u5BFC\u81F4 Placement \u65E0\u9009\u9879\uFF09\n  var validProduct = function(p){\n    if(!p || !p.placements || !p.variants || !p.variants.length) return false;\n    // 2026-08-19: \u52A0\u4E25\u2014\u2014\u9876\u5C42 placements \u975E\u7A7A\u4F46\u6570\u7EC4\u7A7A\u4E5F\u89C6\u4E3A\u810F\uFF08{print:[],embroidery:[]} \u4F1A\u88AB\u8BEF\u547D\u4E2D\uFF09\n    var vals = Object.values(p.placements);\n    return vals.some(function(arr){ return Array.isArray(arr) && arr.length > 0; });\n  };\n  var cached=null;\n  try{\n    var co=JSON.parse(localStorage.getItem(CACHE_KEY)||'null');\n    if(co && validProduct(co.product) && co.fetchedAt && (Date.now()-co.fetchedAt < 24*3600*1000)) cached=co.product;\n    else if(co && !validProduct(co.product)){ try{ localStorage.removeItem(CACHE_KEY); }catch(e){} } // \u6E05\u810F\u7F13\u5B58\n  }catch(e){}\n  // 2026-09-11 (\u6027\u80FD B): flat-template + printfiles\u300C\u63D0\u524D\u53D1\u51FA\u300D\u2014\u2014 \u5165\u53C2\u53EA\u6709 id + selColor\uFF0C\n  // **\u4E0D\u4F9D\u8D56** /catalog/product \u7ED3\u679C\uFF08\u539F\u6765\u5199\u5728 then() \u91CC\u4E24\u8F6E\u4E32\u884C\u3001\u767D\u7B49\u4E00\u6574\u8F6E RTT\uFF09\uFF1B\u4EC5\u672C\u5730\u6A21\u677F\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u624D\u53D1\u3002\n  var _tplP=null;\n  try{\n    var _tplKey='hd_tpl_v6_'+id+'_'+(selColor||'').replace(/[^a-z0-9]/gi,'_');\n    var _tc=JSON.parse(localStorage.getItem(_tplKey)||'null');\n    var _tcOk=false;\n    if(_tc && _tc.ts && Date.now()-_tc.ts < 6*3600*1000 && _tc.flat && _tc.pf){\n      var _fc={}; (_tc.flat.templates||[]).forEach(function(t){ if(t&&t.url&&t.placement) _fc[t.placement]=1; });\n      _tcOk=Object.keys(_fc).length>=2;\n    }\n    if(!_tcOk){\n      _tplP=Promise.all([\n        ft(B + '/catalog/product/' + id + '/flat-template?color=' + encodeURIComponent(selColor || '')),\n        ft(B + '/catalog/product/' + id + '/printfiles')\n      ]);\n    }\n  }catch(e){}\n  var p;\n  if(cached){\n    console.log('[DC] product from cache:', id);\n    p=Promise.resolve({product:cached});\n    // 2026-08-19: stale-while-revalidate \u2014 \u540E\u53F0\u9759\u9ED8\u91CD\u65B0\u62C9\u6570\u636E\u5E76 rerender\uFF08\u9632\u810F\u7F13\u5B58\u53EA\u89C1 1 chip\uFF09\n    if(!window.__hdSWR){\n      window.__hdSWR=1;\n      setTimeout(function(){\n        ft(B+'/catalog/product/'+id).then(function(r){return r.json()}).then(function(d){\n          if(d && validProduct(d.product)){\n            try{ localStorage.setItem(CACHE_KEY, JSON.stringify({product:d.product, fetchedAt:Date.now()})); }catch(e){}\n            product=d.product;\n            renderPlacements(d.product.placements||{});\n            console.log('[DC] SWR refreshed placement chips');\n          }\n        }).catch(function(){});\n      }, 300);\n    }\n  } else {\n    p=ft(B+'/catalog/product/'+id).then(function(r){return r.json()});\n    p.then(function(d){\n      if(d && validProduct(d.product)){ try{ localStorage.setItem(CACHE_KEY, JSON.stringify({product:d.product, fetchedAt:Date.now()})); }catch(e){} }\n    });\n  }\n  p.then(function(d){\n    product=d.product;\n    // 2026-08-30: \u6807\u9898\u5DF2\u5220\u9664\uFF08pfmTitle \u4E0D\u5B58\u5728\uFF09\u2014 \u65E0\u64CD\u4F5C\n\n    // C: flat-template + printfiles \u6309\u300C\u4EA7\u54C1+\u989C\u8272\u300D\u7F13\u5B58 6h \u2014\u2014 \u591A\u89D2\u5EA6\u4EA7\u54C1\u53EF\u8FBE ~600 \u6A21\u677F\uFF0C\u662F\u52A0\u8F7D\u6700\u6162\u7684\u4E00\u6BB5\u3002\n    // 2026-09-04: v2 \u952E\u540D\u4E00\u6B21\u6027\u4F5C\u5E9F\u65E7 schema \u7F13\u5B58\uFF08\u65E7\u6570\u636E\u65E0\u7248\u672C\u6821\u9A8C\uFF0C\u547D\u4E2D\u540E\u7F3A placement spec\uFF09\uFF1BTTL 24h\u21926h\u3002\n    var cacheKey='hd_tpl_v6_'+id+'_'+(selColor||'').replace(/[^a-z0-9]/gi,'_'); // 2026-09-09 v6: v5 \u7F13\u5B58\u5B58 D0/\u7EDF\u4E00\u62C9\u56FE\u524D\u6570\u636E\uFF08\u65E0 color \u2192 prodPreview \u7A7A/\u65E7\u8BED\u4E49\uFF09\u2192 \u4F5C\u5E9F\u91CD\u62C9\uFF1Bv6 \u8BED\u4E49=\u670D\u52A1\u5668\u9ED8\u8BA4\u8272 prodPreview + \u53EA\u62C9\u670D\u52A1\u5668\u56FE\n    function buildFrom(tdata,pdata){\n      var ghostUrl = tdata.url || (d.product.variantImages && Object.values(d.product.variantImages)[0]) || d.product.image || '';\n      product.allTemplates = tdata.templates || [];\n      /* 2026-10-25\uFF1A\u9884\u8BF7\u6C42\u6240\u6709 positioning \u56FE\u7684\u300C\u670D\u52A1\u7AEF cut \u7248\u300D\u2014\u2014\n         \u5207\u9762\u65F6\u6D4F\u89C8\u5668\u5DF2\u7F13\u5B58 \u21D2 \u524D\u666F\u7ACB\u5373\u663E\u793A\uFF0C\u6D88\u9664\u300C\u5207\u9762\u77AC\u95F4\u56FE\u6848\u8FD8\u76D6\u7740\u5E3D\u515C\u300D\u7684\u7A7A\u7A97\u3002 */\n      try {\n        (product.allTemplates || []).forEach(function (t) {\n          if (t && /\\/positioning\\//i.test(t.url || '')) {\n            var _pi = new Image();\n            _pi.src = B + '/image-proxy?url=' + encodeURIComponent(t.url) + '&cut=200';\n          }\n        });\n      } catch (e) {}\n      product._cachedBgUrl = tdata.backgroundUrl || '';\n      product._cachedBgColor = tdata.backgroundColor || '';\n      // 2026-09-07: \u670D\u52A1\u5668\u9884\u751F\u6210\u6210\u54C1\u56FE\uFF08prodimg/<pid>/<\u8272>__<\u9762>.png\uFF09\u2014\u2014\u5207\u9762\u4F18\u5148\u76F4\u8D34\uFF0C\u4E0D\u518D\u524D\u7AEF\u62FC host+ghost\n      product._prodPreview = tdata.prodPreview || null;\n      // 2026-09-07: DROP \u540C\u6B3E \u2014\u2014 \u62FF\u5230\u6210\u54C1\u56FE\u6620\u5C04\u540E\u4E00\u6B21\u6027\u9759\u9ED8\u9884\u52A0\u8F7D\u5168\u90E8 4 \u9762\uFF0C\u5207\u89D2\u5EA6\u53EA\u505A\u672C\u5730\u80CC\u666F\u5207\u6362\u3001\u65E0\u7F51\u7EDC\u7B49\u5F85\u3002\n      // 2026-09-09: \u9884\u8F7D URL = \u76F4\u8D34 URL\uFF08prodimg \u539F\u56FE\uFF0C\u4E0E pimg() \u4E00\u81F4\uFF09\u2192 \u5207\u9762\u5FC5\u547D\u4E2D HTTP \u7F13\u5B58\u3002\n      try {\n        if (product._prodPreview) {\n          ['front', 'back', 'sleeve_left', 'sleeve_right'].forEach(function(_f) {\n            var _u = product._prodPreview[_f];\n            if (!_u) return;\n            var _im = new Image();\n            _im.decoding = 'async';\n            _im.src = _u; // prodimg \u539F\u56FE\uFF081000px \u9759\u6001\u76F4\u8FDE\uFF09\n          });\n        }\n      } catch (e) { /* preload is best-effort */ }\n      product._colorName = tdata.requestedColor || '';\n\n      // 2026-09-11 (\u6027\u80FD D): \u6570\u636E\u4E00\u5230\u5C31\u7ACB\u523B\u63A8\u5BFC\u5C55\u793A\u53F0\u9996\u56FE\uFF0C\u4E0D\u518D\u7B49 1s \u8F6E\u8BE2\uFF08\u8F6E\u8BE2\u964D\u7EA7\u4E3A\u515C\u5E95\uFF09\u2014\u2014\n      // \u4E4B\u524D stagePreview \u7531 setInterval(1000) \u9A71\u52A8\uFF0C\u6570\u636E\u5230\u4F4D\u540E\u6700\u591A\u518D\u767D\u7B49 1 \u79D2\u3002\n      if (window.__pfmStagePreview) { try { window.__pfmStagePreview(); } catch (e) {} }\n\n      // Build a printfile lookup: printfileId \u2192 { width, height, dpi }\n      var printfileMap = {};\n      (pdata.printfiles || []).forEach(function(p){\n        printfileMap[p.printfileId] = { width: p.width, height: p.height, dpi: p.dpi };\n      });\n\n      // 2026-08-31: \u9009\u6A21\u677F\u89C4\u5219\u91CD\u5199 \u2014\u2014 \u6309\u5B98\u65B9 variant_printfiles \u7684 printfileId \u7CBE\u786E\u5339\u914D\n      // \uFF08\u4FEE\u590D 71 \u5927\u524D\u5370 front_large / 317 \u5047 hash \u6A21\u677F\u8BEF\u9009 / 307,511 zoom \u6A21\u677F\u88AB\u8FC7\u6EE4\uFF09\uFF1A\n      // \u5F53\u524D\u53D8\u4F53\u7684 placements \u2192 printfileId \u6620\u5C04\u3002\n      var vpList = (pdata.variantPrintfiles) || [];\n      var vpMap = {};\n      for (var vi = 0; vi < vpList.length; vi++) {\n        if (vpList[vi].variant_id === currentVariantId) { vpMap = vpList[vi].placements || {}; break; }\n      }\n      if (!Object.keys(vpMap).length && vpList.length) vpMap = vpList[0].placements || {};\n      // 2. \u6309 placement \u5206\u7EC4\u6A21\u677F\n      var byPlace = {};\n      (tdata.templates || []).forEach(function(t){\n        if(!t.printArea || !t.templateWidth || !t.templateHeight) return;\n        if(!byPlace[t.placement]) byPlace[t.placement] = [];\n        byPlace[t.placement].push(t);\n      });\n      // 3. \u6BCF\u7EC4\u9009\u4E00\u4E2A\uFF1A\u5B98\u65B9 printfileId \u7CBE\u786E\u5339\u914D\uFF08\u4EFB\u610F zoom\uFF09\u2192 \u975E zoom \u9762\u79EF\u6700\u5927 \u2192 \u5168 zoom \u515C\u5E95\n      printAreaSpecs = {};\n      Object.keys(byPlace).forEach(function(p){\n        var list = byPlace[p];\n        var picked = null;\n        var targetPf = vpMap[p];\n        if (targetPf) picked = list.find(function(t){ return t.printfileId === targetPf; });\n        if (!picked) {\n          var nonZoom = list.filter(function(t){ return !t.isZoomed; });\n          if (nonZoom.length) {\n            picked = nonZoom.slice().sort(function(a,b){\n              return (b.printArea.width * b.printArea.height) - (a.printArea.width * a.printArea.height);\n            })[0];\n          }\n        }\n        if (!picked) picked = list[0];\n        if (picked) {\n          var pf = printfileMap[picked.printfileId] || { width: picked.printArea.width, height: picked.printArea.height, dpi: 150 };\n          printAreaSpecs[p] = {\n            // Template-relative coords (for showing on garment image)\n            left: picked.printArea.left, top: picked.printArea.top,\n            width: picked.printArea.width, height: picked.printArea.height,\n            templateWidth: picked.templateWidth, templateHeight: picked.templateHeight,\n            printfileId: picked.printfileId,\n            isZoomed: !!picked.isZoomed,\n            // Actual print resolution (design canvas logical size)\n            printWidth: pf.width, printHeight: pf.height, printDpi: pf.dpi\n          };\n        }\n      });\n      originalPrintAreaSpecs = JSON.parse(JSON.stringify(printAreaSpecs));\n\n      // 2026-10-05(A): front_large \u5F52\u4E00\u5316\u5DF2\u4E0A\u79FB\u81F3 rerenderPlacements() \u5185\u90E8\uFF08\u552F\u4E00\u771F\u6E90\uFF09\u3002\n      // \u8FD9\u91CC\u4ECD\u8C03\u4E00\u6B21\u4EE5\u5237\u65B0 chips\uFF1B\u5F52\u4E00\u5316\u672C\u8EAB\u7531\u51FD\u6570\u5165\u53E3\u5B8C\u6210\uFF08\u5E42\u7B49\uFF1A\u5DF2\u5F52\u4E00\u5316\u540E findIndex \u8FD4\u56DE -1\uFF09\u3002\n      rerenderPlacements();\n\n      // Fallback: backend has no flat-template data for this product (e.g. not synced).\n      // Build specs from the relative printArea scaled to the ghost/variant image size.\n      if(!Object.keys(printAreaSpecs).length && d.product && d.product.printArea && ghostUrl){\n        buildFallbackSpecs(d.product.printArea, ghostUrl);\n      }\n\n      // Resize canvas to current placement's print area\n      var spec = printAreaSpecs[currentPlacement] || printAreaSpecs['front'] || Object.values(printAreaSpecs)[0];\n      if(spec) resizeCanvasToPrintArea(spec);\n\n      // 2026-09-08: \u521D\u59CB\u52A0\u8F7D\u4E0E\u5207\u9762\u4E00\u81F4 \u2014\u2014 \u6709 prodPreview \u6210\u54C1\u56FE\u5219\u5355\u5C42\u76F4\u8D34\uFF0C\u4E0D\u518D\u53E0 ghost \u7070\u6A21\uFF08\u907F\u514D\u300C\u53E0\u96FE\u300D\uFF09\u3002\n      // 2026-09-09: \u7EDF\u4E00\u300C\u53EA\u62C9\u670D\u52A1\u5668\u56FE\u300D\u2014\u2014 \u65E0\u670D\u52A1\u5668\u6210\u54C1\u5219\u663E\u793A\u5360\u4F4D\uFF0C\u4E0D\u518D\u524D\u7AEF\u62FC\u5C42\uFF08hex+ghost \u5BF9\u586B\u8272\u6A21\u677F\u8BED\u4E49\u9519\u8BEF\uFF0C\n      // 71 \u767D T \u4F1A\u53D8\u9ED1\uFF1B\u5B98\u65B9\u62FC\u5C42\u662F\u670D\u52A1\u7AEF\u804C\u8D23\uFF09\u3002\n      var _ppInit = product._prodPreview && product._prodPreview[currentPlacement || 'front'];\n      if (_ppInit) loadProductBackground('', _ppInit, '#ffffff');\n      else showProdPlaceholder();\n\n      /* 2026-10-14\uFF1A\u6210\u529F\u8DEF\u5F84\u6539\u8D70\u300C\u5C31\u7EEA\u95E8\u300D\u2014\u2014 \u7B49\u5404\u89D2\u5EA6\u56FE/\u753B\u5E03\u56FE\u7247\u771F\u6B63\u52A0\u8F7D\u5B8C\u624D\u6536\u8D77\u52A0\u8F7D\u63D0\u793A */\n      hideLoadingWhenImagesReady();\n      _pfmShotsSeed();     /* 2026-10-14\uFF08\u7F13\u5B58\uFF09\uFF1A\u5148\u7528\u672C\u5730\u7F13\u5B58\u56DE\u586B\u5185\u5B58\uFF0C\u518D\u9884\u8F7D */\n      pfmDrainPreload();   /* 2026-10-14\uFF1A\u4EA7\u54C1\u5C31\u7EEA \u21D2 \u7ACB\u523B\u6D88\u8D39\u300C\u89C4\u683C\u5361\u961F\u5217\u91CC\u90A3\u51E0\u884C\u8272\u300D\u7684\u9884\u52A0\u8F7D */\n\n    }\n    // 2026-09-04: \u7F13\u5B58\u81EA\u6108 \u2014\u2014 \u547D\u4E2D\u540E buildFrom \u89E3\u6790\u629B\u9519\uFF08\u810F\u6570\u636E/\u7ED3\u6784\u4E0D\u517C\u5BB9\uFF09\u65F6\u5220\u952E\u5E76\u56DE\u843D\u7F51\u7EDC\u91CD\u62C9\uFF0C\n    // \u4E0D\u518D\u88AB\u5916\u5C42\u7A7A catch \u9759\u9ED8\u541E\u6389\uFF08\u66FE\u5BFC\u81F4\u5207\u89D2\u5EA6\u5931\u6548\u800C\u65E0\u75D5\u6B63\u5E38\uFF09\u3002\n    try{\n      var cached=JSON.parse(localStorage.getItem(cacheKey));\n      // 2026-09-04 \u6839\u6CBB\uFF1A\u7ED3\u6784\u6821\u9A8C \u2014\u2014 templates \u987B\u4E3A\u6570\u7EC4\u3001\u81F3\u5C11\u542B 2 \u79CD placement\uFF08front/back\uFF09\u3001\u6BCF\u9879\u6709 url\uFF1B\n      // \u5426\u5219\u5F53\u810F\u7F13\u5B58\u4E22\u5F03\u91CD\u62C9\uFF08\u675C\u7EDD\u300C\u9AD8\u4EAE\u4F46\u56FE\u4E0D\u53D8\u300D\uFF09\u3002\n      var _flatOk = cached && cached.flat && Array.isArray(cached.flat.templates) && cached.flat.templates.length > 0;\n      if(_flatOk){\n        var _faces={};\n        cached.flat.templates.forEach(function(t){ if(t && t.url && t.placement) _faces[t.placement]=1; });\n        _flatOk = Object.keys(_faces).length >= 2;\n      }\n      var _tplHit = false;\n      if(cached && cached.ts && Date.now()-cached.ts < 6*3600*1000 && cached.flat && cached.pf && _flatOk){\n        console.log('[loadProduct] using cached templates:', id, selColor);\n        try{ buildFrom(cached.flat, cached.pf); }\n        catch(e){\n          console.warn('[loadProduct] cached templates unusable \u2014 clearing & refetching:', e && e.message);\n          try{ localStorage.removeItem(cacheKey); }catch(_){}\n          cached=null; // fallthrough \u2192 network reload below\n        }\n        /* \uD83D\uDD34\uD83D\uDD34 2026-10-12 \u620A\uFF1A\u539F\u6765\u8FD9\u91CC\u662F `if(cached) return;` \u2014\u2014 \u547D\u4E2D\u6A21\u677F\u7F13\u5B58\u5C31**\u76F4\u63A5 return**\uFF0C\n           \u628A\u672C\u56DE\u8C03\u4E0B\u534A\u6BB5\u7684 currentTech / currentVariantId / renderPlacements **\u6574\u6BB5\u8DF3\u8FC7**\u3002\n           \u540E\u679C\uFF1AcurrentVariantId \u6052\u4E3A null \u21D2 \u51FA\u56FE payload \u9001 catalogVariantId:null \u21D2\n           \u670D\u52A1\u7AEF\u53EA\u80FD\u56DE\u9000\u300C\u8BE5\u4EA7\u54C1\u7B2C\u4E00\u4E2A\u989C\u8272\u300D\u21D2 **\u9009\u767D\u51FA\u9ED1**\uFF08\u7B2C\u4E00\u6B21\u8FDB\u65E0\u7F13\u5B58\u662F\u5BF9\u7684\uFF0C\u4E4B\u540E\u5FC5\u9519\uFF09\u3002\n           \u6539\u4E3A\u6253\u6807\u8BB0\u7EE7\u7EED\u5F80\u4E0B\u8D70\uFF08\u4EC5\u7F51\u7EDC\u6BB5\u8DF3\u8FC7\uFF09\uFF0C\u4E0B\u9762\u7684\u8D4B\u503C\u4E00\u5F8B\u6267\u884C\u3002 */\n        if(cached){ _tplHit = true; }\n      }\n    }catch(e){ console.warn('[loadProduct] template cache read error:', e && e.message); }\n\n    // \u5E76\u884C\u52A0\u8F7D flat-lay \u6A21\u677F + \u5B9E\u9645 printfile \u5C3A\u5BF8\u3002\n    // 2026-09-11 (\u6027\u80FD B): \u4F18\u5148\u590D\u7528\u5165\u53E3\u5904\u5DF2\u300C\u63D0\u524D\u53D1\u51FA\u300D\u7684 _tplP\uFF08\u4E0E /catalog/product \u5E76\u884C\uFF09\uFF1B\n    // \u4EC5\u7F13\u5B58\u672A\u547D\u4E2D\u56DE\u9000\u5230\u7F51\u7EDC\u65F6\u624D\u73B0\u53D1\u4E00\u6B21\u3002\n    if(!_tplHit) (_tplP || Promise.all([\n      ft(B + '/catalog/product/' + id + '/flat-template?color=' + encodeURIComponent(selColor || '')),\n      ft(B + '/catalog/product/' + id + '/printfiles')\n    ])).then(function(responses){\n      return Promise.all(responses.map(function(r){return r.json()}));\n    }).then(function(arr){\n      var tdata = arr[0] || {};\n      var pdata = arr[1] || {};\n      try{ localStorage.setItem(cacheKey, JSON.stringify({ts:Date.now(), flat:tdata, pf:pdata})); }catch(e){}\n      buildFrom(tdata, pdata);\n    }).catch(function(e){\n      console.error('[loadProduct] template/printfiles failed:', e);\n      q('pfmCanvasInner').style.backgroundImage='none';\n      q('pfmCanvasInner').style.backgroundColor='#fff';\n      hideLoading();\n    });\n\n    // 2026-08-25: technique \u8DDF\u968F\u4EA7\u54C1\u5B9E\u9645\u652F\u6301\u7684\u6280\u672F\uFF08\u6709 DTFlex/DTFILM \u4F18\u5148\uFF0C\u5426\u5219\u53D6\u4EA7\u54C1\u7B2C\u4E00\u9879\uFF09\u3002\n    // 2026-08-29: \u8BBE\u8BA1\u94FE\u8DEF\u4E0D\u505A\u523A\u7EE3 \u2014\u2014 \u8FC7\u6EE4\u523A\u7EE3\u7CFB\u6280\u672F\uFF08Embroidery/Knitwear/Patch\uFF09\uFF0C\u53EA\u7559\u5370\u82B1\u3002\n    var techList = (d.product.techniques || []).filter(function(t){\n      var k = String((t && (t.key || t.name)) || '').toUpperCase();\n      return !(k.indexOf('EMBROIDERY') >= 0 || k.indexOf('KNITWEAR') >= 0);\n    });\n    currentTech = (techList.find(function(t){ return String(t.key||'').toUpperCase() === 'DTFILM'; }) || techList[0] || { key: 'DTG' }).key;\n    if (!techList.length) console.warn('[loadProduct] product only supports embroidery \u2014 design disabled (kept DTG fallback)');\n    console.log('[loadProduct] technique:', currentTech);\n    /* 2026-10-21 (B): \u6280\u672F\u552F\u4E00\u771F\u6E90 = \u540E\u7AEF\u6837\u673A\u8868\uFF08DTF \u4F18\u5148 DTG \u515C\u5E95\uFF0C\u6BCF\u65E5\u5237\u65B0\uFF09\u3002\n       \u8986\u76D6\u4E0A\u9762\u300C\u751F\u4EA7\u8868\u300D\u5224\u65AD\uFF0C\u4FDD\u8BC1 \u8BE6\u60C5\u9875/\u8BBE\u8BA1\u53F0/\u753B\u677F/\u751F\u56FE/\u8865\u56FE \u4E94\u5C42\u4E00\u81F4\u3002 */\n    try {\n      fetch(B + '/catalog/product/' + pid + '/technique').then(function(r){ return r.json(); }).then(function(dd){\n        if (dd && dd.success && dd.technique) { currentTech = dd.technique; console.log('[loadProduct] technique(\u6837\u673A\u8868):', currentTech); }\n      }).catch(function(){});\n    } catch (e) {}\n    var variants = d.product.variants || [];\n    // 2026-09-01: color= may be a full name -> match by name first, then color_code.\n    var selKey = String(selColor || '').toLowerCase();\n    var sizeKey = String(selSize || '').trim().toLowerCase();\n    function _vc(v){ return (v.color && String(v.color).toLowerCase()===selKey) || (v.color_code && String(v.color_code).toLowerCase()===selKey); }\n    function _vs(v){ return !sizeKey || String(v.size || '').trim().toLowerCase()===sizeKey; }\n    /* \u2500\u2500 2026-10-13: \u8272/\u7801\u5F3A\u5173\u8054\u4FEE\u590D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n       \u6539\u524D\u5339\u914D\u94FE\u300C\u8272+\u7801 \u2192 \u53EA\u6309\u8272 \u2192 \u53EA\u6309\u7801\u300D**\u4F1A\u8DE8\u8272\u53D6\u53D8\u4F53**\uFF0C\u800C product._colorName \u4ECD\u662F\n       \u9ED8\u8BA4\u8272 \u21D2 \u300C\u7801\u53D6\u81EA A \u8272\u3001\u8272\u540D\u662F B \u8272\u300D\u21D2 \u7ED3\u8D26\u6309 (\u8272\u540D, \u7801) \u67E5 list.variants \u67E5\u4E0D\u5230\uFF0C\n       \u62A5 \"<\u8272> is not available in size <\u7801>\"\u3002\u73B0\u5728**\u7EDD\u4E0D\u8DE8\u8272**\uFF1A\u2460 \u76EE\u6807\u8272\u5185\u7CBE\u786E\u547D\u4E2D\uFF1B\n       \u2461 \u8BE5\u8272\u6CA1\u6709\u8BE5\u7801 \u21D2 \u56DE\u9000\u5230\u8BE5\u8272\u7B2C\u4E00\u4E2A\u53EF\u7528\u7801\u5E76\u540C\u6B65\u6539\u5199 selSize\uFF08\u63D0\u793A\u7528\u6237\uFF09\uFF1B\n       \u2462 \u8FDE\u8272\u90FD\u5BF9\u4E0D\u4E0A \u21D2 \u8DDF\u968F\u7B2C\u4E00\u4E2A\u53D8\u4F53\u5E76\u628A _colorName \u540C\u6B65\u6210\u5B83\u7684\u8272\u540D\uFF08\u4FDD\u8BC1\u4E09\u8005\u4E00\u81F4\uFF09\u3002 */\n    var matched = variants.find(function(v){ return _vc(v) && _vs(v); });\n    var _szWanted = String(selSize || '').trim(), _szFix = '';\n    if (!matched) {\n      var _nm0 = String(product._colorName || '').trim().toLowerCase();\n      var _bucket = selKey ? variants.filter(_vc)\n        : (_nm0 ? variants.filter(function(v){\n            return String(v.color || '').trim().toLowerCase() === _nm0\n                || String(v.color_code || '').trim().toLowerCase() === _nm0;\n          }) : variants);\n      if (!_bucket.length) _bucket = variants;\n      matched = _bucket[0];\n      if (matched) {\n        var _sz0 = String(matched.size || '').trim();\n        if (_sz0 && _sz0.toLowerCase() !== sizeKey) { if (sizeKey) _szFix = _sz0; selSize = _sz0; }\n      }\n    }\n    currentVariantId = matched ? matched.variant_id : (variants[0] && variants[0].variant_id) || pid;\n    /* 2026-10-23\uFF08\u7532\uFF09\uFF1A\u53D8\u4F53\u5339\u914D\u53EA\u5B9A currentVariantId\uFF0C**\u4E0D\u5F97\u8986\u76D6**\u5DF2\u4ECE flat-template \u62FF\u5230\u7684\u6B63\u786E\u8272\u540D\u3002\n       \u6839\u56E0\uFF1AURL \u65E0 color \u53C2\u6570\u65F6 selKey='' \u21D2 \u515C\u5E95\u53D6\u300C\u7B2C\u4E00\u4E2A\u53D8\u4F53\u300D\uFF08\u53EF\u80FD\u662F Jet Black/Fire Red\uFF09\uFF0C\n       \u8986\u76D6\u6389 @1799 \u7684 requestedColor\uFF08Jet Black/Arctic White\uFF09\u21D2 \u5207\u80CC\u9762/\u4FA7\u9762\u8865\u62C9\u7528\u9519\u8272\u540D \u21D2 \u9ED1\u8896\u7EA2\u8EAB\u3002 */\n    if (!product._colorName && matched && matched.color) product._colorName = String(matched.color);\n    if (_szFix) {\n      console.log('[loadProduct] size adjusted:', _szWanted, '->', _szFix);\n      try { showToast('Size ' + _szWanted + ' is not offered in this color - switched to ' + _szFix + '.', 'warn'); } catch (e) {}\n    }\n    console.log('[loadProduct] selected variant:', currentVariantId, 'color:', selColor, 'size:', selSize);\n    /* 2026-10-14\uFF1A\u539F\u6765\u5728\u8FD9\u91CC\u5F80\u9762\u677F\u4E0A\u5199\u4E00\u884C\u5C0F\u5B57\u300CDesigning: \u8272 / \u7801\u300D\u2014\u2014\n       \u73B0\u6539\u4E3A**\u53EA\u6302\u6570\u636E**\uFF08window.__dsPick\uFF09\uFF0CUI \u7531\u5916\u7F6E assets/hd-team-combos.js \u7EDF\u4E00\u6E32\u67D3\u6210\u89C4\u683C\u5361\u3002 */\n    try{\n      var _cn=product._colorName || (matched && matched.color) || '';\n      var _hex='';\n      try{\n        for(var _vi=0;_vi<variants.length;_vi++){\n          if(String(variants[_vi].color||'')===String(_cn)){ _hex=String(variants[_vi].color_code||''); break; }\n        }\n      }catch(e2){}\n      window.__dsPick = { color:_cn, size:selSize||'', hex:_hex };\n      window.__dsVariants = variants;   /* 2026-10-14\uFF1A\u6362\u9884\u89C8\u8272\u65F6\u6309\u300C\u8272\u540D+\u7801\u300D\u91CD\u5339\u914D\u53D8\u4F53\uFF08\u89C1 __hdSwapColor\uFF09 */\n    }catch(e){}\n    renderPlacements(d.product.placements||{});\n  }).catch(function(e){\n    console.error('[loadProduct] product load failed:', e);\n    hideLoading();\n    // 2026-08-19: \u4EA7\u54C1\u52A0\u8F7D\u5931\u8D25\u515C\u5E95\u2014\u2014\u9875\u9762\u4E0D\u80FD\u663E\u793A\"\u5B8C\u6210\"\u4F46 Placement \u7A7A\u767D\u3002\n    // \u2460 \u4ECD\u6E32\u67D3\u9ED8\u8BA4 Placement UI\uFF08Front chip\uFF09\u2461 2s \u540E\u81EA\u52A8\u91CD\u8BD5\u4E00\u6B21\n    try{ rerenderPlacements(); }catch(e2){ console.error('[loadProduct] fallback placements err', e2 && e2.message); }\n    if(!window.__hdProdRetried){\n      window.__hdProdRetried = 1;\n      setTimeout(function(){ window.__hdProdRetried = 0; loadProduct(id); }, 2000);\n    }\n  });\n}\n// 2026-08-31: \u79FB\u9664\u811A\u672C\u4E3B\u4F53\u91CC\u76F4\u63A5\u8C03\u7528 loadProduct \u2014\u2014 \u4E0E DOMContentLoaded \u53CC\u89E6\u53D1\uFF0C/catalog/product \u8BF7\u6C42 \u00D72\n// \uFF08\u7011\u5E03\u5B9E\u6D4B 1.1s+1.4s\uFF09\u3002\u53EA\u4FDD\u7559 DOMContentLoaded \u5355\u4E00\u8C03\u7528\u70B9\u3002\n\nvar allPlacements={print:[],embroidery:[]};\nfunction renderPlacements(pl){allPlacements=pl||{print:[],embroidery:[]};rerenderPlacements()}\nfunction rerenderPlacements(){\n  try {\n  // 2026-08-29: \u8BBE\u8BA1\u94FE\u8DEF\u4E0D\u505A\u523A\u7EE3 \u2014 placement \u53EA\u53D6 print \u7EC4\uFF0C\u4E0D\u518D\u56DE\u9000 embroidery\n  var key='print';\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-05(A): front_large \u5F52\u4E00\u5316 \u2014\u2014 **\u552F\u4E00\u771F\u6E90**\u3002\n     \u539F\u5B9E\u73B0\u6563\u5728 buildFrom() \u7684\u7F51\u7EDC\u5206\u652F\u91CC\uFF0C\u4F1A\u88AB\u968F\u540E\u7684 renderPlacements() \u7528**\u539F\u59CB** placements\n     \u8986\u76D6 \u21D2 currentPlacement \u4ECE front_large \u9000\u56DE front\uFF08\u5B9E\u6D4B\u65F6\u5E8F\uFF1At=1754ms front_large \u2192\n     t=2153ms front\uFF09\u3002\u800C /designs/doc \u7684\u5DE5\u7A0B key \u5C31\u662F front_large \u21D2 \u6062\u590D\u65F6\u6309 front \u53D6\u69FD\u53EA\u5F97\u7A7A\u69FD\n     \u21D2 \u753B\u5E03\u6062\u590D\u6210\u7A7A\u3002\u653E\u5728\u51FD\u6570\u5165\u53E3\uFF0C\u4EFB\u4F55\u8C03\u7528\u8005\u3001\u4EFB\u4F55\u65F6\u5E8F\u90FD\u5F52\u4E00\u5316\u3002 */\n  if (printAreaSpecs['front_large'] && Array.isArray(allPlacements['print'])) {\n    var _fi = allPlacements['print'].findIndex(function(g){ return g && g.type === 'front'; });\n    if (_fi !== -1) allPlacements['print'][_fi] = { name: 'Front', type: 'front_large' };\n  }\n  var items=allPlacements[key]||[];\n  if(!Array.isArray(items)) items=[];\n  // 2026-09-11: chips \u53EA\u6E32\u67D3\u300Cprodimg \u771F\u6709\u56FE\u300D\u7684\u9762\uFF08\u5B98\u65B9\u6709\u8BE5 placement \u4F46\u6210\u54C1\u56FE\u672A\u751F\u6210\u7684\u9762\uFF0C\u70B9\u8FDB\u53BB\u53EA\u4F1A\u663E\u793A\u5360\u4F4D\uFF09\u3002\n  // \u4EC5\u5728 _prodPreview \u5DF2\u5C31\u7EEA\uFF08\u6709\u952E\uFF09\u65F6\u8FC7\u6EE4\uFF1B\u672A\u5C31\u7EEA\uFF08\u65B0\u54C1\u521A\u4E0A\u67B6\u5F85\u751F\u6210\uFF09\u4FDD\u6301\u539F\u6837\uFF0C\u907F\u514D\u4E00\u4E2A chip \u90FD\u6CA1\u6709\u3002\n  try{\n    if(product && product._prodPreview && Object.keys(product._prodPreview).length){\n      var _pv=product._prodPreview;\n      var _ok=items.filter(function(p){\n        var t=String((p&&p.type)||'');\n        return !!(_pv[t] || _pv[t.replace(/_large$/,'')]);\n      });\n      if(_ok.length && _ok.length<items.length){\n        console.log('[placements] hidden (no preview):', items.filter(function(p){return _ok.indexOf(p)===-1}).map(function(p){return p&&p.type}).join(','));\n        items=_ok;\n      }\n    }\n  }catch(e){}\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-06\uFF1A**\u4E0D\u8986\u76D6\u7528\u6237\u5DF2\u9009\u9762**\u3002\n     \u6839\u56E0\uFF1A\u672C\u51FD\u6570\u5728 buildFrom()\uFF08\u6362\u8272/\u6362\u6B3E\uFF09\u4E0E renderPlacements()\uFF08\u4EA7\u54C1\u8F7D\u5165\uFF09\u65F6\u90FD\u4F1A\u8DD1\uFF0C\n     \u539F\u5B9E\u73B0\u65E0\u6761\u4EF6\u628A currentPlacement \u91CD\u7F6E\u4E3A\u9996 chip\uFF08= front_large\uFF09\u21D2 \u7528\u6237\u5728\u67D0\u9762\u753B\u5B8C\u3001\u6362\u4E86\u989C\u8272\uFF0C\n     \u5F53\u524D\u9762\u4F1A**\u6084\u6084\u8DF3\u56DE** front_large\uFF0C\u800C\u753B\u5E03\u5185\u5BB9\u4ECD\u662F\u90A3\u4E00\u9762\u7684 \u21D2 \u5BFC\u51FA\u65F6\u6309\u9519\u9762\u7684\u6253\u5370\u533A\u77E9\u5F62\u88C1\u526A\n     \u21D2 \u5168\u900F\u660E\u7A7A\u56FE\uFF08\u5B9E\u6D4B\u4E24\u6B21\uFF1A\u975E\u900F\u660E\u50CF\u7D20 0.00%\uFF09\u3002\n     \u4FDD\u7559\u539F\u8BED\u4E49\uFF1A\u4EC5\u5F53 currentPlacement \u4E0D\u662F\u672C\u4EA7\u54C1\u7684\u5408\u6CD5\u9762\u65F6\u624D\u843D\u5230\u9996 chip\u3002\n     \u9996\u5C4F currentPlacement \u521D\u503C 'front' \u4E0D\u5728 items \u91CC\uFF08items \u9996\u9879\u5DF2\u5F52\u4E00\u5316\u4E3A front_large\uFF09\n     \u21D2 \u4ECD\u843D front_large\uFF0C\u884C\u4E3A\u4E0E\u6539\u524D\u4E00\u81F4\uFF08\u96F6\u56DE\u5F52\uFF09\u3002 */\n  var _hasCur=false;\n  for(var _ci=0;_ci<items.length;_ci++){ if(items[_ci]&&items[_ci].type===currentPlacement){ _hasCur=true; break; } }\n  if(!_hasCur) currentPlacement=(items[0]&&items[0].type)?items[0].type:'front';\n  // If we still have zero placements, show a default single chip so the user can\n  // always see the placement UI (avoids the \"blank Placement section\" symptom).\n  if(!items.length){\n    items=[{name:'Front',type:'front'}];\n  }\n  q('pfmPlacementSection').style.display=(items.length<1?'none':'block');\n  if(items.length<1){drawGrid();return}\n  q('pfmPlacements').innerHTML=items.map(function(p,i){\n    var label=((p&&p.name)||(p&&p.type)||'front').replace(/_/g,' ').replace(/dtf|dtg|embroidery/gi,'').trim().replace(/\\b\\w/g,function(c){return c.toUpperCase()});\n    /* 2026-10-06\uFF1A\u9AD8\u4EAE\u8DDF\u968F currentPlacement\uFF08\u539F\u6765\u5199\u6B7B i===0 \u21D2 \u4FDD\u7559\u5DF2\u9009\u9762\u540E\u4F1A\u51FA\u73B0\u300C\u9009\u4E2D\u80CC\u9762\u4F46\u6B63\u9762\u9AD8\u4EAE\u300D\uFF09 */\n    var _pt=((p&&p.type)||'front');\n    return'<div class=\"pfm-chip'+(_pt===currentPlacement?' sel':'')+'\" data-p=\"'+_pt+'\">'+label+'</div>';\n  }).join('');\n  /* 2026-10-06: \u7ACB\u5373\u628A\u9762 chip \u540C\u6B65\u5230\u53F3\u680F View \u884C\uFF08#pfmStageFaces\uFF09\u3002\n     \u539F\u5B9E\u73B0\u53EA\u9760 1 \u79D2\u8F6E\u8BE2\uFF08_pvIv\uFF0C\u8DD1 15 \u6B21\u81EA\u505C\uFF09\u21D2 \u5B9E\u6D4B #pfmPlacements \u5728 2110ms \u5DF2\u6709 4 \u9762\u6570\u636E\uFF0C\n     \u53F3\u680F\u5374\u7B49\u5230 3020ms\uFF08\u7B2C 3 \u4E2A tick\uFF09\u624D\u8DDF\u4E0A\uFF0C\u767D\u7B49 910ms\u3002\u5B88\u536B\u5F0F\u8C03\u7528\uFF1A\u672A\u5C31\u7EEA/\u62A5\u9519\u90FD\u4E0D\u5F71\u54CD\u672C\u51FD\u6570\u3002 */\n  /* 2026-10-12: \u4E0A\u9762\u7684 innerHTML \u91CD\u5EFA\u628A .pfm-pdot \u4E00\u5E76\u62B9\u6389\u4E86 \u21D2 \u5148\u8865\u7EA2\u70B9\uFF08\u5176\u5185\u90E8\u4F1A\u518D\u540C\u6B65\u53F3\u680F\uFF09\u3002 */\n  try{ updatePlacementDots(); }catch(_){}\n  try{ if(window.__pfmSyncStageChips) window.__pfmSyncStageChips(); }catch(_){}\n  } catch(err){\n    console.error('[rerenderPlacements] error:', err && err.message);\n    // Never let placement render break the rest of the design lab.\n    try{ q('pfmPlacements').innerHTML='<div class=\"pfm-chip sel\" data-p=\"front\">Front</div>'; }catch(_){}\n  }\n  q('pfmPlacements').onclick=function(e){\n    /* 2026-10-12: \u6D4F\u89C8\u5668\u7FFB\u8BD1\u4F1A\u628A chip \u6587\u672C\u5305\u8FDB <font> \u21D2 \u547D\u4E2D\u76EE\u6807\u662F <font>\uFF0C\n       \u6B64\u5904\u76F4\u8BFB classList \u4F1A\u9759\u9ED8 return\uFF08\u75C7\u72B6=\u5207\u9762\u70B9\u4E0D\u52A8 / \u70B9\u81EA\u5DF1\u7684\u7EA2\u70B9\u4E5F\u5931\u6548\uFF09\u3002\n       \u6539\u7528 closest() \u2014\u2014 \u5B83\u80FD\u7A7F\u8FC7 <font>\u3002 */\n    var _c=(e.target&&e.target.closest)?e.target.closest('.pfm-chip'):null;if(!_c)return;\n    console.log('[switch] tap=', _c.dataset.p, '| cur=', currentPlacement, '| allTpl=', product && product.allTemplates ? product.allTemplates.length : 'n/a');\n    try {\n      var target=_c.dataset.p;\n      if(target===currentPlacement)return;\n      // \u5207\u9762\u79BB\u5F00\u524D\u5148\u5B58\u5F53\u524D\u9762\u7684 art\u3002\u5FEB\u7167\u5FC5\u987B\u5265\u6389 grid + isPreview \u77AC\u6001\u5C42\uFF08drawGrid \u4F1A\u91CD\u52A0\u3001\u9884\u89C8\u5C42\u4F1A\u6B8B\u7559\uFF09\u3002\n      // NOTE: canvas.toJSON() \u5DF2\u8FD4\u56DE\u5BF9\u8C61\u800C\u975E\u5B57\u7B26\u4E32 \u2014\u2014 \u4E0D\u8981\u518D JSON.parse\u3002\n      var snap = stripTransientObjects(canvas.toJSON());\n      // hasArt must be computed from the snapshot being saved (not carried over) \u2014\n      // otherwise a face whose art was cleared keeps its dot lit (\"red dot but empty canvas\").\n      var snapHasArt = !!(snap && Array.isArray(snap.objects) && snap.objects.length);\n      placementArt[currentPlacement]={ json: JSON.stringify(snap), hasArt: snapHasArt, thumb: makeCanvasThumb(canvas) };\n      this.querySelectorAll('.pfm-chip').forEach(function(s){s.classList.remove('sel')});_c.classList.add('sel');\n      // CRITICAL: \u5FC5\u987B**\u5148\u6E05\u753B\u5E03**\u518D\u66F4\u65B0 currentPlacement \u2014\u2014 resizeCanvasToPrintArea \u4F1A\u8C03 drawGrid()\uFF0C\n      // \u89E6\u53D1 object:added\uFF1B\u82E5 currentPlacement \u5DF2\u662F\u65B0\u9762\uFF0CmarkPlacementArt() \u4F1A\u628A\u65E7\u9762 art \u5B58\u5230\u65B0\u9762\u952E\u4E0B\uFF0C\u5BF9\u8C61\u8DE8\u9762\u6CC4\u6F0F\u3002\n      canvas.clear();\n      currentPlacement=target;\n      // Resize canvas so the restored art is scaled to the new print area.\n      var spec = printAreaSpecs[currentPlacement];\n      if(spec) resizeCanvasToPrintArea(spec);\n      else {\n        /* 2026-10-14: \u8BE5\u9762\u6CA1\u6709\u6253\u5370\u533A\u89C4\u683C \u21D2 **\u4E0D\u8BB8\u9759\u9ED8\u6CBF\u7528\u4E0A\u4E00\u9762\u7684\u6846**\uFF08\u6846\u4F1A\u753B\u5728\u9519\u4F4D\u7F6E\u3001\u88C1\u526A\u4E0E\u8D8A\u754C\u5224\u65AD\u4E5F\u5168\u9519\uFF09\u3002\n           \u660E\u786E\"\u4E0D\u53EF\u7528\"\uFF1A\u6E05\u5370\u533A/\u88C1\u526A/\u6846 + \u6BCF\u9762\u53EA\u63D0\u793A\u4E00\u6B21\u3002\u5BFC\u51FA\u8BE5\u9762\u4F1A\u663E\u5F0F\u5931\u8D25\u3002 */\n        try{\n          canvas._pfmPrintArea=null; pfmApplyClip(); drawGrid();\n          if(!_pfmNoSpecWarned[currentPlacement]){ _pfmNoSpecWarned[currentPlacement]=1; hdcoToast('This side has no print area yet &mdash; pick another side.'); }\n          console.warn('[pfm] no printArea spec for placement:', currentPlacement);\n        }catch(e){}\n      }\n      // Now restore the target face's art (or draw a fresh grid if it has none yet)\n      var saved=placementArt[currentPlacement]&&placementArt[currentPlacement].json;\n      // B: \u53CC\u7F13\u51B2 \u2014\u2014 \u5148\u77AC\u65F6\u663E\u793A\u8BE5\u9762\u7F13\u5B58\u7684\u4F4D\u56FE\uFF08\u4E0D\u7B49\u91CD\u5EFA\uFF09\uFF0C\u8FD8\u539F\u5B8C fabric \u5BF9\u8C61\u540E\u518D\u6362\u4E0A\uFF1B\n      // \u65E0\u7F13\u5B58\u7F29\u7565\u56FE\u65F6\u9000\u56DE grid-only \u5360\u4F4D\u3002\n      var thumb=placementArt[currentPlacement]&&placementArt[currentPlacement].thumb;\n      var overlay=q('pfmCanvasThumb');\n      if(thumb && overlay){\n        overlay.style.backgroundImage='url('+thumb+')';\n        overlay.style.display='block';\n      } else if(overlay){\n        overlay.style.display='none';\n      }\n      var doneOverlay=function(){ if(overlay) overlay.style.display='none'; };\n      if(saved){\n        try {\n          // \u7528 fabric.util.enlivenObjects \u53D6\u4EE3 loadFromJSON \u2014\u2014 loadFromJSON \u4F1A\u5148\u6E05\u753B\u5E03\u3001\u52A0\u8F7D\u540E\u6025\u5207\u91CD\u6E32\u67D3\uFF1B\n          // \u4E00\u6B21\u6027 enliven + \u6279\u91CF add + \u5355\u6B21 renderAll \u662F fabric \u63A8\u8350\u7684\u8FD8\u539F\u5FEB\u8DEF\u5F84\u3002\n          var savedObj=JSON.parse(saved);\n          fabric.util.enlivenObjects(savedObj.objects||[], function(objects){\n            canvas.add.apply(canvas, objects);\n            // Strip any grid / preview object that may have come from a pre-filter\n            // save (older sessions) \u2014 guarantees the face is fully clean.\n            canvas.getObjects().forEach(function(o){ if(o.isGrid || o.isPreview) canvas.remove(o); });\n            canvas.getObjects().forEach(function(o){ if(!o.isGrid && !o.isPreview) applyControlStyle(o); });\n            // Pull fully-off-canvas art back into view (placement-switch coordinate drift fix)\n            normalizeOffcanvasObjects();\n            // Add the print-area grid AFTER art is restored so it sits on top exactly once.\n            drawGrid();\n            canvas.renderAll(); updateLayers();\n            doneOverlay();\n            // Delayed check \u2014 fabric layout may still settle; avoids false positives.\n            scheduleBounds();\n            // DIAG: log what actually ended up on the canvas after a restore.\n            console.log('[switch] restored objects:', canvas.getObjects().map(function(o){\n              return {t:o.type, g:!!o.isGrid, v:o.visible, l:Math.round(o.left), tp:Math.round(o.top), w:Math.round((o.width||0)*(o.scaleX||1)), h:Math.round((o.height||0)*(o.scaleY||1))};\n            }));\n          });\n        } catch(err){\n          console.error('[switchPlacement] restore failed:', err);\n          canvas.clear();\n          drawGrid();\n          canvas.renderAll(); updateLayers(); scheduleBounds();\n          doneOverlay();\n        }\n      } else {\n        // Fresh empty face: resizeCanvasToPrintArea already drew the grid, but draw again\n        // for safety when spec is missing.\n        drawGrid();\n        canvas.renderAll(); updateLayers(); scheduleBounds();\n        doneOverlay();\n      }\n      // 2026-09-04: \u62BD\u4E3A switchFaceBg()\uFF1BallTemplates \u7F3A\u5931\uFF08\u52A0\u8F7D\u7ADE\u6001/\u65E7\u7F13\u5B58\u7F3A\u5B57\u6BB5\uFF09\u65F6\u81EA\u52A8\u8865\u62C9\u4E00\u6B21\n      // flat-template \u518D\u91CD\u8BD5\uFF0C\u675C\u7EDD\u300Cchip \u9AD8\u4EAE\u4F46\u8863\u670D\u56FE\u4E0D\u53D8\u300D\u3002\n      switchFaceBg(currentPlacement);\n      updatePlacementDots();\n    } catch(err){\n      console.error('[switchPlacement] error:', err);\n      if(canvas){ canvas.renderAll(); }\n      try { drawGrid(); } catch(e2) {}\n    }\n  };\n  drawGrid();\n}\n\n// ===== 2026-09-04: \u5207\u9762\u80CC\u666F\u5207\u6362\uFF08\u542B allTemplates \u7F3A\u5931\u81EA\u6108\uFF09=====\n// 2026-09-09: \u7EDF\u4E00\"\u53EA\u62C9\u670D\u52A1\u5668\u56FE\" \u2014 \u65E0\u670D\u52A1\u5668\u6210\u54C1\u65F6\u7684\u5360\u4F4D\uFF08\u4E0D\u518D\u524D\u7AEF\u62FC\u5C42\u515C\u5E95\uFF09\nfunction showProdPlaceholder(){\n  try{\n    var host = q('pfmZoomLayer') || q('pfmCanvasInner');\n    var bg = q('pfmProductBg');\n    if(host){ host.style.backgroundImage='none'; host.style.backgroundColor='#e9ebee'; }\n    if(bg){ bg.style.backgroundImage='none'; }\n    var loadEl = q('pfmLoading');\n    if(loadEl){\n      var tx = loadEl.querySelector('.pfm-loading-text') || loadEl;\n      // 2026-09-11: \u6587\u6848\u7EA0\u6B63 \u2014\u2014 \u65E7\u6587\u6848\u300C\u8BF7\u7A0D\u540E\u5237\u65B0\u67E5\u770B\u300D\u4F1A\u8BA9\u4EBA\u4E00\u76F4\u5237\u65B0\uFF0C\u4F46**\u7F3A\u56FE\u4E0D\u4F1A\u81EA\u6108**\n      // \uFF08\u5178\u578B\uFF1A\u5B98\u65B9\u6709\u8BE5 placement \u4F46 prodimg \u672A\u751F\u6210\u8BE5\u9762\uFF0C\u5982 456 \u8896\u9762\uFF09\u3002\n      // \u6539\u4E3A\u300C\u8BE5\u9762\u6682\u4E0D\u53EF\u7528 \u00B7 \u70B9\u6B64\u91CD\u8BD5\u300D\uFF0C\u652F\u6301\u70B9\u51FB\u91CD\u8BD5 + \u6700\u591A 3 \u6B21\u6709\u754C\u81EA\u52A8\u91CD\u8BD5\u3002\n      tx.textContent = 'This side is unavailable \u00B7 Tap to retry';\n      loadEl.style.display='flex';\n      loadEl.style.cursor='pointer';\n      loadEl.onclick = function(){\n        try{\n          if(product){ product.__phRetry=0; product.__bgRefreshing=0; }\n          switchFaceBg(currentPlacement);\n        }catch(e){}\n      };\n      if(product){\n        product.__phRetry = product.__phRetry || 0;\n        if(product.__phRetry < 3){\n          product.__phRetry++;\n          clearTimeout(product.__phT);\n          product.__phT = setTimeout(function(){\n            try{ product.__bgRefreshing=0; switchFaceBg(currentPlacement); }catch(e){}\n          }, 1500);\n        }\n      }\n    }\n  }catch(e){}\n}\nfunction switchFaceBg(face){\n  try{\n    if(!product) return;\n    /* 2026-10-25\uFF1A\u53D6\u300C\u8BE5\u9762\u300D\u7684 **positioning \u5C42**\uFF08\u5E3D\u515C/\u524D\u666F\uFF09\u3002\n       \uD83D\uDD34 \u53EA\u53D6 positioning\uFF0C\u4E0D\u53D6 base \u2014\u2014 base(05_..._base_whitebg) \u662F\u300C\u767D\u5E95 alpha=255 + \u8863\u8EAB alpha\u224821\u300D\uFF0C\n       \u5F53alpha \u9608\u503C\u524D\u666F\u4F1A\u628A\u767D\u5E95\u4FDD\u7559\u3001\u6574\u5757\u906E\u4F4F\u56FE\u6848\uFF0871/146/1465 \u5168\u4E2D\u62DB\uFF09\u3002\n       \u6CA1\u6709 positioning \u7684\u9762 \u21D2 \u8FD4\u56DE ''\uFF08\u4E0D\u52A0\u524D\u666F\uFF0C\u96F6\u56DE\u5F52\uFF09\u3002 */\n    var _ghostFor = function(f){\n      try{\n        var ts = product.allTemplates || [];\n        if(!ts.length) return '';\n        var list = ts.filter(function(t){\n          return String(t.placement || '') === String(f || '') && /\\/positioning\\//i.test(t.url || '');\n        });\n        if(!list.length) return '';\n        var cslug = String(product._colorName || selColor || '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n        var byColor = list.filter(function(t){ return cslug && String(t.url || '').toLowerCase().indexOf(cslug) >= 0; })[0];\n        var pick = byColor || list[0];\n        return (pick && pick.url) || '';\n      }catch(e){ return ''; }\n    };\n    var _gh = _ghostFor(face);\n    // 2026-09-07/09-09: \u670D\u52A1\u5668\u6210\u54C1\u56FE\u4F18\u5148 \u2014\u2014 prodimg \u6709\u8BE5\u8272\u00D7\u8BE5\u9762\u5219\u76F4\u8D34\u5355\u5C42\uFF1B\u65E0\u5219\u8865\u62C9\u4E00\u6B21 flat-template\n    // \uFF08\u670D\u52A1\u5668\u53EF\u80FD\u5DF2\u751F\u6210\uFF09\u2192 \u6709\u5219\u76F4\u8D34\uFF0C\u4ECD\u65E0\u5219\u5360\u4F4D\u3002\u524D\u7AEF\u4E0D\u518D\u62FC\u5C42\u3002\n    var _pv = product._prodPreview && product._prodPreview[face];\n    if(_pv){\n      product.__phRetry=0; // 2026-09-11: \u53D6\u5230\u56FE \u2192 \u91CD\u7F6E\u5360\u4F4D\u91CD\u8BD5\u8BA1\u6570\n      loadProductBackground(_gh, _pv, '#ffffff');\n      return;\n    }\n    if(product.__bgRefreshing) return;\n    product.__bgRefreshing=1;\n    var pid=product.id || product.product_id || '';\n    // 2026-09-07 FIX: refresh \u5FC5\u987B\u5E26\u6B63\u786E\u8272\u540D\uFF08_cachedBgColor \u53EF\u80FD\u4E3A\u7A7A/hex\uFF09\u2014\u2014 color= \u7A7A\u4F1A\u62C9\u56DE\u65E0 prodimg \u7684\n    // \u9ED8\u8BA4\u9ED1\u6C60 \u2192 \u5207\u9762\u9ED1 T\u3002\u4F18\u5148 _colorName(\u670D\u52A1\u7AEF\u89C4\u8303\u540D) \u2192 selColor(URL)\u3002\n    /* 2026-10-23\uFF08\u7532\uFF09\uFF1A\u8865\u62C9\u53EA\u7528\u300C\u8272\u540D\u300D\uFF0C\u7981\u6B62\u7528 _cachedBgColor\uFF08hex\uFF09\u515C\u5E95\u3002\n       \u53CC\u8272\u5546\u54C1\uFF08\u5982 Jet Black/Arctic White\uFF09\u7684 hex \u53EA\u4EE3\u8868\u8EAB\u4F53\u8272\uFF0C\u670D\u52A1\u7AEF\u6309 hex \u53CD\u67E5 .hexmap\n       \u4F1A\u547D\u4E2D\u9519\u8BEF\u7EC4\u5408\u8272\uFF08#c1103b \u2192 jet-black-fire-red\uFF09\u21D2 \u80CC\u9762/\u4FA7\u9762\u9519\u8272\u3002 */\n    var colName = product._colorName || selColor || (window.__dsPick && window.__dsPick.color) || '';\n    var col=encodeURIComponent(colName);\n    // 2026-09-18: \u4E0D\u518D\u5E26 refresh=Date.now() \u2014\u2014 \u670D\u52A1\u5668 cacheKey() \u628A query \u4E5F\u62FC\u8FDB\u952E\uFF0C\n    // \u968F\u673A refresh \u4F1A\u8BA9\u8865\u62C9\u6BCF\u6B21\u90FD\u7A7F\u900F\u5230 Printful\uFF08\u5B9E\u6D4B 95ms\uFF1B\u547D\u4E2D\u7F13\u5B58\u53EA\u8981 4ms\uFF09\u3002\n    // \u670D\u52A1\u5668\u5DF2\u6539\u4E3A\u300Cflat-template \u547D\u4E2D\u7F13\u5B58\u65F6\u91CD\u7B97 prodPreview\u300D\uFF08\u7EAF\u78C1\u76D8\u626B\u63CF\u3001\u5FAE\u79D2\u7EA7\uFF09\uFF0C\n    // \u6240\u4EE5\u4E0D\u5E26 refresh \u4E5F\u80FD\u7ACB\u523B\u53D1\u73B0\u65B0\u751F\u6210\u7684\u6210\u54C1\u56FE\uFF0C\u81EA\u6108\u80FD\u529B\u4E0D\u4E22\u3002\n    ft(B+'/catalog/product/'+pid+'/flat-template?color='+col, {}, 15000)\n      .then(function(r){ return r.json(); })\n      .then(function(td){\n        if(td && td.success!==false){\n          product.allTemplates = td.templates || product.allTemplates || [];\n          product._cachedBgUrl = td.backgroundUrl || product._cachedBgUrl;\n          product._cachedBgColor = td.backgroundColor || product._cachedBgColor;\n          product._prodPreview = td.prodPreview || product._prodPreview || null; // 2026-09-07: refresh \u540C\u6B65\u6210\u54C1\u56FE\u6620\u5C04\n          product._colorName = td.requestedColor || product._colorName || '';\n          var _pv2 = product._prodPreview && product._prodPreview[face];\n          if(_pv2){ product.__phRetry=0; loadProductBackground(_gh, _pv2, '#ffffff'); }\n          else showProdPlaceholder();\n        }\n      })\n      .catch(function(e){ console.warn('[switchFaceBg] refresh fail', e && e.message); })\n      .then(function(){\n        setTimeout(function(){ product.__bgRefreshing=0; }, 2000);\n      });\n  }catch(e){ console.error('[switchFaceBg] error:', e && e.message); }\n}\n\n/* 2026-10-14\uFF08\u7532\uFF09\u6362\u9884\u89C8\u8272 \u2014\u2014 \u4F9B\u5916\u7F6E assets/hd-team-combos.js \u7684\u89C4\u683C\u5361\u8C03\u7528\u3002\n   \u53EA\u6362\u300C\u5E95\u677F/\u6210\u54C1\u56FE + \u5F53\u524D\u53D8\u4F53 + _colorName\u300D\uFF0C**\u753B\u5E03\u4E0A\u7684\u8BBE\u8BA1\u5BF9\u8C61\u4E00\u6839\u4E0D\u52A8**\u3002\n   \u5B9E\u73B0\u76F4\u63A5\u590D\u7528\u65E2\u6709 switchFaceBg()\uFF08\u5B83\u672C\u6765\u5C31\u6309 product._colorName \u53BB\u62C9\u8BE5\u8272 flat-template\uFF09\u3002 */\n/* 2026-10-14\uFF08\u6027\u80FD \u2460\u2461\uFF09\uFF1A\u6309\u8272\u6210\u54C1\u56FE\u524D\u7AEF\u7F13\u5B58 \u2014\u2014 \u6362\u8272\u4E0D\u518D\u6BCF\u6B21\u90FD\u95EE\u670D\u52A1\u7AEF\u3002\n   \u6570\u636E\u6E90 = /catalog/product/<pid>/flat-template?color=<\u8272> \u54CD\u5E94\u91CC\u7684 prodPreview\uFF08\u8BE5\u8272\u5404\u9762\u7684\u6210\u54C1\u56FE URL\uFF09\u3002\n   \u26A0\uFE0F \u90A3\u4E2A API \u540C\u65F6\u627F\u62C5\u300C\u670D\u52A1\u7AEF\u5C1A\u672A\u751F\u6210\u8BE5\u8272\u6210\u54C1\u56FE\u65F6\u89E6\u53D1\u751F\u6210\u300D\u7684\u5FC5\u9700\u526F\u4F5C\u7528 \u21D2 \u53EA\u505A**\u53BB\u91CD**\uFF0C\u4E0D\u5220\u5B83\u3002 */\nwindow.__hdApplyColorShot = function(colorName){\n  try{\n    var nm = String(colorName || '').trim();\n    var cache = (product && product.__pfmColorShots) || {};\n    var pp = cache[nm];\n    if (!nm || !pp) return false;\n    product._cachedBgColor = '';\n    product._prodPreview = pp;          /* \u5582\u56DE\u6620\u5C04 \u21D2 switchFaceBg \u76F4\u63A5\u8D34\u56FE */\n    product.__bgRefreshing = 0;\n    product.__phRetry = 0;\n    switchFaceBg(currentPlacement);\n    return true;\n  }catch(e){ return false; }\n};\n/* 2026-10-14\uFF08\u7F13\u5B58\uFF09\uFF1A\u8272 \u2192 \u5404\u9762\u6210\u54C1\u56FE \u2014\u2014 \u843D localStorage\uFF0C\u5237\u65B0\u540E\u6362\u8272\u4ECD\u53EF\u79D2\u5207\u3002\n   \u53EA\u5582 __pfmColorShots\uFF08switchFaceBg \u7684\u7F13\u5B58\u5FEB\u8DEF\u5F84\uFF09\uFF0C**\u4E0D\u53C2\u4E0E buildFrom / \u6253\u5370\u533A** \u21D2 \u4E0D\u53EF\u80FD\u5F71\u54CD\u6A21\u677F\u4E0E\u6253\u5370\u5C3A\u5BF8\u3002\n   \u4E0E\u65E2\u6709 hd_prod_v2_* / hd_tpl_v6_* \u5B8C\u5168\u9694\u79BB\uFF0C\u72EC\u7ACB\u952E hd_shots_v1_<\u4EA7\u54C1id>\u3002 */\nvar PFM_SHOTS_KEY = 'hd_shots_v1_';\nvar PFM_SHOTS_MAX = 200;          /* \u6BCF\u4EA7\u54C1\u6700\u591A\u8BB0 200 \u4E2A\u8272 */\nvar PFM_SHOTS_TTL = 30 * 86400 * 1000;\nfunction _pfmShotsRead(pid){\n  try{\n    var o = JSON.parse(localStorage.getItem(PFM_SHOTS_KEY + pid) || 'null');\n    if(!o || !o.d || !o.ts || (Date.now() - o.ts > PFM_SHOTS_TTL)) return {};\n    return o.d;\n  }catch(e){ return {}; }\n}\nfunction _pfmShotsWrite(pid, color, pp){\n  try{\n    if(!pid || !color || !pp) return;\n    var faces = {}, n = 0;\n    for(var f in pp){ var u = pp[f]; if(typeof u === 'string' && u){ faces[f] = u.slice(0, 300); n++; } }\n    if(!n) return;\n    var all = _pfmShotsRead(pid);\n    all[color] = faces;\n    var ks = Object.keys(all);\n    if(ks.length > PFM_SHOTS_MAX){ ks.slice(0, ks.length - PFM_SHOTS_MAX).forEach(function(k){ delete all[k]; }); }\n    localStorage.setItem(PFM_SHOTS_KEY + pid, JSON.stringify({ ts: Date.now(), d: all }));\n  }catch(e){}\n}\n/* \u4EA7\u54C1\u5C31\u7EEA\u540E\u56DE\u586B\u5185\u5B58\u7F13\u5B58 \u2014\u2014 \u547D\u4E2D\u5373\"\u96F6\u8BF7\u6C42\u3001\u77AC\u65F6\"\u6362\u8272\uFF08\u56FE\u7247\u672C\u8EAB\u8FD8\u6709\u6D4F\u89C8\u5668 1 \u5929 HTTP \u7F13\u5B58\u515C\u5E95\uFF09 */\nfunction _pfmShotsSeed(){\n  try{\n    var pid = (product && (product.id || product.product_id)) || '';\n    if(!pid) return;\n    var d = _pfmShotsRead(pid);\n    var cache = product.__pfmColorShots || (product.__pfmColorShots = {});\n    var hit = 0;\n    for(var k in d){\n      if(!cache[k] && d[k] && Object.keys(d[k]).length){ cache[k] = d[k]; hit++; }\n    }\n    if(hit) console.log('[shots] \u547D\u4E2D\u672C\u5730\u7F13\u5B58 ' + hit + ' \u4E2A\u8272 (pid=' + pid + ')');\n  }catch(e){}\n}\n/* \u9884\u53D6\u8BE5\u8272**\u5F53\u524D\u9762**\u7684\u6210\u54C1\u56FE\uFF08\u53EA\u5F53\u524D\u9762\uFF0C\u7701\u5E26\u5BBD\uFF1B\u540E\u53F0\u9759\u9ED8\u3001\u5931\u8D25\u65E0\u6240\u8C13\uFF09 */\nfunction _pfmPrefetchShot(pp){\n  try{\n    var u = pp && pp[currentPlacement];\n    if (!u) u = pp && (pp.front_large || pp.front);\n    if (u) { var i = new Image(); i.src = u; }\n  }catch(e){ }\n}\n/* 2026-10-14\uFF08\u6362\u8272\u63D0\u901F\uFF09\uFF1A\u6309\u670D\u52A1\u7AEF prodimg \u547D\u540D\u89C4\u5F8B\u62FC\u300C\u8BE5\u8272\u00D7\u8BE5\u9762\u300D\u7684\u6210\u54C1\u56FE URL \u2014\u2014\n   \u5B9E\u6D4B\u89C4\u5F8B\uFF1Aprodimg/<pid>/<\u8272\u540D\u5C0F\u5199\u00B7\u7A7A\u683C\u8F6C->__<\u9762>.jpg\uFF08black / navy / heather-prism-mint\uFF09\u3002\n   \u21D2 \u53EF\u76F4\u63A5\u76F4\u8FDE\u56FE\u7247\uFF0C**\u8DF3\u8FC7 flat-template API \u7684 667ms**\uFF1B\u62FC\u9519/\u672A\u751F\u6210\u65F6\u7531\u8C03\u7528\u65B9\u56DE\u9000 API\u3002 */\n/* 2026-10-15\uFF1A\u7EAF URL \u6784\u9020\u5668\uFF08\u62BD\u51FA\uFF0C\u4EE5\u4FBF product \u672A\u5C31\u7EEA\u65F6\u4E5F\u80FD\u9884\u70ED\uFF09\u2014\u2014 \u547D\u540D\u89C4\u5219\u4E0E\u539F\u5B9E\u73B0\u9010\u5B57\u4E00\u81F4\u3002 */\nfunction _pfmShotUrl(pid, colorName, face){\n  try{\n    var nm = String(colorName || '').trim();\n    if(!pid || !nm) return '';\n    return B + '/prodimg/' + pid + '/' + nm.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') + '__' + (face || currentPlacement) + '.jpg';\n  }catch(e){ return ''; }\n}\nfunction _pfmDirectShot(colorName, face){\n  try{\n    var pid = (product && (product.id || product.product_id)) || '';\n    return _pfmShotUrl(pid, colorName, face);\n  }catch(e){ return ''; }\n}\n/* \u2500\u2500 2026-10-15\uFF08\u79D2\u5207\uFF09\uFF1A\u88F8\u9884\u70ED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   \u53EA\u628A\u300C\u5C55\u793A\u53F0\u5B9E\u9645\u663E\u793A\u7684\u90A3\u5F20\u300D\uFF08<\u8272>__<\u9762>_large.jpg\uFF09\u585E\u8FDB\u6D4F\u89C8\u5668 HTTP \u7F13\u5B58\u3002\n   \uD83D\uDD34 \u5B9E\u6D4B\u6839\u56E0\uFF1A\u539F\u9884\u70ED\u7684\u95F8\u95E8\u662F\u300Cproduct \u5C31\u7EEA\u300D\uFF0C\u800C product \u5C31\u7EEA\u8981\u7B49\u6574\u4E2A\u76EE\u5F55\u6570\u636E\u52A0\u8F7D\u5B8C\n   \uFF08\u5F31\u7F51\u5B9E\u6D4B\u9884\u70ED 32.6s \u624D\u53D1\u51FA\uFF0C\u800C\u7528\u6237\u65E9\u5C31\u5728\u70B9\u8272\u677F\uFF09\u21D2 \u7F13\u5B58\u5168\u51B7 \u21D2 \u6BCF\u6B21\u6362\u8272\u73B0\u4E0B\u8F7D\n   41~98KB\uFF0C\u5B9E\u6D4B 755~1388ms\uFF08\u70ED\u7684\u53EA\u8981 3ms\uFF09\u3002\n   \u21D2 \u8FD9\u91CC**\u4E0D\u7B49 product**\uFF1Apid \u76F4\u63A5\u53D6 URL \u53C2\u6570 product_id\u3002\n   \u4E32\u884C + 300ms \u95F4\u9694\uFF0C\u4E0D\u8DDF\u9996\u5C4F\u62A2\u5E26\u5BBD\uFF1B\u5E42\u7B49\uFF08\u6D4F\u89C8\u5668\u5DF2\u7F13\u5B58\u5219\u4E0D\u518D\u4F20\u8F93\uFF09\u3002\n   \u7EAF\u9884\u70ED\uFF0C**\u4E0D\u5199\u4EFB\u4F55\u5185\u5B58\u7F13\u5B58\u3001\u4E0D\u78B0\u4EFB\u4F55\u5224\u65AD\u903B\u8F91**\u3002 */\nvar _pfmWarmQ = [], _pfmWarmRunning = false, _pfmWarmSeen = {};\nfunction _pfmWarmShots(names){\n  try{\n    var _pid = String((params && params.get('product_id')) ||\n                      (product && (product.id || product.product_id)) || '');\n    if(!_pid) return;\n    /* \u5C55\u793A\u53F0\u53D6 prodPreview[currentPlacement]\uFF1Bproduct 71 \u5B9E\u6D4B currentPlacement = front_large\uFF0C\n       \u6545\u9884\u70ED <base>_large\uFF08currentPlacement \u5B9A\u7A3F\u524D\u9ED8\u8BA4\u4E3A front \u21D2 \u4E5F\u7B97\u51FA front_large\uFF09\u3002 */\n    var _face = String(currentPlacement || 'front').replace(/_large$/, '') + '_large';\n    (names || []).forEach(function(nm){\n      if(!nm) return;\n      var u = _pfmShotUrl(_pid, nm, _face);\n      if(u && !_pfmWarmSeen[u]){ _pfmWarmSeen[u] = 1; _pfmWarmQ.push(u); }\n    });\n    if(_pfmWarmRunning) return;\n    _pfmWarmRunning = true;\n    (function _step(){\n      if(!_pfmWarmQ.length){ _pfmWarmRunning = false; return; }\n      var u = _pfmWarmQ.shift();\n      try{ var im = new Image(); im.decoding = 'async'; im.src = u; }catch(e){}\n      setTimeout(_step, 300);\n    })();\n  }catch(e){}\n}\n/* \u8D70 API \u62C9\u8BE5\u8272\u7684 prodPreview\uFF08\u539F\u6709\u903B\u8F91\uFF0C\u62BD\u6210\u51FD\u6570\uFF1A\u65E2\u662F\u9996\u62C9\u8DEF\u5F84\uFF0C\u4E5F\u662F\u300C\u76F4\u8FDE\u5931\u8D25\u300D\u7684\u515C\u5E95\uFF09 */\nfunction _pfmApiShot(nm, pid, cache, pend){\n  /* \u5728\u9014\u53BB\u91CD\uFF1A\u5B9E\u6D4B\u300C\u76F4\u8FDE\u5931\u8D25 \u2192 \u56DE\u9000\u300D\u8DEF\u5F84\u4E0A\u540C\u4E00\u8272\u4F1A\u91CD\u590D\u53D1 7 \u6B21 API\u3002\n     pend \u7EA6\u5B9A\uFF1A1 = \u6574\u4F53\u5728\u9014\uFF08\u76F4\u8FDE\u9636\u6BB5\uFF09\uFF0C2 = API \u5728\u9014\u3002 */\n  if (pend[nm] === 2) return;\n  pend[nm] = 2;\n  ft(B + '/catalog/product/' + pid + '/flat-template?color=' + encodeURIComponent(nm), {}, 15000)\n    .then(function(r){ return r.json(); })\n    .then(function(td){\n      delete pend[nm];\n      if (td && td.success !== false && td.prodPreview) {\n        cache[nm] = td.prodPreview;\n        _pfmShotsWrite(pid, nm, td.prodPreview);   /* 2026-10-14\uFF08\u7F13\u5B58\uFF09\uFF1A\u6574\u9762\u8272\u6620\u5C04\u843D\u76D8 */\n        _pfmPrefetchShot(td.prodPreview);\n        try{ if (String(product._colorName || '') === nm) window.__hdApplyColorShot(nm); }catch(e2){}\n      }\n    })\n    .catch(function(){ delete pend[nm]; });\n}\n\n/* \u540E\u53F0\u4E3A\u67D0\u8272\u62C9\u4E00\u6B21\uFF08= \u67E5\u8BE2/\u89E6\u53D1\u751F\u6210 + \u5199\u7F13\u5B58 + \u9884\u53D6\u56FE\uFF09\uFF1B\u5DF2\u5728\u7F13\u5B58\u6216\u6B63\u5728\u62C9 \u21D2 \u76F4\u63A5\u8FD4\u56DE */\nwindow.__hdPreloadColor = function(colorName){\n  try{\n    var nm = String(colorName || '').trim();\n    if (!nm || !product) return false;\n    var pid = product.id || product.product_id || '';\n    if (!pid) return false;\n    var cache = product.__pfmColorShots || (product.__pfmColorShots = {});\n    if (cache[nm]) { _pfmPrefetchShot(cache[nm]); return true; }\n    var pend = product.__pfmColorPend || (product.__pfmColorPend = {});\n    if (pend[nm]) return false;                       /* \u6B63\u5728\u62C9 \u21D2 \u4E0D\u91CD\u590D\u53D1 */\n    pend[nm] = 1;\n    /* \u2460 \u5148\u8BD5**\u76F4\u8FDE\u56FE\u7247**\uFF08\u96F6 API\uFF09\uFF1A\u547D\u4E2D\u5C31\u7ACB\u523B\u53EF\u7528 \u2014\u2014 \u8FD9\u662F\u628A\u300C\u6CA1\u770B\u8FC7\u7684\u8272\u300D\u4ECE ~715ms \u62C9\u4E0B\u6765\u7684\u5173\u952E\u3002 */\n    var _du = _pfmDirectShot(nm, currentPlacement);\n    if (!_du) { _pfmApiShot(nm, pid, cache, pend); return true; }\n    var _im = new Image(), _done = false;\n    function _fallback(){                 /* \u2461 \u76F4\u8FDE\u5931\u8D25\uFF08404\uFF09/ \u8D85\u65F6 \u21D2 \u56DE\u9000 API\uFF08\u987A\u4FBF\u89E6\u53D1\u751F\u6210\uFF09 */\n      if (_done) return; _done = true;\n      _pfmApiShot(nm, pid, cache, pend);\n    }\n    _im.onload = function(){\n      if (_done) return; _done = true;\n      /* 2026-10-23\uFF08\u7532\uFF09\uFF1A\u76F4\u8FDE\u6210\u529F\u65F6\u6309 prodimg \u547D\u540D\u89C4\u5F8B\u62FC\u5168 4 \u9762 \u2014\u2014 \u539F\u6765\u53EA\u8BB0\u5F53\u524D\u9762\uFF0C\n         \u5207\u5230\u80CC\u9762/\u4FA7\u9762\u65F6 _prodPreview[face] \u4E3A\u7A7A \u21D2 \u8D70\u8865\u62C9 \u21D2 \u8865\u62C9\u7528 hex \u515C\u5E95 \u21D2 \u547D\u4E2D\u9519\u8BEF\u7EC4\u5408\u8272\u3002\n         \u73B0\u5728\u4E00\u6B21\u62FC\u5168 4 \u9762\uFF08\u8272\u540D\u76F8\u540C\uFF0C\u9762\u540D\u4E0D\u540C\uFF09\uFF0C\u5207\u9762\u76F4\u63A5\u547D\u4E2D\uFF0C\u4E0D\u518D\u8865\u62C9\u3002 */\n      var pp = {};\n      ['front', 'front_large', 'back', 'back_large', 'sleeve_left', 'sleeve_right'].forEach(function (_f) {\n        var _u = _pfmShotUrl(pid, nm, _f);\n        if (_u) pp[_f] = _u;\n      });\n      if (!pp[currentPlacement]) pp[currentPlacement] = _du;\n      cache[nm] = pp;\n      _pfmShotsWrite(pid, nm, pp);               /* 2026-10-14\uFF08\u7F13\u5B58\uFF09\uFF1A\u76F4\u8FDE\u6210\u529F\u4E5F\u843D\u76D8 */\n      delete pend[nm];\n      _pfmPrefetchShot(pp);\n      try{ if (String(product._colorName || '') === nm) window.__hdApplyColorShot(nm); }catch(e2){}\n    };\n    _im.onerror = _fallback;\n    setTimeout(_fallback, 2500);          /* \u5F31\u7F51\u515C\u5E95\uFF1A2.5s \u5185\u6CA1\u7ED3\u679C\u5C31\u4EA4\u7ED9 API */\n    _im.src = _du;\n    return true;\n  }catch(e){ return false; }\n};\n\n/* 2026-10-14\uFF08\u63D0\u901F\uFF09\uFF1A\u9884\u52A0\u8F7D**\u5165\u53E3** \u2014\u2014 \u7531\u89C4\u683C\u5361\uFF08hd-team-combos.js\uFF09\u8C03\u7528\uFF0C\u4F20\u5165\u300C\u7528\u6237\u9009\u7684\u8272\u300D\u3002\n   \uD83D\uDD34 \u5B9E\u6D4B\u5751\uFF1A\u89C4\u683C\u5361\u5728 DOMContentLoaded \u9644\u8FD1\u5C31\u8C03\u7528\uFF0C\u90A3\u65F6 product \u8FD8\u6CA1\u5C31\u7EEA \u21D2 \u76F4\u63A5\u8C03 __hdPreloadColor\n   \u4F1A\u88AB\u5B83\u7B2C\u4E00\u884C `if(!product) return false` \u4E22\u6389\uFF0C**\u4E00\u4E2A\u8BF7\u6C42\u90FD\u4E0D\u53D1**\uFF084 \u8F6E\u8BCA\u65AD\u5B9A\u4F4D\uFF09\u3002\n   \u21D2 \u8FD9\u91CC\u505A**\u5F85\u529E\u961F\u5217**\uFF1Aproduct \u6CA1\u5C31\u7EEA\u5C31\u5148\u5B58\u7740\uFF0C\u7B49 loadProduct \u5B8C\u6210\u540E\u7531 pfmDrainPreload() \u6D88\u8D39\u3002 */\nwindow.__hdPreloadColors = function(names){\n  try{\n    var arr = (names || []).filter(Boolean);\n    if(!arr.length) return;\n    /* 2026-10-15\uFF08\u79D2\u5207\uFF09\uFF1A**\u5148\u88F8\u9884\u70ED**\uFF08\u4E0D\u7B49 product\uFF09\u2014\u2014 \u89C1 _pfmWarmShots \u6CE8\u91CA\u3002 */\n    _pfmWarmShots(arr);\n    var q = window.__pfmPreloadQueue || (window.__pfmPreloadQueue = []);\n    arr.forEach(function(n){ if(q.indexOf(n) < 0) q.push(n); });\n    pfmDrainPreload();\n  }catch(e){ }\n};\nfunction pfmDrainPreload(){\n  try{\n    var q = window.__pfmPreloadQueue;\n    if(!q || !q.length) return;\n    if(!product) return;                 /* \u8FD8\u6CA1\u5C31\u7EEA \u21D2 \u7559\u5728\u961F\u5217\u91CC\uFF0CloadProduct \u5B8C\u6210\u540E\u518D\u8C03\u4E00\u6B21 */\n    window.__pfmPreloadQueue = [];\n    q.forEach(function(nm){ try{ window.__hdPreloadColor(nm); }catch(e){ } });\n  }catch(e){ }\n}\n\nwindow.__hdSwapColor = function(colorName){\n  try{\n    var nm = String(colorName || '').trim();\n    if (!nm || !product) return false;\n    if (String(product._colorName || '') === nm) return true;\n    product._colorName = nm;\n    product._cachedBgColor = '';\n    product.__bgRefreshing = 0;\n    product.__phRetry = 0;\n    /* 2026-10-14\uFF08\u6027\u80FD \u2460\uFF09\uFF1A**\u5148\u67E5\u6309\u8272\u6210\u54C1\u56FE\u524D\u7AEF\u7F13\u5B58** \u2014\u2014 \u547D\u4E2D \u21D2 \u628A\u8BE5\u8272\u7684 prodPreview \u5582\u56DE\u53BB\uFF0C\n       switchFaceBg \u8D70\u300C\u76F4\u63A5\u8D34\u56FE\u300D\u5206\u652F \u21D2 **0 \u8BF7\u6C42\u3001\u77AC\u65F6**\uFF08\u5B9E\u6D4B\u539F\u6765\u6BCF\u6B21\u90FD\u8981\u4E00\u4E2A 667ms \u7684 API \u5F80\u8FD4\uFF09\u3002\n       \u672A\u547D\u4E2D\uFF08\u9996\u6B21\u8BBF\u95EE\u8BE5\u8272\uFF09\u21D2 \u53EA\u8C03 __hdPreloadColor \u62C9\u4E00\u6B21\uFF1A\u90A3\u4E2A API \u8FD8\u8D1F\u8D23\u300C\u670D\u52A1\u7AEF\u8FD8\u6CA1\u751F\u6210\u8BE5\u8272\n       \u6210\u54C1\u56FE\u65F6\u89E6\u53D1\u5B83\u751F\u6210\u300D\u8FD9\u4E00\u5FC5\u9700\u526F\u4F5C\u7528\uFF0C\u6240\u4EE5\u53EA\u505A\u53BB\u91CD\u3001\u7EDD\u4E0D\u5220\u3002\u62C9\u56DE\u6765\u4F1A\u81EA\u52A8\u8D34\u4E0A\u53BB\u3002 */\n    if (!window.__hdApplyColorShot(nm)) {\n      product._prodPreview = null;      /* \uD83D\uDD34 \u5FC5\u987B\u6E05\uFF1A\u5426\u5219 switchFaceBg \u4F1A\u8D34\u4E0A**\u4E0A\u4E00\u4E2A\u8272**\u7684\u56FE */\n      try { window.__hdPreloadColor(nm); } catch (e) { }\n    }\n    /* \u540C\u6B65\u300C\u5F53\u524D\u53D8\u4F53\u300D= \u65B0\u8272 + \u5F53\u524D\u5C3A\u7801\uFF08\u62FF\u4E0D\u5230\u5C31\u4FDD\u6301\u539F\u6837\uFF0C\u7EDD\u4E0D\u731C\uFF09 */\n    try{\n      var _vs = window.__dsVariants || [];\n      var _sz = selSize || '', _hit = null, _hex = '';\n      for (var _i=0;_i<_vs.length;_i++){\n        var _v = _vs[_i];\n        if (String(_v.color||'').toLowerCase() !== nm.toLowerCase()) continue;\n        if (!_hex) _hex = String(_v.color_code||'');\n        if (_sz && String(_v.size||'') === String(_sz)){ _hit = _v; break; }\n        if (!_hit) _hit = _v;\n      }\n      if (_hit && _hit.variant_id) currentVariantId = _hit.variant_id;\n      window.__dsPick = { color: nm, size: _sz, hex: _hex };\n    }catch(e2){}\n    return true;\n  }catch(e){ return false; }\n};\n\n// 2026-09-04: \u9876\u90E8\u4E09\u6309\u94AE\u884C\u5BBD\u5EA6 = \u753B\u5E03\u5BBD\u5EA6\uFF08\u5DE6\u53F3\u8FB9\u7F18\u5BF9\u9F50\u753B\u5E03\uFF09\uFF0C\u6309\u94AE flex:1 \u4E09\u7B49\u5206\uFF1B\u4F4D\u7F6E\u4ECD\u5728\u9875\u9762\u9876\u90E8\n// header \u5185\uFF0C\u7528 ResizeObserver \u8DDF\u968F\u753B\u5E03\u5C3A\u5BF8\u3002\nfunction syncHeaderBar(){\n  try{\n    var inner=document.getElementById('pfmCanvasInner');\n    var row=document.getElementById('pfmHeaderRow');\n    if(!inner||!row||!inner.offsetWidth)return;\n    var header=row.parentElement;\n    if(!header)return;\n    var ir=inner.getBoundingClientRect();\n    var hb=header.getBoundingClientRect();\n    var hs=getComputedStyle(header);\n    var baseLeft=hb.left+(parseFloat(hs.paddingLeft)||0);\n    var ml=Math.max(0,Math.round(ir.left-baseLeft));\n    var w=Math.round(inner.offsetWidth);\n    row.style.width=w+'px';\n    row.style.marginLeft=ml+'px';\n  }catch(e){}\n}\n(function(){\n  var inner=document.getElementById('pfmCanvasInner');\n  if(inner&&window.ResizeObserver){\n    try{new ResizeObserver(function(){syncHeaderBar();}).observe(inner);}catch(e){}\n  }\n})();\nwindow.addEventListener('load',function(){setTimeout(syncHeaderBar,200);setTimeout(syncHeaderBar,800);});\ndocument.addEventListener('DOMContentLoaded',function(){setTimeout(syncHeaderBar,300);});\n// Recompute canvas size when viewport/orientation changes\nvar resizeTimer;\nwindow.addEventListener('resize',function(){\n  clearTimeout(resizeTimer);\n  resizeTimer=setTimeout(function(){\n    var spec=printAreaSpecs[currentPlacement];\n    if(spec) resizeCanvasToPrintArea(spec);\n  },150);\n});\n\n/* \uD83D\uDD34 2026-09-19: \u753B\u5E03\u533A\u5C3A\u5BF8\u53D8\u5316\u4E5F\u8981\u91CD\u7B97 \u2014\u2014 \u300C\u4EA7\u54C1\u52A0\u8F7D\u5B8C\u6210\u300D\u90A3\u4E00\u523B\u753B\u5E03\u533A\u53EF\u80FD\u8FD8\u662F 0 \u9AD8\n   \uFF08\u753B\u677F\u521A\u6253\u5F00/\u5E03\u5C40\u672A\u5B8C\u6210\uFF09\u21D2 \u7B97\u51FA\u7684\u753B\u5E03\u4F1A\u504F\u5927 \u21D2 .pfm-canvas-area \u51FA\u73B0\u6EDA\u52A8\u6761\u3002\n   \u89C2\u5BDF #pfmCanvasArea\uFF08\u5B83\u7684\u9AD8\u5EA6\u7531 flex \u51B3\u5B9A\u3001\u4E0E\u5185\u5BB9\u65E0\u5173 \u21D2 \u91CD\u7B97\u4E0D\u4F1A\u4E0E\u89C2\u5BDF\u5F62\u6210\u5FAA\u73AF\uFF09\uFF0C\n   \u5C3A\u5BF8\u53D8\u5316\u540E debounce 200ms \u91CD\u7B97\u4E00\u6B21\u3002 */\n(function(){\n  var ca = document.getElementById('pfmCanvasArea');\n  if(!ca || !window.ResizeObserver) return;\n  var last = '', t = 0;\n  try{\n    new ResizeObserver(function(){\n      var key = ca.clientWidth + 'x' + ca.clientHeight;\n      if(key === last) return;\n      last = key;\n      clearTimeout(t);\n      t = setTimeout(function(){\n        try{\n          var spec = printAreaSpecs[currentPlacement];\n          if(spec && canvas) resizeCanvasToPrintArea(spec);\n        }catch(e){}\n      }, 200);\n    }).observe(ca);\n  }catch(e){}\n})();\n/* 2026-10-09\uFF08\u7528\u6237\u88C1\u51B3 \u7532\u2460/\u4E59\u2461/\u4E19\u2460/\u4E01\u2461\uFF09\uFF1A\u4E0A\u4F20\u5165\u53E3\u6536\u53E3\u4E3A**\u4E00\u4E2A**\u51FD\u6570\u3002\n   \u4E09\u6761\u8DEF\u5F84\uFF08+ \u53F7\u683C\u70B9\u9009 / \u62D6\u653E / file input change\uFF09\u5FC5\u987B\u5171\u7528\u540C\u4E00\u5B9E\u73B0 \u2014\u2014\n   \u5404\u5199\u4E00\u4EFD\u8FDF\u65E9\u5206\u53C9\uFF0C\u800C\u4E14\u5206\u53C9\u662F\u9759\u9ED8\u7684\uFF08\u753B\u5E03\u6709\u56FE\u4F46\u7D20\u6750\u5E93\u6CA1\u5165\u5E93\uFF0C\u6216\u53CD\u4E4B\uFF09\u3002 */\nfunction pfmPickUpload(file){\n  if(!file) return;\n  var reader=new FileReader();\n  reader.onload=function(ev){\n    addImage(ev.target.result,{noSelect:true});\n    /* 2026-10-08: \u540C\u4E00\u5F20\u56FE\u4E5F\u8FDB\u300CMy Images\u300D\uFF08\u79C1\u6709\u7D20\u6750\uFF0C\u53EA\u6709\u81EA\u5DF1\u770B\u5F97\u89C1\uFF09\u3002\n       \uD83D\uDD34 fire-and-forget\uFF1A\u5165\u5E93\u5931\u8D25\u7EDD\u4E0D\u5141\u8BB8\u5F71\u54CD\u7528\u6237\u62FF\u5230\u753B\u5E03\u4E0A\u7684\u56FE\uFF1B\n          \u753B\u5E03\u7528\u7684\u4ECD\u662F\u539F\u56FE\uFF08\u672C\u5904\u4E0D\u52A8 addImage \u7684\u5165\u53C2\uFF09\u21D2 \u51FA\u56FE\u5206\u8FA8\u7387\u96F6\u56DE\u5F52\u3002 */\n    if(window.__hdLib){ try{ window.__hdLib.ingest(file); }catch(err){} }\n  };\n  reader.readAsDataURL(file);\n}\nq('pfmFileInput').addEventListener('change',function(e){\n  var f=e.target.files&&e.target.files[0];\n  /* \u6E05\u7A7A value\uFF1A\u5426\u5219\u300C\u8FDE\u70B9\u4E24\u6B21 + \u53F7\u683C\u3001\u4E24\u6B21\u9009\u540C\u4E00\u5F20\u56FE\u300D\u7B2C\u4E8C\u6B21\u4E0D\u89E6\u53D1 change\n     \u21D2 \u8868\u73B0\u4E3A\u4E0A\u4F20\u6BEB\u65E0\u53CD\u5E94\uFF08\u9759\u9ED8\u5931\u6548\uFF09\u3002\u5148\u53D6\u51FA file \u518D\u6E05\uFF0CFile \u5BF9\u8C61\u4E0D\u53D7\u5F71\u54CD\u3002 */\n  try{ e.target.value=''; }catch(_){}\n  pfmPickUpload(f);\n});\n/* 2026-10-09\uFF08\u4E01\u2461\uFF09\uFF1A\u771F\u62D6\u653E\u3002\u6539\u524D\u6587\u6848\u91CC\u7684 \"drop\" \u662F**\u78B0\u5DE7**\u80FD\u7528\u7684\uFF08\u900F\u660E file input\n   \u94FA\u6EE1\u6574\u6846\uFF0C\u6D4F\u89C8\u5668\u539F\u751F\u63A5\u53D7\u62D6\u653E\uFF09\uFF1B\u6362\u6210 + \u53F7\u683C\u540E\u5FC5\u987B\u81EA\u5DF1\u5B9E\u73B0\u3002\n   dragenter/dragover \u5FC5\u987B preventDefault\uFF0C\u5426\u5219\u6D4F\u89C8\u5668\u4F1A\u76F4\u63A5\u5BFC\u822A\u5230\u88AB\u62D6\u5165\u7684\u6587\u4EF6\uFF08\u6574\u9875\u88AB\u66FF\u6362\uFF09\u3002\n   depth \u8BA1\u6570\u62B5\u6D88\u5B50\u5143\u7D20\u95F4\u79FB\u52A8\u65F6\u8FDE\u7EED\u7684 leave/enter\uFF0C\u5426\u5219\u9AD8\u4EAE\u4F1A\u95EA\u3002 */\n(function(){\n  var box=document.getElementById('pfmLib');\n  if(!box) return;\n  var depth=0;\n  box.addEventListener('dragenter',function(e){\n    if(!e.dataTransfer) return;\n    e.preventDefault(); depth++; box.classList.add('dragover');\n  });\n  box.addEventListener('dragover',function(e){\n    if(!e.dataTransfer) return;\n    e.preventDefault();\n    try{ e.dataTransfer.dropEffect='copy'; }catch(_){}\n    box.classList.add('dragover');\n  });\n  box.addEventListener('dragleave',function(e){\n    /* \u515C\u5E95\uFF1A\u62D6\u51FA\u7A97\u53E3\u65F6\u6D4F\u89C8\u5668\u53EF\u80FD\u4E0D\u7ED9\u914D\u5BF9\u7684 dragleave\uFF08relatedTarget=null\uFF09\uFF0C\n       \u53EA\u9760\u8BA1\u6570\u4F1A**\u6C38\u4E45\u5361\u5728\u9AD8\u4EAE\u6001** \u21D2 \u8D8A\u754C\u76F4\u63A5\u5F52\u96F6\u3002 */\n    depth--;\n    if(depth<=0 || !e.relatedTarget || !box.contains(e.relatedTarget)){\n      depth=0; box.classList.remove('dragover');\n    }\n  });\n  box.addEventListener('drop',function(e){\n    e.preventDefault(); depth=0; box.classList.remove('dragover');\n    var f=e.dataTransfer&&e.dataTransfer.files&&e.dataTransfer.files[0];\n    if(f) pfmPickUpload(f);\n  });\n})();\nwindow.__hdAct.bind('pfmBtnAddText',async function(){\n  var txt=q('pfmTextInput').value||'Your Text';\n  var fam=q('pfmFontSelect').value;\n  /* 2026-09-12: \u5B57\u4F53\u5F02\u6B65\u4E0B\u8F7D \u2014\u2014 \u5148\u7B49\u5B83\u5C31\u7EEA\uFF0C\u5426\u5219\u65B0\u5EFA\u7684\u6587\u5B57\u662F fallback \u5B57\u5F62 */\n  if(fam){ try{ await window.__hdDraw.fontLoad(fam); }catch(e){} }\n  /* 2026-10-14\uFF08\u56DE\u5F52\u4FEE\u590D\uFF09\uFF1A#pfmTextColor \u5DF2\u79FB\u9664 \u21D2 \u5FC5\u987B\u5B88\u536B\u53D6\u8272\u3002\n     \u88F8\u53D6\u503C\u4F1A q()=null \u21D2 .value \u629B TypeError \u21D2 async \u9759\u9ED8\u5931\u8D25\uFF08\u70B9 Add Text \u65E0\u53CD\u5E94\uFF09\u3002 */\n  var _tcEl=q('pfmTextColor'); var _tcColor=(_tcEl&&_tcEl.value)?_tcEl.value:'#000000';\n  addText(txt,fam,parseInt(q('pfmFontSize').value),_tcColor,parseInt(q('pfmOutlineWidth').value),q('pfmOutlineColor').value,q('pfmTextArc').value);\n});\n\n// ============= TEXT CONTROLS: live update on selected text =============\n/* 2026-10-14\uFF08\u7532\uFF09\uFF1A\u6309\u6765\u6E90\u53EA\u5199\u5BF9\u5E94\u5B57\u6BB5 \u2014\u2014 \u539F\u300C\u5168\u91CF\u5199\u56DE\u300D\u4F1A\u7528 #pfmTextColor \u7684\u65E7\u503C\u628A Fill \u9009\u7684\u8272\u8986\u76D6\u6389\u3002\n   field \u7F3A\u7701 = \u5168\u91CF\uFF08\u65E7\u884C\u4E3A\u96F6\u56DE\u5F52\uFF09\uFF1B#pfmTextColor \u5DF2\u79FB\u9664 \u21D2 \u53D6\u503C\u5E26 null \u5B88\u536B\u3002 */\nasync function applyTextControlsToActive(field){\n  var obj=canvas.getActiveObject();\n  if(!obj || !(obj instanceof fabric.IText)) return;\n  var wantFont=(!field||field==='font');\n  var fam=q('pfmFontSelect') ? q('pfmFontSelect').value : '';\n  /* 2026-09-12: \u7B49\u5B57\u4F53\u4E0B\u8F7D\u5B8C\u518D set\uFF0C\u5426\u5219\u753B\u5E03\u4E0A\u4ECD\u662F fallback \u5B57\u5F62\uFF08\u770B\u4E0D\u51FA\u6765\uFF09\u3002\n     await \u671F\u95F4\u7528\u6237\u53EF\u80FD\u5207\u6362\u4E86\u9009\u4E2D\u5BF9\u8C61 \u2192 \u56DE\u6765\u540E\u91CD\u65B0\u53D6\u4E00\u6B21 activeObject\u3002 */\n  if(wantFont && fam && !(window.__hdDraw&&window.__hdDraw.fontReady&&window.__hdDraw.fontReady(fam))){\n    try{ await window.__hdDraw.fontLoad(fam); }catch(e){}\n    obj=canvas.getActiveObject();\n    if(!obj || !(obj instanceof fabric.IText)) return;\n  }\n  var patch={};\n  if(wantFont) patch.fontFamily=fam;\n  if(!field || field==='size') patch.fontSize=parseInt(q('pfmFontSize').value)||36;\n  if(!field || field==='color'){ var _ce=q('pfmTextColor'); if(_ce) patch.fill=_ce.value; }\n  if(!field || field==='stroke') patch.stroke=q('pfmOutlineColor').value;\n  if(!field || field==='strokeW') patch.strokeWidth=parseInt(q('pfmOutlineWidth').value)||0;\n  if(Object.keys(patch).length) obj.set(patch);\n  if(!field || field==='arc'){ var _ae=q('pfmTextArc'); if(_ae) applyArcToText(obj,_ae.value); }\n  canvas.renderAll();saveState();\n}\nfunction syncTextPanel(){\n  var obj=canvas.getActiveObject();\n  if(!obj || !(obj instanceof fabric.IText)) return;\n  var sv=function(id,val){var el=q(id);if(el)el.value=val;};\n  sv('pfmFontSelect',(window.__hdDraw&&window.__hdDraw.fontVal)?window.__hdDraw.fontVal(obj.fontFamily):obj.fontFamily);   /* 2026-09-12: \u5F52\u4E00\u5316\u6210\u5E26\u5355\u5F15\u53F7\u7684 option \u503C\uFF08\u65E7\u8BBE\u8BA1\u5B58\u7684 'Arial' \u4E5F\u80FD\u547D\u4E2D\uFF09 */\n  if(window.__hdDraw&&window.__hdDraw.fontSyncUI) window.__hdDraw.fontSyncUI();\n  var s=obj.fontSize||36, sr=Math.round(s), svv=Math.max(8,Math.min(500,s));\n  sv('pfmFontSize',svv);\n  q('pfmFontSizeVal').textContent=sr;\n  sv('pfmTextColor',obj.fill||'#000000');\n  sv('pfmOutlineColor',obj.stroke||'#ffffff');\n  sv('pfmOutlineWidth',obj.strokeWidth||0);\n  sv('pfmTextArc',obj.pfmPathKind==='custom'?'path':(obj.path?(obj.pfmArcDir||'up'):'none'));\n}\n// Bind live updates on TEXT panel controls (Quick panel removed 2026-09-03)\n/* 2026-10-14\uFF08\u7532\uFF09\uFF1A\u6BCF\u63A7\u4EF6\u53EA\u5199\u81EA\u5DF1\u90A3\u4E00\u4E2A\u5B57\u6BB5\uFF08\u89C1\u4E0A\uFF09\u3002 */\n/* 2026-10-25\uFF08P0\uFF09\uFF1A\u5B57\u53F7\u6ED1\u6746 rAF \u5E27\u5185\u5408\u5E76 \u2014\u2014 \u539F\u6BCF\u6B21 input \u90FD set(fontSize)\uFF08\u89E6\u53D1 IText \u6574\u6BB5\u91CD\u6392\uFF09+ renderAll\uFF1B\n   \u5B9E\u6D4B CPU 10x\uFF08\u4F4E\u7AEF\u673A\uFF09\u4E0B\u4EC5 23.7fps\u3001\u5355\u5E27\u6700\u957F 350ms\u3002\u6539\u4E3A\u6BCF\u5E27\u6700\u591A\u4E00\u6B21\uFF0Cchange \u65F6\u8865\u4E00\u6B21\u4FDD\u8BC1\u7EC8\u6001\u3002 */\nvar _fsRaf = 0;\nq('pfmFontSize').addEventListener('input',function(){\n  q('pfmFontSizeVal').textContent=this.value;\n  if(_fsRaf) return;\n  _fsRaf = requestAnimationFrame(function(){ _fsRaf = 0; applyTextControlsToActive('size'); });\n});\nq('pfmFontSize').addEventListener('change',function(){\n  if(_fsRaf){ try{ cancelAnimationFrame(_fsRaf); }catch(e){} _fsRaf = 0; }\n  applyTextControlsToActive('size');\n});\nq('pfmFontSelect').addEventListener('change',function(){applyTextControlsToActive('font')});\n/* #pfmTextColor \u5DF2\u79FB\u9664 \u21D2 \u5B88\u536B\u5F0F\u7ED1\u5B9A\uFF08null \u4F1A\u4E2D\u65AD\u540E\u7EED\u7ED1\u5B9A\uFF09\u3002 */\ntry{ var _pfmTcEl=q('pfmTextColor'); if(_pfmTcEl) _pfmTcEl.addEventListener('input',function(){applyTextControlsToActive('color')}); }catch(e){}\nq('pfmOutlineColor').addEventListener('input',function(){applyTextControlsToActive('stroke')});\nq('pfmOutlineWidth').addEventListener('change',function(){applyTextControlsToActive('strokeW')});\nq('pfmTextArc').addEventListener('change',function(){applyTextControlsToActive('arc')});\n\n// Side tabs\ndocument.querySelectorAll('.pfm-stab').forEach(function(btn){\n  btn.addEventListener('click',function(){\n    /* 2026-09-19: \u5BF9\u8C61\u6A21\u5F0F tab\uFF08\u89C1\u6587\u4EF6\u540E\u6BB5 __pfmObjTabs\uFF09\u2014\u2014 \u5148\u5206\u6D41\uFF0C\u4E0D\u8D70\u7D20\u6750\u9762\u677F\u903B\u8F91 */\n    if(btn.dataset.objtab){ try{ window.__pfmObjTab(btn); }catch(e){} return; }\n    /* 2026-10-13\uFF08\u7532\uFF09\uFF1A\u5207\u7D20\u6750\u9762\u677F\uFF08\u542B Draw\uFF09\u21D2 \u5148\u6536\u300CImage effects\u300D\u5F39\u5361\u3002\n       \u684C\u9762\u7AEF\u8BE5\u5F39\u5361\u4E0D\u5728 .pfm-panel \u96C6\u5408\u91CC\uFF0C\u4E0D\u4E3B\u52A8\u5173\u4F1A\u4E0E\u7D20\u6750\u9762\u677F\u540C\u5C4F\uFF1B\n       \u6E05 `__pfmFxPrevPanel` \u21D2 \u4E0D\u8BA9 hd-image.close() \u7684\u300C\u6062\u590D\u300D\u5206\u652F\u628A\u65E7\u9762\u677F\u62A2\u56DE\u6765\n       \uFF08\u672C\u51FD\u6570\u968F\u540E\u81EA\u5DF1\u51B3\u5B9A\u663E\u793A\u54EA\u4E2A panel\uFF09\u3002 */\n    window.__pfmFxPrevPanel = null;\n    try{ if(window.__hdImage && window.__hdImage.close) window.__hdImage.close(); }catch(e){}\n    // Draw tab opens sketchpad modal directly \u2014 no intermediate panel\n    if(btn.dataset.panel === 'draw'){\n      document.querySelectorAll('.pfm-stab[data-panel]').forEach(function(b){b.classList.remove('sel')});\n      btn.classList.add('sel');\n      document.querySelectorAll('.pfm-panel').forEach(function(p){p.style.display='none'});\n      if(window.__hdDraw&&typeof window.__hdDraw.show === 'function') window.__hdDraw.show();\n      return;\n    }\n    document.querySelectorAll('.pfm-stab[data-panel]').forEach(function(b){b.classList.remove('sel')});btn.classList.add('sel');\n    document.querySelectorAll('.pfm-panel').forEach(function(p){p.style.display='none'});\n    var panelId='panel-'+btn.dataset.panel;if(q(panelId))q(panelId).style.display='block';\n    /* 2026-10-08: \u70B9 Image \u952E\u624D\u62C9\u7D20\u6750\u5E93\uFF08\u61D2\u52A0\u8F7D\uFF1B\u5931\u8D25\u4E0D\u5F71\u54CD\u9762\u677F\u672C\u8EAB\uFF09 */\n    if(btn.dataset.panel==='upload'&&window.__hdLib)try{window.__hdLib.open();}catch(e){}\n    // 2026-09-10: \u624B\u673A\u7AEF\u70B9\u5DE5\u5177 \u2192 \u81EA\u52A8\u4E0A\u6ED1\u5C5E\u6027\u9762\u677F\u62BD\u5C49\uFF08\u684C\u9762\u7AEF\u8BE5\u51FD\u6570\u4E3A\u7A7A\u64CD\u4F5C\uFF09\n    if(window.__pfmDrawerOpen)try{window.__pfmDrawerOpen();}catch(e){}\n  });\n});\n\n// 2026-09-15: \u753B\u677F\u5F39\u7A97\u5185\u7684\u300C\u77E2\u91CF\u5DE5\u5177\u300D\u5165\u53E3\uFF08Shape / Pen\uFF09\u3002\n//   \u4E24\u8005\u5DF2\u4ECE\u5DE6\u4FA7\u5DE5\u5177\u6761\u79FB\u51FA\uFF08\u5DE5\u5177\u6761 7\u21925 \u9879\uFF09\uFF1B\u5165\u53E3\u6539\u5230\u5F39\u7A97\u5DE5\u5177\u884C\u672B\u5C3E\uFF0C\n//   \u70B9\u5B83 = \u5173\u95ED\u5F39\u7A97 + \u628A\u8BBE\u8BA1\u677F\u5207\u5230\u5BF9\u5E94\u9762\u677F \u2014\u2014 **\u4ECD\u4EA7\u51FA\u77E2\u91CF\u5BF9\u8C61**\uFF08\u53EF\u7EE7\u7EED\u7F16\u8F91\u8282\u70B9\uFF09\uFF0C\n//   \u56E0\u6B64\u5E03\u5C14\u8FD0\u7B97\uFF08\u710A\u63A5/\u4FEE\u526A/\u76F8\u4EA4\uFF09\u4E0E\u300C\u6587\u5B57\u6CBF\u4EFB\u610F\u8DEF\u5F84\u300D\u7684\u8F93\u5165\u6765\u6E90\u4E0D\u53D7\u5F71\u54CD\u3002\nfunction pfmOpenPanel(name){\n  document.querySelectorAll('.pfm-stab[data-panel]').forEach(function(b){b.classList.remove('sel')});\n  var tab=document.querySelector('.pfm-stab[data-panel=\"'+name+'\"]');\n  if(tab)tab.classList.add('sel');\n  document.querySelectorAll('.pfm-panel').forEach(function(p){p.style.display='none'});\n  var pid='panel-'+name;if(q(pid))q(pid).style.display='block';\n  /* 2026-10-08: \u7A0B\u5E8F\u5316\u6253\u5F00 Image \u9762\u677F\uFF08\u753B\u677F\u5F39\u7A97\u7684\u5165\u53E3\u8D70\u7684\u662F\u8FD9\u6761\uFF09\u540C\u6837\u89E6\u53D1\u61D2\u52A0\u8F7D */\n  if(name==='upload'&&window.__hdLib)try{window.__hdLib.open();}catch(e){}\n  if(window.__pfmDrawerOpen)try{window.__pfmDrawerOpen();}catch(e){}\n}\nwindow.__pfmOpenPanel = pfmOpenPanel;\n/* ============================================================\n   \uD83C\uDD95 2026-10-08 \u7D20\u6750\u5E93\uFF08Image \u9762\u677F\u5185\u7684\u56FE\u5E93\uFF09\n   ------------------------------------------------------------\n   \u4E24\u6BB5\uFF1A\n     \u00B7 My Images \u2014\u2014 \u8BE5\u8BBE\u8BA1\u8005**\u81EA\u5DF1\u4E0A\u4F20\u8FC7**\u7684\u56FE\uFF0C\u79C1\u6709\uFF08\u53EA\u6709\u81EA\u5DF1\u770B\u5F97\u89C1\uFF09\uFF0C\u6392\u5728\u6700\u524D\n     \u00B7 Library   \u2014\u2014 \u6211\u4EEC\u63D0\u4F9B\u7684\u7D20\u6750\uFF0C\u5168\u7AD9\u5171\u7528\uFF08\u540E\u53F0\u300C\uD83E\uDDE9 \u7D20\u6750\u5E93\u300Dtab \u7EF4\u62A4\uFF09\n   \u53E3\u5F84\uFF08\u7528\u6237 2026-10-08 \u88C1\u51B3\uFF0C\u52FF\u64C5\u6539\uFF09\uFF1A\u79C1\u6709 \u00B7 \u514D\u5BA1 \u00B7 \u5355\u5F20 \u22645MB \u00B7 \u4E0D\u5206\u7C7B\uFF08\u7EAF\u65F6\u95F4\u5012\u5E8F\uFF09\n     \u00B7 \u5165\u53E3\u53EA\u5728 Image \u9762\u677F\u5185\uFF0C\u5DE6\u4FA7\u5DE5\u5177\u6761\u4E0D\u65B0\u589E\u952E\n   \u6570\u636E\u6E90\uFF1Abridge GET /assets/lib?email=&nickname= \u21D2 { mine:[], ours:[] }\n   \u70B9\u4E00\u683C = \u8C03 addImage(url) \u2014\u2014 \u4E0E\u62D6\u56FE**\u5B8C\u5168\u540C\u4E00\u6761\u8DEF\u5F84**\uFF08\u8DE8\u57DF crossOrigin / \u81EA\u52A8 fit \u6253\u5370\u533A 90% /\n   \u6709\u6548 DPI \u9884\u8B66 \u5168\u90E8\u81EA\u52A8\u751F\u6548\uFF09\u3002\u7981\u7B2C\u4E8C\u4EFD\u63D2\u56FE\u5B9E\u73B0\u3002\n   \u26A0\uFE0F \u5165\u5E93\u8981\u5148\u964D\u5230\u957F\u8FB9 \u22642000px\uFF1A\u62D6\u62FD\u533A\u5141\u8BB8 50MB \u800C\u7D20\u6750\u5E93\u4E0A\u9650 5MB\uFF1B\n      \u753B\u5E03\u4E0A\u4ECD\u7528\u539F\u56FE\uFF08\u672C\u6A21\u5757\u4E0D\u6539 addImage \u7684\u5165\u53C2\uFF09\u21D2 \u96F6\u56DE\u5F52\u3002\n   ============================================================ */\n\n/* ============================================================\n   2026-09-19: \u5E95\u90E8\u5DE5\u5177\u680F\u300C\u7D20\u6750\u6A21\u5F0F / \u5BF9\u8C61\u6A21\u5F0F\u300D\uFF08\u65B9\u6848 B\uFF09\n   - \u672A\u9009\u4E2D\uFF1A\u7D20\u6750\u7EC4\uFF08Upload/Text/Clipart/Layers/Draw\uFF09\n   - \u9009\u4E2D  \uFF1A\u5BF9\u8C61\u7EC4\u56FA\u5B9A 6 \u683C\uFF0C\u6309\u7C7B\u578B\u914D\u7F6E label/\u56FE\u6807/\u76EE\u6807\uFF0C\u4E0D\u9002\u7528\u7684\u7F6E\u7070\n   - \u533A\u5757\u663E\u9690\u7531 hd-canvas.css \u7684 .pfm-props[data-objtab] \u7EDF\u4E00\u8FC7\u6EE4\uFF0C\u8FD9\u91CC\u53EA\u5207 tab \u4E0E\u72B6\u6001\n   - \u53EA\u5728\u624B\u673A/\u5E73\u677F\u7AD6\u5C4F\u542F\u7528\uFF1B\u684C\u9762\u7AEF\u4FDD\u6301\u7D20\u6750\u7EC4\n   ============================================================ */\n\n[[\"pfmDrawVecShape\",\"shape\",\"Select a shape to place on the canvas\"],\n [\"pfmDrawVecPen\",\"pen\",\"Tap Start drawing, then draw on the canvas\"]].forEach(function(it){\n  var b=q(it[0]); if(!b) return;\n  b.addEventListener('click',function(){\n    if(window.__hdDraw&&window.__hdDraw.hide) window.__hdDraw.hide();\n    pfmOpenPanel(it[1]);\n    try{ if(window.__pfmToast) window.__pfmToast(it[2]); }catch(e){}\n  });\n});\n\n// ===== Mockup modal\uFF082026-10-06 \u7532\u7532\uFF09=====\n// \u72B6\u6001\u5373\u6309\u94AE\uFF1A\u539F\u300C\u4E00\u884C\u7070\u5C0F\u5B57\u72B6\u6001\u884C\u300D\u5DF2\u5220\u9664\uFF0C\u4E94\u6001\u5168\u90E8\u7531 #pfmBtnGenerate[data-state] \u8868\u8FBE\u3002\n// \u5355\u4E00\u771F\u6E90\uFF1A\u6240\u6709\u5206\u652F\u53EA\u8C03 pfmGenBtn(state,{text,title})\uFF0C\u4E0D\u518D\u5404\u5904\u5404\u5199\u4E00\u53E5 textContent\u3002\n//   idle(\u7D2B\u7C89\u6E10\u53D8=\u6539\u524D\u539F\u6837) / busy(\u7070+\u8F6C\u5708+disabled) / done(\u7EFF\u95EA1.6s\u56DEidle) / error(\u7EA2\u00B7\u70B9\u51FB\u539F\u4F4D\u91CD\u8DD1) / blocked(\u767D\u5E95\u7EA2\u6846\u00B7\u975E\u5931\u8D25)\n// \u957F\u6587\u6848\u4E0D\u8FDB\u6309\u94AE\uFF1A\u538B\u7F29\u6210\u77ED\u6001\u8BCD\uFF0C\u5B8C\u6574\u53E5\u5B50\u6302 title + \u5C4F\u5E55\u9605\u8BFB\u5668 live \u533A\u3002\n/* ===== 2026-10-06 \u620A\uFF1A\u7B49\u5F85\u8FC7\u7A0B\u7684\u300C\u6E29\u99A8\u63D0\u9192\u300D =====\n   2026-10-15\uFF1A\u6574\u5757\uFF0812.2 KB\uFF09\u5DF2\u5916\u7F6E\u5230 assets/hd-gen-warm.js \u2014\u2014 \u81EA\u5305\u542B\uFF0C\u4EC5\u4F9D\u8D56 DOM\u3002\n   window.hdGenPhase/Submitted/Busy/Start/Stop + window.pfmGenBtn \u5747\u5728\u65B0 asset \u5185\u5B9A\u4E49\uFF1B\n   \u52A0\u8F7D\u987A\u5E8F\u89C1 sections/design-canvas.liquid\uFF08\u7D27\u63A5\u672C\u6587\u4EF6\u4E4B\u540E\uFF0Cdefer\uFF09\u3002 */\n// ===== ADD TO CART\uFF08\u5B9E\u65F6\u8BBE\u8BA1\u4E0A\u67B6 \u2192 \u8D2D\u7269\u8F66\uFF09=====\n// \u628A\u6BCF\u4E2A\u6709 art \u7684\u9762\u5BFC\u6210 { placementKey: dataURL }\u3002\n// IMPORTANT: \u5FC5\u987B\u8FD4\u56DE Promise \u2014\u2014 loadFromJSON \u5F02\u6B65\uFF0C\u65E9\u671F\u540C\u6B65\u8FD4\u56DE\u7248\u672C\u6052\u5F97 {}\uFF0C\n// \u5BFC\u81F4\u6BCF\u6B21\u8BF7\u6C42\u90FD\u5E26\u7A7A faces\uFF08\"No design file provided\"\uFF09\u3002\n/* 2026-10-06\uFF1A**\u7A7A\u9762\u5B88\u536B**\u3002\u88C1\u526A\u77E9\u5F62\u5185\u6CA1\u6709\u4EFB\u4F55\u975E\u900F\u660E\u50CF\u7D20\u65F6\uFF0C\u5BFC\u51FA\u7684\u662F\u5168\u900F\u660E PNG\uFF0C\n   \u65E7\u94FE\u8DEF\u7167\u6837\u53D1\u7ED9 Printful \u21D2 \u51FA\u300C\u7A7A\u767D\u886C\u886B\u300D\uFF0C\u65E2\u4E0D\u62A5\u9519\u4E5F\u770B\u4E0D\u51FA\u539F\u56E0\u3002\n   \u5B9E\u6D4B\uFF1A\u574F\u6837\u672C\u975E\u900F\u660E\u50CF\u7D20 0.00%\uFF0C\u6B63\u5E38\u8BBE\u8BA1 18~27%\u3002\u5224\u636E\u53D6 0.05% \u4E0A\u9650\uFF08\u7F29\u5230 <=240px \u91C7\u6837\uFF09\u3002\n   \u8BFB\u4E0D\u5230\u50CF\u7D20 / \u89E3\u7801\u5931\u8D25\u4E00\u5F8B**\u653E\u884C**\uFF08\u5B81\u53EF\u653E\u8FC7\u4E5F\u4E0D\u8BEF\u6740\uFF09\u3002 */\nfunction hdFaceHasInk(dataUrl){\n  return new Promise(function(resolve){\n    try{\n      var im=new Image();\n      im.onload=function(){\n        try{\n          var W=im.naturalWidth||im.width||0, H=im.naturalHeight||im.height||0;\n          if(!W || !H){ resolve(true); return; }\n          var sc=Math.min(1, 240/W);\n          var w=Math.max(1, Math.round(W*sc)), h=Math.max(1, Math.round(H*sc));\n          var cv=document.createElement('canvas'); cv.width=w; cv.height=h;\n          var cx=cv.getContext('2d');\n          cx.clearRect(0,0,w,h);\n          cx.drawImage(im,0,0,w,h);\n          var dat=cx.getImageData(0,0,w,h).data, ink=0;\n          for(var i=3;i<dat.length;i+=4){ if(dat[i]>8) ink++; }\n          resolve(ink/Math.max(1,w*h) >= 0.0005);\n        }catch(e){ resolve(true); }\n      };\n      im.onerror=function(){ resolve(true); };\n      im.src=dataUrl;\n    }catch(e){ resolve(true); }\n  });\n}\nasync function hdFilterNonEmptyFaces(exports){\n  var kept={}, dropped=[], keys=Object.keys(exports||{});\n  for(var i=0;i<keys.length;i++){\n    var k=keys[i];\n    var hasInk=await hdFaceHasInk(exports[k]);\n    console.log('[faceFilter]', k, 'exportLen=' + ((exports[k]||'').length), 'hasInk=' + hasInk);\n    if(hasInk) kept[k]=exports[k]; else dropped.push(k);\n  }\n  return { kept: kept, dropped: dropped };\n}\n\n/* \uD83D\uDD34\uD83D\uDD34 2026-10-13\uFF08\u4E59 \u00B7 \u7528\u6237\u88C1\u51B3\u300C\u52FF\u4F24\u300D\uFF09\uFF1A**\u79BB\u5C4F\u5BFC\u51FA**\u3002\n   \u539F\u5B9E\u73B0\u5BF9\u6BCF\u4E2A\u9762\u8C03 `canvas.loadFromJSON()` \u6253\u5728**\u4E3B\u753B\u5E03**\u4E0A \u21D2 \u5BF9\u8C61\u5168\u90E8\u6362\u65B0\u5B9E\u4F8B \u21D2\n     \u2460 **\u9009\u4E2D\u4E22\u5931**\uFF08\u7528\u6237\u62A5\u300C\u9009\u4E2D\u56FE\u6848\u8FC7\u4E00\u4F1A\u81EA\u5DF1\u53D6\u6D88\u9009\u4E2D\u300D\uFF1B\u9884\u70ED\u6BCF\u505C\u7B14 5s \u8C03\u672C\u51FD\u6570\u4E00\u6B21\uFF0C\n         \u63A2\u9488\u5B9E\u6D4B T+5003ms \u5FC5\u4E22\uFF09\u2461 \u6253\u65AD\u6B63\u5728\u8FDB\u884C\u7684\u62D6\u52A8 \u2462 \u591A\u4E00\u5E27\u95EA\u3002\n   \u6539\u6CD5\uFF1A\u7528\u4E00\u5757**\u79BB\u5C4F StaticCanvas**\u627F\u8F7D\u5BFC\u51FA\uFF0C**\u4E3B\u753B\u5E03\u5168\u7A0B\u96F6\u6539\u52A8** \u21D2 \u4E0D\u4E22\u9009\u4E2D/\u4E0D\u6253\u65AD/\u4E0D\u95EA\u3002\n   \u26A0\uFE0F **\u5FC5\u987B\u4F4D\u7EA7\u7B49\u4EF7**\uFF08\u5DF2\u5BF9\u62CD\uFF1A\u4E3B\u753B\u5E03 toDataURL \u4E0E\u79BB\u5C4F toDataURL \u5728 crop \u4E0E clipPath\n      \u300C\u91CD\u5408\u300D\u4E0E\u300C\u9519\u5F00\u300D\u4E24\u79CD\u573A\u666F\u4E0B **\u5B57\u7B26\u4E32\u5B8C\u5168\u76F8\u540C**\uFF09\u2014\u2014 \u79BB\u5C4F\u9010\u9879\u5BF9\u9F50\u4E3B\u753B\u5E03\u7684\n      \u300C\u5C3A\u5BF8(3000\u00B2) + enableRetinaScaling:false + renderOnAddRemove:false + clipPath\u300D\u3002\n   \u26A0\uFE0F clipPath \u5B9E\u6D4B**\u4E0D\u53C2\u4E0E** toDataURL \u7684\u88C1\u526A\uFF08\u4E24\u573A\u666F\u4E0B\u5E26\u4E0E\u4E0D\u5E26\u7ED3\u679C\u4E00\u81F4\uFF09\uFF0C\n      \u8FD9\u91CC\u4ECD**\u539F\u6837\u590D\u5236**\u4E3B\u753B\u5E03\u5F53\u524D\u7684 clipPath\uFF0C\u4EE5\u4FDD\u6301\u6E32\u67D3\u914D\u7F6E\u4E0E\u4E3B\u753B\u5E03\u4E00\u81F4\uFF08\u96F6\u56DE\u5F52\u6700\u4FDD\u5B88\uFF09\u3002\n   \u26A0\uFE0F \u9644\u5E26\u6536\u76CA\uFF1A\u8DE8\u57DF\u56FE\u6C61\u67D3\u7684\u662F**\u79BB\u5C4F**\u753B\u5E03\uFF08\u7528\u5B8C\u5373\u5F03\uFF09\uFF0C\u4E0D\u518D\u8BA9\u4E3B\u753B\u5E03\u6C38\u4E45 SecurityError\u3002 */\nvar _pfmOffCv=null;\nfunction _pfmOffscreenCanvas(){\n  var w=canvas.getWidth(), h=canvas.getHeight();\n  if(_pfmOffCv){\n    if(_pfmOffCv.getWidth()===w && _pfmOffCv.getHeight()===h) return _pfmOffCv;\n    try{ _pfmOffCv.dispose(); }catch(e){}\n    _pfmOffCv=null;\n  }\n  /* \u9009\u9879\u9010\u9879\u5BF9\u9F50\u4E3B\u753B\u5E03\uFF08\u89C1\u672C\u6587\u4EF6 new fabric.Canvas \u7684\u9009\u9879\uFF09 */\n  var el=document.createElement('canvas');\n  el.width=w; el.height=h;\n  _pfmOffCv=new fabric.StaticCanvas(el,{renderOnAddRemove:false,enableRetinaScaling:false});\n  return _pfmOffCv;\n}\nfunction _pfmCopyClipTo(off){\n  var src=canvas.clipPath;\n  if(!src){ off.clipPath=null; return; }\n  if(src.type==='rect'){\n    off.clipPath=new fabric.Rect({\n      left:src.left, top:src.top, width:src.width, height:src.height,\n      absolutePositioned:true, originX:src.originX||'left', originY:src.originY||'top',\n      selectable:false, evented:false\n    });\n  } else if(src.clone){\n    src.clone(function(c){ off.clipPath=c; });\n  } else {\n    off.clipPath=null;\n  }\n}\nasync function exportAllPlacements(){\n  /* 2026-09-12: \u5BFC\u51FA\u524D\u7B49\u6240\u6709\u5DF2\u89E6\u53D1\u7684\u5B57\u4F53\u52A0\u8F7D\u5B8C\u6210 \u2014\u2014 printfile \u662F\u6805\u683C PNG\uFF0C\n     \u5B57\u4F53\u6CA1\u5C31\u7EEA\u5C31\u4F1A\u628A\u8BBE\u8BA1\u5370\u6210 fallback \u5B57\u4F53\uFF0C\u800C\u4E14\u8089\u773C\u770B\u4E0D\u51FA\u3002 */\n  try{ await window.__hdDraw.fontsReady(); }catch(e){}\n  // \u53EA**\u8BFB**\u4E3B\u753B\u5E03\uFF08toJSON \u4E0D\u6539\u53D8\u5B83\uFF09\uFF0C\u628A\u5F53\u524D\u9762 flush \u8FDB placementArt\u3002\n  // \u5FEB\u7167\u5FC5\u987B\u5265\u6389 grid + \u77AC\u6001\u9884\u89C8\u5C42\uFF1AdrawGrid() \u6BCF\u6B21 resize/\u5207\u9762\u90FD\u91CD\u5EFA grid\u3002\n  var snap = stripTransientObjects(canvas.toJSON());\n  var hasArt = canvas.getObjects().some(function(o){return !o.isGrid && !o.isPreview;});\n  placementArt[currentPlacement]={ json: JSON.stringify(snap), hasArt: hasArt };\n  var out={};\n  var keys = Object.keys(placementArt).filter(function(p){\n    return placementArt[p] && placementArt[p].hasArt && placementArt[p].json;\n  });\n  if(!keys.length){ return Promise.resolve(out); }\n  var seq = Promise.resolve();\n  keys.forEach(function(k){\n    seq = seq.then(function(){\n      return new Promise(function(resolve, reject){\n        var objs;\n        try{ objs = JSON.parse(placementArt[k].json).objects || []; }\n        catch(e){ reject(new Error('export failed for \"' + k + '\": bad snapshot')); return; }\n        /* 2026-10-19\uFF08\u65B9\u6848\u4E59\uFF09\uFF1A\u6362\u56DE\u539F\u56FE \u2014\u2014 \u8BB0\u4E0B\u9884\u89C8\u6863\u5C3A\u5BF8\uFF0Cenliven \u56DE\u8C03\u91CC\u6309\u300C\u9884\u89C8/\u539F\u56FE\u300D\u8C03 scale\u3002\n           \u539F\u56FE\u6BD4\u9884\u89C8\u5927\uFF0Cscale \u4E0D\u8C03\u4F1A\u653E\u5927 \u21D2 \u9519\u4F4D\uFF1Benliven \u7B49\u56FE\u7247\u52A0\u8F7D\u5B8C\u624D\u56DE\u8C03 \u21D2 \u65E0\u7A7A\u767D\u7ADE\u6001\u3002 */\n        var _previewSizes = {};\n        try { objs.forEach(function(o, i){\n          if(o._pfmOrigUrl){\n            _previewSizes[i] = { w: o.width || 1, h: o.height || 1 };\n            o.src = o._pfmOrigUrl;\n            /* \uD83D\uDD34 2026-10-24\uFF1A\u540C\u6B65\u628A JSON \u7684 width/height \u6539\u6210\u539F\u56FE\u5C3A\u5BF8 \u2014\u2014 fabric enliven \u4F1A\u7528 JSON \u7684 width\n               \u8986\u76D6\u539F\u56FE\u81EA\u7136\u5BBD\uFF0C\u82E5\u4ECD\u5199\u9884\u89C8\u6863\u5BBD(1200)\uFF0C\u6362\u56FE\u540E\u5BF9\u8C61 width \u4ECD\u662F 1200\uFF0Cscale \u518D\u4E58\u300C\u9884\u89C8/\u539F\u56FE\u300D\u21D2 \u56FE\u6848\u7F29\u5C0F 0.6 \u500D\u3001\u4F4D\u7F6E\u53D8\u5F62\u3002\n               \u8FD9\u91CC\u6539\u6210\u539F\u56FE\u5BBD\u540E\uFF0Cenliven \u5F97\u5230 width=\u539F\u56FE\u5BBD\uFF0Cscale \u6309 \u9884\u89C8/\u539F\u56FE \u8FD8\u539F\uFF0C\u663E\u793A\u5C3A\u5BF8\u624D\u4E0E\u753B\u5E03\u4E00\u81F4\u3002 */\n            if(o._pfmOrigW) o.width = o._pfmOrigW;\n            if(o._pfmOrigH) o.height = o._pfmOrigH;\n          }\n        }); } catch(e) {}\n        // fabric.util.enlivenObjects \u53D6\u4EE3 loadFromJSON \u2014\u2014 \u53EA\u628A\u5BF9\u8C61\u300C\u590D\u6D3B\u300D\u5230\u79BB\u5C4F\u753B\u5E03\uFF0C\n        // \u4E3B\u753B\u5E03\u4E00\u4E2A\u5B57\u8282\u90FD\u4E0D\u52A8\uFF08loadFromJSON \u4F1A\u5148\u6E05\u4E3B\u753B\u5E03\u518D\u52A0\u8F7D\uFF09\u3002\n        fabric.util.enlivenObjects(objs, function(alive){\n          try{\n            var off=_pfmOffscreenCanvas();\n            off.clear();                 // \u5148\u6E05\uFF08clear \u4F1A\u91CD\u7F6E clipPath/\u80CC\u666F\uFF09\n            /* 2026-10-18\uFF08\u7528\u6237\u62A5\uFF1A\u8DF3\u8FC7\u6709\u56FE\u7684\u9762\uFF09\u2014\u2014 **\u4E0D\u518D\u590D\u5236\u4E3B\u753B\u5E03\u7684 clipPath**\uFF1A\n               \u5B83\u662F\u300C\u5F53\u524D\u663E\u793A\u9762\u300D\u7684\u5370\u533A\uFF1B\u5BFC\u51FA\u5176\u5B83\u9762\u65F6\u4F1A\u628A\u5BF9\u8C61\u6574\u5757\u88C1\u6389 \u21D2 \u5BFC\u51FA\u7A7A\u767D \u21D2\n               \u88AB hdFaceHasInk \u5224\u6210\u300C\u7A7A\u9762\u300D\u800C\u8DF3\u8FC7\u3002toDataURL \u5DF2\u6309\u8BE5\u9762\u81EA\u5DF1\u7684\n               left/top/width/height \u88C1\u526A\uFF0C\u8DB3\u591F\u7CBE\u786E \u2713 */\n            off.clipPath = null;\n            alive.forEach(function(o, i){\n              if(o.isGrid || o.isPreview) return;\n              var _ps = _previewSizes[i];\n              if(_ps){\n                var _ow = o._pfmOrigW || o.width || _ps.w, _oh = o._pfmOrigH || o.height || _ps.h;   /* \u7528\u663E\u5F0F\u8BB0\u5F55\u7684\u539F\u56FE\u5C3A\u5BF8\uFF0C\u907F\u514D fabric \u590D\u6D3B width \u8BED\u4E49\u6F02\u79FB */\n                if(_ow > 0 && _oh > 0){\n                  o.scaleX = (o.scaleX || 1) * (_ps.w / _ow);\n                  o.scaleY = (o.scaleY || 1) * (_ps.h / _oh);\n                }\n              }\n              off.add(o);\n            });\n            off.renderAll();\n            // 2026-08-30: canvas=\u6574\u4EF6\u8863\u670D \u2014\u2014 printfile \u4E25\u683C\u88C1\u526A\u6253\u5370\u533A\u77E9\u5F62\uFF1B\n            // multiplier \u8FD8\u539F\u5230\u6253\u5370\u533A\u5B9E\u9645\u5206\u8FA8\u7387\uFF08printWidth\uFF09\u3002\n            var _sp = originalPrintAreaSpecs[k] || printAreaSpecs[k];\n            if(_sp && _sp.width > 0){\n              var _mult = (_sp.printWidth || _sp.width) / _sp.width;\n              out[k]=off.toDataURL({format:'png', left:_sp.left, top:_sp.top, width:_sp.width, height:_sp.height, multiplier:_mult});\n            } else {\n              /* 2026-10-14: \u53D6\u4E0D\u5230\u8BE5\u9762\u7684\u6253\u5370\u533A\u89C4\u683C \u21D2 **\u663E\u5F0F\u5931\u8D25**\u3002\u539F\u5B9E\u73B0\u9000\u56DE\u300C\u6574\u5E45\u753B\u5E03\u300DtoDataURL\uFF0C\n                 \u7B49\u4E8E\u628A\u6574\u5F20\u6A21\u677F\uFF08\u542B\u8863\u670D\u81EA\u8EAB\uFF09\u5F53\u5370\u5237\u6587\u4EF6\u4EA4\u7ED9 Printful \u21D2 \u5370\u9519\u8303\u56F4\u4E14\u7528\u6237\u65E0\u611F\u3002 */\n              reject(new Error('print area unavailable for \"' + k + '\"'));\n              return;\n            }\n          }catch(e){\n            // 2026-09-14: \u5BFC\u51FA\u5FC5\u987B**\u663E\u5F0F\u5931\u8D25**\uFF08toDataURL \u5728\u8DE8\u57DF\u6C61\u67D3\u65F6\u629B SecurityError\uFF09\u3002\n            reject(new Error('export failed for \"' + k + '\": ' + ((e && e.message) || e)));\n            return;\n          }\n          resolve();\n        });\n      });\n    });\n  });\n  /* \u4E3B\u753B\u5E03\u5168\u7A0B\u672A\u52A8 \u21D2 \u65E0\u9700\u300C\u6062\u590D\u5F53\u524D\u9762\u300D\uFF0C\u9009\u4E2D / \u62D6\u52A8 / \u7F29\u653E / \u64A4\u9500\u6808\u5168\u90E8\u539F\u6837\u4FDD\u7559\u3002 */\n  return seq.then(function(){ return out; });\n}\n// ===== 2026-09-03: Creator onboarding \u2014 2026-10-14 \u5DF2\u5916\u7F6E\uFF08\u89C1\u4E0A\u65B9 window.__hdLibDeps \u5904\u6CE8\u91CA\uFF09=====\n// \u5168\u90E8\u903B\u8F91\u642C\u53BB assets/hd-signup.js\uFF08window.__hdSignup\uFF09\u3002\u672C\u5904\u53EA\u7559\u4E24\u6837\uFF1A\n//   \u2460 hdcoToast \u2014\u2014 \u8BBE\u8BA1\u53F0\u7684**\u901A\u7528 toast**\uFF08Layers/Image/Vector \u6865\u63A5\u4E0E\u5404\u7C7B\u63D0\u793A\u90FD\u5728\u7528\uFF09\uFF0C\n//      \u4F4D\u7F6E\u8981\u8DDF\u968F\u8BBE\u8BA1\u677F \u21D2 \u5C5E\u4E8E\u8BBE\u8BA1\u53F0\uFF0C\u4E0D\u8DDF\u7740\u5F39\u7A97\u8D70\uFF08.hdco-toast \u6837\u5F0F\u4ECD\u7559\u5728 hd-canvas.css\uFF09\u3002\n//   \u2461 \u540C\u540D\u8584\u8F6C\u53D1 + \u4E09\u6761\u63A5\u7EBF \u2014\u2014 \u8BA9\u672C\u6587\u4EF6\u91CC 150+ \u5904\u65E2\u6709\u5F15\u7528\u96F6\u6539\u52A8\u3002\nfunction hdcoToast(msg){\n  var t=q('hdcoToast'); if(!t) return;\n  /* 2026-09-13: \u8BBE\u8BA1\u677F\u6253\u5F00\u65F6\u8BA9\u5230\u9876\u680F\u4E0B\u65B9 \u2014\u2014 toast \u662F fixed/top:18px \u4E14 z-index \u9AD8\u4E8E\u8BBE\u8BA1\u677F\u5C42\uFF0C\n     \u539F\u4F4D\u7F6E\u4F1A\u5B9E\u6321\u4F4F \u2190 Back / \u21B6\u21B7 / \u2714 Apply\uFF08\u5B9E\u6D4B\u91CD\u53E0 7451 px\u00B2\uFF09\u3002\u5173\u677F\u540E\u8FD8\u539F\u3002\n     \u987A\u4FBF\u628A\u65F6\u957F 7s \u6536\u5230 3.5s\uFF08\u4E0E\u8BBE\u8BA1\u677F\u5185 toast \u7EDF\u4E00\uFF09\u3002 */\n  try{\n    var bd=q('pfmBoard');\n    t.style.top = (bd && bd.getBoundingClientRect().width > 10) ? '68px' : '';\n  }catch(e){}\n  t.innerHTML=msg; t.style.display='block';\n  clearTimeout(hdcoToast._t);\n  hdcoToast._t=setTimeout(function(){ t.style.display='none'; }, 3500);\n}\n\n/* ===== \u5916\u7F6E\u6A21\u5757\uFF08assets/hd-signup.js\uFF09\u7684\u8584\u8F6C\u53D1 \u2014\u2014 \u5168\u90E8\u662F function \u58F0\u660E\uFF0Choist \u53EF\u7528 ===== */\nfunction _HDSU_(){ return window.__hdSignup || null; }\nfunction hdcoLoad(){ var S=_HDSU_(); return S ? S.load() : null; }\nfunction hdcoSaveObj(o){ var S=_HDSU_(); if(S) S.saveObj(o); }\nfunction hdcoShow(){ var S=_HDSU_(); if(S) S.show(); }\nfunction hdcoClose(){ var S=_HDSU_(); if(S) S.close(); }\nfunction hdcoHint(v){ var S=_HDSU_(); if(S) S.hint(v); }\nfunction hdcoRequireFields(){ var S=_HDSU_(); if(S) S.requireFields(); }\nfunction hdcoFieldsOk(){ var S=_HDSU_(); return S ? S.fieldsOk() : false; }\nfunction hdcoTakenNow(){ var S=_HDSU_(); return S ? S.takenNow() : false; }\nfunction hdcoSyncSaveBtn(){ var S=_HDSU_(); if(S) S.syncSaveBtn(); }\nfunction hdcoCheckEmail(a,b){ var S=_HDSU_(); return S ? S.checkEmail(a,b) : Promise.resolve(''); }\nfunction hdcoApplyCheck(c){ var S=_HDSU_(); if(S) S.applyCheck(c); }\nfunction hdcoScheduleCheck(){ var S=_HDSU_(); if(S) S.scheduleCheck(); }\nfunction hdcoCreds(){ var S=_HDSU_(); return S ? S.creds() : { email:'', nickname:'' }; }\nfunction hdcoAfterVerified(e,n){ var S=_HDSU_(); if(S) S.afterVerified(e,n); }\nfunction hdcoBind(){ var S=_HDSU_(); if(S) S.bind(); }\nfunction hdcoSyncSaveBtnSafe(){ if(typeof hdcoSyncSaveBtn==='function') hdcoSyncSaveBtn(); }\n\n/* ===== \u4E09\u6761\u63A5\u7EBF\uFF1A\u5916\u7F6E\u6A21\u5757\u53EA\u8BFB\u8FD9\u51E0\u4E2A window \u94A9\u5B50 ===== */\nwindow.__hdSignupBoot = function(){\n  var S=_HDSU_(); if(!S) return;\n  if(S.setToast) S.setToast(hdcoToast);   /* \u63D0\u793A\u8D70\u8BBE\u8BA1\u53F0\u81EA\u5DF1\u7684 toast\uFF08\u8DDF\u968F\u8BBE\u8BA1\u677F\u5B9A\u4F4D\uFF09 */\n  S.bind();\n  S.show();                                /* \u8FDB\u7AD9\u5373\u5F39\uFF08\u6309\u6863\u6848/Skip \u89C4\u5219\uFF1B?signup=1 \u4ECD\u4F1A\u5F3A\u5236\uFF09 */\n};\nwindow.__hdSignupOnSave = function(email){\n  /* \u70B9 Save \u89E6\u53D1\u7684\u6536\u96C6\u5B8C\u6210\u540E\uFF0C\u56DE\u5230\u8BBE\u8BA1\u53F0\u7684\u4FDD\u5B58\u6D41\u7A0B\uFF08\u539F _pfmSavePending \u5206\u652F\uFF09\u3002\n     _pfmSavePending \u662F var\uFF08hoist\uFF09\u3001pfmDoSave \u662F\u51FD\u6570\u58F0\u660E \u21D2 \u6B64\u5904\u5F15\u7528\u5B89\u5168\u3002 */\n  if(_pfmSavePending){ _pfmSavePending=false; pfmDoSave(email); }\n};\nwindow.__hdSignupIsPending = function(){ return !!_pfmSavePending; };\n\n/* ===== 2026-09-13: Save design \u2014\u2014 \u628A\u5F53\u524D\u8BBE\u8BA1\u6302\u5230\u90AE\u7BB1\uFF0C\u6362\u8BBE\u5907\u4E5F\u80FD\u627E\u56DE =====\n   \u4E0E Add to Cart \u5171\u7528 pfmDesignId / pfmUploadFaces\uFF08\u7981\u7B2C\u4E8C\u4EFD\u5B9E\u73B0\uFF09\u3002 */\nvar _pfmSavePending=false;\n\nfunction pfmDesignId(exports){\n  /* Deterministic design id from ALL faces (multi-face hash) so a front+back design\n     creates a DIFFERENT product than front-only (pricing differs by face count). */\n  return 'd'+(function(parts){var h=0;for(var i=0;i<parts.length;i++){var s=parts[i];for(var j=0;j<s.length;j++){h=((h<<5)-h)+s.charCodeAt(j);h|=0;}}return Math.abs(h).toString(36);})(Object.keys(exports).sort().map(function(k){return exports[k].slice(0,200000);}));\n}\n\n/* \u9010\u9762\u987A\u5E8F\u4E0A\u4F20\uFF1B\u62BD\u6210\u516C\u5171\u539F\u8BED\u540E Save \u4E0E Add to Cart \u884C\u4E3A\u5B8C\u5168\u4E00\u81F4\uFF08\u542B designIdBase \u5E42\u7B49\uFF09 */\nfunction pfmUploadFaces(exports, designIdBase){\n  var seq=Object.keys(exports), acc={};\n  function one(){\n    if(!seq.length) return Promise.resolve(acc);\n    var k=seq.shift();\n    return ft(B+'/upload-design',{method:'POST',headers:{'Content-Type':'application/json'},\n      body:JSON.stringify({designBase64:exports[k],productType:String(pid),placementKey:k,designIdBase:designIdBase||''})\n    }, 90000).then(function(r){return r.json()}).then(function(d){\n      if(!d.success||!d.designId)throw new Error(d.error||'design upload failed');\n      acc[k]={ url:B+'/design/'+d.designId+'.png', designId:d.designId };\n      return one();\n    });\n  }\n  return one();\n}\n\n/* 2026-09-17: \u628A\u5404\u9762\u7684 fabric \u5DE5\u7A0B JSON \u5B58\u5230 /designs/doc\uFF08\u4E4B\u540E\u53EF loadFromJSON \u7EE7\u7EED\u7F16\u8F91\uFF09\u3002\n   \u6570\u636E\u6E90 = placementArt \u2014\u2014 exportAllPlacements() \u5DF2\u628A\u6BCF\u9762 flush \u8FDB\u53BB\u4E14 strip \u8FC7 grid/preview\uFF0C\n   \u6240\u4EE5\u8FD9\u91CC\u4E0D\u91CD\u590D\u9020\u5FEB\u7167\u3002id \u7528 pfmDesignId(exports)\uFF08\u8BBE\u8BA1\u5185\u5BB9\u54C8\u5E0C\uFF09\u21D2 \u540C\u4E00\u8BBE\u8BA1\u91CD\u590D\u4FDD\u5B58\u662F\u8986\u76D6\uFF0C\u5929\u7136\u5E42\u7B49\u3002\n   fire-and-forget\uFF1A\u5931\u8D25\u4E0D\u5F71\u54CD Save \u6210\u529F\uFF08\u7528\u6237\u81F3\u5C11\u8FD8\u6709 PNG + \u90AE\u7BB1\u6863\u6848\uFF09\u3002 */\nfunction pfmSaveDoc(docId){\n  try{\n    var doc={};\n    Object.keys(placementArt).forEach(function(k){\n      var a=placementArt[k];\n      if(a && a.hasArt && a.json){ try{ doc[k]=JSON.parse(a.json); }catch(e){} }\n    });\n    if(!Object.keys(doc).length) return;\n    ft(B+'/designs/doc',{method:'POST',headers:{'Content-Type':'application/json'},\n      body:JSON.stringify({designId:String(docId), doc:doc})}, 60000).catch(function(){});\n  }catch(e){}\n}\n\nfunction pfmDoSave(email){\n  var btn=q('pfmBtnSaveDesign'), orig=btn?btn.textContent:'';\n  if(btn){ btn.textContent='Saving\u2026'; btn.disabled=true; }\n  return exportAllPlacements().then(function(exports){\n    var keys=Object.keys(exports);\n    if(!keys.length) throw new Error('empty');\n    var designId=pfmDesignId(exports);\n    return pfmUploadFaces(exports, designId).then(function(faces){\n      var urls={}; keys.forEach(function(k){ urls[k]=faces[k].url; });\n      /* 2026-09-13: \u6635\u79F0\u968F Save \u4E00\u8D77\u4E0A\u62A5 \u2192 \u540E\u7AEF design_users \u5EFA\u6863\uFF08\u90AE\u7BB1\u552F\u4E00\uFF0C\u6635\u79F0\u9996\u6B21\u767B\u8BB0\u540E\u4E0D\u8986\u76D6\uFF09 */\n      var _prof=hdcoLoad()||{};\n      return ft(B+'/designs/claim',{method:'POST',headers:{'Content-Type':'application/json'},\n        body:JSON.stringify({ email:String(email||''), nickname:String(_prof.nick||''), productId:String(pid),\n          color:(typeof selColor!=='undefined'?String(selColor||''):''),\n          designId:designId, primaryUrl:urls[keys[0]], faces:urls })\n      }, 30000).then(function(r){\n        /* 2026-10-06: \u539F\u5B9E\u73B0 `return r.json()` \u540E\u76F4\u63A5\u5F53\u6210\u529F \u21D2 \u670D\u52A1\u7AEF 5xx/429 \u53EA\u8981\u56DE JSON\uFF0C\n           \u6309\u94AE\u5C31\u53D8\u300C\u2713 Saved\u300D+ toast\u300CDesign saved\u300D= **\u5047\u6210\u529F**\uFF08\u7528\u6237\u4EE5\u4E3A\u5B58\u4E86\uFF0C\u5B9E\u9645\u6CA1\u5B58\uFF09\u3002\n           \u6B63\u786E\u6A21\u5F0F\u4E0E\u672C\u5E93\u65E2\u6709\u5199\u6CD5\u4E00\u81F4\uFF08\u89C1\u540C\u6587\u4EF6 /designs/doc \u9884\u8F7D\u5904\u7684 r.ok \u5224\u5B9A\uFF09\u3002\n           `r.json().catch(\u2026)` \u515C\u4F4F HTML \u9519\u8BEF\u9875\uFF08\u975E JSON \u65F6 json() \u4F1A reject\uFF09\u3002 */\n        return r.json().catch(function(){ return {}; }).then(function(d){\n          if(!r.ok || !d || !d.ok) throw new Error((d&&d.error)||('Save failed (HTTP '+r.status+')'));\n          return d;\n        });\n      }).then(function(d){\n        /* 2026-09-17: \u987A\u624B\u5B58\u4E00\u4EFD\u53EF\u518D\u7F16\u8F91\u7684\u5DE5\u7A0B\u6587\u4EF6\uFF08PNG \u53EA\u80FD\u770B\uFF0C\u5DE5\u7A0B\u80FD\u6539\uFF09 */\n        pfmSaveDoc(designId);\n        return d;\n      });\n    });\n  }).then(function(d){\n    if(btn){ btn.textContent='\\u2713 Saved'; btn.disabled=false; setTimeout(function(){ btn.textContent=orig; },2200); }\n    hdcoToast('Design saved &mdash; reopen it any time with your email');\n    return d;\n  }).catch(function(e){\n    if(btn){ btn.textContent=orig; btn.disabled=false; }\n    /* 2026-10-06: \u539F\u5B9E\u73B0\u5BF9\u4EFB\u4F55\u5931\u8D25\u90FD\u56DE\u300Cplease try again\u300D\u2014\u2014\n       \u2460 \u7A7A\u753B\u5E03\uFF08\u672C\u9875\u552F\u4E00\u53EF\u5224\u5B9A\u7684\u771F\u56E0\uFF09\u91CD\u8BD5\u6C38\u8FDC\u5931\u8D25\uFF0C\u6587\u6848\u8BEF\u5BFC\uFF1B\n       \u2461 \u670D\u52A1\u7AEF\u771F\u56E0\uFF08\u5982\u9650\u6D41\uFF09\u88AB\u541E\u6389\uFF0C\u7528\u6237\u65E0\u4ECE\u4E0B\u624B\u3002\n       \u73B0\u6309\u771F\u56E0\u5206\u6863\uFF1B\u7A7A\u6001\u53E3\u5F84\u4E0E\u540C\u9875 Add to Cart \u7684\u300CDesign is empty \u2014 add something first\u300D\u7EDF\u4E00\u3002 */\n    var _em=String((e&&e.message)||'');\n    if(_em==='empty'){ hdcoToast('Design is empty &mdash; add something first'); }\n    else if(/too many|slow down/i.test(_em)){ hdcoToast('Too many saves &mdash; please wait a moment and try again'); }\n    /* 2026-10-11\uFF1A\u540E\u7AEF\u7B2C\u4E8C\u9053\u95F8\u515C\u4F4F\uFF08\u524D\u7AEF\u9884\u68C0\u6F0F\u7F51 / \u5E76\u53D1\u62A2\u7ED1\uFF09\u21D2 \u91CD\u5F00\u5F39\u7A97\u505C\u5728\u63D0\u793A\u6001\uFF0C\n       \u5E76\u6E05\u6389\u672C\u5730\u90A3\u4E2A\u4E0D\u5C5E\u4E8E\u4ED6\u7684\u90AE\u7BB1\uFF08\u5426\u5219\u4E4B\u540E\u6BCF\u6B21 Save \u90FD\u8DF3\u8FC7\u5F39\u7A97\u3001\u76F4\u63A5 409\uFF09\u3002 */\n    else if(_em==='email_taken'){\n      try{ var _p=hdcoLoad()||{}; _p.email=''; hdcoSaveObj(_p); }catch(e3){}\n      var _w=q('hdcoWrap'); if(_w) _w.style.display='flex';\n      var _em2=q('hdcoEmail'); if(_em2) _em2.value='';\n      if(typeof hdcoHint==='function') hdcoHint(true);\n      if(window.HDET) HDET.mark(true);\n      if(typeof hdcoSyncSaveBtn==='function') hdcoSyncSaveBtn();\n      hdcoToast('This email is already in use &mdash; verify it or contact us');\n    }\n    else if(_em==='nickname_reserved'){\n      var _w2=q('hdcoWrap'); if(_w2) _w2.style.display='flex';\n      if(typeof hdcoHint==='function') hdcoHint(true);\n      hdcoApplyCheck('nickname_reserved');\n    }\n    else { hdcoToast('Could not save this design &mdash; please try again'); }\n    throw e;\n  });\n}\n\n/* \u70B9 Save\uFF1A\u8FD8\u6CA1\u7559\u90AE\u7BB1\u5C31\u5148\u6253\u5F00\u5F39\u7A97\u6536\u96C6\uFF08\u5B58\u597D\u540E\u81EA\u52A8\u7EE7\u7EED\uFF0C\u89C1 hdcoBind \u7684 save\uFF09 */\nfunction pfmSaveDesign(){\n  var prof=hdcoLoad()||{};\n  var email=String(prof.email||'').trim();\n  var nick=String(prof.nick||'').trim();\n  /* 2026-10-06: \u90AE\u7BB1\u6216\u8BBE\u8BA1\u5E08\u540D\u4EFB\u4E00\u7F3A\u5931 \u21D2 \u62E6\u4E0B\u5E76\u6253\u5F00\u5F39\u7A97\uFF08\u9884\u586B\u5DF2\u6709\u503C + \u5207\u300C\u5FC5\u586B\u300D\u6587\u6848\uFF09\u3002\n     \u539F\u5B9E\u73B0\u53EA\u5224\u90AE\u7BB1 \u21D2 \u300C\u6709\u90AE\u7BB1\u3001\u65E0\u6635\u79F0\u300D\u7684\u8BBF\u5BA2\u76F4\u63A5\u4FDD\u5B58\uFF0C\u6863\u6848\u6C38\u8FDC\u6CA1\u6709\u6635\u79F0\u3002 */\n  if(!email || !nick){\n    _pfmSavePending=true;\n    var w=q('hdcoWrap'); if(w) w.style.display='flex';\n    var ne=q('hdcoName'), ee=q('hdcoEmail');\n    if(ne && !String(ne.value||'').trim() && nick) ne.value=nick;\n    if(ee && !String(ee.value||'').trim() && email) ee.value=email;\n    if(typeof hdcoHint==='function') hdcoHint(true);\n    /* 2026-10-11\uFF1A\u6E05\u6389\u4E0A\u4E00\u6B21\u7684\u5360\u7528\u63D0\u793A + \u6309\u5DF2\u9884\u586B\u7684\u503C\u91CD\u7B97 Save \u6001\uFF08\u90FD\u5408\u6CD5\u5219\u987A\u624B\u67E5\u4E00\u6B21\u5360\u7528\uFF09 */\n    if(window.HDET) HDET.reset();\n    if(typeof hdcoScheduleCheck==='function') hdcoScheduleCheck();\n    hdcoToast('Enter your email and designer name to save this design');\n    return;\n  }\n  pfmDoSave(email);\n}\nwindow.__hdAct.bind('pfmBtnSaveDesign', pfmSaveDesign);\n/* ===== Save design: end ===== */\n\n/* 2026-10-16\uFF08\u4E59\uFF09\uFF1ABuy it now \u8FDB\u884C\u6001 \u2014\u2014 \u590D\u7528\u591A\u8272\u51FA\u56FE\u6309\u94AE\u540C\u4E00\u5957\u89C6\u89C9\uFF08fill/sheen/dots\uFF09\uFF0C\u65F6\u95F4\u9A71\u52A8\u8FDB\u5EA6\u3002\n   \u72B6\u6001\uFF1Abusy\uFF0810%\u2192100% \u8FDE\u7EED\u589E\u957F\uFF09/ done\uFF08\u2713 + \u95EA\u4E00\u6B21\uFF09/ reset\u3002CSS \u4E0E keyframes \u4E0E\u591A\u8272\u51FA\u56FE\u6309\u94AE\u5171\u4EAB\uFF0C\u7981\u7B2C\u4E8C\u4EFD\u5B9E\u73B0\u3002 */\nfunction hdAtcBusy(on){\n  var btn = q('pfmBtnAddToCart'); if (!btn) return null;\n  if (!on) { if (btn._busyT) { clearInterval(btn._busyT); btn._busyT = null; } btn.classList.remove('pfm-btn-busy'); return btn; }\n  btn.disabled = true;\n  btn.classList.add('pfm-btn-busy');\n  btn.innerHTML = '<span class=\"pfm-fill\" style=\"width:10%\"></span><span class=\"pfm-sheen\"></span><span class=\"pfm-lbl\"><span class=\"pfm-dots\"><i></i><i></i><i></i></span>Creating &amp; adding\u2026</span>';\n  var t0 = Date.now();\n  btn._busyT = setInterval(function () {\n    /* 2026-10-17\uFF1A\u5C01\u9876 95% \u2014\u2014 \u5047\u8FDB\u5EA6\u5230 100% \u800C\u771F\u5B9E\u6D41\u7A0B\uFF08\u5EFA\u54C1+\u6302 5 \u56FE\uFF09\u8FD8\u5728\u8DD1\uFF0C\u4F1A\u663E\u5F97\u300C\u6EE1\u4E86\u4E0D\u52A8\u300D\u3002\n       95% \u505C\u4F4F+\u4E09\u70B9\u52A8\u753B\u8868\u793A\u4ECD\u5728\u5FD9\uFF1B\u771F\u6B63\u5B8C\u6210\u65F6 hdAtcDone() \u76F4\u63A5\u663E\u793A \u2713\u3002 */\n    var pct = Math.min(95, 10 + (Date.now() - t0) / 120);\n    var f = btn.querySelector('.pfm-fill'); if (f) f.style.width = pct + '%';\n  }, 200);\n  return btn;\n}\nfunction hdAtcDone(){\n  var btn = hdAtcBusy(false); if (!btn) return;\n  btn.innerHTML = '<span class=\"pfm-lbl\">\u2713 Added \u2014 Checkout</span>';\n  btn.classList.add('pfm-flash');\n  setTimeout(function () { btn.classList.remove('pfm-flash'); }, 500);\n  btn.disabled = false;\n}\nfunction hdAtcReset(txt){\n  var btn = hdAtcBusy(false); if (!btn) return;\n  if (txt) btn.textContent = txt;\n  btn.disabled = false;\n}\n\n/* ===== 2026-10-28\uFF1A\u5B98\u65B9\u8BBE\u8BA1\u6A21\u5F0F\uFF08?official=1\uFF09=====\n   \u540E\u53F0\u300C\u5B98\u65B9\u8BBE\u8BA1\u300Dtab \u7528 iframe \u5D4C\u8BBE\u8BA1\u53F0\uFF0C\u5E26 official=1&pubkey= \u53C2\u6570\u3002\n   \u8BBE\u8BA1\u5B8C\u6210\u540E\u70B9\u300C\u5EFA\u5546\u54C1\u4E0A\u67B6\u300D\u2192 \u590D\u7528 export/upload \u2192 \u8C03 bridge /official/publish\uFF08\u8DF3\u8FC7\u4E0B\u5355/\u6295\u7A3F/AI \u5BA1\u6838\uFF09\u3002 */\nvar __pfmOfficial = false;\n(function(){\n  try {\n    var _p = window.__pfmParams || new URLSearchParams(location.search);\n    __pfmOfficial = (_p.get('official') === '1');\n    if (!__pfmOfficial) return;\n    var _sv = document.getElementById('pfmBtnSaveDesign');\n    var _my = document.getElementById('pfmBtnMyDesigns');\n    if (_sv) _sv.style.display = 'none';\n    if (_my) _my.style.display = 'none';\n    var _atc = document.getElementById('pfmBtnAddToCart');\n    if (_atc) _atc.textContent = '\u2705 \u5EFA\u5546\u54C1\u4E0A\u67B6';\n  } catch(e){}\n})();\nfunction officialPublish(){\n  if(!canvas || !product){showToast('Please wait for the product to load', 'info');return;}\n  markPlacementArt();\n  var filled=Object.keys(placementArt).filter(function(p){return placementArt[p]&&placementArt[p].hasArt;});\n  if(!filled.length){showToast('Design is empty \u2014 add something first', 'warn');return;}\n  var btn=q('pfmBtnAddToCart'), orig=btn.textContent;\n  hdAtcBusy(true);\n  return exportAllPlacements().then(function(exports){\n    var firstKey=Object.keys(exports)[0];\n    if(!firstKey){showToast('Design is empty \u2014 add something first', 'warn');return;}\n    var designId=pfmDesignId(exports);\n    var faceKeys=Object.keys(exports);\n    return pfmUploadFaces(exports, designId).then(function(faces){\n      var primaryUrl=faces[firstKey].url;\n      var token=String((window.__pfmParams||new URLSearchParams(location.search)).get('token')||'');\n      var colors=(function(){try{var _g=(typeof hdGenColors==='function')?(hdGenColors()||[]):[];return _g.map(function(x){return (x&&typeof x==='object')?(x.c||x.name||''):x}).filter(Boolean)}catch(e){return null}})();\n      var facesForServer={};\n      faceKeys.forEach(function(k){ facesForServer[k] = faces[k] && faces[k].url; });\n      var mockupUrl=(function(){try{return window.__hdLastMockup||localStorage.getItem('hd_last_mockup')||''}catch(e){return ''}})();\n      return ft(B+'/official/publish',{method:'POST',headers:{'Content-Type':'application/json'},\n        body:JSON.stringify({token:token,designUrl:primaryUrl,catalogProductId:pid,designId:designId,faceCount:faceKeys.length,color:product._colorName||selColor,colors:colors,faces:facesForServer,mockupUrl:mockupUrl})\n      }, 120000).then(function(r){return r.json()}).then(function(d){\n        if(!d || !d.ok){ throw new Error((d && d.error) || 'publish failed'); }\n        btn.innerHTML='<span class=\"pfm-lbl\">\u2713 \u5DF2\u4E0A\u67B6 \u2014 \u6253\u5F00\u5546\u54C1\u9875</span>';\n        btn.classList.add('pfm-flash');\n        btn.disabled=false;\n        showToast('Official design published', 'ok');\n        if(d.url){ try{ window.open(d.url, '_blank'); }catch(e){} }\n        return d;\n      }).catch(function(e){\n        hdAtcReset(orig);\n        showToast('\u4E0A\u67B6\u5931\u8D25\uFF1A'+(e.message||e), 'err');\n        throw e;\n      });\n    });\n  });\n}\n\nwindow.__hdAct.bind('pfmBtnAddToCart',function(){\n  if (__pfmOfficial) { officialPublish(); return; }\n  if(!canvas || !product){showToast('Please wait for the product to load', 'info');return;}\n  // Ensure current face art is tracked\n  markPlacementArt();\n  var filled=Object.keys(placementArt).filter(function(p){return placementArt[p]&&placementArt[p].hasArt;});\n  if(!filled.length){showToast('Design is empty \u2014 add something first', 'warn');return;}\n  /* 2026-11-01\uFF08\u53CD\u9988\u5373\u65F6\uFF09\uFF1AhdAtcBusy \u63D0\u524D\u5230\u5BFC\u51FA\u4E4B\u524D \u2014\u2014 \u70B9\u51FB\u5373\u7ED9\u300CCreating & adding\u2026\u300D\u53CD\u9988\uFF0C\n     \u5426\u5219 exportAllPlacements \u5F02\u6B65\u5BFC\u51FA\u671F\u95F4\u6309\u94AE\u65E0\u4EFB\u4F55\u54CD\u5E94\uFF08\u5B98\u65B9\u53D1\u5E03 officialPublish \u65E9\u5DF2\u5982\u6B64\uFF09\u3002 */\n  var btn=q('pfmBtnAddToCart'), orig=btn.textContent;\n  hdAtcBusy(true);\n  // 2026-09-03: creator identity collected ONCE at entry (modal) \u2014 read it here, no prompts.\n  var _prof=hdcoLoad()||{};\n  var cName=String(_prof.nick||'').trim()||'Custom';\n  var cEmail=String(_prof.email||'').trim()||'';\n  /* 2026-10-13 \u9ED8\u8BA4\u6295\u7A3F\uFF1A\u52FE\u9009\u6846\u9ED8\u8BA4\u52FE\u4E0A\uFF1B\u6B64\u5904\u300C\u672A\u660E\u786E\u53D6\u6D88\u8FC7\u300D\u5373\u89C6\u4E3A\u540C\u610F \u2014\u2014\n     \u00B7 \u8001\u6863\u6848 list=0 \u4F46\u65E0 listTouched \u6807\u8BB0\uFF08\u65E7\u7248\u6CA1\u6709\u9ED8\u8BA4\u52FE\uFF0C0 \u662F\u7CFB\u7EDF\u9ED8\u8BA4\u800C\u975E\u7528\u6237\u9009\u62E9\uFF09\u21D2 \u89C6\u4E3A\u540C\u610F\uFF1B\n     \u00B7 \u7528\u6237\u5728\u5F39\u7A97\u91CC**\u81EA\u5DF1\u53D6\u6D88**\u8FC7\uFF08list=0 \u4E14 listTouched=1\uFF09\u21D2 \u5C0A\u91CD\uFF0C\u4E0D\u6295\u3002 */\n  var wantList=!!cEmail && !(_prof.list===0 && _prof.listTouched===1);\n  var creatorConsent = wantList;\n  var facesUploaded = null;   /* 2026-09-13: \u4E0A\u4F20\u7ED3\u679C\u8DE8\u4F5C\u7528\u57DF\u4FDD\u5B58\uFF08\u4E0B\u65B9\u300C\u4E0A Drop\u300D\u63D0\u4EA4\u8981\u7528\uFF1B\u539F\u5B9E\u73B0\u76F4\u63A5\u5F15\u7528\u5185\u5C42 faces \u4F1A ReferenceError\uFF09 */\n  // Export ALL faces that have art. Async: fabric loadFromJSON is asynchronous, so\n  // the export must finish before building the upload payload.\n  /* 2026-10-12: \u9884\u70ED\u547D\u4E2D\uFF08\u540C\u4E00\u8BBE\u8BA1\u3001\u7528\u6237\u6CA1\u518D\u6539\uFF09\u21D2 \u8DF3\u8FC7\u300C\u5BFC\u51FA/\u4E0A\u4F20/\u5EFA\u5546\u54C1\u300D\uFF0C\u76F4\u63A5\u52A0\u8D2D\u3002 */\n  var _warm=null;\n  try{ if(window.__pfmWarm&&window.__pfmWarm.take) _warm=window.__pfmWarm.take(); }catch(e){}\n  return (_warm?Promise.resolve(_warm.exports):exportAllPlacements()).then(function(exports){\n  var firstKey=Object.keys(exports)[0];\n  if(!firstKey){hdAtcReset(orig);showToast('Design is empty \u2014 add something first', 'warn');return;}\n  var _design=exports[firstKey];\n  // 2026-09-13: \u62BD\u6210\u516C\u5171\u539F\u8BED pfmDesignId\uFF08Save \u4E0E\u52A0\u8D2D\u5171\u7528\uFF0C\u7981\u7B2C\u4E8C\u4EFD\u5B9E\u73B0\uFF09\n  var designId=_warm?_warm.designId:pfmDesignId(exports);\n  // Upload every face (sequential, reuse same designId base for idempotency)\n  var faceKeys=Object.keys(exports);\n  // 2026-09-13: \u4E0A\u4F20\u62BD\u6210\u516C\u5171\u539F\u8BED pfmUploadFaces\uFF08\u539F uploadOne \u5185\u8054\u5B9E\u73B0\u5DF2\u79FB\u9664\uFF09\n  (_warm?Promise.resolve(_warm.faces):pfmUploadFaces(exports, designId)).then(function(faces){\n    facesUploaded = faces;\n    // Primary face = first uploaded (deterministic order preserved)\n    var primaryUrl=faces[firstKey].url;\n    // Real-time: create (or reuse) the published Shopify product for this design\n    return ((_warm&&_warm.list)?Promise.resolve(_warm.list):ft(B+'/catalog/design-listing',{method:'POST',headers:{'Content-Type':'application/json'},\n      body:JSON.stringify({designUrl:primaryUrl,mockupByColor:(function(){try{var _byd=window.__hdDesignId||designId;return window.__hdMockupByColor||JSON.parse(localStorage.getItem('hd_mockup_by_color_'+_byd)||'{}')}catch(e){return window.__hdMockupByColor||{}}})(),mockupUrl:(function(){try{return window.__hdLastMockup||localStorage.getItem('hd_last_mockup')||''}catch(e){return window.__hdLastMockup||''}})(),catalogProductId:pid,customerName:String(cName).trim(),designId:designId,faceCount:faceKeys.length,colors:(function(){try{var _g=(typeof hdGenColors==='function')?(hdGenColors()||[]):[];return _g.map(function(x){return (x&&typeof x==='object')?(x.c||x.name||''):x}).filter(Boolean)}catch(e){return null}})(),color:product._colorName||selColor,faces})\n    }, 90000).then(function(r){return r.json()})).then(function(list){\n      if(!list.success)throw new Error(list.error||'design-listing failed');\n      /* 2026-09-13 \u4FEE\u6B63\uFF08\u4E24\u4E2A bug\uFF09\uFF1A\n         \u2460 \u539F\u5B9E\u73B0\u5728\u6B64\u5904 `return` \u4E86\u5BA1\u6838\u95E8 \u2192 \u5176\u540E\u6574\u6BB5\uFF08variant \u5B88\u536B / props / /cart/add.js\uFF09\n            \u6210\u4E86**\u4E0D\u53EF\u8FBE\u6B7B\u4EE3\u7801**\uFF0C\u52A0\u8D2D\u4ECE\u672A\u771F\u6B63\u6267\u884C\u8FC7\u3002\n         \u2461 \u95E8\u7528 primaryUrl\uFF08\u672C\u6B21\u521A\u4E0A\u4F20\u7684\u65B0\u56FE\uFF09\u53BB\u67E5 creator_works \u2014\u2014 \u65B0 designId \u5FC5\u7136\u67E5\u4E0D\u5230\n            \u2192 \u6C38\u8FDC not_submitted \u2192 \u81EA\u8D2D 100% \u88AB\u81EA\u5DF1\u7684\u5BA1\u6838\u95E8\u62E6\u6B7B\uFF0C\u8FD8\u4F1A\u987A\u624B\u628A\u5B83\u63D0\u4EA4\u53BB\u5BA1\u6838\u3002\n         \u73B0\u6539\u4E3A\uFF1A\u95E8\u53EA\u670D\u52A1\u300C\u4E70\u522B\u4EBA\u7684 Drop \u4F5C\u54C1\u300D\uFF08\u6309 workId \u67E5\uFF0C\u4ECD\u80FD\u6321\u4F4F\u5DF2\u4E0B\u67B6\u4F5C\u54C1\uFF09\uFF0C\n         \u5E76\u4E14\u662F promise \u94FE\u7684\u4E00\u73AF \u2192 \u540E\u9762\u7684\u4E0B\u5355\u903B\u8F91\u653E\u8FDB .then \u91CC\u771F\u6B63\u8DD1\u8D77\u6765\u3002 */\n      var cwBuy = (params.get && params.get('creator_work_id')) || '';\n      var preGate = Promise.resolve();\n      if (cwBuy) {\n        preGate = ft(B + '/creator/check?workId=' + encodeURIComponent(cwBuy), {}, 8000)\n          .then(function(r){ return r.json(); })\n          .then(function(d){\n            if (d && d.ok) return; // \u4ECD approved \u2192 \u7EE7\u7EED\u52A0\u8D2D\n            btn.textContent = orig; btn.disabled = false;\n            showToast('This design is no longer available for purchase.', 'warn');\n            var e = new Error('work unavailable'); e.__unavailable = true; throw e;\n          });\n      }\n      return preGate.then(function(){\n      // Availability guard: Printful \u5B9E\u65F6 variant ID \u56DE\u6765\u4E86\u3001\u800C\u5F53\u524D\u9009\u4E2D\u7684 catalog variant \u4E0D\u5728\u5176\u4E2D \u2192\n      // \u8BE5\u5C3A\u7801/\u989C\u8272\u5DF2\u505C\u4EA7\uFF0C\u963B\u6B62\u4E0B\u5355\u5E76\u544A\u77E5\u5BA2\u6237\u3002\n      var avail=list.availableVariantIds;\n      if(avail && avail.length){\n        /* 2026-10-10: only block when a real picked variant is missing from PF live list. */\n        var curRaw=currentVariantId, curId=String(curRaw);\n        var ready=(curRaw!==null && curRaw!==undefined && /^\\d+$/.test(curId) && curId!==String(pid));\n        if(ready){\n          var ok=avail.some(function(id){return String(id)===curId;});\n          if(!ok){\n            hdAtcReset(orig);\n            showToast('Sorry, this color/size has been discontinued (Unavailable). Please pick another color or size.', 'warn');\n            var err=new Error('variant unavailable'); err.__unavailable=true; throw err;\n          }\n        }\n      }\n      /* 2026-10-11: block add-to-cart when the catalog variant is not resolved yet. */\n      if(!/^\\d+$/.test(String(currentVariantId))||String(currentVariantId)===String(pid)){hdAtcReset(orig);showToast('Product is still loading, please retry in a moment.','warn');throw new Error('variant not ready');}\n      // pick the variant matching the selected color + size\n      var vs=list.variants||[];\n      var cN=(product._colorName||'').toLowerCase();\n      var sN=String(selSize||'').trim().toLowerCase();\n      /* \uD83D\uDD34\uD83D\uDD34 2026-10-12: design-listing \u7684**\u590D\u7528\u5206\u652F\u53EA\u56DE {id,title}**\uFF08\u6CA1\u6709 option1/option2\uFF09\u21D2\n         \u5FC5\u987B\u5728 option \u7F3A\u5931\u65F6**\u4ECE title \u62C6**\uFF08\"\u2026 - nemo - White / XS\"\uFF1A\u4EE5 \"/\" \u5207\uFF0C\n         \u9996\u6BB5\u505A\u989C\u8272\u5B50\u4E32\u5339\u914D\u3001\u672B\u6BB5\u505A\u5C3A\u7801\u7CBE\u786E\u5339\u914D\uFF09\uFF0C\u5426\u5219\u7CBE\u786E\u5339\u914D\u6052\u5931\u8D25\u3001\u52A0\u8D2D\u88AB\u81EA\u5DF1\u62E6\u6B7B\u3002 */\n      function _opt(x,i){\n        var o=(i===0?x.option1:x.option2);\n        if(o!==undefined&&o!==null&&o!=='')return String(o);\n        var p=String(x.title||'').split('/');\n        return p.length>i?String(p[i]).trim():'';\n      }\n      var v=null;\n      if(cN||sN){\n        v=vs.find(function(x){\n          var okC=!cN || _opt(x,0).toLowerCase().indexOf(cN)!==-1;\n          var okS=!sN || _opt(x,1).toLowerCase()===sN;\n          return okC && okS;\n        });\n      }\n      /* \uD83D\uDD34 2026-10-12: \u9501\u5B9A\u4E86\u989C\u8272+\u5C3A\u7801\u5374\u5339\u914D\u4E0D\u5230 \u21D2 **\u7EDD\u4E0D fallback \u731C\u4E00\u4E2A**\uFF08\u539F vs[0] \u4F1A\u9759\u9ED8\u52A0\u9519\u5C3A\u7801\uFF09\uFF0C\n         \u660E\u786E\u62A5\u9519\u8BA9\u7528\u6237\u770B\u5230\u7F3A\u7684\u662F\u54EA\u4E00\u4EF6\u3002 */\n      if(!v && sN){ throw new Error((product._colorName||'This color') + ' is not available in size ' + selSize); }\n      if(!v) v=vs[0];\n      if(!v)throw new Error('No variant returned');\n      // Build multi-face properties: _placement_X + _design_url_X for every face\n      var props={\n        '_catalog_variant_id':String(currentVariantId),\n        '_catalog_product_id':String(pid),   // 2026-08-18 heat tracking\n        '_design_url':primaryUrl,\n        '_placement':firstKey,\n        '_color':selColor||'',\n        '_product_name':product.name||'',\n        '_shopify_product_id':String(list.productId),\n        '_face_count':String(faceKeys.length),\n        '_list_on_drop':(creatorConsent?'1':'0'),   /* 2026-10-16\uFF1A\u6295\u7A3F\u610F\u613F\u968F\u8BA2\u5355\u8D70\uFF0C\u670D\u52A1\u7AEF\u300C\u4ED8\u6B3E+\u91D1\u989D>0\u300D\u624D\u6295\u7A3F */\n        '_section':section,   /* 2026-10-28\uFF1A\u4F5C\u54C1\u6027\u522B\uFF08men/women/kids/\u7A7A\uFF09\uFF0C\u4ED8\u6B3E\u6295\u7A3F\u65F6\u843D work_sections */\n        '_designer_email':String((hdcoLoad()||{}).email||''),   /* 2026-11-03\uFF08\u7532\uFF09\uFF1A\u8BBE\u8BA1\u53F0\u5F53\u524D\u767B\u5F55\u8D26\u53F7\uFF0C\u968F\u8BA2\u5355\u8D70\uFF0C\u4ED8\u6B3E\u6295\u7A3F\u4F18\u5148\u8BA4\u5B83 */\n        '_designer_nick':String((hdcoLoad()||{}).nick||'')\n      };\n      // 2026-08-18 creator market: when buying an existing creator work, attach\n      // its work id + creator email so the webhook credits the right creator.\n      if (cwBuy) {\n        props['_creator_work_id'] = String(cwBuy);\n        props['_creator_email'] = '';\n        props['_design_url'] = primaryUrl;\n      }\n      faceKeys.forEach(function(k){\n        props['_placement_'+k]=k;\n        props['_design_url_'+k]=faces[k].url;\n      });\n      /* 2026-10-12: \u52A0\u8D2D\u662F\u5173\u952E\u8DEF\u5F84\uFF0C\u539F\u5148\u8D70 ft() \u7684**\u9ED8\u8BA4 10s \u8D85\u65F6** \u2014\u2014 \u6162\u7F51/Shopify \u6CE2\u52A8\u65F6\u88AB\n         AbortSignal.timeout \u6390\u65AD\uFF0C\u7528\u6237\u53EA\u770B\u5230\u7B3C\u7EDF\u5931\u8D25\uFF08\u672C\u673A\u5B9E\u6D4B\u4E24\u6B21 ~1.3s\uFF0C\u5F31\u7F51\u53EF\u8FBE\u5341\u51E0~\u51E0\u5341\u79D2\uFF09\u3002 */\n      /* 2026-10-16 \u591A\u8272\u8D2D\u4E70\uFF1A\u6BCF\u8272\u6311\u4E00\u4E2A\u53D8\u4F53\uFF0C\u4E00\u6B21 items[] \u63D0\u4EA4\u3002\n         \u771F\u6E90 hdGenColors()\uFF08\u4E0D\u53E6\u9020\u8272\u5217\u8868\uFF09\uFF1B\u5355\u8272/\u5339\u914D\u4E0D\u5230 \u21D2 \u9000\u56DE\u539F\u6765\u90A3\u4E00\u884C\uFF0C\u884C\u4E3A\u4E0D\u53D8\u3002 */\n      /* 2026-10-16 \u4FEE\u590D\u2461\uFF1A\u6BCF\u884C\u8981\u5E26\u3010\u81EA\u5DF1\u7684\u5C3A\u7801 + \u81EA\u5DF1\u7684\u6570\u91CF\u3011\u3002\n         \u771F\u6E90 = sessionStorage['hdTeamCombos'].items[{c,s,q}]\uFF08\u76EE\u5F55\u9875\u300CYour combos\u300D\u90A3 7 \u6761\uFF1B\n         hdGenColors() \u4EA6\u4ECE\u6B64\u5904\u8BFB\uFF0C\u4F46\u53EA\u56DE {c} \u21D2 \u4E22\u6389\u4E86 s/q\uFF0C\u6545\u8FD9\u91CC\u76F4\u63A5\u8BFB\u540C\u4E00\u4EFD\u771F\u6E90\uFF09\u3002\n         \u6CE8\u610F\uFF1AhdGenColors() \u672C\u8EAB\u4E0D\u52A8\uFF08\u5B83\u670D\u52A1\u51FA\u56FE\u6D41\u7A0B\uFF09\u3002 */\n      var _combos = [];\n      try {\n        var _pq = String(new URLSearchParams(location.search).get('product_id') || '');\n        var _o = JSON.parse(sessionStorage.getItem('hdTeamCombos') || 'null');\n        /* 2026-10-17 \u4FEE\uFF1A\u539F\u6765\u8981\u6C42 combos.pid === URL \u7684 product_id\uFF0C\u800C\u5E76\u975E\u6240\u6709\u5165\u53E3 URL \u90FD\u5E26 product_id\n           \u21D2 \u5224\u5B9A\u5931\u8D25 \u21D2 _combos \u6E05\u7A7A \u21D2 \u9000\u5316\u6210\u53EA\u6709 1 \u884C\uFF08\u7528\u6237\uFF1A\u53D8\u4F53\u90FD\u6CA1\u5E26\u8FDB\u8D2D\u7269\u8F66\uFF09\u3002\n           \u6539\u4E3A\uFF1Apid \u7F3A\u5931\u65F6\u7167\u6837\u7528 combos\uFF1B\u53EA\u6709\u4E24\u8FB9\u90FD\u6709\u503C\u4E14\u4E0D\u4E00\u81F4\u65F6\u624D\u4E0D\u7528\u3002 */\n        if (_o && (!_pq || !_o.pid || String(_o.pid) === String(_pq))) _combos = _o.items || [];\n      } catch (e) {}\n      var _items = [];\n      for (var _ci = 0; _ci < _combos.length; _ci++) {\n        var _it = _combos[_ci] || {};\n        var _cc = String(_it.c || '').trim();\n        if (!_cc) continue;\n        var _ss = String(_it.s || '').trim().toLowerCase();          /* \u8BE5 combo \u81EA\u5DF1\u7684\u5C3A\u7801 */\n        var _qq = parseInt(_it.q, 10); if (!(_qq > 0)) _qq = 1;      /* \u8BE5 combo \u81EA\u5DF1\u7684\u6570\u91CF */\n        /* 2026-10-17 \u4FEE Bug\u2460\uFF1A**\u7CBE\u786E\u7B49\u503C\u5339\u914D**\uFF08\u539F\u6765\u7528 indexOf \u5305\u542B\u5339\u914D \u21D2\n           \"True Royal\" \u4F1A\u649E\u4E0A \"Heather True Royal\" / \"Heather Prism Mint\" \u7B49\uFF0Cfind \u53D6\u7B2C\u4E00\u4E2A \u21D2 \u4E32\u8272+\u91CD\u590D\u884C\uFF09\u3002\n           \u5C3A\u7801\u4E5F\u5FC5\u987B\u7CBE\u786E\uFF08\u539F\u6765 !_ss \u65F6\u653E\u884C\u4EFB\u610F\u5C3A\u7801 \u21D2 \u9759\u9ED8\u53D6\u8BE5\u8272\u7B2C\u4E00\u4E2A\u53D8\u4F53\uFF09\u3002\n           \u627E\u4E0D\u5230\u65F6\u6253\u65E5\u5FD7\uFF0C\u4FBF\u4E8E\u770B\u6E05\u7F3A\u7684\u662F\u54EA\u4E2A\u7EC4\u5408\u3002 */\n        var _ccL = _cc.toLowerCase().trim();\n        var _vv = vs.find(function (x) {\n          var o1 = _opt(x, 0).toLowerCase().trim();\n          var o2 = _opt(x, 1).toLowerCase().trim();\n          return o1 === _ccL && o2 === _ss;\n        });\n        if (!_vv) { try { console.log('[combo-miss] ' + _cc + ' / ' + _ss + ' \u2014 \u672A\u5728 ' + vs.length + ' \u4E2A\u53D8\u4F53\u4E2D\u627E\u5230'); } catch (e) {} continue; }\n        var _p2 = {}; for (var _k in props) { if (Object.prototype.hasOwnProperty.call(props, _k)) _p2[_k] = props[_k]; }\n        _p2['_color'] = _cc; _p2['_size'] = String(_it.s || '');\n        /* 2026-10-17\uFF08\u7528\u6237\uFF09\uFF1A\u6BCF\u884C\u7528**\u5404\u81EA\u7684\u8272+\u7801**\u67E5 Printful catalog \u53D8\u4F53 \u2014\u2014\n           \u539F\u6765\u53EA\u8986\u76D6 _color/_size\uFF0C_catalog_variant_id \u5168\u662F\u300C\u5F53\u524D\u53D8\u4F53\u300D\u90A3\u4E00\u4E2A \u21D2 \u6BCF\u884C\u76F8\u540C\u3002\n           \u5FC5\u987B\u8D70 window.hdVariantFor\uFF08\u8DE8\u4F5C\u7528\u57DF\uFF0C\u88F8\u540D\u8C03\u4E0D\u5230\uFF09\u3002 */\n        var _cid2 = 0;\n        try{ if(typeof window.hdVariantFor==='function') _cid2 = window.hdVariantFor(_cc, _it.s); }catch(e){}\n        _p2['_catalog_variant_id'] = String(_cid2 || props['_catalog_variant_id'] || '');\n        _items.push({ id: _vv.id, quantity: _qq, properties: _p2 });\n      }\n      /* 2026-10-17\uFF08\u7528\u6237\uFF09\uFF1A\u5355\u8272\u8FD9\u4E00\u884C\u4E5F\u8981\u7528**\u89C4\u683C\u5361\u91CC\u81EA\u5DF1\u7684\u6570\u91CF q**\uFF0C\u4E0D\u518D\u5199\u6B7B 1\u3002\n         \u53D6\u6CD5\u4E0E\u591A\u8272\u540C\u6E90\uFF1A\u5148\u5728 _combos \u91CC\u6309\u5F53\u524D\u8272+\u7801\u627E\uFF1B\u627E\u4E0D\u5230\u4E14\u53EA\u6709\u4E00\u884C \u21D2 \u5C31\u7528\u90A3\u4E00\u884C\u3002 */\n      var _q0 = 1;\n      try{\n        var _c0 = String(product._colorName || '').trim().toLowerCase();\n        var _s0 = String(selSize || '').trim().toLowerCase();\n        var _hit0 = null;\n        for (var _qi = 0; _qi < _combos.length; _qi++) {\n          var _it0 = _combos[_qi] || {};\n          var _ok0C = !_c0 || String(_it0.c || '').trim().toLowerCase() === _c0;\n          var _ok0S = !_s0 || String(_it0.s || '').trim().toLowerCase() === _s0;\n          if (_ok0C && _ok0S) { _hit0 = _it0; break; }\n        }\n        if (!_hit0 && _combos.length === 1) _hit0 = _combos[0];\n        if (_hit0) { var _n0 = parseInt(_hit0.q, 10); if (_n0 > 0) _q0 = _n0; }\n      }catch(e){}\n      /* \u6CA1\u6709 combos\uFF08\u975E\u76EE\u5F55\u9875\u8FDB\u5165\uFF09\u21D2 \u9000\u56DE\u5355\u884C\u884C\u4E3A\uFF08\u6570\u91CF\u53D6\u4E0A\u9762\u7684 _q0\uFF0C\u9ED8\u8BA4 1\uFF09 */\n      if (!_items.length) _items = [{ id: v.id, quantity: _q0, properties: props }];\n      return ft('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},\n        body:JSON.stringify({ items:_items })}, 45000);\n      });\n    });\n  }).then(function(r){\n    // Shopify sometimes returns 200 with an EMPTY body for /cart/add.js even\n    // though the item WAS added. Don't choke on that \u2014 treat non-JSON as success.\n    return r.text().then(function(txt){\n      var _d = null;\n      if (txt) { try { _d = JSON.parse(txt); } catch(e) { _d = null; } }\n      /* 2026-10-06: \u539F\u5B9E\u73B0\u53EA\u770B body\u3001\u4E0D\u770B\u72B6\u6001\u7801 \u21D2 422\uFF08variant \u505C\u4EA7 / \u8D85 50 \u4EF6\u4E0A\u9650\u7B49\uFF09\n         \u53EA\u8981\u56DE JSON \u5C31\u88AB\u5F53\u6210\u529F\uFF0C\u6309\u94AE\u53D8\u300C\u2713 Added \u2014 Checkout\u300D= **\u5047\u6210\u529F**\uFF08\u8DF3 /cart \u89C1\u7A7A\u8F66\uFF09\u3002\n         \u65E2\u6709\u300C200 + \u7A7A body \u4E5F\u7B97\u6210\u529F\u300D\u7684\u5BB9\u5FCD\u903B\u8F91\u4FDD\u6301\u4E0D\u53D8\uFF08r.ok \u4E3A\u771F\u65F6\u4ECD\u8FD4\u56DE {token:null}\uFF09\uFF1B\n         \u629B\u51FA\u7684\u9519\u8BEF\u7531\u672C\u5757\u5916\u5C42 .catch \u63A5\u4F4F\uFF08\u663E\u793A 'Add to cart failed' \u5E76\u590D\u4F4D\u6309\u94AE\uFF09\u3002 */\n      if (!r.ok) {\n        var _msg = (_d && (_d.description || _d.message)) || ('HTTP ' + r.status);\n        throw new Error(_msg);\n      }\n      return _d || { token: null };\n    });\n  }).then(function(cart){\n    hdAtcDone();\n    /* 2026-10-16\uFF1A\u6295\u7A3F\u6539\u4E3A\u300C\u4ED8\u6B3E\u624D\u89E6\u53D1\u300D\u2014\u2014 \u8FD9\u91CC**\u4E0D\u518D**\u52A0\u8D2D\u5373\u6295\u7A3F\u3002\n       \u6295\u7A3F\u610F\u613F\u5DF2\u901A\u8FC7 line_item property `_list_on_drop` \u968F\u8BA2\u5355\u8D70\uFF0C\u7531\u670D\u52A1\u7AEF\u5728\n       orders/create \u56DE\u4F20\u91CC\u5224\u300Cfinancial_status=paid + \u91D1\u989D>0\u300D\u624D\u5199 creator_works\u3002 */\n    /* 2026-10-10\uFF08\u00A71011t\uFF09\uFF1A\u52A0\u8D2D\u540E\u7EDF\u4E00\u53BB\u8D2D\u7269\u8F66\uFF08\u64A4\u9500 \u00A71011r \u7684\u300C\u76F4\u8FBE\u7ED3\u7B97\u300D\uFF09\u3002\n       \u7406\u7531\uFF1A\u4E0E\u8BE6\u60C5\u9875 Buy it now \u884C\u4E3A\u5B8C\u5168\u4E00\u81F4\uFF0C\u4E24\u5904\u540C\u540D\u6309\u94AE\u53BB\u5411\u76F8\u540C\uFF08main-product.liquid 2026-10-08 \u5B9A\uFF09\u3002 */\n    if(cart && cart.token) setTimeout(function(){window.location.href='/cart';},600);\n    else window.location.href='/cart';\n  }).catch(function(e){\n    hdAtcReset(orig);\n    if(e && e.__unavailable){ return; } // availability alert already shown\n    if(e && e.__reviewGate){ return; }  // review gate message already shown (toast/alert)\n    showToast('Add to cart failed: ' + ((e && e.message) || 'unknown') + '. Please try again.', 'error');\n  });\n  }).catch(function(e){\n    // Export phase failed before uploads started\n    hdAtcReset(orig);\n    showToast('Export failed: ' + ((e && e.message) || 'unknown') + '. Please try again.', 'error');\n  });\n});\n\n// ===== 2026-08-30: \u6574\u4F53\u7F29\u653E\uFF08zoomLayer transform\uFF09\u2014 \u767D\u6846\u4E0D\u52A8\uFF0C\u4EA7\u54C1\u56FE+\u6253\u5370\u533A+\u4E0A\u4F20\u56FE\u7247\u4E00\u8D77\u7F29\u653E/\u5E73\u79FB\uFF1B50%\u2013300% =====\nvar pfmZoomLevel = 1;\nvar pfmPanTx = 0, pfmPanTy = 0;\nfunction pfmApplyLayer(){\n  /* \uD83D\uDD34 2026-09-19: \u672A\u653E\u5927\uFF08100%\uFF09\u65F6\u5E73\u79FB\u91CF\u5FC5\u987B\u4E3A 0 \u2014\u2014 \u7528\u6237\u62A5\u300C\u624B\u673A\u7AEF\u80CC\u666F\u56FE\u4F1A\u968F\u753B\u9762\u6ED1\u52A8\u300D\u3002\n     \u89E6\u6478\u8BBE\u5907\u4E0A\u628A\u5E73\u79FB\u673A\u4F1A\u5F7B\u5E95\u9501\u6B7B\uFF08\u684C\u9762\u7AEF\u9F20\u6807\u62D6\u62FD\u5E73\u79FB\u4FDD\u6301\u539F\u6837\uFF09\uFF1B\u7F29\u56DE 100% \u65F6\u81EA\u52A8\u56DE\u6B63\u3002 */\n  try{\n    if(pfmZoomLevel <= 1.001 && window.__pfmTouchLayout && window.__pfmTouchLayout()){ pfmPanTx = 0; pfmPanTy = 0; }\n  }catch(e){}\n  var layer = document.getElementById('pfmZoomLayer');\n  if(layer) layer.style.transform = 'translate(' + pfmPanTx + 'px,' + pfmPanTy + 'px) scale(' + pfmZoomLevel + ')';\n  var pct = document.getElementById('pfmZoomPct');\n  if(pct) pct.textContent = Math.round(pfmZoomLevel * 100) + '%';\n  // 2026-09-03: \u65B9\u6848A \u2014\u2014 zoom>1 \u52A0 .pfm-zoom\uFF08touch-action:none\uFF0C\u624B\u52BF\u5168\u5F52\u753B\u5E03\uFF1A\u5355\u6307\u5E73\u79FB+\u53CC\u6307\u634F\u5408\uFF09\uFF1B\n  // =100% \u79FB\u9664\uFF08pan-y\uFF0C\u5355\u6307\u4E0A\u4E0B\u6ED1\u6062\u590D\u9875\u9762\u6EDA\u52A8\uFF0C\u4E0D\u518D\u51FA\u73B0\u6846\u9009\uFF09\u3002\n  var inn = document.getElementById('pfmCanvasInner');\n  if(inn) inn.classList.toggle('pfm-zoom', pfmZoomLevel > 1.001);\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF1A**\u6574\u4F53\u7F29\u653E\u7684\u552F\u4E00\u6536\u53E3\u5C31\u5728\u8FD9\u91CC** \u2014\u2014 transform \u5DF2\u5E94\u7528\u540E\u91CD\u7B97\"\u5C4F\u5E55\u6052\u5B9A\"\u7684\u91CF\u3002\n     \u63A7\u5236\u70B9/\u547D\u4E2D\u533A/\u65CB\u8F6C\u70B9\u95F4\u8DDD/\u6846\u7EBF\u8D70 `pfmApplyControlSize()`\uFF0C\u6253\u5370\u533A\u6307\u793A\u7EBF\u8D70 `pfmApplyGridStroke()`\uFF1B\n     \u4E24\u8005\u90FD\u6709**\u5199\u524D\u6BD4\u5BF9** \u21D2 \u7EAF\u5E73\u79FB\u65F6\u4E0D\u4EA7\u751F\u4EFB\u4F55\u53D8\u66F4\u3001\u4E5F\u4E0D\u91CD\u7ED8\uFF08\u4E0D\u4F1A\u4E3A\u7F29\u653E\u4E4B\u5916\u7684\u8DEF\u5F84\u589E\u52A0\u5F00\u9500\uFF09\u3002 */\n  var _ctrlCh = pfmApplyControlSize();\n  var _gridCh = pfmApplyGridStroke();\n  if((_ctrlCh || _gridCh) && canvas && canvas.requestRenderAll) canvas.requestRenderAll();\n}\nfunction pfmSetZoom(z){\n  z = Math.max(0.5, Math.min(3, Math.round(z * 100) / 100));\n  pfmZoomLevel = z;\n  pfmApplyLayer();\n}\n// \u7A7A\u767D\u62D6\u62FD\u5E73\u79FB\uFF08\u5BF9\u8C61\u4E0A\u4ECD\u662F\u9009\u4E2D/\u79FB\u52A8\uFF09\nvar pfmPanning = false, pfmPanStart = null, pfmPanT0 = null;\n// 2026-09-03: \u89E6\u6478\u624B\u52BF\u4E0A\u4E0B\u6587\u2014\u2014\u672C\u6B21\u89E6\u6478\u8D77\u70B9\u662F\u5426\u843D\u5728\u7A7A\u767D\uFF08\u4F9B\u653E\u5927\u6001\u5355\u6307\u7A7A\u767D\u5E73\u79FB\u5224\u5B9A\uFF1Bfabric \u5408\u6210 mouse:down \u65F6\u5199\u5165\uFF09\nvar pfmTouchDownBlank = false;\nfunction pfmPanMove(e){\n  if(!pfmPanning || !pfmPanStart) return;\n  pfmPanTx = pfmPanT0.tx + (e.clientX - pfmPanStart.x);\n  pfmPanTy = pfmPanT0.ty + (e.clientY - pfmPanStart.y);\n  pfmApplyLayer();\n}\nfunction pfmPanUp(){\n  pfmPanning = false; pfmPanStart = null;\n  if(canvas) canvas.defaultCursor = 'default';\n}\nfunction pfmBindPan(){\n  if(!canvas) return;\n  canvas.on('mouse:down', function(o){\n    // 2026-09-03: \u89E6\u6478\u6D3E\u751F\u7684 mouse:down\uFF08o.e \u4E3A TouchEvent\uFF09\u2192 \u8BB0\u5F55\u8D77\u70B9\u7A7A\u767D\u4E0E\u5426\uFF08\u5BF9\u8C61/\u7F51\u683C\u4E0D\u7B97\u7A7A\u767D\uFF09\uFF0C\u4F9B\u653E\u5927\u6001\u5355\u6307\u5E73\u79FB\u5224\u5B9A\n    if(o.e && ('touches' in o.e)) pfmTouchDownBlank = !o.target;\n    /* \uD83D\uDD34 2026-09-19: \u89E6\u6478\u8BBE\u5907\u53EA\u5728\u653E\u5927\u6001\u5141\u8BB8\u7A7A\u767D\u5E73\u79FB\uFF08\u4E0E pfmTmH \u7684\u5224\u5B9A\u4E00\u81F4\uFF09\u3002\n       \u90E8\u5206\u5185\u6838\uFF08\u9E3F\u8499 ArkWeb \u7B49\uFF09\u4F1A\u628A\u89E6\u6478\u5408\u6210\u4E3A MouseEvent \u21D2 \u6309**\u8BBE\u5907\u7C7B\u578B**\u5224\u65AD\uFF0C\u800C\u4E0D\u770B\u4E8B\u4EF6\u6765\u6E90\u3002 */\n    var _allowPan = true;\n    try{ _allowPan = !(window.__pfmTouchLayout && window.__pfmTouchLayout()) || pfmZoomLevel > 1.001; }catch(e){}\n    if(!o.target && o.e && _allowPan){\n      pfmPanning = true; pfmPanStart = { x: o.e.clientX, y: o.e.clientY };\n      pfmPanT0 = { tx: pfmPanTx, ty: pfmPanTy };\n      canvas.defaultCursor = 'grabbing';\n    }\n  });\n  // move/up \u7ED1 window \u2014 \u62D6\u51FA\u753B\u5E03\u4ECD\u6301\u7EED\u5E73\u79FB\n  window.addEventListener('mousemove', pfmPanMove);\n  window.addEventListener('mouseup', pfmPanUp);\n}\nfunction pfmBindZoom(){\n  // 2026-08-30: zoom \u63A7\u4EF6\u5DF2\u5220\u9664 \u2014 \u53EA\u4FDD\u7559\u6EDA\u8F6E/\u634F\u5408\u7F29\u653E + \u53CC\u51FB\u590D\u4F4D\n  var inner = document.getElementById('pfmCanvasInner');\n  function pfmResetZoom(){ pfmZoomLevel = 1; pfmPanTx = 0; pfmPanTy = 0; pfmApplyLayer(); }\n  if(inner){\n    // \u53CC\u51FB\u753B\u5E03 \u2192 \u590D\u4F4D 100% + \u6E05\u9664\u5E73\u79FB\uFF08inner + canvas + wrapper \u4E09\u5C42\u76F4\u7ED1\uFF0C\u9632\u4E2D\u95F4\u5C42\u541E\uFF09\n    inner.addEventListener('dblclick', pfmResetZoom);\n    inner.addEventListener('wheel', function(e){\n      e.preventDefault();\n      pfmSetZoom(pfmZoomLevel * (e.deltaY < 0 ? 1.1 : 0.9));\n    }, { passive: false });\n    // \u89E6\u6478\uFF1A\u53CC\u6307\u634F\u5408\u7F29\u653E\uFF08\u4E2D\u5FC3\uFF09+ \u53CC\u6307\u5E73\u79FB\uFF1B\u5355\u6307\u7A7A\u767D\u62D6\u62FD\u5E73\u79FB\u8D70 fabric mouse:down\u3002\n    // 2026-09-03: \u52A0\u56FA \u2014\u2014 touchstart/move \u5747 passive:false + preventDefault\uFF08\u9632 UA \u63A5\u7BA1\u624B\u52BF\uFF09\uFF0C\n    // \u4E14\u540C\u65F6\u7ED1 inner \u4E0E canvas \u76F4\u63A5\u76EE\u6807\uFF1B\u4E2D\u5FC3\u7F29\u653E\u8DDF\u968F\u53CC\u6307\u4E2D\u70B9\u3002\n    var pfmTouch = { dist:null, z0:1, ccx:null, ccy:null, multi:false, sx:null, sy:null, pan0:null };\n    // \u89E6\u6478\u53CC\u51FB\uFF08\u4E24\u6B21\u65E0\u4F4D\u79FB\u8F7B\u70B9 <320ms\uFF09\u2192 \u590D\u4F4D\uFF1B\u540C\u4E00 Event \u5BF9\u8C61\u5728\u591A\u5143\u7D20\u76F4\u7ED1\u4E0B\u53EA\u5904\u7406\u4E00\u6B21\uFF08e.__pfmDone\uFF09\n    var pfmTapT0 = 0, pfmTapX0 = 0, pfmTapY0 = 0;\n    var pfmTapT = 0, pfmTapX = 0, pfmTapY = 0;\n    function pfmTapTrack(x, y){\n      var now = Date.now();\n      if(now - pfmTapT < 320 && Math.hypot(x - pfmTapX, y - pfmTapY) < 40){\n        pfmTapT = 0;\n        pfmResetZoom();\n      } else {\n        pfmTapT = now; pfmTapX = x; pfmTapY = y;\n      }\n    }\n    function pfmTsH(e){\n      if(e.__pfmDone) return; e.__pfmDone = true;\n      var L = e.touches.length;\n      if(L===1){\n        pfmTapT0 = Date.now(); pfmTapX0 = e.touches[0].clientX; pfmTapY0 = e.touches[0].clientY;\n        pfmTouch.dist = null; pfmTouch.ccx = null; pfmTouch.ccy = null;\n        // 2026-09-03: \u8BB0\u5F55\u5355\u6307\u8D77\u70B9\uFF08\u653E\u5927\u6001\u7A7A\u767D\u5E73\u79FB\u7528 pan0 \u57FA\u51C6\uFF09\n        pfmTouch.sx = e.touches[0].clientX; pfmTouch.sy = e.touches[0].clientY;\n        pfmTouch.pan0 = { tx: pfmPanTx, ty: pfmPanTy };\n      } else if(L===2){\n        e.preventDefault();\n        pfmTouch.multi = true;\n        pfmTouch.sx = null; // \u53CC\u6307\u4F1A\u8BDD\u4E0D\u8FDB\u5165\u5355\u6307\u5E73\u79FB\n        var t=e.touches;\n        pfmTouch.dist = Math.hypot(t[0].clientX-t[1].clientX, t[0].clientY-t[1].clientY);\n        pfmTouch.z0 = pfmZoomLevel;\n        pfmTouch.ccx = (t[0].clientX+t[1].clientX)/2;\n        pfmTouch.ccy = (t[0].clientY+t[1].clientY)/2;\n      }\n    }\n    function pfmTmH(e){\n      if(e.__pfmDone) return; e.__pfmDone = true;\n      if(e.touches.length===2 && pfmTouch.dist){\n        e.preventDefault();\n        var t=e.touches;\n        var d = Math.hypot(t[0].clientX-t[1].clientX, t[0].clientY-t[1].clientY);\n        var cx = (t[0].clientX+t[1].clientX)/2, cy = (t[0].clientY+t[1].clientY)/2;\n        if(pfmTouch.ccx!=null){\n          pfmPanTx += (cx - pfmTouch.ccx) / pfmZoomLevel;\n          pfmPanTy += (cy - pfmTouch.ccy) / pfmZoomLevel;\n        }\n        pfmTouch.ccx = cx; pfmTouch.ccy = cy;\n        if(d > 0) pfmSetZoom(pfmTouch.z0 * d / pfmTouch.dist);\n        pfmApplyLayer();\n      } else if(e.touches.length===1 && pfmTouch.sx!=null && pfmTouch.pan0 && !pfmTouch.multi && pfmZoomLevel>1.001 && pfmTouchDownBlank){\n        // 2026-09-03: \u653E\u5927\u6001\u7A7A\u767D\u5355\u6307\u62D6\u52A8 = \u5E73\u79FB\u753B\u5E03\uFF08\u8DDF\u968F\u624B\u6307\uFF0C\u4E0E\u684C\u9762\u7A7A\u767D\u62D6\u62FD\u4E00\u81F4\uFF09\n        var t0=e.touches[0];\n        pfmPanTx = pfmTouch.pan0.tx + (t0.clientX - pfmTouch.sx);\n        pfmPanTy = pfmTouch.pan0.ty + (t0.clientY - pfmTouch.sy);\n        pfmApplyLayer();\n      }\n    }\n    function pfmTeH(e){\n      if(e.__pfmDone) return; e.__pfmDone = true;\n      var L = e.touches.length;\n      pfmTouch.dist = null; pfmTouch.ccx = null; pfmTouch.ccy = null;\n      if(L===0){\n        pfmTouch.sx = null; pfmTouch.pan0 = null; pfmTouchDownBlank = false; // 2026-09-03: \u4F1A\u8BDD\u7ED3\u675F\u6E05\u7406\u5355\u6307\u5E73\u79FB\u4E0A\u4E0B\u6587\n        if(pfmTouch.multi){ pfmTouch.multi = false; return; } // \u634F\u5408\u4F1A\u8BDD\u7ED3\u675F\uFF1A\u4E0D\u53C2\u4E0E\u53CC\u51FB\n        if(e.changedTouches && e.changedTouches.length){\n          var ct = e.changedTouches[0];\n          var dx = ct.clientX - pfmTapX0, dy = ct.clientY - pfmTapY0;\n          var dt = Date.now() - pfmTapT0;\n          // \u4EC5\u65E0\u4F4D\u79FB\u8F7B\u70B9\uFF08<12px \u4E14 <300ms\uFF09\u8BA1\u5165\u53CC\u51FB\u5224\u5B9A\uFF0C\u62D6\u52A8\u753B\u7B14/\u5E73\u79FB\u4E0D\u8BEF\u89E6\u53D1\n          if(dx*dx + dy*dy < 144 && dt < 300) pfmTapTrack(ct.clientX, ct.clientY);\n        }\n      }\n    }\n    function pfmBindTouchTarget(el){\n      el.addEventListener('touchstart', pfmTsH, { passive: false });\n      el.addEventListener('touchmove', pfmTmH, { passive: false });\n      el.addEventListener('touchend', pfmTeH);\n      el.addEventListener('touchcancel', pfmTeH);\n      el.addEventListener('dblclick', pfmResetZoom);\n    }\n    inner.addEventListener('touchstart', pfmTsH, { passive: false });\n    inner.addEventListener('touchmove', pfmTmH, { passive: false });\n    inner.addEventListener('touchend', pfmTeH);\n    inner.addEventListener('touchcancel', pfmTeH);\n    // \u76F4\u63A5\u7ED1\u89E6\u6478\u76EE\u6807\uFF08canvas / fabric wrapper\uFF09\uFF0C\u4E0D\u4F9D\u8D56\u5192\u6CE1\n    function pfmBindTouchTarget(el){\n      el.addEventListener('touchstart', pfmTsH, { passive: false });\n      el.addEventListener('touchmove', pfmTmH, { passive: false });\n      el.addEventListener('touchend', pfmTeH);\n      el.addEventListener('touchcancel', pfmTeH);\n    }\n    var cv = q('pfmCanvas'); if(cv) pfmBindTouchTarget(cv);\n    var wr = inner.querySelector('.canvas-container'); if(wr) pfmBindTouchTarget(wr);\n  }\n  pfmBindPan();\n}\n\n// Init \u2014 2026-08-30: fabric \u6539 defer \u540E setTimeout(0) \u53EF\u80FD\u65E9\u4E8E defer \u811A\u672C\u6267\u884C\uFF08defer \u9700\u7B49\u6587\u6863\u89E3\u6790\u5B8C\uFF09\u2192\n// \u5FC5\u987B\u7B49 DOMContentLoaded\u3002\ndocument.addEventListener('DOMContentLoaded', function(){\n  hdPatchFabricSerialization(); // fabric defer \u2192 \u8865\u4E01\u5EF6\u8FDF\u5230\u6B64\u5904\u6267\u884C\n  initCanvas(); try{ if(window.renderClipartGrid) window.renderClipartGrid(); }catch(e){}\n  pfmBindZoom();\n  if(pid) loadProduct(pid);\n  try{ if(window.__hdDraw&&window.__hdDraw.init) window.__hdDraw.init(); }catch(e){}   /* 2026-09-20: \u7ED8\u753B\u677F\u5F15\u64CE\u5DF2\u5916\u7F6E\u5230 assets/hd-draw.js */\n  /* 2026-10-12\uFF08\u75321\uFF09\uFF1A\u8349\u7A3F\u6A21\u5757**\u6574\u4F53\u5916\u7F6E** assets/pf-draft.js \u2014\u2014\n     \u672C section \u5DF2\u8D34 Shopify \u5355 asset 256KB \u786C\u9876\uFF08\u4F59\u91CF\u4EC5 140 B\uFF09\uFF0C\u4EFB\u4F55\u51C0\u589E\u90FD 422\u3002\n     \u5EF6\u7EED 2026-09-20\u300C\u7ED8\u753B\u677F\u5F15\u64CE\u5916\u7F6E assets/hd-draw.js\u300D\u7684\u65E2\u5B9A\u7B56\u7565\uFF1A\u6B64\u5904\u53EA\u7559\u4F9D\u8D56\u6CE8\u5165 + \u542F\u52A8\u8C03\u7528\u3002\n     2026-08-19 \u8D77\u7684\u8349\u7A3F\u81EA\u52A8\u4FDD\u5B58\uFF08\u9632\u5237\u65B0\u4E22\u5931\uFF09/ 09-16 \u91CD\u5EFA\u7684\u6062\u590D\u5165\u53E3\uFF0C\u5B9E\u73B0\u5DF2\u8FC1\u5230\u8BE5 asset\u3002\n     \uD83D\uDD34 \u4F9D\u8D56\u888B\u5FC5\u987B\u8BBE\u5728\u6B64\u5904\uFF08DOMContentLoaded \u5185\u3001initCanvas \u4E4B\u540E\uFF09\uFF1Acanvas \u6B64\u523B\u5DF2\u5C31\u7EEA\uFF0C\n        \u4E14 `_preloadDocId` \u662F\u672C\u56DE\u8C03\u7684\u5C40\u90E8\u53D8\u91CF \u2014\u2014 \u53EA\u6709\u8FD9\u91CC\u62FF\u5F97\u5230\u3002\n     \uD83D\uDD34 \u4E0E __hdDraw \u540C\u6A21\u5F0F\uFF1A\u5916\u7F6E\u811A\u672C\uFF08defer\uFF09\u5148\u4E8E DOMContentLoaded \u8F7D\u5165 \u21D2 \u6B64\u523B __pfmDraft \u5DF2\u5B58\u5728\u3002\n     2026-09-17: `design_id` \u5224\u5B9A\u5FC5\u987B**\u65E9\u4E8E\u8349\u7A3F\u521D\u59CB\u5316** \u2014\u2014 \u8349\u7A3F\u6761\u9996\u5E27\u5C31\u8981\u7528\u5B83\u538B\u5236\n        \uFF08\u7528\u6237\u4ECE My Designs \u5E26 design_id \u56DE\u6765\u65F6\uFF0C\u672C\u5730\u90A3\u4EFD\u65E0\u5173\u8349\u7A3F\u4E0D\u8BE5\u5F39\u51FA\u6765\u62A2\u620F\uFF09\u3002 */\n  var _preloadDocId = (window.__pfmParams && window.__pfmParams.get('design_id')) || (params && params.get('design_id')) || '';\n  window.__pfmDraftDeps = {\n    q: q,\n    canvas: function(){ return window.__pfmCanvas; },\n    placementArt: placementArt,\n    currentPlacement: function(){ return currentPlacement; },\n    flushPendingSave: flushPendingSave,\n    restoreState: restoreState,\n    saveState: saveState,\n    updateLayers: updateLayers,\n    updatePlacementDots: updatePlacementDots,\n    pid: function(){ return pid; },\n    hasDesignUrl: !!(params && params.get && params.get('design_url')),\n    preloadDocId: function(){ return _preloadDocId; }\n  };\n  try{ if(window.__pfmDraft && window.__pfmDraft.init) window.__pfmDraft.init(); }catch(e){}\n  /* 2026-10-12: \u52A0\u8D2D\u9884\u70ED\uFF08assets/pf-warm.js\uFF09\u4F9D\u8D56\u6CE8\u5165 \u2014\u2014 \u4E0E __pfmDraft \u540C\u6A21\u5F0F\u3002 */\n  window.__pfmWarmDeps = {\n    ft: ft, B: B, pid: pid,\n    canvas: function(){ return canvas; },\n    exportAllPlacements: exportAllPlacements, pfmDesignId: pfmDesignId, pfmUploadFaces: pfmUploadFaces,\n    selColor: function(){ return selColor; },\n    colorName: function(){ return (product && product._colorName) || ''; },\n    customerName: function(){ var p = hdcoLoad() || {}; return String(p.nick || '').trim() || 'Custom'; }\n  };\n  try{ if(window.__pfmWarm && window.__pfmWarm.init) window.__pfmWarm.init(); }catch(e){}\n  // creator market: \u9884\u8F7D\u5DF2\u6709 creator/\u5B98\u65B9\u8BBE\u8BA1\u4F9B\u4E70\u5BB6\u9884\u89C8\u5E76\u76F4\u63A5\u52A0\u8D2D\u3002\n  // Gate: \u53EA\u6709 approved \u4F5C\u54C1\u80FD\u8F7D\u5165 \u2014\u2014 rejected/reviewing/removed \u4E00\u5F8B\u62E6\u4F4F\uFF0C\n  // \u907F\u514D\u5206\u4EAB\u94FE\u63A5\u628A\u672A\u5BA1\u6838\u4F5C\u54C1\u63A8\u8FDB Printful \u751F\u4EA7\u3002\n  var preloadUrl = (window.__pfmParams && window.__pfmParams.get('design_url')) || (params && params.get('design_url')) || '';\n  /* 2026-09-17: \u5E26 design_id \u65F6\u4F18\u5148\u300C\u6062\u590D\u5DE5\u7A0B\u300D\uFF08\u53EF\u7EE7\u7EED\u7F16\u8F91\uFF09\uFF0C\u4E0D\u8DD1 design_url \u9884\u89C8\u9884\u8F7D \u2014\u2014\n     \u4E24\u8005\u90FD\u4F1A\u5728 1.6~1.8s \u5185\u6539\u753B\u5E03\uFF0C\u540C\u65F6\u8DD1\u4F1A\u4E92\u76F8\u8986\u76D6\u3002 */\n  /* \uD83D\uDD34\uD83D\uDD34 2026-10-04\uFF08\u4E59\uFF09\uFF1APNG \u9884\u8F7D\u62BD\u6210**\u53EF\u590D\u7528\u51FD\u6570** \u2014\u2014 \u539F\u6765\u5B83\u5D4C\u5728\u4E0B\u9762\u90A3\u4E2A `if` \u91CC\uFF0C\n     \u5E26 `design_id` \u65F6**\u6839\u672C\u6CA1\u5B9A\u4E49** \u21D2 \u5DE5\u7A0B\u53D6\u4E0D\u5230\u5C31\u6CA1\u6709\u9000\u8DEF\uFF08\u5B9E\u6D4B `?design_id=<\u4E0D\u5B58\u5728>` \u21D2\n     \u753B\u5E03 0 \u4E2A\u56FE\u7247\u5BF9\u8C61 = **\u767D\u5C4F**\uFF09\u3002\u800C my-designs \u7684 `labOf()` \u6CE8\u91CA\u4E00\u76F4\u5199\u7740\n     \u300C\u4E07\u4E00\u5DE5\u7A0B\u53D6\u4E0D\u5230\uFF0C\u8BBE\u8BA1\u53F0\u4F1A\u964D\u7EA7\u4E3A\u9884\u89C8\u4F5C\u54C1\u56FE\uFF08\u4E0D\u4F1A\u767D\u5C4F\uFF09\u300D\u21D2 **\u8FD9\u53E5\u627F\u8BFA\u6B64\u524D\u4ECE\u672A\u5151\u73B0**\u3002 */\n  function _runPreload(delay){\n    setTimeout(function(){\n      try {\n        if (typeof addImage === 'function') addImage(preloadUrl);\n        else console.warn('[creator] addImage not ready');\n      } catch(e) { console.warn('[creator] preload failed:', e && e.message); }\n    }, typeof delay === 'number' ? delay : 1600); // 1600 = \u7B49\u4EA7\u54C1\u6A21\u677F\uFF1B\u964D\u7EA7\u8DEF\u5F84\u4F20\u5C0F\u503C\n  }\n  if (preloadUrl && !_preloadDocId) {\n    var doPreload = function(){ _runPreload(1600); };\n    var preloadWorkId = (window.__pfmParams && window.__pfmParams.get('creator_work_id')) || (params && params.get('creator_work_id')) || '';\n    var checkQ = '/creator/check?' + (preloadWorkId\n      ? 'workId=' + encodeURIComponent(preloadWorkId)\n      : 'designUrl=' + encodeURIComponent(preloadUrl));\n    ft(B + checkQ, {}, 10000)\n      .then(function(r){ return r.json(); })\n      .then(function(d){\n        if (d && d.ok === false) {\n          showToast('This design is unavailable and cannot be purchased.', 'warn');\n          return; // do not load the design\n        }\n        doPreload();\n      })\n      .catch(function(){ doPreload(); }); // check failure \u2192 allow (never block legit buyers)\n  }\n  // 2026-09-17: \u5DE5\u7A0B\u6587\u4EF6\u6062\u590D \u2014\u2014 \u5E26 ?design_id= \u65F6\u628A\u4FDD\u5B58\u8FC7\u7684 fabric \u5DE5\u7A0B\u704C\u56DE\u6765\u3002\n  // \u8D70\u7684\u662F\u4E0E\u300C\u64A4\u9500/\u5207\u9762\u300D\u5B8C\u5168\u76F8\u540C\u7684\u8FD8\u539F\u8DEF\u5F84\uFF08restoreState\uFF09\uFF0C\u6240\u4EE5 grid / clip / \u63A7\u4EF6\u6837\u5F0F\u81EA\u52A8\u6B63\u786E\u3002\n  if (_preloadDocId) {\n    setTimeout(function(){\n      ft(B + '/designs/doc?id=' + encodeURIComponent(_preloadDocId), {}, 20000)\n        .then(function(r){ if(!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })\n        .then(function(doc){\n          var dk = Object.keys(doc || {});\n          if (!dk.length) throw new Error('empty doc');\n          dk.forEach(function(k){\n            if (doc[k] && doc[k].objects) placementArt[k] = { json: JSON.stringify(doc[k]), hasArt: true };\n          });\n          /* \uD83D\uDD34\uD83D\uDD34 2026-10-05(B): \u5224\u636E\u4ECE\u300C\u69FD\u5728\u4E0D\u5728\u300D\u5347\u7EA7\u4E3A\u300C\u69FD\u91CC\u6709\u6CA1\u6709 json\u300D\u3002\n             markPlacementArt() \u4F1A\u5728\u5F53\u524D\u9762\u540D\u4E0B\u5EFA**\u7A7A\u69FD** {json:null,hasArt:false}\uFF08\u975E\u7A7A\u4F46\u65E0\u5185\u5BB9\uFF09\n             \u21D2 \u65E7\u5224\u636E !cur \u6052 false \u21D2 \u4E0D\u8D70\u56DE\u9000 \u21D2 restoreState(JSON.parse(null)) \u21D2 \u753B\u5E03\u6062\u590D\u6210\u7A7A\u3002 */\n          var cur = placementArt[currentPlacement];\n          if (!cur || !cur.json) {\n            var _bk = (dk || []).filter(function(k){ return placementArt[k] && placementArt[k].json; });\n            if (_bk.length) {\n              currentPlacement = _bk[0]; cur = placementArt[_bk[0]];\n              try { Array.prototype.forEach.call(q('pfmPlacements').querySelectorAll('.pfm-chip'), function(c){ c.classList.toggle('sel', c.dataset.p === currentPlacement); }); } catch(_){}\n            }\n          }\n          if (!cur || !cur.json) throw new Error('doc restore: no art for placement ' + currentPlacement);\n          restoreState(JSON.parse(cur.json));\n          if (typeof updateLayers === 'function') updateLayers();\n          /* 2026-10-12: \u5DE5\u7A0B\u6062\u590D\u540E\u7ACB\u523B\u5237\u65B0\u300C\u54EA\u4E9B\u9762\u6709\u8BBE\u8BA1\u300D\u7EA2\u70B9\uFF08\u542B\u5C55\u793A\u53F0 View \u884C\uFF09\u3002\n             restoreState \u671F\u95F4 _suppressSave=true \u21D2 markPlacementArt / updatePlacementDots \u4E0D\u4F1A\u88AB\u89E6\u53D1\uFF1B\n             placementArt \u4E0A\u9762\u5DF2\u6309 doc \u586B\u597D \u21D2 \u6B64\u523B\u5224\u5B9A\u662F\u51C6\u7684\u3002 */\n          try{ updatePlacementDots(); }catch(e){}\n          /* restoreState \u7684 loadFromJSON \u662F\u5F02\u6B65\u7684 \u21D2 \u7B49\u5B83\u843D\u5B8C\u518D\u628A\u64A4\u9500\u6808\u91CD\u7F6E\u4E3A\u300C\u8F7D\u5165\u6001\u300D\u3002\n             \u4E0D\u91CD\u7F6E\u7684\u8BDD\u6808\u5E95\u662F\u7A7A\u767D\uFF0C\u7528\u6237\u7B2C\u4E00\u6B21\u64A4\u9500\u4F1A\u628A\u6574\u4E2A\u8BBE\u8BA1\u6E05\u7A7A\u3002 */\n          setTimeout(function(){\n            try{\n              placementUndo[currentPlacement] = [JSON.stringify(canvas.toJSON())];\n              placementRedo[currentPlacement] = [];\n              if (window.__pfmDraft && window.__pfmDraft.save) window.__pfmDraft.save();\n            }catch(e){}\n            /* \uD83D\uDD34 2026-10-05(D): \u4ECE My Designs \u8FDB\u6765\u6CA1\u4EBA\u8C03\u5C55\u793A\u5C42\u5B9A\u683C\u51FD\u6570\uFF08stageArt \u53EA\u5728\u5173\u677F/\u5207 View \u65F6\u88AB\u8C03\uFF09\n               \u21D2 \u5373\u4F7F\u5DE5\u7A0B\u6062\u590D\u6210\u529F\uFF0C\u9996\u5C4F\u4ECD\u662F\u7D20\u4EA7\u54C1\u56FE\u3002\n               restoreState \u8D70 loadFromJSON **\u5F02\u6B65**\uFF08\u4F4D\u56FE\u89E3\u7801\u66F4\u6162\uFF09\u21D2 800ms \u65F6\u5BF9\u8C61\u53EF\u80FD\u5C1A\u672A\u843D\u753B\u5E03\uFF0C\n               \u5B9A\u683C\u4F1A\u88AB stageArt \u81EA\u5DF1 `hide()` \u6389\uFF08\u5B9E\u6D4B\uFF1A\u5EF6\u8FDF\u8865\u8C03\u5373\u51FA\u56FE\uFF09\u3002\n               \u6545\uFF1A\u7ACB\u523B\u8BD5\u4E00\u6B21 + \u8F6E\u8BE2\u515C\u5E95\u5230\u300C\u6709\u8BBE\u8BA1\u5BF9\u8C61\u300D\u518D\u5B9A\u683C\uFF0C\u4E0A\u9650 6s\u3002 */\n            try{ if (typeof window.__pfmStageArt === 'function') window.__pfmStageArt(); }catch(e){}\n            try{\n              window.__pfmStageDTry = 0;\n              var _pfmStageRetry = function(){\n                window.__pfmStageDTry++;\n                var cvv = window.__pfmCanvas;\n                var has = !!(cvv && cvv.getObjects) && cvv.getObjects().filter(function(o){return !o.isGrid && !o.isPreview;}).length > 0;\n                if (has) { if (typeof window.__pfmStageArt === 'function') window.__pfmStageArt(); return; }\n                if (window.__pfmStageDTry <= 24) setTimeout(_pfmStageRetry, 250);\n              };\n              setTimeout(_pfmStageRetry, 250);\n            }catch(e){}\n            /* \uD83D\uDD34 2026-10-05(C): \u53EA\u6709**\u771F\u6062\u590D\u51FA\u56FE**\u624D\u62A5\u6210\u529F \u2014\u2014 \u6062\u590D\u5931\u8D25\u65F6\u4E0D\u518D\u5047\u62A5\u300CDesign restored\u300D\u3002 */\n            try{\n              var _real = canvas.getObjects().filter(function(o){ return !o.isGrid && !o.isPreview; }).length;\n              if (_real > 0) hdcoToast('Design restored &mdash; you can keep editing');\n              else console.warn('[design] restore produced 0 art objects');\n            }catch(e){ hdcoToast('Design restored &mdash; you can keep editing'); }\n          }, 800);\n        })\n        .catch(function(e){\n          /* \u53D6\u4E0D\u5230\u5DE5\u7A0B\u5C31\u9759\u9ED8\u964D\u7EA7\u4E3A\u73B0\u72B6\uFF08\u7A7A\u767D/\u9884\u89C8\uFF09\uFF0C\u4E0D\u6253\u6270\u7528\u6237 */\n          console.warn('[design] doc restore failed:', e && e.message);\n          /* 2026-09-17: \u628A\u8349\u7A3F\u6761\u653E\u56DE\u6765 \u2014\u2014 \u5426\u5219\u7528\u6237\u65E2\u62FF\u4E0D\u5230\u4E91\u7AEF\u5DE5\u7A0B\u3001\u4E5F\u770B\u4E0D\u5230\u672C\u5730\u8349\u7A3F\uFF0C\u4E24\u6761\u8DEF\u90FD\u5835\u6B7B\u3002 */\n          _preloadDocId = '';\n          try{ if(window.__pfmDraftBarSync) window.__pfmDraftBarSync(); }catch(e2){}\n          /* \uD83D\uDD34 2026-10-04\uFF08\u4E59\uFF09\uFF1A**\u5151\u73B0\u964D\u7EA7\u627F\u8BFA** \u2014\u2014 \u53EA\u653E\u56DE\u8349\u7A3F\u6761\u4E0D\u591F\uFF1A\u5E26 `design_id` \u65F6 design_url \u7684\n             \u9884\u8F7D\u5728\u89E3\u6790\u671F\u5C31\u88AB\u8DF3\u8FC7\uFF08\u89C1\u4E0A\u9762 `if (preloadUrl && !_preloadDocId)`\uFF09\uFF0C\u5DE5\u7A0B\u53C8\u53D6\u4E0D\u5230 \u21D2\n             \u753B\u5E03\u5B9E\u9645\u662F**\u7A7A\u7684**\uFF08\u5B9E\u6D4B 0 \u4E2A\u56FE\u7247\u5BF9\u8C61 = \u767D\u5C4F\uFF09\u3002\u8FD9\u91CC\u8865\u8DD1\u4E00\u6B21 design_url \u9884\u8F7D\u3002\n             300ms\uFF1A\u8D70\u5230\u8FD9\u91CC\u65F6\u4EA7\u54C1\u6A21\u677F\u65E9\u5DF2\u52A0\u8F7D\u5B8C\uFF08\u5DE5\u7A0B\u6062\u590D\u672C\u8EAB\u665A 1800ms + \u4E00\u6B21\u7F51\u7EDC\u5F80\u8FD4\uFF09\u3002 */\n          if (preloadUrl) _runPreload(300);\n        });\n    }, 1800);\n  }\n},200);\n\n\n/* ===== 2026-09-14\uFF1A\u8DE8 IIFE \u4F5C\u7528\u57DF\u53E5\u67C4 \u2014\u2014 **\u5FC5\u987B\u843D\u5728\u4E3B IIFE \u5185** =====\n   \u26A0\uFE0F \u8E29\u5751\u8BB0\u5F55\uFF1A\u8FD9\u6279\u53E5\u67C4\u539F\u5148\u5199\u5728\u6587\u4EF6\u4E0B\u65B9\u300CDEBUG PANEL\u300D\u90A3\u4E2A IIFE \u91CC\uFF0C\u800C\u8BE5 IIFE\n   \u9996\u884C\u662F `if(!(params||new URLSearchParams(location.search)).get('debug')) return;`\n   \u2192 **\u6CA1\u6709 ?debug=1 \u65F6\u6574\u5757\u4E0D\u6267\u884C**\uFF0C\u4E8E\u662F\uFF1A\n     \u00B7 __pfmSaveState \u6052 undefined \u2192 \u7B2C\u4E8C IIFE \u7684 saveState() \u59D4\u6258\u6052\u7A7A\n       \u2192 \u56FE\u5C42\u52FE\u9009/\u6210\u7EC4\u3001\u56FE\u7247\u5904\u7406\u7B49\u64CD\u4F5C**\u4E0D\u8FDB\u64A4\u9500\u6808**\uFF0809-10 \u8D77\u5C31\u5B58\u5728\uFF09\n     \u00B7 __pfmGetPlacement \u6052 undefined \u2192 \u76F8\u5173\u8C03\u7528\u56DE\u9000 'front'\n   \u94C1\u5F8B\uFF1A\u8DE8 IIFE \u53D6\u53D8\u91CF\u5FC5\u987B\u663E\u5F0F\u66B4\u9732\uFF0C\u4E14**\u66B4\u9732\u70B9\u5FC5\u987B\u4F4D\u4E8E\u4E00\u5B9A\u4F1A\u6267\u884C\u7684\u4F5C\u7528\u57DF**\u3002 */\ntry{ window.__pfmSaveState = saveState; }catch(e){}\ntry{ window.__pfmGetPlacement = function(){ return currentPlacement; }; }catch(e){}\n/* ===== 2026-09-20\uFF1A\u7ED8\u753B\u677F\u5F15\u64CE\uFF08assets/hd-draw.js\uFF09\u7684\u4F9D\u8D56\u6CE8\u5165 =====\n   \u5F15\u64CE\u662F defer \u52A0\u8F7D \u21D2 \u5728 DOMContentLoaded \u524D\u6267\u884C\uFF0C\u672C\u884C\u5728\u89E3\u6790\u671F\u6267\u884C \u21D2 \u4E00\u5B9A\u65E9\u4E8E\u5B83\u3002\n   \uD83D\uDD34 \u53D6\u503C\u51FD\u6570\u5FC5\u987B\u4F20\u51FD\u6570\u3001\u4E0D\u80FD\u4F20\u503C\uFF1Acanvas / currentPlacement \u6B64\u523B\u90FD\u8FD8\u6CA1\u521D\u59CB\u5316\u3002\n   \uD83D\uDD34 \u66B4\u9732\u70B9\u5FC5\u987B\u5728\u8FD9\u91CC\uFF08\u4E3B IIFE \u5185\u4E14\u4E00\u5B9A\u4F1A\u6267\u884C\uFF09\u2014\u2014 \u4E0E\u4E0A\u4E00\u884C __pfmGetPlacement \u540C\u4E00\u4E2A\u7406\u7531\u3002 */\ntry{\n  window.__hdDrawDeps = {\n    q: q,\n    canvas: function(){ return canvas; },\n    saveState: saveState,\n    updateLayers: updateLayers,\n    applyControlStyle: applyControlStyle,\n    currentPlacement: function(){ return currentPlacement; }\n  };\n}catch(e){}\n/* 2026-09-16: \u526A\u8D34\u677F\u7684\u300C\u526A\u5207\u300D\uFF08assets/hd-edit.js\uFF09\u590D\u7528\u540C\u4E00\u4EFD\u5220\u9664\u5B9E\u73B0 */\ntry{ window.__pfmDoAction = pfmDoAction; }catch(e){}\n\n/* 2026-09-14 \u6279\u6B211\uFF08\u77E2\u91CF\u5F62\u72B6\u5F15\u64CE\uFF09\uFF1Aassets/hd-vector.js \u4F9D\u8D56\u7684\u4E24\u4E2A\u539F\u8BED */\ntry{\n  /* \u7EDF\u4E00\u300C\u6DFB\u52A0\u5BF9\u8C61\u300D\u539F\u8BED\uFF1A\u63A7\u5236\u70B9\u6837\u5F0F + \u5165\u753B\u5E03 + \u9009\u4E2D + \u6E32\u67D3 + \u5165\u64A4\u9500\u6808 + \u5237\u65B0\u56FE\u5C42\uFF0C\n     \u987A\u5E8F\u4E0E\u65E2\u6709 addImage/addText \u4FDD\u6301\u4E00\u81F4\uFF0C\u907F\u514D\u4E0B\u6E38\u5404\u5199\u4E00\u4EFD\u5B9E\u73B0\u3002 */\n  window.__pfmAddObject = function(obj, opts){\n    if(!obj || !canvas) return null;\n    opts = opts || {};\n    try{ applyControlStyle(obj); }catch(e){}\n    canvas.add(obj);\n    if(opts.noSelect !== true){ try{ canvas.setActiveObject(obj); }catch(e){} }\n    canvas.renderAll();\n    try{ saveState(); }catch(e){}\n    try{ updateLayers(); }catch(e){}\n    return obj;\n  };\n  /* \u843D\u4F4D\u539F\u8BED\u590D\u7528\uFF08\u5F62\u72B6\u4E0E\u56FE\u7247\u5171\u7528\u540C\u4E00\u4EFD\u5B9E\u73B0\uFF0C\u7981\u7B2C\u4E8C\u4EFD\uFF09\u3002 */\n  window.__pfmFitToPrintArea = function(){ return window.__hdDraw ? window.__hdDraw.fitToPrintArea.apply(null, arguments) : undefined; };\n  /* 2026-09-14 \u6279\u6B212b\uFF08\u5E03\u5C14\u8FD0\u7B97\uFF09\uFF1A\u9700\u8981\u6309\u300C\u56FE\u5C42\u9762\u677F Multi \u52FE\u9009\u300D\u53D6\u51FA\u5BF9\u8C61 \u2014\u2014\n     \u79FB\u52A8\u7AEF\u6CA1\u6709 Shift \u591A\u9009\uFF0C\u53EA\u80FD\u9760\u56FE\u5C42\u52FE\u9009\u6765\u51D1\u9F50\u53C2\u4E0E\u8FD0\u7B97\u7684\u5BF9\u8C61\u3002 */\n  window.__pfmLayerObjs = pfmLayerObjs;\n  /* 2026-09-14 \u6279\u6B214a\uFF08\u5BF9\u9F50\u5F15\u64CE\uFF09\uFF1A**\u9009\u4E2D\u5BF9\u8C61\u96C6\u5408 \u2014\u2014 \u516C\u5171\u539F\u8BED\uFF0C\u53EA\u6B64\u4E00\u4EFD**\u3002\n     \u8986\u76D6\u4E09\u6761\u6765\u6E90\u7684\u5E76\u96C6\uFF1Afabric Shift \u591A\u9009\u3001\u5355\u9009\u3001\u56FE\u5C42\u9762\u677F Multi \u52FE\u9009\uFF08\u79FB\u52A8\u7AEF\u65E0 Shift\uFF09\u3002\n     \u523B\u610F**\u4E0D\u5BF9\u7C7B\u578B\u505A\u8FC7\u6EE4**\uFF1A\u5E03\u5C14\u8FD0\u7B97\u53EA\u8981\u77E2\u91CF\u5F62\u72B6\uFF0C\u5BF9\u9F50\u8981\u4E00\u5207\u5BF9\u8C61 \u2014\u2014\n     \u4E1A\u52A1\u5DEE\u5F02\u7531\u8C03\u7528\u65B9\u5404\u81EA\u8D1F\u8D23\uFF0C\u516C\u5171\u539F\u8BED\u53EA\u56DE\u7B54\u300C\u7528\u6237\u9009\u4E2D\u4E86\u4EC0\u4E48\u300D\u3002 */\n  window.__pfmSelectedObjs = function(){\n    var out=[], seen=[];\n    if(!canvas) return out;\n    function push(o){\n      if(!o || o.isGrid || o.isPreview) return;\n      if(seen.indexOf(o)>=0) return;\n      seen.push(o); out.push(o);\n    }\n    try{ if(canvas.getActiveObjects) canvas.getActiveObjects().forEach(push); }catch(e){}\n    try{\n      var L=window.__hdLayers;\n      if(L && L.multiOn && L.multiOn() && window.__pfmLayerObjs){\n        window.__pfmLayerObjs().slice().reverse().forEach(function(o,i){\n          if(L.isPicked(i)) push(o);\n        });\n      }\n    }catch(e){}\n    return out;\n  };\n  /* \u9762\u677F\u6570\u503C\u56DE\u586B\u540E\u9700\u8981\u5237\u65B0\u56FE\u5C42\u52FE\u9009\u6001 */\n  window.__pfmUpdateLayers = function(){ try{ updateLayers(); }catch(e){} };\n  /* toast \u516C\u5171\u539F\u8BED\uFF1A\u5404\u5916\u7F6E asset \u5171\u7528\u4E00\u4EFD\u63D0\u793A DOM\uFF08\u907F\u514D\u5404\u5EFA\u4E00\u4E2A\u5143\u7D20\uFF09 */\n  window.__pfmToast = hdcoToast;\n  /* 2026-09-14 \u6279\u6B214c\uFF1A\u5F27\u5F62\u6587\u5B57\u8DEF\u5F84\u91CD\u7B97 \u2014\u2014 hd-text.js \u6539\u5B57\u95F4\u8DDD\u540E\u5FC5\u987B\u91CD\u7B97\uFF0C\n     \u5426\u5219\u8DEF\u5F84\u957F\u5EA6\u4ECD\u6309\u65E7\u6587\u5B57\u5BBD\u7B97 \u2192 \u6587\u5B57\u4F1A\u6EA2\u51FA\u66F2\u7EBF\u3002\u5B9E\u73B0\u53EA\u6B64\u4E00\u4EFD\uFF0C\u4E0D\u5728\u5916\u7F6E asset \u91CD\u5199\u3002 */\n  window.__pfmApplyArcToText = applyArcToText;\n  /* 2026-09-15\uFF1A\u89E6\u63A7\u5E03\u5C40\u5224\u5B9A \u2014\u2014 **\u516C\u5171\u539F\u8BED\uFF0C\u552F\u4E00\u5B9E\u73B0\uFF0C\u7981\u6B62\u518D\u6563\u843D**\u3002\n     \u539F\u5148 8c / 8e / 8e-2 \u5404\u5199\u4E86\u4E00\u4EFD `innerWidth<=768`\uFF08\u540C\u4E00\u5224\u65AD\u4E09\u5904\u91CD\u590D\uFF09\u3002\n     \u5224\u636E\u4E0E CSS \u4FA7\u300C\u624B\u673A\u6863\u300D\u5A92\u4F53\u67E5\u8BE2**\u5B57\u9762\u5B8C\u5168\u4E00\u81F4**\uFF08\u540C\u4E00\u4E32 MQ\uFF0C\u89C1\u4E0B\u65B9\u5E38\u91CF\uFF09\uFF1A\n       @media(max-width:768px),(orientation:portrait) and (max-width:1024px)\n     \u2192 \u624B\u673A\u7AD6\u5C4F + **\u7AD6\u5C4F\u5E73\u677F**\uFF08iPad Air \u7AD6 820 / iPad Pro \u7AD6 1024\uFF09\u90FD\u8D70\u62BD\u5C49\u5F62\u6001\u3002\n     \u4E3A\u4EC0\u4E48\u7AD6\u5C4F\u5E73\u677F\u4E5F\u8981\u8D70\u62BD\u5C49\uFF1A\u7AD6\u5C4F\u5E73\u677F\u7684\u74F6\u9888\u662F**\u5BBD\u5EA6**\uFF08820 \u5BBD\uFF0C\u5DE6\u53F3\u53CC\u680F\u5403\u6389 360px\n     \u2192 \u753B\u5E03\u88AB\u5BBD\u5EA6\u9501\u6B7B 420\uFF0C\u800C\u5C4F\u5E55 1180 \u9AD8\u3001\u4E0B\u65B9 654px \u5168\u7A7A\uFF09\uFF1B\u6539\u6210\u62BD\u5C49\u540E\u753B\u5E03\u80FD\u5403\u5168\u5BBD ~796\u3002\n     \u26A0\uFE0F \u6539\u65AD\u70B9\u5FC5\u987B\u4E24\u5904\u540C\u6539\uFF08CSS \u7684 @media + \u8FD9\u91CC\u7684 MQ \u5E38\u91CF\uFF09\uFF0C\u5426\u5219\u4F1A\u51FA\u73B0\n        \u300CCSS \u5F53\u5E73\u677F(\u62BD\u5C49) / JS \u5F53\u684C\u9762(\u4E0D\u642C\u8FC1)\u300D\u9519\u4F4D \u2192 8e/8e-2 \u5E38\u9A7B\u6761\u5931\u6548\u3001\u62BD\u5C49\u7B2C\u4E00\u5757\u5F00\u677F\u4E0D\u53EF\u89C1\u3002\n     \u5B9E\u73B0\u53D6\u5411\uFF1A**\u4F18\u5148 matchMedia \u67E5\u540C\u4E00\u6761 MQ**\uFF08\u4E0E CSS \u5929\u7136\u540C\u6E90\uFF0C\u4E0D\u4F1A\u9519\u4F4D\uFF09\uFF1B\n     matchMedia \u4E0D\u53EF\u7528/\u5F02\u5E38\u65F6\u9000\u56DE\u663E\u5F0F\u8BA1\u7B97\uFF08\u884C\u4E3A\u7B49\u4EF7\uFF0C\u4EC5\u4F5C\u515C\u5E95\uFF09\u3002 */\n  window.__pfmTouchLayout = function(){\n    var MQ = '(max-width:768px),(orientation:portrait) and (max-width:1024px)';\n    try{\n      if(window.matchMedia){\n        var r = window.matchMedia(MQ);\n        if(r && typeof r.matches === 'boolean') return r.matches;\n      }\n    }catch(e){}\n    try{\n      if(window.innerWidth <= 768) return true;\n      /* CSS `orientation:portrait` \u8BED\u4E49 = \u9AD8 \u2265 \u5BBD\uFF08\u542B\u6B63\u65B9\u5F62\u89C6\u53E3\uFF09 */\n      return window.innerHeight >= window.innerWidth && window.innerWidth <= 1024;\n    }catch(e){ return false; }\n  };\n}catch(e){ console.warn('[pfm] vector bridge failed', e && e.message); }\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   2026-10-15\uFF08\u7532\u00B7\u7528\u6237\u88C1\u51B3\uFF09\uFF1A**\u51FA\u56FE\u5757\u642C\u56DE\u672C\u6587\u4EF6**\u3002\n   \uD83D\uDD34 \u80CC\u666F\uFF1A\u8BE5\u5757\u4ECA\u5929\u66FE\u88AB\u5916\u7F6E\u4E3A assets/hd-gen-warm.js\uFF0C\u4F46\u88AB\u642C\u51FA\u53BB\u7684\u4EE3\u7801\u88F8\u7528\u672C\u6587\u4EF6 IIFE \u5185\u90E8\u7684\n   pid / product / selColor / currentTech / currentVariantId / placementArt / markPlacementArt /\n   exportAllPlacements / hdFilterNonEmptyFaces / B / ft \u2014\u2014 \u72EC\u7ACB\u6587\u4EF6\u91CC\u5168\u90E8 ReferenceError\uFF0C\n   \u800C\u5F02\u5E38\u88AB __hdAct \u541E\u6389 \u21D2 **\u70B9 Mockups \u5B8C\u5168\u65E0\u53CD\u5E94\uFF08\u9759\u9ED8\u5931\u6548\uFF09**\u3002\n   \u642C\u56DE\u6B64\u5904\uFF08\u6700\u5916\u5C42 IIFE \u5185\u3001\u8FD9\u4E9B\u6807\u8BC6\u7B26\u5168\u90E8\u53EF\u89C1\uFF09\u21D2 \u95ED\u5305\u5929\u7136\u6B63\u786E\u3002\n   \u26A0\uFE0F \u540C\u65F6\u5DF2\u4ECE sections/design-canvas.liquid \u6458\u6389 hd-gen-warm.js \u7684 <script>\uFF0C\u907F\u514D\u91CD\u590D\u7ED1\u5B9A\u3002 */\n/* ===== HighDeep \u8BBE\u8BA1\u53F0 \u00B7 \u51FA\u56FE\u7B49\u5F85\u300C\u6E29\u99A8\u63D0\u9192\u300D(2026-10-15 \u81EA hd-canvas.js \u5916\u7F6E) =====\n   \u539F\u4F4D\u7F6E\uFF1Aassets/hd-canvas.js \u5185\u300C\u6E29\u99A8\u63D0\u9192\u300D\u6574\u5757\u3002\u5916\u7F6E\u7406\u7531\uFF1Ahd-canvas.js \u5DF2 265 KB \u5355\u6587\u4EF6\u8FC7\u5927\u3002\n   \u81EA\u5305\u542B\uFF1A\u4EC5\u4F9D\u8D56 DOM \u2014\u2014 \u81EA\u5E26 q()\uFF08\u540C assets/hd-fontlib.js \u5148\u4F8B\uFF09\uFF1B\u4E0E\u4E3B IIFE \u65E0\u5176\u5B83\u8026\u5408\n           \uFF08\u5757\u5916\u4EC5\u901A\u8FC7 window.hdMockupItems \u8FD9\u4E00\u5171\u4EAB\u6570\u7EC4\u4EA4\u4E92\uFF0C\u4ECD\u8D70 window\uFF09\u3002\n   \u5BFC\u51FA\uFF08\u4E0E\u539F\u5B9E\u73B0\u9010\u5B57\u4E00\u81F4\uFF09\uFF1AhdGenPhase / hdGenSubmitted / hdGenBusy / hdGenStart / hdGenStop\n           / pfmGenBtn / hdMockupItems / __pfmGenBack\n   \u52A0\u8F7D\u4F4D\u7F6E\uFF1Asections/design-canvas.liquid\uFF0C\u7D27\u63A5 hd-canvas.js \u4E4B\u540E\uFF08defer\uFF09\u3002 */\n(function(){\n'use strict';\nvar q=function(id){return document.getElementById(id);};\n/* ===== 2026-10-06 \u620A\uFF1A\u7B49\u5F85\u8FC7\u7A0B\u7684\u300C\u6E29\u99A8\u63D0\u9192\u300D =====\n   \u7532+\u4E01\u4E4B\u540E\u5355\u6B21\u751F\u6210 20~35s\uFF08\u591A\u9762\u66F4\u957F\uFF09\uFF0Cbusy \u6001\u53EA\u5199 \"Generating\u2026\" \u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u5361\u6B7B\uFF1B\n   \u95F8\u95E8\u53C8\u8BA9\u7B49\u5F85\u65F6\u957F\u53EF\u53D8\uFF08\u540E\u53F0\u6279\u91CF\u51FA\u56FE\u65F6\u66F4\u4E45\uFF09\u21D2 \u5FC5\u987B\u8BA9\u7528\u6237\u770B\u5F97\u89C1\u300C\u8FDB\u5EA6\u300D\u548C\u300C\u5728\u6392\u961F\u300D\u3002\n   \u4E24\u6BB5\u5F0F\uFF1APOST \u672A\u8FD4\u56DE = \u63D0\u4EA4/\u6392\u961F\uFF1BPOST \u5DF2\u8FD4\u56DE = \u51FA\u56FE\u4E2D\u3002\u77ED\u53E5\u8FDB\u6309\u94AE\uFF0C\u5B8C\u6574\u53E5\u5B50\u8FDB title\u3002 */\nvar _genActive=false, _genT0=0, _genResp=0, _genTotal=0, _genTick=0;\nwindow.hdGenPhase=function(){\n  var v=(_genTotal>1)?(' \\u00b7 '+_genTotal+' views'):'';\n  if(!_genResp){\n    var e1=(Date.now()-_genT0)/1000;\n    if(e1<6)  return {text:'Sending\\u2026'+v,   title:'Sending your design to Printful'+(v?' ('+_genTotal+' views)':'')};\n    if(e1<22) return {text:'Queued\\u2026'+v,    title:\"We're queuing your design \\u2014 another render is finishing first, about 30 seconds\"};\n    return          {text:'Still waiting\\u2026', title:'Printful is busy right now \\u2014 hang tight, this can take up to a minute'};\n  }\n  var e2=(Date.now()-_genResp)/1000;\n  if(e2<25) return {text:'Rendering\\u2026 ~20s', title:'Printful is rendering your design \\u2014 usually about 20 seconds'};\n  if(e2<55) return {text:'Almost there\\u2026'+v, title:'Still rendering \\u2014 thanks for your patience'};\n  return         {text:'Still rendering\\u2026',  title:'Printful is taking longer than usual \\u2014 your job keeps running, no need to click again'};\n};\nwindow.hdGenSubmitted=function(){ _genResp=Date.now(); };\nwindow.hdGenBusy=function(title){\n  var p=window.hdGenPhase();\n  pfmGenBtn('busy', p?{text:p.text, title:title||p.title}:{title:title});\n};\nwindow.hdGenStart=function(total){\n  _genActive=true; _genT0=Date.now(); _genResp=0; _genTotal=total||0;\n  /* 2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u65B0\u4E00\u8F6E\u4EFB\u52A1\u5F00\u59CB \u21D2 \u5355\u8C03\u503C\u5F52\u96F6\u3002\n     \u5426\u5219\u4E0A\u4E00\u8F6E\u7559\u4E0B\u7684 99% \u4F1A\u88AB\u5E26\u8FC7\u6765\uFF0C\u65B0\u4EFB\u52A1\u4E00\u5F00\u59CB\u6761\u5C31\u505C\u5728 99% \u4E0D\u52A8\u3002 */\n  window.__mcFillMax=0; window.__mcEtaMin=null;\n  if(_genTick) clearInterval(_genTick);\n  _genTick=setInterval(function(){\n    if(!_genActive){ clearInterval(_genTick); _genTick=0; return; }\n    var b=q('pfmBtnGenerate');\n    if(b && b.getAttribute('data-state')==='busy') window.hdGenBusy();\n  },3000);\n};\nwindow.hdGenStop=function(){ _genActive=false; if(_genTick){ clearInterval(_genTick); _genTick=0; } };\nfunction pfmGenBtn(state, opt){\n  opt = opt || {};\n  var b = q('pfmBtnGenerate'); if(!b) return;\n  var TXT = {idle:'Generate Mockup', busy:'Generating\u2026', done:'Done', error:'Retry', blocked:'Not ready yet'};\n  var SR  = {idle:'', busy:'Generating mockups', done:'Mockups ready', error:'Mockup generation failed', blocked:'Cannot generate yet'};\n  var t = b.querySelector('.pfm-gen-txt');\n  b.setAttribute('data-state', state);\n  if(state!=='busy'){ window.hdGenStop(); }   // 2026-10-06 \u620A\uFF1A\u4E00\u6B21\u6027\u6001\u7ACB\u523B\u505C\u6389\u8FDB\u5EA6\u8282\u62CD\u5668\n  if(t) t.textContent = opt.text || TXT[state] || TXT.idle;\n  b.disabled = (state === 'busy');                       // \u4EC5 busy \u7981\u7528 \u2014\u2014 \u9632\u8FDE\u70B9\u91CD\u590D\u5EFA Printful \u4EFB\u52A1\n  b.setAttribute('aria-busy', state === 'busy' ? 'true' : 'false');\n  if(opt.title){ b.title = opt.title; } else { b.removeAttribute('title'); }\n  var sr = q('pfmGenStatus');\n  if(sr){\n    var st = SR[state] || '';\n    sr.textContent = opt.title ? (st ? st + ' \u2014 ' + opt.title : opt.title) : st;\n  }\n  clearTimeout(window.__pfmGenBack);\n  if(state === 'blocked'){                               // \u4EC5 blocked \u4E3A\u4E34\u65F6\u6001\uFF08\u81EA\u52A8\u56DE idle\uFF09\n    window.__pfmGenBack = setTimeout(function(){\n      var cur = q('pfmBtnGenerate');\n      if(cur && cur.getAttribute('data-state') === state) pfmGenBtn('idle');\n    }, 1600);\n  }\n  /* 2026-10-15\uFF08\u7528\u6237\u88C1\u51B3 \u7532\uFF09\uFF1A\u5E95\u90E8\u300C\u21BB Generate again\u300D**\u5DF2\u4ECE\u5F39\u7A97\u5220\u9664** \u21D2 \u5B8C\u6210\u6001\u7684\u300C\u518D\u751F\u6210\u300D\n     \u5165\u53E3\u632A\u5230**\u63D0\u793A\u533A**\uFF08\u4E0E Start generating \u540C\u4E00\u4F4D\u7F6E\uFF09\u3002\u590D\u7528\u4E3B\u6309\u94AE\u8DEF\u5F84\uFF0C\u4E0D\u5199\u7B2C\u4E8C\u4EFD\u51FA\u56FE\u4EE3\u7801\u3002 */\n  try { hdMcDoneTip(state === 'done'); } catch (e) {}\n}\nwindow.pfmGenBtn = pfmGenBtn;\n\n/* 2026-10-15 \u62792b-1\uFF08\u7528\u6237\u88C1\u51B3\u300C\u2460\u4E59 \u2461\u7532\u300D\uFF09\uFF1A\u70B9 Mockups **\u5148\u7ED9\u786E\u8BA4\u6001** \u2014\u2014 \u6E29\u99A8\u63D0\u793A + \u771F\u5B9E\u7684\n   \u300C\u6392\u961F\u4EFB\u52A1\u6570 / \u9884\u8BA1\u7B49\u5F85\u300D\uFF08\u6570\u636E\u6765\u81EA bridge \u53EA\u8BFB\u63A5\u53E3 GET /mockup/queue\uFF0C2026-10-15 \u5DF2\u4E0A\u7EBF\uFF09\uFF0C\n   \u7528\u6237\u70B9 [Start generating] **\u624D\u5F00\u59CB\u51FA\u56FE**\u3002\n   \uD83D\uDD34 \u96F6\u56DE\u5F52\uFF1A\u53EA\u9009 1 \u4E2A\u8272\uFF08\u6216\u6CA1\u8D70\u76EE\u5F55\u9875\uFF09\u21D2 \u8D70\u539F\u8DEF\u5F84\uFF0C\u884C\u4E3A\u4E0E\u6539\u524D**\u5B8C\u5168\u4E00\u81F4**\u3002 */\nfunction hdMcFmtEta(sec){\n  sec = Math.max(0, parseInt(sec, 10) || 0);\n  if (sec < 60) return '~' + sec + 's est.';\n  var m = Math.floor(sec / 60), r = sec % 60;\n  return '~' + m + 'm ' + (r < 10 ? '0' + r : r) + 's est.';\n}\nfunction hdMcShowConfirm(names, genBtn){\n  var tip = q('pfmMcTipConfirm'), busy = q('pfmMcTipBusy');\n  if (!tip) { pfmGenBtn('idle'); genBtn.click(); return; }   /* \u5BB9\u5668\u7F3A\u5931 \u21D2 \u9000\u56DE\u539F\u884C\u4E3A\uFF0C\u7EDD\u4E0D\u5361\u6B7B */\n  if (busy) busy.style.display = 'none';\n  var n = names.length;\n  tip.style.display = '';\n  /* 2026-10-15\uFF08\u7528\u6237\uFF09\uFF1A\u786E\u8BA4\u6001**\u5168\u82F1\u6587**\u3001**\u4E0D\u63D0 Printful**\u3001**\u4E0D\u5199\u989C\u8272\u540D** \u2014\u2014 \u53EA\u7559\u6570\u91CF\u4E0E\u6392\u961F/\u7B49\u5F85\u3002 */\n    tip.style.display = 'none';   /* 2026-10-16\uFF08\u7528\u6237\uFF09\uFF1A\u63D0\u793A\u533A\u5DF2\u79FB\u9664 \u2014\u2014 \u4FE1\u606F\u5168\u7531\u5E95\u90E8\u6309\u94AE\u627F\u8F7D */\n  /* \u771F\u5B9E\u6392\u961F / \u9884\u8BA1\u7B49\u5F85\uFF08\u53EA\u8BFB\uFF1B\u5931\u8D25\u9759\u9ED8\u964D\u7EA7\u6210\u300C\u2026\u300D\uFF0C\u7EDD\u4E0D\u963B\u585E\u51FA\u56FE\uFF09 */\n  try {\n    ft(B + '/mockup/queue?pageId=' + encodeURIComponent(window.__hdPageId || ''), {}, 8000).then(function (r) { return r.json(); }).then(function (d) {\n      if (!d || !d.success) return;\n      var Q = q('pfmMcQ'), E = q('pfmMcEta');\n      if (Q) Q.textContent = String(d.queued || 0);\n      if (E) E.textContent = hdMcFmtEta(d.etaSec);\n    }).catch(function () {});\n  } catch (e) {}\n  /* \u5E95\u90E8\u6309\u94AE\u533A\uFF1Aconfirm \u6001 = Start generating\uFF08\u7EFF\u8272 CTA\uFF0C\u5168\u5BBD\uFF09 */\n  hdMcFoot([{ id: 'pfmMcGo', txt: 'Start generating', fn: function () {\n    tip.style.display = 'none';\n    pfmGenBtn('idle');\n    genBtn.click();                        /* \u590D\u7528\u539F\u751F\u6210\u8DEF\u5F84\uFF08\u5355\u4E00\u771F\u6E90\uFF09 */\n  } }]);\n}\ntry { window.hdMcShowConfirm = hdMcShowConfirm; } catch (e) {}\n/* 2026-10-15 \u62792b-2a\uFF1A**\u8FDB\u5F39\u7A97\u5373\u5EFA\u7A7A\u5360\u4F4D\u9AA8\u67B6** \u2014\u2014 \u8FD8\u6CA1\u51FA\u56FE\u65F6\u4E5F\u7528\u540C\u4E00\u5957\u7A97\u58F3\n   \uFF08\u865A\u7EBF\u5927\u56FE\u6846 + \u7A7A\u5C0F\u56FE\u5E26\uFF09\uFF0C\u800C\u4E0D\u662F\u4E00\u7247\u7A7A\u767D\u3002\u51FA\u56FE\u540E\u539F\u6E32\u67D3\u4F1A\u91CD\u5199 #pfmMockupGallery\uFF0C\n   \u9AA8\u67B6\u81EA\u7136\u8BA9\u4F4D\uFF08\u65E0\u9700\u62C6\u5378\uFF09\u3002\uD83D\uDD34 \u7528\u6237\u94C1\u5F8B\uFF1A\u5355\u8272/\u591A\u8272**\u4E00\u5F8B**\u663E\u793A\uFF0C\u4E0D\u5206\u53C9\u3002 */\nfunction hdMcSkeleton(){\n  var g = q('pfmMockupGallery'); if (!g) return;\n  if (g.querySelector('.pfm-carousel-main')) return;      /* \u5DF2\u6709\uFF08\u771F\u56FE\u6216\u9AA8\u67B6\uFF09\u21D2 \u4E0D\u91CD\u5EFA */\n  g.innerHTML = '<div class=\"pfm-carousel-main pfm-mockup-item empty\">'\n      + '<span class=\"pfm-carousel-badge\">\u2014</span><img src=\"\" alt=\"\">'\n      + '<div class=\"pfm-mc-ph\"><img src=\"https://cdn.shopify.com/s/files/1/0835/1527/7555/t/7/assets/brand-icon.png?v=45260592905099172801786886543\" alt=\"HighDeep Creative\"><span>HighDeep Creative</span></div>'\n    + '</div>'\n    + '<div class=\"pfm-carousel-thumbs\"></div>';\n}\ntry { window.hdMcSkeleton = hdMcSkeleton; } catch (e) {}\n/* 2026-10-16\uFF08\u7528\u6237\uFF09\uFF1A**\u5F39\u7A97\u6302\u5230 document.body** \u2014\u2014\n   \u5B83\u60F3\u6309\u89C6\u53E3\u5C45\u4E2D\uFF0C\u4F46\u53EA\u8981\u6709\u7956\u5148\u5E26 transform/filter/contain\uFF0Cfixed \u7684\u53C2\u7167\u7CFB\u5C31\u4F1A\u88AB\u52AB\u6301\u6210\u90A3\u4E2A\u7956\u5148\n   \u21D2 \u5F39\u7A97\u504F\u4F4D\uFF08\u5B9E\u6D4B\u504F\u5DE6 31px\uFF09\uFF0B \u5BB9\u5668\u4E00\u53D8\u5C31\"\u8DF3\"\u3002\u6302\u5230 body \u540E\u5F7B\u5E95\u8131\u79BB\u88AB\u52AB\u6301\u7684\u7956\u5148\u3002 */\ntry { document.body.appendChild(q('pfmMockupModal')); } catch (e) {}\n\n/* 2026-10-16\uFF1A**\u5DE6\u53F3\u5212\u52A8\u5207\u56FE**\uFF08\u7EBF\u4E0A\u6B64\u524D\u7F3A\u5931\uFF09\u2014\u2014\n   \u00B7 \u5927\u56FE\u4E0A\u5DE6\u53F3\u5212 = \u4E0A\u4E00\u5F20 / \u4E0B\u4E00\u5F20\n   \u00B7 \u5C0F\u56FE\u5E26\u4E0A\u5DE6\u53F3\u5212 = \u6574\u6BB5\u7FFB\u9875\uFF08\u8BE5\u6761\u5DF2\u662F overflow:hidden \u21D2 \u65E0\u6EDA\u52A8\u6761\uFF0C\u5FC5\u987B\u9760\u5212\uFF09\n   \uD83D\uDD34 \u590D\u7528\u7EBF\u4E0A\u65E2\u6709\u7684\u5168\u5C40 hdSelectMockup(i)\uFF08\u5C0F\u56FE onclick \u5C31\u662F\u5B83\uFF09\u21D2 \u5207\u56FE\u903B\u8F91\u5355\u4E00\u771F\u6E90\u3002\n   \uD83D\uDD34 \u59D4\u6258\u5230**\u5E38\u9A7B**\u7684 #pfmMockupGallery\uFF08\u5B83\u5185\u90E8\u4F1A\u88AB\u91CD\u5EFA\uFF0C\u76F4\u63A5\u7ED1\u4F1A\u7ED1\u5230\u88AB\u4E22\u5F03\u7684\u8282\u70B9\uFF09\u3002\n   \u00B7 pointer \u4E8B\u4EF6 \u21D2 \u9F20\u6807\u62D6\u62FD / \u89E6\u6478 / \u89E6\u63A7\u7B14\u901A\u5403\uFF1B\u7AD6\u5212\u4E0D\u62A2\uFF08|dx|<|dy| \u76F4\u63A5\u5FFD\u7565\uFF09\u3002 */\n(function () {\n  var box = document.getElementById('pfmMockupGallery'); if (!box) return;\n  var inMain  = function (t) { return !!(t && t.closest && t.closest('.pfm-carousel-main')); };\n  var inStrip = function (t) { return !!(t && t.closest && t.closest('.pfm-carousel-thumbs')); };\n  var x0 = null, y0 = null;\n  box.addEventListener('pointerdown', function (ev) {\n    if (ev.pointerType === 'mouse' && ev.button !== 0) return;\n    x0 = ev.clientX; y0 = ev.clientY;\n  });\n  box.addEventListener('pointerup', function (ev) {\n    if (x0 === null) return;\n    var dx = ev.clientX - x0, dy = ev.clientY - y0; x0 = null; y0 = null;\n    if (Math.abs(dx) < 30 || Math.abs(dx) < Math.abs(dy)) return;\n    var thumbs = box.querySelectorAll('.pfm-mockup-thumb'); if (!thumbs.length) return;\n    if (inMain(ev.target)) {\n      /* 2026-10-16 \u4FEE\uFF1A\u539F\u5148\u7528 window.__mcActive \u4F5C\u57FA\u51C6\uFF0C\u5B83\u53EF\u80FD\u4E0D\u88AB\u5207\u56FE\u51FD\u6570\u66F4\u65B0\n         \u21D2 \u6BCF\u6B21\u90FD\u4EE5\u540C\u4E00\u4E0B\u6807\u7B97 \u21D2 \u8868\u73B0\u4E3A\u300C\u53EA\u80FD\u5207\u5230\u540C\u4E00\u5F20\u300D\u3002\u6539\u4E3A**\u4ECE DOM \u8BFB .active**\uFF08\u5207\u56FE\u51FD\u6570\u5FC5\u66F4\u65B0\u5B83\uFF09\u3002 */\n      var cur = -1;\n      for (var ci = 0; ci < thumbs.length; ci++) { if (thumbs[ci].classList.contains('active')) { cur = ci; break; } }\n      if (cur < 0) cur = 0;\n      var nx = (dx < 0) ? cur + 1 : cur - 1;\n      if (nx < 0 || nx >= thumbs.length) return;\n      try { if (typeof hdSelectMockup === 'function') hdSelectMockup(nx); } catch (e) {}\n      /* \u628A\u5207\u6362\u540E\u7684\u5F53\u524D\u5F20\u6EDA\u8FDB\u89C6\u91CE\uFF08\u65E0\u6EDA\u52A8\u6761\uFF0C\u9760\u7A0B\u5E8F\u6EDA\uFF09 */\n      try { var row = box.querySelector('.pfm-carousel-thumbs'), t = thumbs[nx];\n        if (row && t) row.scrollLeft = (t.offsetLeft || 0) - (row.clientWidth - t.clientWidth) / 2; } catch (e) {}\n    } else if (inStrip(ev.target)) {\n      var r2 = box.querySelector('.pfm-carousel-thumbs'); if (!r2) return;\n      var f = r2.querySelector('.pfm-mockup-thumb');\n      var stepW = (f ? f.offsetWidth : 72) + 8;\n      var n = Math.max(1, Math.round(Math.abs(dx) / stepW));\n      r2.scrollLeft = r2.scrollLeft + (dx < 0 ? 1 : -1) * stepW * n;\n    }\n  });\n  box.addEventListener('pointercancel', function () { x0 = null; y0 = null; });\n})();\n\n/* 2026-10-16\uFF08\u7528\u6237\u300C\u53F3\u5927\u300D\uFF1D\u504F\u5DE6\uFF09\uFF1A**\u5728\u300C\u542B\u6EDA\u52A8\u6761\u7684\u771F\u5B9E\u7A97\u53E3\u300D\u91CC\u5C45\u4E2D**\u3002\n   \u73B0\u8C61\uFF1A\u5C11\u6570\u73AF\u5883\u4E0B `100vw` **\u4E0D\u542B**\u6EDA\u52A8\u6761 \u21D2 \u906E\u7F69\u6BD4 window.innerWidth \u7A84 ~15px\n        \u21D2 `justify-content:center` \u5728\u7A84\u4E86 15px \u7684\u6846\u91CC\u5C45\u4E2D \u21D2 \u5F39\u7A97**\u6052\u504F\u5DE6 sbw/2**\u3002\n   \u505A\u6CD5\uFF1A\u6309**\u5B9E\u6D4B\u5DEE\u503C**\u8865\u5E73\u79FB\uFF1B\uD83D\uDD34 \u906E\u7F69\u4E0E\u7A97\u53E3\u7B49\u5BBD\u65F6**\u4E0D\u52A8\u4F5C**\uFF08\u907F\u514D\u5728\u6211\u8FD9\u79CD\u73AF\u5883\u91CC\u53CC\u91CD\u8865\u507F\uFF09\u3002 */\nfunction hdMcCenter(){\n  try{\n    var m = q('pfmMockupModal'); if (!m) return;\n    var box = m.querySelector('.pfm-modal-box'); if (!box) return;\n    var need = window.innerWidth - Math.round(m.getBoundingClientRect().width);\n    box.style.transform = (Math.abs(need) > 1) ? 'translateX(' + (need / 2) + 'px)' : '';\n  }catch(e){}\n}\ntry { window.hdMcCenter = hdMcCenter; } catch (e) {}\nwindow.addEventListener('resize', function () { hdMcCenter(); }, { passive: true });\n\n/* 2026-10-16\uFF1A\u8C03\u8BD5\u89D2\u6807\u5DF2\u64A4\uFF08\u5B9A\u4F4D\u5B8C\u6210\uFF1A\u5185\u90E8\u504F\u5DE6\u771F\u56E0 = scrollbar-gutter \u5355\u8FB9\u9884\u7559\uFF09\u3002 */\n\n\n/* 2026-10-15\uFF08\u7528\u6237\uFF09\uFF1A**\u63D0\u793A\u533A\u5B9A\u9AD8\u69FD\u4F4D**\u3002\n   \u5B9E\u6D4B\u6839\u56E0\uFF1Aconfirm \u6001 tip=104px(\u5F39\u7A97 800)\uFF0C\u70B9 Start \u540E**\u4E24\u5757 tip \u540C\u65F6\u4E0D\u663E\u793A** \u21D2 \u69FD\u4F4D\u584C\u9677\n   \u21D2 \u5F39\u7A97\u77AC\u95F4\u53D8 683px\uFF08-117px\uFF09\u2014\u2014 \u8FD9\u5C31\u662F\u300C\u4F1A\u53D8\u77EE\u4E00\u6B21\u300D\u3002\n   \u4FEE\u6CD5\uFF1A\u628A\u4E24\u5757 tip \u5305\u8FDB\u4E00\u4E2A**\u6052\u5B9A\u9AD8\u5EA6**\u7684 wrap\uFF08\u63D0\u793A\u672C\u8EAB\u7EDD\u5BF9\u5B9A\u4F4D\u94FA\u6EE1\uFF09\u21D2 \u8C01\u663E\u793A\u8C01\u586B\uFF0C\u69FD\u4F4D\u6C38\u4E0D\u584C\u3002 */\n(function () {\n  try {\n    var box = q('pfmMockupModal'); if (!box) return;\n    if (q('pfmMcTipWrap')) return;\n    var c = q('pfmMcTipConfirm'), b = q('pfmMcTipBusy');\n    if (!c || !b || !c.parentNode) return;\n    var w = document.createElement('div'); w.id = 'pfmMcTipWrap';\n    c.parentNode.insertBefore(w, c);\n    w.appendChild(c); w.appendChild(b);\n  } catch (e) {}\n})();\n\n/* 2026-10-16\uFF08\u7528\u6237\uFF09\uFF1A\u2715 \u5173\u95ED\u6309\u94AE**\u5DF2\u5220\u9664** \u21D2 \u4E0A\u9762\u8FD9\u6BB5\u300C\u628A \u2715 \u79FB\u8FDB h3\u300D\u7684\u4EE3\u7801\u540C\u65F6\u79FB\u9664\u3002\n   \u5173\u7A97\u4ECD\u6709\u4E24\u6761\u8DEF\uFF1A\u70B9\u906E\u7F69\u7A7A\u767D\u5904 / \u5E95\u90E8 \u2713 Done\u3002 */\n\n\n/* 2026-10-15\uFF08\u7528\u6237\u88C1\u51B3 \u7532\uFF09\uFF1A\u5B8C\u6210\u6001\u7684\u300C\u518D\u751F\u6210\u300D\u5165\u53E3\uFF08\u539F\u5148\u5728\u5F39\u7A97\u5E95\u90E8\u7684 #pfmBtnRegen\uFF0C\u5DF2\u5220\u9664\uFF09 */\n/* 2026-10-15\uFF08\u7528\u6237\u53CD\u9988\uFF09\uFF1A**\u8FDB\u884C\u6001\u4E5F\u8981\u663E\u793A\u300C\u6392\u961F / \u9884\u8BA1\u7B49\u5F85\u300D** \u2014\u2014 \u4E4B\u524D\u70B9 Start \u4E4B\u540E\n   \u8FD9\u4E24\u9879\u5C31\u6CA1\u4E86\uFF08\u53EA\u7559\u8FDB\u5EA6\uFF09\uFF0C\u4FE1\u606F\u4E22\u5931\u3002\u8FD9\u91CC\u590D\u7528\u540C\u4E00\u4E2A\u53EA\u8BFB\u63A5\u53E3\uFF0C\u8282\u6D41 \u22652.5s \u4EE5\u514D\u5237\u7206\u3002 */\nvar _mcQAt = 0;\nfunction hdMcQueueFill(qid, eid){\n  if (Date.now() - _mcQAt < 2500) return;\n  _mcQAt = Date.now();\n  try {\n    ft(B + '/mockup/queue?pageId=' + encodeURIComponent(window.__hdPageId || ''), {}, 8000).then(function (r) { return r.json(); }).then(function (d) {\n      if (!d || !d.success) return;\n      var Q = q(qid), E = q(eid);\n      if (Q) Q.textContent = String(d.queued || 0);\n      if (E) E.textContent = hdMcFmtEta(d.etaSec);\n    }).catch(function () {});\n  } catch (e) {}\n}\n\n/* 2026-10-15\uFF08\u7532\u4E59\uFF09\uFF1A**\u8FDB\u884C\u6001\u505A\u8FDB\u63D0\u793A\u533A** \u2014\u2014 \u5E95\u90E8\u4E3B\u6309\u94AE\u9690\u85CF\u540E\uFF0C\u8FD9\u91CC\u662F\u552F\u4E00\u7684\u8FDB\u5EA6\u53CD\u9988\u3002\n   \uD83D\uDD34 \u505A\u6CD5\uFF1A**\u4E0D\u624B\u672F\u51FA\u56FE\u6D41\u7A0B**\uFF0C\u53EA\u8F6E\u8BE2 window.hdGenProgress\uFF08\u591A\u8272\u6D41\u7A0B\u6BCF\u6B65\u90FD\u5728\u66F4\u65B0\u5B83\uFF09\uFF1B\n      \u5355\u8272\u8D70\u539F\u8DEF\u5F84\u65F6 hdGenProgress \u4E0D\u5B58\u5728 \u21D2 \u56DE\u9000\u770B #pfmBtnGenerate \u7684 data-state==='busy'\u3002\n   \u7528 data-mc=\"busy\" \u6807\u8BB0\uFF1A\u53EA\u6536\u8D77/\u66F4\u65B0**\u6211\u81EA\u5DF1\u5199\u7684 busy \u6001**\uFF0C\u7EDD\u4E0D\u8BEF\u4F24 done \u6001\u3002 */\n(function(){\n  var last = '';\n  setInterval(function () {\n    try {\n      var p = window.hdGenProgress, tip = q('pfmMcTipBusy');\n      if (!tip) return;\n      var alive = p && p.phase && p.phase !== 'done';\n      var b = q('pfmBtnGenerate');\n      if (!alive && b && b.getAttribute('data-state') === 'busy') alive = true;\n      if (!alive) {\n        if (tip.getAttribute('data-mc') === 'busy') { tip.style.display = 'none'; tip.removeAttribute('data-mc'); }\n        last = ''; return;\n      }\n      var done = (p && p.done) || 0, total = (p && p.total) || 0;\n      var phase = (p && p.phase) || 'working';\n      /* \uD83D\uDD34 2026-10-17\uFF1A\u961F\u5217\u8BF7\u6C42**\u5FC5\u987B\u653E\u5728 sig \u5224\u65AD\u4E4B\u524D** \u2014\u2014 \u539F\u6765\u5B83\u5728\u300C\u8FDB\u5EA6\u6CA1\u53D8\u5C31\u4E0D\u91CD\u7ED8\u300D\u540E\u9762\uFF0C\n         \u5BFC\u81F4\u6392\u961F\u671F\u95F4 sig \u4E0D\u53D8 \u21D2 \u6C38\u4E0D\u8BF7\u6C42 \u21D2 __mcEtaSec \u6052 0 \u21D2 \u6309\u94AE\u663E\u793A 0s\uFF08\u7528\u6237\u5B9E\u6D4B\uFF09\u3002\n         \u672C\u5757\u81EA\u5E26 2.5s \u8282\u6D41\uFF0C\u6BCF tick \u90FD\u53EF\u5B89\u5168\u6267\u884C\u3002\n         2026-10-16\u3010\u7532\u3011\uFF1A\u771F\u5B9E\u300C\u591A\u4EBA\u6392\u961F\u300D\u2014\u2014 \u8282\u6D41 2.5s \u62C9 /mockup/queue\uFF0C\n           \uD83D\uDD34 **\u53EA\u5199 .pfm-ahead \u8FD9\u4E00\u4E2A span**\uFF08\u52FF\u7528 textContent \u8986\u76D6 label\uFF0C\u5426\u5219\u4F1A\u628A\u4E09\u70B9/\u6570\u5B57\u4E00\u8D77\u62B9\u6389\uFF09\u3002 */\n        try {\n          if (Date.now() - (window.__mcQAt || 0) > 2500) {\n            window.__mcQAt = Date.now();\n            /* 2026-11-02\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1APOST \u672A\u8FD4\u56DE\uFF08_genResp=0\uFF09= \u8FD8\u6CA1\u843D\u76D8\uFF0C\u6B64\u65F6\u67E5 /mockup/queue \u4E5F\u67E5\u4E0D\u5230\u81EA\u5DF1\uFF0C\n               \u4F1A\u8D70\u515C\u5E95\u8BEF\u663E\u793A\u6210\u300C\u7B2C 1 \u4F4D\u300D\u3002\u4E0E\u6309\u94AE\u6587\u6848\u300CSending\u2026/Queued\u2026\u300D\u540C\u6E90\uFF1A\u63D0\u4EA4\u4E2D\u4E0D\u67E5 ETA\uFF0C\u843D\u76D8\u540E\u624D\u67E5\u3002 */\n            if (_genResp) { ft(B + '/mockup/queue?pageId=' + encodeURIComponent(window.__hdPageId || ''), {}, 8000).then(function (r) { return r.json(); }).then(function (d) {\n              if (!d || !d.success) return;\n              /* 2026-10-16\uFF08\u7528\u6237\uFF1Aahead=\u6392\u6211\u524D\u9762\u7684\uFF09\u2014\u2014 \u51CF\u6389\u81EA\u5DF1\uFF1A\u603B\u6570-1\uFF08\u5355\u4EBA\u21D20\uFF0C\u4E24\u4EBA\u21D21\uFF09\u3002 */\n              window.__mcQ = (typeof d.ahead === 'number') ? ('Position ' + (d.ahead + 1)) : null;   /* 2026-10-17\uFF1A\u663E\u793A\u6211\u7684\u4F4D\u6B21\uFF08\u82F1\u6587 #N\uFF09 */\n              window.__mcEtaSec = (typeof d.etaSec === 'number' && d.etaSec >= 0) ? d.etaSec : 0;\n              if (typeof d.perTaskSec === 'number' && d.perTaskSec > 0) window.__mcPer = d.perTaskSec;   /* 2026-10-18\uFF1A\u8FDB\u5EA6\u6761\u7528\u540E\u7AEF\u300C\u6BCF\u4EFB\u52A1\u300D\u5747\u503C\uFF0C\u4E0D\u518D\u6052 25 */\n              window.__mcEtaAt = Date.now();   /* 2026-10-17\uFF1A\u5012\u8BA1\u65F6\u57FA\u51C6\u65F6\u523B */\n              if (!window.__mcEtaInitial && typeof d.etaSec === 'number' && d.etaSec > 0) window.__mcEtaInitial = d.etaSec;   /* \u8FDB\u5EA6\u6761\u5206\u6BCD */\n              var e2 = q('pfmMcGen'), a = e2 && e2.querySelector('.pfm-ahead');\n              if (a) a.textContent = (typeof d.ahead === 'number') ? ('Position ' + (d.ahead + 1)) : '\u2014';\n            }).catch(function () {}); }\n          }\n        } catch (e) {}\n      var sig = done + '/' + total + '/' + phase;\n      if (sig === last) return;\n      last = sig;\n      var c = q('pfmMcTipConfirm'); if (c) c.style.display = 'none';\n      tip.setAttribute('data-mc', 'busy');\n      tip.style.display = '';\n      var pct = total ? Math.round(done / total * 100) : 0;\n      /* \u5E95\u90E8\u6309\u94AE\uFF1A\u8FDB\u884C\u6001 = \u540C\u4E00\u4E2A\u4F4D\u3001\u6587\u5B57 Generating\u2026 + **\u6309\u94AE\u5185\u8FDB\u5EA6\u586B\u5145** */\n      (function () {\n        var _tot = total > 0 ? total\n          : ((typeof hdGenColors === 'function' ? (hdGenColors() || []).length : 0) || 1);\n        var _done = total > 0 ? done : 0;\n        var _per = (window.__mcPer && window.__mcPer > 0) ? window.__mcPer : 25;   /* \u79D2/\u5F20 */\n        if (!window.__mc0 || window.__mcTotal !== _tot) { window.__mc0 = Date.now(); window.__mcTotal = _tot; window.__mcStart = Date.now(); window.__mcEtaInitial = null;\n          /* 2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u603B\u5F20\u6570\u53D8\u4E86 = \u65B0\u4E00\u6279\u4EFB\u52A1 \u21D2 \u5355\u8C03\u503C\u4E00\u8D77\u5F52\u96F6 */\n          window.__mcFillMax = 0; window.__mcEtaMin = null; }\n        var _eta = (window.__mcEtaSec > 0) ? Math.max(1, window.__mcEtaSec) : 0;   /* \u961F\u5217\u603BETA\uFF1B0=\u8FD8\u6CA1\u62FF\u5230\uFF0C\u663E\u793A \u2026 */\n        /* 2026-10-16\uFF08\u5927\u578B\u7F51\u7AD9\u6392\u961F\u6A21\u578B\uFF09\uFF1A\u8FDB\u5EA6\u6761 = \u4E8B\u4EF6\u9A71\u52A8\uFF08done/total\uFF09\u4E3A\u4E3B\uFF1B\n           \u6392\u961F\u65F6\uFF08done=0\uFF09\u7F13\u6162\u722C\u5230 40% \u5C01\u9876\uFF08\u4E0D\u51B2\u6EE1\uFF0C\u907F\u514D\u300C\u8FDB\u5EA6\u6EE1\u4F46\u6CA1\u51FA\u56FE\u300D\uFF09\u3002 */\n        var _byEvent = total > 0 ? Math.round(done / total * 100) : 0;\n        var _isLoading = !!(window.hdGenProgress && window.hdGenProgress.phase === 'loading');\n        var _fill;\n        if (_isLoading) {\n          /* 2026-10-29\uFF08\u7532\uFF09\uFF1A\u4E0B\u8F7D+\u6E32\u67D3\u9884\u89C8\u9636\u6BB5 \u2014\u2014 \u4ECE 99% \u7F13\u722C\u5230 100%\uFF08\u7EA6 3s\uFF09\uFF0C\n             \u4E0D\u51B2\u6EE1\u4E5F\u4E0D\u505C\u6B7B\uFF1B\u7B49 finishAfterPreview \u5224\u5B9A\u56FE\u7247\u52A0\u8F7D\u5B8C\u624D\u5207 done\u3002 */\n          var _lp = Math.min(100, 99 + (Date.now() - (window.__mcLoadingAt || Date.now())) / 3000);\n          _fill = Math.round(_lp);\n        } else if (_byEvent > 0) {\n          _fill = Math.max(10, Math.min(100, _byEvent));\n        } else {\n          var _qElapsed = (Date.now() - (window.__mcStart || window.__mc0)) / 1000;\n          _fill = Math.min(40, 10 + Math.round(_qElapsed * 2));   /* \u6392\u961F\u4E2D\uFF1A\u6BCF\u79D2 +2%\uFF0C\u5C01\u9876 40% */\n        }\n        /* 2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u91CD\u5EFA\u6309\u94AE\u65F6\u4E5F\u8981\u7528\u5355\u8C03\u503C \u2014\u2014 \u5426\u5219\u300C\u5FC3\u8DF3\u63A8\u5230 70% \u2192 800ms \u91CD\u5EFA\u6454\u56DE 40%\u300D\n           \u5C31\u662F\u7528\u6237\u770B\u5230\u7684\u300C\u8FDB\u5EA6\u6761\u8DF3\u6765\u8DF3\u53BB\u300D\u3002\u53D6\u5386\u53F2\u6700\u5927\u503C\uFF0C\u6761\u53EA\u4F1A\u5F80\u4E0A\u6216\u505C\u4F4F\u3002 */\n        _fill = Math.max(window.__mcFillMax || 0, _fill);\n        window.__mcFillMax = _fill;\n        hdMcFoot([{ id: 'pfmMcGen', dots: true, fill: _fill,\n          txt: '<span class=\"pfm-ahead\">' + ((window.__mcQ != null) ? window.__mcQ : '\\u2014') + '</span>'\n               + ' \\u00b7 <span class=\"pfm-num\">' + _done + '</span> / <span class=\"pfm-tot\">' + _tot + '</span>'\n               + ' \\u00b7 <span class=\"pfm-eta\">' + (_eta > 0 ? hdMcFmtEta(_eta) : '\\u2026') + '</span>' }]);\n        var _el = q('pfmMcGen');\n        if (_el) { _el.setAttribute('data-tot', String(_tot)); _el.setAttribute('data-done', String(_done)); }\n        /* \u6BCF\u5F20\u5B8C\u6210\u65F6\u628A\u65F6\u95F4\u57FA\u51C6\u5F80\u56DE\u62E8\u5230\u300C\u5DF2\u5B8C\u6210\u5F20\u6570\u6240\u5360\u7684\u65F6\u95F4\u300D\u21D2 \u5269\u4F59\u65F6\u95F4\u8DDF\u7740\u771F\u5B9E\u8FDB\u5EA6\u6821\u6B63 */\n        window.__mc0 = Date.now() - Math.round(_done * _per * 1000);\n      })();\n      (function () { try { var _n = q('pfmMcGen'), _x = _n && _n.querySelector('.pfm-num');\n        if (_x) { _x.classList.add('tick');\n          setTimeout(function () { try { _x.classList.remove('tick'); } catch (e) {} }, 190); } } catch (e) {} })();\n      /* 2026-10-16\uFF08\u7528\u6237\uFF1A\u4FEE\u4E09\u70B9 + \u4E59\uFF09\uFF1A\n         \u539F\u5148\u8FD9\u91CC\u62C9 /mockup/queue \u5E76 `lb.textContent = ...` **\u6574\u4F53\u8986\u76D6 label** \u21D2\n         \u628A\u300C\u4E09\u70B9\u6CE2\u6D6A\u300D\u548C\u300C\u6570\u5B57 span\u300D\u4E00\u8D77\u62B9\u6389\uFF08\u6240\u4EE5\u770B\u4E0D\u5230\u4E09\u70B9\uFF09\u3002\n         \u73B0\u6539\u4E3A**\u663E\u793A\u81EA\u5DF1\u7684\u8FDB\u5EA6**\uFF08done/total + \u5269\u4F59\u4F30\u7B97\uFF09\u21D2 \u4E0D\u518D\u9700\u8981\u8BE5\u8BF7\u6C42\uFF0C\u6574\u6BB5\u79FB\u9664\u3002\n         \u21D2 \u4E09\u70B9\u4FDD\u7559\u3001\u6570\u5B57\u4ECD\u53EF .tick \u5F39\u8DF3\u3002 */\n\n      /* 2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u2460 \u8FDB\u5EA6\u6761\u53D6\u5355\u8C03\u503C\uFF0C\u548C\u6309\u94AE\u5185\u90A3\u6761\u4E00\u81F4\u3001\u4E14\u4E0D\u56DE\u9000\uFF1B\n         \u2461 \u300CQueued ahead / Est. wait\u300D\u539F\u6765\u5199\u6B7B\u300C\u2026\u300D\u6C38\u8FDC\u4E0D\u52A8\uFF0C\u91CD\u5EFA\u65F6\u5148\u586B\u4E0A\u5F53\u524D\u771F\u503C\uFF0C\n            \u4E4B\u540E\u7531 1 \u79D2\u5FC3\u8DF3\u6301\u7EED\u56DE\u586B\uFF08tip \u6BCF\u6B21 sig \u53D8\u5316\u90FD\u4F1A\u91CD\u5EFA\uFF0C\u6240\u4EE5\u4E0D\u80FD\u53EA\u5199\u4E00\u6B21\uFF09\u3002 */\n      var _phaseTxt = (phase === 'loading') ? 'Loading preview\\u2026' : phase;\n      tip.innerHTML = '<div class=\"pfm-mc-status\"><span>' + (total ? done + '/' + total + ' \\u2014 ' + _phaseTxt : _phaseTxt) + '</span>'\n        + '<span>' + (total ? done + ' / ' + total : '') + '</span></div>'\n        + '<div class=\"pfm-mc-prog\"><i style=\"width:' + Math.max(pct, window.__mcFillMax || 0) + '%\"></i></div>'\n        + '<div class=\"pfm-mc-eta\"><div>Queued ahead <span id=\"pfmMcQ2\">' + ((window.__mcQ != null) ? window.__mcQ : '\\u2014') + '</span></div>'\n        + '<div>Est. wait <span id=\"pfmMcEta2\">' + (window.__mcEtaMin == null ? (window.__mcEtaSec > 0 ? hdMcFmtEta(window.__mcEtaSec) : '\\u2026') : hdMcFmtEta(window.__mcEtaMin)) + '</span></div></div>';\n    } catch (e) {}\n  }, 800);\n})();\n\n/* 2026-10-15\uFF08\u7528\u6237\uFF09\uFF1A**\u5E95\u90E8\u72EC\u7ACB\u6309\u94AE\u533A** \u2014\u2014 \u4E00\u4E2A\u6309\u94AE\u4F4D\u3001\u7531\u72B6\u6001\u9A71\u52A8\u3002\n   confirm=Start generating\uFF5Cbusy=Generating\u2026 n/M + \u6309\u94AE\u5185**\u8FDB\u5EA6\u586B\u5145**\uFF08\u5BF9\u9F50 Buy it now\uFF09\uFF5Cdone=\u2713 Done */\nfunction hdMcFootBox(){\n  var box = q('pfmMcFoot');\n  if (!box) {\n    var g = q('pfmMockupGallery'); if (!g || !g.parentNode) return null;\n    box = document.createElement('div'); box.id = 'pfmMcFoot';\n    g.parentNode.insertBefore(box, g.nextSibling);\n  }\n  return box;\n}\nfunction hdMcFoot(btns){\n  try{\n    var box = hdMcFootBox(); if (!box) return;\n    if (!btns || !btns.length) { box.style.display = 'none'; box.innerHTML = ''; return; }\n    box.style.display = '';\n    box.innerHTML = btns.map(function (b) {\n      var lbl = '<span class=\"pfm-lbl\">' + b.txt + '</span>';\n      var _dis = b.disabled ? ' disabled aria-disabled=\"true\"' : '';\n      return b.fill == null\n        ? '<button class=\"pfm-btn\"' + _dis + ' type=\"button\" id=\"' + b.id + '\">' + lbl + '</button>'\n        : '<button class=\"pfm-btn pfm-btn-busy\" type=\"button\" id=\"' + b.id + '\">'\n          + '<span class=\"pfm-fill\" style=\"width:' + (b.fill || 0) + '%\"></span>'\n          + '<span class=\"pfm-sheen\"></span>'\n          + '<span class=\"pfm-lbl\">' + (b.dots ? '<span class=\"pfm-dots\"><i></i><i></i><i></i></span>' : '') + b.txt + '</span></button>';\n    }).join('');\n    btns.forEach(function (b) { var el = q(b.id); if (el && b.fn) el.onclick = b.fn; });\n  }catch(e){}\n}\ntry { window.hdMcFoot = hdMcFoot; } catch (e) {}\n\n/* 2026-10-16\u3010\u7532\u3011**\u8FDB\u884C\u6001 1 \u79D2\u5FC3\u8DF3**\uFF1A\u65F6\u95F4\u9A71\u52A8 \u2014\u2014 \u79D2\u6570\u5B9E\u65F6\u9012\u51CF + \u8FDB\u5EA6\u8FDE\u7EED\u589E\u957F\u3002\n   \uD83D\uDD34 \u53EA\u5C31\u5730\u6539 fill \u5BBD\u5EA6 / .pfm-num / .pfm-eta\uFF0C**\u7EDD\u4E0D\u91CD\u5EFA\u6309\u94AE**\n      \uFF08\u91CD\u5EFA\u4F1A\u8BA9 .pfm-sheen \u7684\u6D41\u5149\u52A8\u753B\u548C .pfm-dots \u7684\u6CE2\u6D6A\u6BCF\u79D2\u91CD\u542F\u52A8\uFF09\u3002 */\n(function () {\n  setInterval(function () {\n    try {\n      var el = q('pfmMcGen'); if (!el) return;\n      var tot = parseInt(el.getAttribute('data-tot') || '0', 10);\n      var don = parseInt(el.getAttribute('data-done') || '0', 10);\n      if (!(tot > 0)) return;\n      var per = (window.__mcPer && window.__mcPer > 0) ? window.__mcPer : 25;\n      var t0 = window.__mc0 || Date.now();\n      var elapsed = Date.now() - t0;\n      var expMs = tot * per * 1000;\n      var remain = Math.max(0, expMs - elapsed);\n      /* \u8FDB\u5EA6\u53D6\u300C\u65F6\u95F4\u9A71\u52A8\u300D\u4E0E\u300C\u4E8B\u4EF6\u9A71\u52A8\u300D\u7684\u8F83\u5927\u8005 \u21D2 \u8FDE\u7EED\u589E\u957F\u4F46\u4E0D\u4F1A\u843D\u540E\u4E8E\u771F\u5B9E\u5B8C\u6210\u6570 */\n      /* 2026-10-17\uFF1A\u8FDB\u5EA6\u6761\u8DDF\u3010\u5012\u8BA1\u65F6\u3011\u8D70 \u2014\u2014 \u5012\u8BA1\u65F6\u5230 0 \u5C31\u63A5\u8FD1\u6EE1\uFF08\u4E0E eta \u540C\u4E00\u65F6\u95F4\u8F74\uFF0C\u4E0D\u518D\u5404\u7B97\u5404\u7684\uFF09 */\n      var _eta0 = window.__mcEtaInitial || (window.__mcEtaSec || 0);\n      var _etaAt2 = window.__mcEtaAt || Date.now();\n      var _rem2 = Math.max(0, (window.__mcEtaSec || 0) - Math.floor((Date.now() - _etaAt2) / 1000));\n      var byTime = _eta0 > 0 ? Math.min(99, Math.max(0, (1 - _rem2 / _eta0) * 100)) : 0;\n      var byEvent = (don / tot) * 100;\n      var _isLoading = !!(window.hdGenProgress && window.hdGenProgress.phase === 'loading');\n      var pct;\n      if (_isLoading) {\n        /* 2026-10-29\uFF08\u7532\uFF09\uFF1A\u4E0B\u8F7D+\u6E32\u67D3\u9884\u89C8\u9636\u6BB5 \u2014\u2014 \u5FC3\u8DF3\u4FA7\u540C\u6B65\u7F13\u722C 99\u2192100\uFF08\u4E0E\u4E3B\u8F6E\u8BE2\u4E00\u81F4\uFF09 */\n        pct = Math.min(100, 99 + (Date.now() - (window.__mcLoadingAt || Date.now())) / 3000);\n      } else {\n        pct = Math.max(byTime, byEvent);\n      }\n      if (pct > 100) pct = 100;\n      /* 2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u8FDB\u5EA6\u6761**\u53EA\u589E\u4E0D\u51CF** \u2014\u2014 \u300C\u505C\u6EDE\u7B49\u5F85\u300D\u800C\u4E0D\u662F\u300C\u5F80\u56DE\u8DF3\u300D\u3002\n         \u540E\u7AEF\u961F\u5217 ETA \u6296\u52A8\uFF08\u6709\u4EBA\u63D2\u961F / \u4F30\u7B97\u504F\u9AD8\uFF09\u4F1A\u8BA9 byTime \u53D8\u5C0F\uFF1B\u8FD9\u91CC\u53D6\u5386\u53F2\u6700\u5927\u503C\uFF0C\n         \u65B0\u503C\u66F4\u5C0F\u5C31\u505C\u5728\u5F53\u524D\u503C\u7B49\u4E0B\u4E00\u6B21\uFF0C\u89C6\u89C9\u4E0A\u53EA\u6709\u300C\u6DA8\u300D\u548C\u300C\u505C\u300D\uFF0C\u7EDD\u4E0D\u56DE\u7F29\u3002 */\n      pct = Math.max(10, pct);\n      window.__mcFillMax = Math.max(window.__mcFillMax || 0, pct);\n      var f = el.querySelector('.pfm-fill'); if (f) f.style.width = window.__mcFillMax + '%';\n      /* 2026-10-17\uFF1A**\u5012\u8BA1\u65F6** \u2014\u2014 \u7528\u300C\u4E0A\u6B21\u62FF\u5230 eta \u7684\u65F6\u523B\u300D\u63A8\u7B97\u5269\u4F59\uFF0C\u6BCF\u79D2\u51CF 1\uFF08\u4E0D\u518D\u9759\u6B62\uFF09\n         2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A**\u53EA\u51CF\u4E0D\u589E** \u2014\u2014 \u540E\u7AEF ETA \u53D8\u5927\uFF08\u6709\u4EBA\u63D2\u961F\uFF09\u65F6\u505C\u5728\u5F53\u524D\u79D2\u6570\u7EE7\u7EED\u8D70\u3002\n         2026-10-29\uFF08\u56DE\u4FEE\uFF09\uFF1A**\u5FC5\u987B\u62FF\u5230\u771F\u5B9E ETA \u540E\u624D\u5F00\u59CB\u8BB0\u8D26** \u2014\u2014 \u5426\u5219\u7B2C\u4E00\u6B21\u5FC3\u8DF3\u65F6 __mcEtaSec \u8FD8\u662F 0\n         \uFF08\u961F\u5217\u63A5\u53E3\u5F02\u6B65\u3001\u6BD4 1 \u79D2\u5FC3\u8DF3\u665A\u5230\uFF09\u21D2 __mcEtaMin \u88AB\u521D\u59CB\u503C 0 \u9501\u6B7B\uFF0C\u4E4B\u540E min(0, 23)=0 \u6C38\u8FDC\u663E\u793A 0\u3002 */\n      var _etaBase = window.__mcEtaSec || 0;\n      var _etaAt = window.__mcEtaAt || Date.now();\n      var _remSec = Math.max(0, _etaBase - Math.floor((Date.now() - _etaAt) / 1000));\n      if (_etaBase > 0) {\n        window.__mcEtaMin = (window.__mcEtaMin == null) ? _remSec : Math.min(window.__mcEtaMin, _remSec);\n      }\n      var e = el.querySelector('.pfm-eta');\n      if (e) e.textContent = (window.__mcEtaMin == null) ? '\\u2026' : hdMcFmtEta(window.__mcEtaMin);\n      /* 2026-10-29\uFF1A\u63D0\u793A\u533A\u4E24\u4E2A\u5B57\u6BB5\u539F\u672C\u662F\u6B7B\u7684\uFF08\u6A21\u677F\u91CC\u5199\u6B7B\u300C\u2026\u300D\u3001\u5168\u6587\u4EF6\u96F6\u5904\u66F4\u65B0\uFF09\u2014\u2014\u8FD9\u91CC\u6BCF\u79D2\u56DE\u586B\u3002\n         tip \u6BCF\u6B21 sig \u53D8\u5316\u4F1A\u91CD\u5EFA DOM\uFF08\u53C8\u53D8\u56DE\u300C\u2026\u300D\uFF09\uFF0C\u6240\u4EE5\u5FC5\u987B\u7531\u5FC3\u8DF3\u6301\u7EED\u8865\uFF0C\u4E0D\u80FD\u53EA\u5728\u91CD\u5EFA\u65F6\u5199\u4E00\u6B21\u3002 */\n      var _t2 = q('pfmMcTipBusy');\n      if (_t2 && _t2.getAttribute('data-mc') === 'busy') {\n        var _q2 = _t2.querySelector('#pfmMcQ2'), _e2 = _t2.querySelector('#pfmMcEta2');\n        if (_q2) _q2.textContent = (window.__mcQ != null) ? window.__mcQ : '\\u2014';\n        if (_e2) _e2.textContent = (window.__mcEtaMin == null) ? '\\u2026' : hdMcFmtEta(window.__mcEtaMin);\n      }\n    } catch (err) {}\n  }, 1000);\n})();\n\nfunction hdMcDoneTip(show){\n  var tip = q('pfmMcTipBusy'), c = q('pfmMcTipConfirm');\n  if (!tip) return;\n  if (!show) { if (tip.getAttribute('data-mc') === 'done') { tip.style.display = 'none'; hdMcFoot([]); } return; }\n  if (c) c.style.display = 'none';\n  tip.setAttribute('data-mc', 'done');\n  tip.style.display = '';\n  tip.innerHTML = '<div><b>Mockups ready</b></div>';\n  /* \u5E95\u90E8\u6309\u94AE\u533A\uFF1Adone \u6001 = \u2713 Done\uFF08\u5173\u7A97\uFF09 */\n  hdMcFoot([{ id: 'pfmMcDone', txt: '\\u2713  Done', fn: function () {\n    try { q('pfmMockupModal').style.display = 'none'; } catch (e) {}\n  } }]);\n  (function () { try { var _d = q('pfmMcDone');\n    if (_d) { _d.classList.add('pfm-flash');\n      setTimeout(function () { try { _d.classList.remove('pfm-flash'); } catch (e) {} }, 520); } } catch (e) {} })();\n}\ntry { window.hdMcDoneTip = hdMcDoneTip; } catch (e) {}\n\nwindow.__hdAct.bind('pfmBtnMockups',function(){\n  var b = q('pfmBtnGenerate'), st = b ? b.getAttribute('data-state') : '';\n  q('pfmMockupModal').style.display='flex';\n  if(st === 'done'){\n    /* 2026-10-16\uFF1ADone \u6001\u518D\u8FDB \u2014\u2014 \u63D0\u4F9B\u300C\u21BB Generate again\u300D\u5165\u53E3\u3002\n       \uFF0810-15 \u4ECE\u5F39\u7A97\u5220\u4E86 #pfmBtnRegen \u632A\u5230\u63D0\u793A\u533A\uFF0C10-16 \u63D0\u793A\u533A\u53C8\u5220 \u21D2 \u5165\u53E3\u5F7B\u5E95\u4E22\u5931\uFF0C\n         \u5BFC\u81F4\u300Cmockups \u5B8C\u6210\u540E\u65E0\u6CD5\u518D\u6B21\u51FA\u56FE\u300D\u3002\u590D\u7528\u4E3B\u6309\u94AE\u751F\u6210\u903B\u8F91\uFF0C\u4E0D\u5199\u7B2C\u4E8C\u4EFD\u51FA\u56FE\u4EE3\u7801\u3002\uFF09 */\n    hdMcFoot([{ id:'pfmMcRegen', txt:'\u21BB Generate again', fn:function(){ pfmGenBtn('idle'); var gb=q('pfmBtnGenerate'); if(gb) gb.click(); } }]);\n    return;\n  }\n  if(!b || st === 'busy') return;      // busy=\u770B\u8FDB\u5EA6\uFF1B\u65E0\u6309\u94AE=\u9000\u51FA\n  /* \uD83D\uDD34 2026-10-15 \u7528\u6237\u94C1\u5F8B\uFF1A**\u5355\u8272\u548C\u591A\u8272\u8D70\u5B8C\u5168\u540C\u4E00\u5957\u6D41\u7A0B\uFF0C\u53EA\u6709\u51FA\u56FE\u6570\u91CF\u4E0D\u540C** \u21D2\n     \u4E0D\u518D\u5206\u53C9\uFF08\u539F\u5148\u7684\u300C\u5355\u8272\u8D70\u539F\u8DEF\u5F84\u300D\u5DF2\u5220\u9664\uFF09\u3002\u4E00\u5F8B\uFF1A\u5148\u786E\u8BA4\u6001 \u21D2 \u70B9\u4E86 [Start generating] \u624D\u5F00\u8DD1\u3002 */\n  var _names = hdGenColors();\n  pfmGenBtn('idle');\n  hdMcSkeleton();                       /* \u7A7A\u5360\u4F4D\u9AA8\u67B6\uFF1A\u6CA1\u56FE\u65F6\u4E5F\u662F\u540C\u4E00\u5957\u7A97\u58F3 */\n  /* 2026-10-16\uFF08\u7528\u6237\u00B7\u7532\uFF09\uFF1A\u63D0\u793A\u533A\u5DF2\u79FB\u9664 \u21D2 \u628A\u539F\u300C\u5B88\u536B\u63D0\u793A\u300D\u642C\u5230**\u5E95\u90E8\u6309\u94AE**\u4E0A\uFF08\u7070\u8272\u7981\u7528\u3001\u70B9\u4E0D\u52A8\uFF09\u3002\n     \u5224\u636E\u4E0E #pfmBtnGenerate \u91CC\u7684\u4E09\u5206\u652F\u5B8C\u5168\u4E00\u81F4\uFF0C\u907F\u514D\u4E24\u5904\u89C4\u5219\u6F02\u79FB\u3002 */\n  var _blk = null;\n  if (typeof pid === 'undefined' || !pid) _blk = 'Add a product first';\n  else if (!product || !product.variants || !product.variants.length) _blk = 'Product is loading';\n  else {\n    try { markPlacementArt(); } catch (e) {}\n    var _fl = Object.keys(placementArt || {}).filter(function (p) { return placementArt[p] && placementArt[p].hasArt; });\n    if (!_fl.length) _blk = 'Add something first';\n  }\n  if (_blk) { hdMcFoot([{ id: 'pfmMcBlk', txt: _blk, disabled: true, fn: null }]); return; }\n  setTimeout(hdMcCenter, 0);              /* \u5F00\u7A97\u540E\u6821\u6B63\u6C34\u5E73\u5C45\u4E2D */\n  hdMcShowConfirm(_names, b);\n});\nwindow.__hdAct.bind('pfmCloseModal',function(){\n  var _c=q('pfmMcTipConfirm'); if(_c) _c.style.display='none';   /* \u62792b-1\uFF1A\u6536\u8D77\u786E\u8BA4\u6001 */\n  q('pfmMockupModal').style.display='none'});\n/* 2026-10-16\uFF1A\u53BB\u6389\u300C\u70B9\u7A7A\u767D(\u906E\u7F69)\u81EA\u52A8\u5173\u95ED\u300D\u2014\u2014 \u9632\u8BEF\u89E6\uFF1B\u6539\u7531\u53F3\u4E0A\u89D2 \u2715 \u663E\u5F0F\u5173\u95ED\uFF08\u6309\u94AE\u5728 design-canvas.liquid \u7684 h3 \u91CC\uFF09 */\nwindow.__hdAct.bind('pfmModalX', function(){ var _c=q('pfmMcTipConfirm'); if(_c) _c.style.display='none'; q('pfmMockupModal').style.display='none'; });\n/* 2026-10-10: \u300C\u518D\u751F\u6210\u300D\u2014\u2014\u590D\u4F4D\u5230 idle \u540E\u590D\u7528\u4E3B\u6309\u94AE\u7684\u751F\u6210\u903B\u8F91\uFF08\u5355\u4E00\u771F\u6E90\uFF0C\u4E0D\u5199\u7B2C\u4E8C\u4EFD\u51FA\u56FE\u4EE3\u7801\uFF09\u3002 */\n(function(){\n  var rg=q('pfmBtnRegen'); if(!rg) return;\n  window.__hdAct.bind('pfmBtnRegen',function(){\n    pfmGenBtn('idle');\n    var b=q('pfmBtnGenerate'); if(b) b.click();\n  });\n})();\nwindow.__hdAct.bind('pfmBtnGenerate',function(){\n  /* 2026-10-10: done \u6001 = \u300C\u786E\u8BA4\u300D\u2014\u2014\u76F4\u63A5\u5173\u95ED\u9884\u89C8\uFF08\u8BBE\u8BA1\u5DF2\u4FDD\u7559\uFF09\uFF0C\u4E0D\u518D\u50CF\u751F\u6210\u6309\u94AE\u90A3\u6837\u91CD\u8DD1\u3002 */\n  var _gb=q('pfmBtnGenerate');\n  if(_gb && _gb.getAttribute('data-state')==='done'){ q('pfmMockupModal').style.display='none'; return; }\n  if(!pid){pfmGenBtn('blocked',{text:'Add a product first',title:'Select a product first'});return}\n  // 2026-08-24 FIX: \u4EA7\u54C1\u672A\u52A0\u8F7D\u5B8C\u6210\u65F6\u7981\u6B62\u751F\u6210\uFF08\u9632 currentVariantId=null/\u65E7\u503C + currentTech=DTG \u7ADE\u6001\uFF09\n  if(!product || !product.variants || !product.variants.length){\n    pfmGenBtn('blocked',{text:'Product is loading',title:'Product still loading \u2014 wait a moment and try again'});\n    return;\n  }\n  pfmGenBtn('busy');\n  /* 2026-10-29\uFF08\u56DE\u4FEE\uFF09\uFF1A\u70B9\u300C\u21BB Generate again\u300D\u540E\u8FDB\u5EA6\u6761\u4E0D\u5F52\u96F6\u7684\u6839\u56E0 \u2014\u2014 busy \u662F**\u540C\u6B65**\u7684\uFF0C\n     \u4F46 window.hdGenProgress \u8981\u5230 exportAllPlacements \u5F02\u6B65\u5B8C\u6210\u540E\uFF08hdGenMultiRun \u91CC\uFF09\u624D\u91CD\u5EFA\u3002\n     \u8FD9\u6BB5\u7A97\u53E3\u5185\uFF0C800ms \u4E3B\u8F6E\u8BE2\u7528\u65E7 `p.done/total`(=\u6EE1) \u628A\u8FDB\u5EA6\u6761\u91CD\u5EFA\u56DE 100%\uFF0C1000ms \u5FC3\u8DF3\u66F4\u8BFB\n     \u6309\u94AE\u4E0A\u65E7\u7684 data-done/data-tot \u628A `__mcFillMax` \u4ECE 0 \u53C8\u62AC\u56DE 100 \u21D2 max(100,\u65B0\u503C)=100 \u6C38\u8FDC\u5361\u6B7B\u3002\n     \u8FD9\u91CC\u5728 busy \u540E**\u7ACB\u523B\u540C\u6B65\u91CD\u7F6E**\uFF1A\u8FDB\u5EA6\u6807\u8BB0\u5F52\u96F6 + \u6E05\u6309\u94AE\u6570\u636E\uFF0C\u8D76\u5728\u4E0B\u4E00\u8F6E\u4E3B\u8F6E\u8BE2/\u5FC3\u8DF3\u4E4B\u524D\u3002 */\n  if (window.hdGenProgress) { window.hdGenProgress.phase = 'submitting'; window.hdGenProgress.done = 0; window.hdGenProgress.total = 0; }\n  /* 2026-10-29\uFF08\u4E8C\u6B21\u56DE\u4FEE\uFF09\uFF1A\u4E0A\u4E00\u7248\u53EA\u5F52\u96F6 __mcFillMax/__mcEtaMin\uFF0C\u4ECD\u4E0D\u5F52\u96F6 \u2014\u2014 \u6839\u56E0\u662F**\u65F6\u95F4\u57FA\u51C6\u53D8\u91CF\n     \u6CA1\u6E05**\u30021 \u79D2\u5FC3\u8DF3\u91CC byTime = (1 - _rem2/__mcEtaInitial)*100\uFF0C\u5176\u4E2D __mcEtaInitial/__mcEtaSec \u662F\u4E0A\u4E00\u8F6E\n     \u65E7\u503C\u3001\u65E9\u5DF2\"\u8DD1\u5B8C\" \u21D2 _rem2=0 \u21D2 byTime=99 \u21D2 __mcFillMax=max(0,99)=99 \u53C8\u88AB\u62AC\u56DE\u3002\n     \u300C\u518D\u751F\u6210\u300D\u5E38\u662F\u540C\u8272\u6570 \u21D2 `__mcTotal!==_tot` \u5206\u652F\u4E0D\u89E6\u53D1 \u21D2 \u8FD9\u7EC4\u65E7\u503C\u5168\u4FDD\u7559\u3002\n     \u5FC5\u987B\u628A**\u5168\u90E8\u8FDB\u5EA6\u72B6\u6001**\u4E00\u8D77\u5F52\u96F6\uFF0C\u4E0D\u7559\u4EFB\u4F55\u65E7\u57FA\u51C6\u7ED9\u5FC3\u8DF3\u3002 */\n  window.__mcFillMax = 0; window.__mcEtaMin = null;\n  window.__mcEtaInitial = null; window.__mcEtaSec = 0; window.__mcEtaAt = 0;\n  window.__mc0 = 0; window.__mcTotal = 0; window.__mcStart = 0; window.__mcQ = null;\n  (function(){ var _g = q('pfmMcGen'); if (_g) {\n      _g.setAttribute('data-done', '0'); _g.setAttribute('data-tot', '0');\n      var _f = _g.querySelector('.pfm-fill'); if (_f) _f.style.width = '0%';\n    } })();\n  // Multi-face mockup: export EVERY face that has art into a faces[] payload.\n  markPlacementArt();\n  var filled=Object.keys(placementArt).filter(function(p){return placementArt[p]&&placementArt[p].hasArt;});\n  if(!filled.length){pfmGenBtn('blocked',{text:'Add something first',title:'Design is empty \u2014 add something first'});return}\n  exportAllPlacements().then(function(exports){\n    /* 2026-10-06\uFF1A\u5148\u5254\u6389\u300C\u6253\u5370\u533A\u5185\u6CA1\u6709\u4EFB\u4F55\u5185\u5BB9\u300D\u7684\u9762\uFF08\u7A7A\u9762\u53D1\u7ED9 Printful \u53EA\u4F1A\u51FA\u7A7A\u767D\u886C\u886B\uFF09\u3002 */\n    return hdFilterNonEmptyFaces(exports).then(function(_fr){\n      if(_fr.dropped.length){\n        try{ if(typeof hdcoToast==='function') hdcoToast('Skipped empty face(s): '+_fr.dropped.join(', ')); }catch(e){}\n      }\n      return _fr.kept;\n    });\n  }).then(function(exports){\n    if(!exports || !Object.keys(exports).length){\n      pfmGenBtn('blocked',{text:'Move design into frame',title:'Nothing inside the print area \u2014 move your design into the frame'});\n      return;\n    }\n    var faceKeys=Object.keys(exports);\n    try{ window.hdGenStart(faceKeys.length); }catch(e){}   // \u620A\uFF1A\u7ACB\u523B\u5F00\u59CB\u8FDB\u5EA6\u63D0\u9192\uFF08\u9762\u6570\u8FDB title\uFF09\n    var faces=faceKeys.map(function(k){ return { placement:k, designBase64:exports[k] }; });\n    /* 2026-10-15\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A**\u591A\u8272\u8D70\u540C\u4E00\u5957**\u2014\u2014\u5BF9\u753B\u677F\u4E0A\u9009\u4E2D\u7684\u90A3\u51E0\u4E2A\u8272\u9010\u4E2A\u8C03\u7528\u540C\u4E00\u4E2A\n       /mockup/create\uFF08\u540E\u7AEF\u300C\u6BCF\u9762 2 \u5F20 + \u6B63\u9762\u5FC5\u5907\u300D\u539F\u6837\u751F\u6548\uFF09\u3002\u53EA\u9009 1 \u4E2A\u8272 \u21D2 \u8D70\u4E0B\u9762\u539F\u8DEF\u5F84\uFF08\u96F6\u56DE\u5F52\uFF09\u3002 */\n    var _mcs=hdGenColors();\n    /* 2026-10-17\uFF1A**\u5355\u8272\u4E5F\u8D70 job \u961F\u5217** \u2014\u2014 \u539F\u6765\u53EA\u6709 >1 \u8272\u624D\u8FDB job\uFF0C\u5355\u8272\u76F4\u63A5\u8FC7\u95F8\u95E8 \u21D2\n       \u5355\u8272/\u591A\u8272\u6DF7\u5728\u4E00\u8D77\u65F6\u4F1A\u7ED5\u8FC7\u300C\u6309\u4EBA FIFO\u300D\u3002\u7EDF\u4E00\u8D70 hdGenMultiRun\uFF081 \u8272\u4E5F\u5EFA job\uFF09\u3002 */\n    try{ window.__hdDesignId = pfmDesignId(exports); }catch(e){}\n    if(_mcs.length>=1){ hdGenMultiRun(_mcs, faces); return; }\n    var payload;\n    if(faces.length===1){\n      payload={designBase64:faces[0].designBase64,catalogVariantId:currentVariantId,productId:pid,placement:faces[0].placement,technique:currentTech,color:selColor};\n    } else {\n      payload={faces:faces,catalogVariantId:currentVariantId,productId:pid,technique:currentTech,color:selColor};\n    }\n    ft(B+'/mockup/create',{method:'POST',headers:{'Content-Type':'application/json'},\n      body:JSON.stringify(Object.assign({}, payload, { pageId: (window.__hdPageId = ('p' + Date.now() + '_' + Math.random().toString(36).slice(2, 8))) }))\n    }, 120000).then(function(r){return r.json()}).then(function(d){\n    try{ window.hdGenSubmitted(); }catch(e){}   // \u620A\uFF1APOST \u5DF2\u8FD4\u56DE \u21D2 \u4ECE\u300C\u63D0\u4EA4/\u6392\u961F\u300D\u5207\u5230\u300C\u51FA\u56FE\u4E2D\u300D\n    if(d.success&&((d.taskIds&&d.taskIds.length)||d.taskId)){\n      /* 2026-10-06\uFF1A\u4E00\u9762\u4E00\u4EFB\u52A1 \u21D2 \u540E\u7AEF\u56DE taskIds[]\uFF08\u6BCF\u4E2A\u9762\u4E00\u4E2A Printful \u4EFB\u52A1\uFF09\u3002\n         \u8FD9\u91CC\u4E00\u6B21\u6027\u628A\u5168\u90E8\u4EFB\u52A1 id \u7528\u9017\u53F7\u62FC\u8D77\u6765\u8F6E\u8BE2\uFF0C\u540E\u7AEF\u5408\u5E76\u8FD4\u56DE\u6240\u6709\u9762\u7684\u56FE\u3002\n         \u517C\u5BB9\uFF1A\u8001 bridge \u53EA\u56DE taskId\u3002 */\n      var _tid=(d.taskIds&&d.taskIds.length)?d.taskIds.join(','):d.taskId;\n      var tries=0, MAX_TRIES=90; // 90 \u00D7 2s = 180s \u2014 Printful mockups routinely take 1-3 min (multi-face longer)\n      var i=setInterval(function(){\n        tries++;\n        // 2026-08-17: 30s timeout (was default 10s) \u2014 Printful status can take\n        // 10-20s to return completed when the task just finished rendering.\n        ft(B+'/mockup/status/'+_tid, {}, 30000).then(function(r){return r.json()}).then(function(sd){\n          var st=(sd.status||'').toLowerCase();\n          if(st==='completed'&&sd.mockups&&sd.mockups.length){\n            clearInterval(i);pfmGenBtn('done');\n            // Render with resilience: loading placeholder + auto-retry on error (2 tries)\n            // + manual retry fallback. Prevents \"Done but blank image\" on flaky networks.\n            q('pfmMockupGallery').innerHTML='';\n            // carousel\uFF1A\u53EA\u4FDD\u7559\u300C\u6709 art\u300D\u7684\u9762\u5E76\u6807\u6CE8(Front/Back\u2026)\uFF0C\u7F29\u7565\u56FE\u6761 + \u5E26\u6807\u7B7E\u4E3B\u56FE\u3002\n            // \u517C\u5BB9\uFF1A\u65E0 placement \u7684\u6761\u76EE\u4FDD\u7559\uFF08\u65E7 bridge \u6570\u636E\uFF09\u3002\n            // keep front in wanted (blank front from backend)\n            var np=function(p){return p==='front_large'?'front':p==='back_large'?'back':p;};\n            var wanted=faces.map(function(f){return np(f.placement);});if(wanted.indexOf('front')<0)wanted.push('front');\n            var kept=sd.mockups.filter(function(m){\n              var p=(typeof m==='object'&&m)?m.placement:null;\n              if(!p) return true;\n              for(var k=0;k<wanted.length;k++){\n                var w=wanted[k];\n                if(p===w||p.indexOf(w+'_')===0) return true;\n              }\n              return false;\n            });\n            if(!kept.length){ kept=sd.mockups; } // safety: never render an empty gallery\n            /* 2026-10-17\uFF1A**\u8BB0\u4F4F\u6700\u540E\u4E00\u5F20 mockup \u7684\u539F\u59CB CDN URL**\uFF08\u4E0D\u8981 image-proxy \u5305\u88C5\u7248\uFF09\uFF0C\n               \u4F9B\u300C\u52A0\u8D2D\u2192\u5EFA Shopify \u5546\u54C1\u300D\u65F6\u4F5C\u4E3A\u5546\u54C1\u4E3B\u56FE\uFF08\u8D2D\u7269\u8F66/\u5546\u54C1\u9875\u624D\u80FD\u770B\u5230\u5546\u54C1\u6548\u679C\u56FE\uFF0C\n               \u800C\u4E0D\u662F\u90A3\u5F20\u8BBE\u8BA1\u539F\u7A3F\uFF09\u3002\u540C\u65F6\u5199 localStorage\uFF0C\u5237\u65B0\u540E\u4ECD\u5728\u3002 */\n            try{\n              /* 2026-10-17 \u4FEE\uFF1A\u539F\u53D6 kept[0]\uFF0C\u4F46\u5217\u8868\u9996\u9879\u53EF\u80FD\u662F\u300C\u7A7A\u767D\u6B63\u9762\u300D\u5360\u4F4D\u56FE\n                 \uFF08\u5B9E\u6D4B\uFF1A\u4F20\u4E0A\u53BB\u7684\u4E3B\u56FE 81.3% \u900F\u660E = \u8BBE\u8BA1\u539F\u7A3F\uFF09\u3002\u6539\u4E3A**\u8DF3\u8FC7 blank\uFF0C\u4F18\u5148 model/flat \u6548\u679C\u56FE**\u3002 */\n              var _pickModel = '', _pickFlat = '', _fallback = '';\n              for (var _bi = 0; _bi < kept.length; _bi++) {\n                var _m = kept[_bi];\n                var _u = (typeof _m === 'string') ? _m : (_m && _m.url);\n                var _p = (typeof _m === 'object' && _m) ? String(_m.placement || '') : '';\n                if (!_u) continue;\n                if (/blank/i.test(_p)) continue;\n                if (!_fallback) _fallback = _u;\n                if (!_pickModel && /model/i.test(_p)) _pickModel = _u;\n                if (!_pickFlat && /flat/i.test(_p)) _pickFlat = _u;\n              }\n              var _raw0 = _pickModel || _pickFlat || _fallback;\n              try{\n                var _byColor = {};\n                var _gs = (typeof hdMcGroups === 'function') ? (hdMcGroups() || []) : [];\n                for (var _gi = 0; _gi < _gs.length; _gi++) {\n                  var _gcol = String(_gs[_gi].color || '');\n                  if (!_gcol) continue;\n                  var _gis = _gs[_gi].items || [];\n                  var _pickM2 = '', _pickF2 = '', _fb2 = '';\n                  for (var _gj = 0; _gj < _gis.length; _gj++) {\n                    var _gi2 = _gis[_gj];\n                    var _gu = _gi2 && (_gi2.raw || _gi2.src);\n                    var _gp = _gi2 && _gi2.placement ? String(_gi2.placement) : '';\n                    if (!_gu) continue;\n                    if (/blank/i.test(_gp)) continue;\n                    if (!_fb2) _fb2 = _gu;\n                    if (!_pickM2 && /model/i.test(_gp)) _pickM2 = _gu;\n                    if (!_pickF2 && /flat/i.test(_gp)) _pickF2 = _gu;\n                  }\n                  var _final = _pickM2 || _pickF2 || _fb2;\n                  if (_final) _byColor[_gcol] = _final;\n                }\n                /* \u5355\u8272\u8DEF\u5F84\uFF1A__mcGroups \u662F\u7A7A\u7684\uFF08\u53EA\u6709\u591A\u8272\u624D\u5199\uFF09\u21D2 \u7528\u5F53\u524D\u9009\u4E2D\u8272\u8865\u4E00\u6761 */\n                if (!Object.keys(_byColor).length && _raw0) {\n                  var _cn1 = '';\n                  try{ _cn1 = String((window.__pfmProduct && window.__pfmProduct._colorName) || (window.__dsPick && window.__dsPick.color) || ''); }catch(e){}\n                  if (_cn1) _byColor[_cn1] = _raw0;\n                }\n                if (Object.keys(_byColor).length) {\n                  window.__hdMockupByColor = _byColor;\n                  var _dk2=(window.__hdDesignId||'');\n                  try{ localStorage.setItem('hd_mockup_by_color_' + _dk2, JSON.stringify(_byColor)); }catch(e){}\n                  try{ console.log('[hd-mc] byColor keys=' + Object.keys(_byColor).join(',')); }catch(e){}\n                }\n              }catch(e){}\n              if(_raw0){\n                window.__hdLastMockup = _raw0;\n                try{ localStorage.setItem('hd_last_mockup', _raw0); }catch(e){}\n              }\n            }catch(e){}\n            window.hdMockupItems=kept.map(function(m){\n              var u=(typeof m==='string')?m:m.url;\n              var p=(typeof m==='object'&&m)?m.placement:null;\n              return { src:B+'/image-proxy?url='+encodeURIComponent(u), raw:u, placement:p, label:window.hdPlacementLabel(p) };\n            });\n            /* 2026-10-25 \u9636\u6BB53\uFF1A\u7ACB\u523B\u9884\u53D6\u5168\u90E8 mockup \u56FE\uFF08\u4E0D\u7B49 innerHTML \u5EFA\u5B8C\u624D\u53D1\u8BF7\u6C42\uFF09\n               \u2014\u2014 /image-proxy \u6709 24h \u78C1\u76D8\u7F13\u5B58 + \u540C URL \u5E76\u53D1\u53BB\u91CD\uFF0C\u9884\u53D6\u4E0E\u540E\u7EED <img> \u5171\u4EAB\u540C\u4E00\u6B21\u56DE\u6E90 */\n            try{ (window.hdMockupItems||[]).forEach(function(x,i){ if(x&&x.src){ var _pi=new Image(); _pi.decoding='async'; _pi.src=x.src; /* 2026-10-25 \u4FEE\uFF1A**\u53EA\u9884\u89E3\u7801\u524D 2 \u5F20**\u3002\u539F\u6765\u5168\u90E8 decode \u21D2 8~16 \u5F20 1000\u00B2 \u4E00\u6B21\u6027\u89E3\u7801\u5360\u6EE1\u4E3B\u7EBF\u7A0B\uFF0C\u8868\u73B0\u5C31\u662F\u300C\u56FE\u7247\u5DF2\u7ECF\u663E\u793A\uFF0C\u4F46\u7BAD\u5934\u70B9\u4E0D\u52A8\uFF0C\u8981\u7B49\u4E00\u4F1A\u300D\u3002\u5176\u4F59\u53EA\u9884\u53D6\uFF0C\u5207\u5230\u65F6\u6309\u9700\u89E3\u7801\uFF08\u5355\u5F20 10~30ms\uFF0C\u65E0\u611F\uFF09\u3002 */ if(i<2 && _pi.decode){ try{ _pi.decode().catch(function(){}) }catch(_e){} } } }); }catch(e){}\n              var first=window.hdMockupItems[0]||{src:'',label:''};\n              q('pfmMockupGallery').innerHTML=\n                '<div class=\"pfm-carousel-main pfm-mockup-item\">'+\n                  '<span class=\"pfm-carousel-badge\" id=\"pfmMockupBadge\">'+first.label+'</span>'+\n                  '<img class=\"pfm-mockup-img\" id=\"pfmMockupMain\" data-src=\"'+first.src+'\" src=\"'+first.src+'\" alt=\"Mockup\" style=\"width:100%;aspect-ratio:1/1;object-fit:contain;display:block;background:#fff\" onerror=\"hdMockupImgError(this)\">'+\n                  '<div class=\"pfm-mockup-err\">'+\n                  '<span>Image failed to load</span>'+\n                  '<button type=\"button\" onclick=\"return hdRetryMockup(this)\" style=\"padding:6px 14px;border:1px solid #1FBDB7;background:#fff;color:#1FBDB7;border-radius:var(--pf-r-sm);cursor:pointer;font-size:13px\">Retry</button>'+\n                  '</div></div>'+\n                '<div class=\"pfm-carousel-thumbs\">'+window.hdMockupItems.map(function(it,i){\n                  return '<img class=\"pfm-mockup-thumb'+(i===0?' active':'')+'\" src=\"'+it.src+'&w=200'+'\" alt=\"'+it.label+'\" title=\"'+it.label+'\" onclick=\"hdSelectMockup('+i+')\" onerror=\"this.style.display=\\'none\\'\">';\n                }).join('')+'</div>';\n            /* 2026-10-15\uFF1A\u5355\u8272\u8DEF\u5F84\u4E5F\u628A\u540E\u7AEF\u544A\u77E5\u7684\u5931\u8D25\u9762\u663E\u51FA\u6765\uFF08\u539F\u6765\u53EA\u8BFB success/taskIds\uFF0C\u9759\u9ED8\u5C11\u56FE\uFF09\u3002 */\n            try{\n              if(d && d.failedFaces && d.failedFaces.length){\n                hdMcStyle();\n                var _w=document.createElement('div'); _w.className='pfm-mc-warn';\n                _w.textContent=d.failedFaces.length+' view(s) failed: '+d.failedFaces.join(', ')+' \\u2014 tap Retry or generate again';\n                q('pfmMockupGallery').insertBefore(_w, q('pfmMockupGallery').firstChild);\n              }\n            }catch(e){}\n          } else if(st==='failed'){\n            clearInterval(i);pfmGenBtn('error',{title:'Mockup failed: '+(sd.error||'Printful could not render this design')});\n          } else if(tries>=MAX_TRIES){\n            clearInterval(i);pfmGenBtn('error',{title:'Printful is still processing \u2014 please check back shortly (task keeps running in background)'});\n          } else {\n            // Show live progress state so the UI never looks frozen\n            window.hdGenBusy('Printful status: '+st);   // \u620A\uFF1A\u4FDD\u4F4F\u8FDB\u5EA6\u6587\u6848\uFF0C\u53EA\u66F4\u65B0 title\n          }\n        }).catch(function(e){\n          // 2026-08-17: \u5FC5\u987B\u66B4\u9732\u771F\u5B9E\u9519\u8BEF\uFF08timeout / CORS / 5xx\uFF09\uFF0C\u8BA9\u7528\u6237\u80FD\u5206\u8FA8\u662F Printful \u6E32\u67D3\u6162\u3001\u771F 5xx \u8FD8\u662F\u7F51\u7EDC\u95EE\u9898\uFF1B\n          // \u65E7\u7684\u7B3C\u7EDF\u6587\u6848\u628A\u6839\u56E0\u85CF\u8D77\u6765\u4E86\u3002\n          var msg = (e && (e.message || (e.name + ': ' + e.code))) || 'unknown';\n          window.hdGenBusy('Status check error: ' + msg + ' \u2014 retrying\u2026');\n        });\n      },2000);\n    }else if(d&&d.rateLimited){\n      /* \u620A\uFF1APrintful \u8D26\u53F7\u7EA7\u9650\u6D41\uFF08\u540E\u53F0\u6279\u91CF\u51FA\u56FE\u5728\u62A2\u914D\u989D\uFF09\u21D2 \u660E\u786E\u544A\u77E5\u300C\u5728\u6392\u961F\u300D\uFF0C\n         \u5E76\u628A\u6309\u94AE\u7559\u5728\u53EF\u70B9\u6001\uFF08error \u6001\u70B9\u51FB\u539F\u4F4D\u91CD\u8DD1\uFF09\uFF0C\u6587\u6848\u6E29\u6696\u4E0D\u5413\u4EBA\u3002 */\n      pfmGenBtn('error',{text:'Try again', title:\"We're queuing your design \\u2014 Printful is busy right now. Please tap to try again in about a minute.\"});\n    }else{pfmGenBtn('error',{title:'Error: '+(d.error||'unknown')})}\n      }).catch(function(e){pfmGenBtn('error',{title:'Error: '+e.message})});\n    }).catch(function(e){pfmGenBtn('error',{title:'Export error: '+((e&&e.message)||e)})});\n});\n\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   2026-10-15\uFF1A\u591A\u8272\u51FA\u56FE\uFF08\u7528\u6237\u88C1\u51B3\u300C\u591A\u8272\u8D70\u540C\u4E00\u5957\uFF0C\u5148\u505A\u300D\uFF09\n   \u00B7 \u8272\u6E90 = \u753B\u677F\u5E95\u90E8\u8272\u5E26\u7684\u90A3\u51E0\u4E2A\u8272\uFF08\u4E0E\u8272\u5E26\u540C\u6E90\uFF1AsessionStorage['hdTeamCombos']\uFF0Cpid \u5339\u914D\uFF09\n   \u00B7 \u6BCF\u4E2A\u8272\u9010\u4E2A\u8C03\u7528\u540C\u4E00\u4E2A POST /mockup/create \u21D2 \u540E\u7AEF\u90A3\u5957\u300C\u6BCF\u9762 2 \u5F20\uFF08\u7537\u6A21+\u767D\u5E95\uFF09+ \u6B63\u9762\u5FC5\u5907\u300D\u539F\u6837\u751F\u6548\n   \u00B7 \u53EA\u9009 1 \u4E2A\u8272\u65F6**\u4E0D\u8D70\u8FD9\u91CC**\uFF08\u8C03\u7528\u65B9\u76F4\u63A5\u8D70\u539F\u8DEF\u5F84\uFF09\u21D2 \u96F6\u56DE\u5F52\n   \u00B7 \u6BCF\u8272\u5355\u72EC\u8F6E\u8BE2\u81EA\u5DF1\u7684 taskIds\uFF0C**\u51FA\u4E00\u7EC4\u6E32\u67D3\u4E00\u7EC4** \u21D2 \u5929\u7136\u9002\u914D\u540E\u7EED\u300C\u8FDB\u5EA6\u6761 / \u6E29\u99A8\u63D0\u9192\u300D\n   \u00B7 \u9884\u7559 window.hdGenProgress\uFF08colors / total / done / current / phase / startedAt\uFF09\u4F9B\u8FDB\u5EA6\u6761\u63A5\u5165\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nfunction hdGenColors(){\n  var out=[], seen={};\n  try{\n    var pq=String(new URLSearchParams(location.search).get('product_id')||'');\n    var o=JSON.parse(sessionStorage.getItem('hdTeamCombos')||'null');\n    if(o && String(o.pid||'')===pq) (o.items||[]).forEach(function(it){\n      var c=String((it&&it.c)||''); if(!c || seen[c]) return; seen[c]=1; out.push({c:c});\n    });\n  }catch(e){}\n  if(!out.length){                                   /* \u6CA1\u8D70\u76EE\u5F55\u9875 \u21D2 \u9000\u5316\u4E3A\u300C\u53EA\u51FA\u5F53\u524D\u8272\u300D= \u539F\u884C\u4E3A */\n    var cur=String((window.__dsPick||{}).color||''); if(cur) out.push({c:cur});\n  }\n  return out;\n}\n/* \u8272\u540D + \u5F53\u524D\u7801 \u2192 \u8BE5\u8272\u53D8\u4F53 id\uFF08\u627E\u4E0D\u5230\u5C31\u56DE\u9000\u5F53\u524D\u53D8\u4F53\uFF1B\u540E\u7AEF\u8FD8\u4F1A\u518D\u6309\u8272\u540D\u6821\u9A8C\u4E00\u6B21\uFF09 */\nfunction hdVariantFor(colorName, sizeName){\n  try{\n    var vs=window.__dsVariants||[], sizeKey='';\n    /* 2026-10-17\uFF08\u7528\u6237\uFF09\uFF1A\u652F\u6301\u7B2C\u4E8C\u53C2 size \u2014\u2014 \u591A\u8272\u6BCF\u884C\u8981\u7528**\u5404\u81EA combo \u7684\u7801**\u67E5\u53D8\u4F53\uFF1B\n       \u4E0D\u4F20\u5219\u4ECD\u8BFB __dsPick.size\uFF08\u51FA\u56FE\u6D41\u7A0B\u539F\u884C\u4E3A\uFF0C\u96F6\u5F71\u54CD\uFF09\u3002 */\n    try{\n      var _sk2=(sizeName!==undefined && sizeName!==null && String(sizeName)!=='') ? String(sizeName) : String((window.__dsPick||{}).size||'');\n      sizeKey=_sk2.trim().toLowerCase();\n    }catch(e){}\n    var byColor=[], hit=null;\n    for(var i=0;i<vs.length;i++){\n      if(String(vs[i].color||'')!==colorName) continue;\n      byColor.push(vs[i]);\n      if(sizeKey && String(vs[i].size||'').trim().toLowerCase()===sizeKey){ hit=vs[i]; break; }\n    }\n    if(!hit) hit=byColor[0];\n    return hit ? parseInt(hit.variant_id,10) : 0;\n  }catch(e){ return 0; }\n}\n/* \u628A\u4E00\u7EC4\u56FE\u6E32\u67D3\u8FDB\u753B\u5ECA\uFF08\u8FFD\u52A0\u5230\u5DF2\u6709\u5185\u5BB9\u4E4B\u540E\uFF09 */\n/* 2026-10-15\uFF08\u4E59\u00B7\u7528\u6237\u88C1\u51B3\uFF09\uFF1A**\u5168\u5C40\u4E00\u4E2A carousel**\uFF08\u4E0A\u5927\u56FE + \u4E0B\u5C0F\u56FE\u6A2A\u6392\uFF09+ \u9876\u90E8\u989C\u8272 chips\u3002\n   \u6536\u96C6\u6BCF\u7EC4\u6570\u636E \u2192 \u4EA4\u7ED9 hdRenderMC \u7EDF\u4E00\u6E32\u67D3\uFF1B\u70B9 chip \u5207\u8272\uFF1B\u70B9\u5C0F\u56FE\u5207\u5927\u56FE\u590D\u7528\u65E2\u6709 hdSelectMockup\u3002 */\nfunction hdMcStyle(){\n  try{\n    if(document.getElementById('pfm-mc-style')) return;\n    var st=document.createElement('style'); st.id='pfm-mc-style';\n    st.textContent='.pfm-mc-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px}'\n      +'.pfm-mc-chip{padding:4px 10px;border-radius:999px;border:1px solid var(--pf-border);'\n      +'background:#fff;font-size:12px;cursor:pointer;font-family:inherit}'\n      +'.pfm-mc-chip.active{background:#F3E8FF;border-color:#C4B5FD;color:#7C3AED;font-weight:700}'\n      +'.pfm-mc-warn{margin:0 0 8px;font-size:12px;color:#B45309;background:#FEF3C7;border-radius:6px;padding:6px 9px}';\n    document.head.appendChild(st);\n  }catch(e){}\n}\nfunction hdMcGroups(){ if(!window.__mcGroups) window.__mcGroups=[]; return window.__mcGroups; }\nfunction hdRenderMC(active){\n  try{\n    var g=q('pfmMockupGallery'); if(!g) return;\n    var groups=hdMcGroups(); if(!groups.length) return;\n    var cur=null;\n    for(var i=0;i<groups.length;i++){ if(groups[i].color===active) cur=groups[i]; }\n    if(!cur) cur=groups[0];\n    window.__mcActive=cur.color;\n    hdMcStyle();\n    /* \u590D\u7528\u65E2\u6709\u5951\u7EA6\uFF1AhdSelectMockup(i) \u8BFB window.hdMockupItems[i] \u5E76\u5207 .pfm-carousel-thumbs \u7684 active */\n    /* \u4E59\uFF1A\u5C0F\u56FE\u5E26 = **\u6BCF\u4E2A\u5DF2\u51FA\u7684\u8272\u5404\u4E00\u5F20**\uFF08\u4E0D\u662F\u53EA\u5F53\u524D\u8272\uFF09\uFF1B\u5927\u56FE = \u6700\u65B0\u51FA\u7684\u90A3\u4E2A\u8272\u3002 */\n    var _all=[];\n    for(var _g=0;_g<groups.length;_g++){\n      var _gitems=(groups[_g].items||[]);\n      for(var _i2=0;_i2<_gitems.length;_i2++){\n        var _it=_gitems[_i2];\n        _all.push({ src:_it.src, label:String(groups[_g].color||'')+(_it.label?(' \u00B7 '+_it.label):'') });\n      }\n    }\n    window.hdMockupItems = _all.length ? _all : cur.items.slice();\n    /* 2026-10-25 \u9636\u6BB53\uFF1A\u540C\u4E0A\uFF0C\u7ACB\u523B\u9884\u53D6 */\n    try{ (window.hdMockupItems||[]).forEach(function(x,i){ if(x&&x.src){ var _pi=new Image(); _pi.decoding='async'; _pi.src=x.src; /* 2026-10-25 \u4FEE\uFF1A**\u53EA\u9884\u89E3\u7801\u524D 2 \u5F20**\u3002\u539F\u6765\u5168\u90E8 decode \u21D2 8~16 \u5F20 1000\u00B2 \u4E00\u6B21\u6027\u89E3\u7801\u5360\u6EE1\u4E3B\u7EBF\u7A0B\uFF0C\u8868\u73B0\u5C31\u662F\u300C\u56FE\u7247\u5DF2\u7ECF\u663E\u793A\uFF0C\u4F46\u7BAD\u5934\u70B9\u4E0D\u52A8\uFF0C\u8981\u7B49\u4E00\u4F1A\u300D\u3002\u5176\u4F59\u53EA\u9884\u53D6\uFF0C\u5207\u5230\u65F6\u6309\u9700\u89E3\u7801\uFF08\u5355\u5F20 10~30ms\uFF0C\u65E0\u611F\uFF09\u3002 */ if(i<2 && _pi.decode){ try{ _pi.decode().catch(function(){}) }catch(_e){} } } }); }catch(e){}\n    var esc=function(x){ return String(x==null?'':x).replace(/[<>&\"]/g,''); };\n    var chips=groups.map(function(x){\n      return '<button type=\"button\" class=\"pfm-mc-chip'+(x.color===cur.color?' active':'')+'\" data-mc=\"'\n        +esc(x.color)+'\">'+esc(x.color)+'</button>';\n    }).join('');\n    var failed=(cur.failed && cur.failed.length)\n      ? '<div class=\"pfm-mc-warn\">'+cur.failed.length+' view(s) failed for '+esc(cur.color)+': '\n        + esc(cur.failed.join(', ')) +' \\u2014 tap Retry or generate again</div>'\n      : '';\n    var first=(groups[0].items||[])[0]||{src:'',label:''};   /* \u5927\u56FE\u9ED8\u8BA4=\u7B2C\u4E00\u4E2A\u8272\uFF0C\u4E0E\u5C0F\u56FE\u5E26\u9AD8\u4EAE\u5BF9\u9F50 */\n    /* 2026-10-16\uFF08\u7528\u6237\uFF1A\u591A\u8272\u590D\u7528\u5355\u8272\u7684\u7A97\u53E3 \u00B7 \u4E59\uFF09\uFF1A\u9876\u90E8\u8272 chips \u53BB\u6389\u3002 */\n    g.innerHTML=''+failed\n      +'<div class=\"pfm-carousel-main pfm-mockup-item\">'\n        +'<span class=\"pfm-carousel-badge\" id=\"pfmMockupBadge\">'+first.label+'</span>'\n        +'<img class=\"pfm-mockup-img\" id=\"pfmMockupMain\" data-src=\"'+first.src+'\" src=\"'+first.src+'\" alt=\"Mockup\" style=\"width:100%;aspect-ratio:1/1;object-fit:contain;display:block;background:#fff\" onerror=\"hdMockupImgError(this)\">'\n        +'<div class=\"pfm-mockup-err\"><span>Image failed to load</span>'\n          +'<button type=\"button\" onclick=\"return hdRetryMockup(this)\" style=\"padding:6px 14px;border:1px solid #1FBDB7;background:#fff;color:#1FBDB7;border-radius:var(--pf-r-sm);cursor:pointer;font-size:13px\">Retry</button>'\n        +'</div>'\n      +'</div>'\n      +'<div class=\"pfm-mc-thumbs-wrap\">'\n        +'<button type=\"button\" class=\"pfm-mc-arrow pfm-mc-arrow-prev\" aria-label=\"Prev\" onclick=\"window.__mcStep&&window.__mcStep(-1)\">&#8249;</button>'\n        +'<div class=\"pfm-carousel-thumbs\">'+window.hdMockupItems.map(function(it,i){\n            return '<img class=\"pfm-mockup-thumb'+(i===0?' active':'')+'\" src=\"'+it.src+'&w=200'+'\" alt=\"'+it.label+'\" title=\"'+it.label+'\" onclick=\"hdSelectMockup('+i+')\">';\n          }).join('')+'</div>'\n        +'<button type=\"button\" class=\"pfm-mc-arrow pfm-mc-arrow-next\" aria-label=\"Next\" onclick=\"window.__mcStep&&window.__mcStep(1)\">&#8250;</button>'\n      +'</div>';\n    try{ hdMcThumbsArrows(); }catch(e){}\n    var bs=g.querySelectorAll('.pfm-mc-chip');\n    for(var j=0;j<bs.length;j++){\n      bs[j].addEventListener('click', function(){ window.hdShowMC(this.getAttribute('data-mc')); });\n    }\n  }catch(e){}\n}\n/* 2026-10-17\uFF08\u7528\u6237\uFF1A1.\u6709 2.\u529F\u80FD\u662F\u9519\u7684 3.\u4E0D\u662F\u7070\u7684\uFF09\u2014\u2014\n   \u2460 \u300C\u529F\u80FD\u662F\u9519\u7684\u300D\u6839\u56E0\uFF1A\u7BAD\u5934\u540C\u65F6\u6302\u4E86\u300C\u5185\u8054 onclick=window.__mcStep\u300D\u548C\n      \u300C\u59D4\u6258\u5230 g \u7684 click\u300D\u4E24\u5957\u5904\u7406\u5668 \u21D2 \u4E00\u6B21\u70B9\u51FB\u8DD1\u4E24\u904D \u21D2 \u4E00\u6B21\u8DF3\u4E24\u5F20\u3002\n      \u73B0\u53EA\u4FDD\u7559\u5185\u8054 onclick\uFF08\u4E0E\u7F29\u7565\u56FE\u5B8C\u5168\u540C\u673A\u5236\uFF09\u3002\n   \u2461 \u300C\u4E0D\u662F\u7070\u7684\u300D\u6839\u56E0\uFF1A.pfm-mc-arrow.disabled \u6837\u5F0F\u4E00\u76F4\u5728\uFF0C\u4F46\u4ECE\u6CA1\u6709\u4EE3\u7801\u52A0\u8FC7\u8BE5 class\u3002\n      \u21D2 \u7EDF\u4E00\u7531 __mcArrowSync() \u5728\u300C\u6E32\u67D3\u540E / \u5207\u56FE\u540E\u300D\u7F6E\u7070\uFF1A\u9996\u5F20\u7981\u7528 \u2039\u3001\u672B\u5F20\u7981\u7528 \u203A\u3002 */\nwindow.__mcArrowSync=function(){\n  try{\n    var g=document.getElementById('pfmMockupGallery'); if(!g) return;\n    var t=g.querySelector('.pfm-carousel-thumbs'); if(!t) return;\n    var th=t.querySelectorAll('.pfm-mockup-thumb');\n    var p=g.querySelector('.pfm-mc-arrow-prev'), n=g.querySelector('.pfm-mc-arrow-next');\n    if(!p||!n) return;\n    var cur=-1;\n    for(var i=0;i<th.length;i++){ if(th[i].classList.contains('active')){ cur=i; break; } }\n    if(cur<0 && th.length) cur=0;\n    var one = th.length<2;\n    /* 2026-10-25\uFF1A\u5207\u56FE\u5DF2\u6539\u5FAA\u73AF \u21D2 \u4E0D\u518D\u6709\"\u5230\u5934\u7981\u7528\"\uFF0C\u53EA\u6709\u300C\u4EC5\u4E00\u5F20\u56FE\u300D\u65F6\u4E24\u4E2A\u90FD\u7981\u7528 */\n    if(one){ p.classList.add('disabled'); n.classList.add('disabled'); }\n    else { p.classList.remove('disabled'); n.classList.remove('disabled'); }\n  }catch(e){}\n};\n/* 2026-10-16\uFF08\u7528\u6237\uFF1A\u7535\u8111\u7AEF\u5C0F\u56FE\u5E26\u65E0\u6CD5\u6ED1\u52A8\uFF09\u2014\u2014 \u5DE6\u53F3\u7BAD\u5934\uFF1A\u53EA\u5728\u6EA2\u51FA\u65F6\u663E\u793A\u3001\u5230\u5934\u7981\u7528\u3001\u5E73\u6ED1\u7FFB 80%\u3002 */\nfunction hdMcThumbsArrows(){\n  try{\n    var sid='pfm-mc-arrows-css';\n    /* 2026-10-25\uFF08\u7532\u00B7\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u7BAD\u5934**\u4E0D\u518D\u7EDD\u5BF9\u5B9A\u4F4D**\uFF0C\u6539\u4E3A thumbs-wrap \u91CC\u7684\u9759\u6001 flex item\u3002\n       \u5168\u7F51\u5178\u578B\u300C\u540C\u4EE3\u7801\u624B\u673A\u6B63\u5E38\u3001\u7535\u8111\u70B9\u4E0D\u4E2D\u300D\u7684\u5934\u53F7\u539F\u56E0\u5C31\u662F **\u7EDD\u5BF9\u5B9A\u4F4D\u5143\u7D20\u6321\u4F4F\u6309\u94AE**\n       \uFF08`position:absolute` + `left/right:-10px` + `z-index:2`\uFF0C\u4E14 wrap \u7684 position:relative\n        \u8FD8\u662F JS \u6CE8\u5165\u7684 \u21D2 \u5C42\u53E0\u5173\u7CFB\u4E0D\u7A33\u5B9A\uFF09\u3002\n       \u6539\u4E3A flex \u540E\u7BAD\u5934\u771F\u5B9E\u5360\u4F4D\u3001\u547D\u4E2D\u533A\u57DF\u786E\u5B9A\uFF0C\u4E0D\u518D\u53D7\u4EFB\u4F55\u5144\u5F1F/\u6D6E\u5C42\u5F71\u54CD\u3002\n       \uD83D\uDD34 \u6BCF\u6B21\u5148\u5220\u65E7 style \u518D\u6CE8\u5165\uFF1A\u5426\u5219\u6539\u5B8C CSS \u4E0D\u751F\u6548\uFF08\u540C id \u88AB `if(!getElementById)` \u8DF3\u8FC7\uFF09\u3002 */\n    var _old=document.getElementById(sid); if(_old) _old.remove();\n    {\n      var st=document.createElement('style'); st.id=sid;\n      st.textContent='.pfm-mc-thumbs-wrap{position:relative;display:flex;align-items:center;gap:6px}'\n        +'.pfm-mc-arrow{position:static;transform:none;flex:0 0 auto;width:30px;height:30px;border-radius:50%;background:#fff;border:1px solid var(--pf-border);box-shadow:0 2px 8px rgba(0,0,0,.12);display:flex;align-items:center;justify-content:center;font-size:16px;line-height:1;cursor:pointer;color:inherit;padding:0}'\n        +'.pfm-mc-arrow.disabled{opacity:.3;pointer-events:none}'\n        +'.pfm-carousel-thumbs{scroll-behavior:smooth;flex:1;min-width:0}';\n      document.head.appendChild(st);\n    }\n    var g=q('pfmMockupGallery'); if(!g) return;\n    var t=g.querySelector('.pfm-carousel-thumbs'); if(!t) return;\n    var p=g.querySelector('.pfm-mc-arrow-prev'), n=g.querySelector('.pfm-mc-arrow-next');\n    if(!p||!n) return;\n    try{ window.__mcArrowSync(); }catch(e){}\n  }catch(e){}\n}\n/* 2026-10-17\uFF08\u6309\u300C\u624B\u673A\u6B63\u5E38\u3001\u7535\u8111\u6709\u95EE\u9898\u300D\u5012\u63A8\uFF09\uFF1A\n   \u7F29\u7565\u56FE\u7528**\u5185\u8054 onclick** \u4E24\u7AEF\u90FD\u6B63\u5E38\uFF1B\u7BAD\u5934\u539F\u6765\u7528 JS \u7ED1\u5B9A/\u59D4\u6258\uFF0C\u7535\u8111\u7AEF\u51FA\u95EE\u9898\u3002\n   \u21D2 \u7BAD\u5934\u6539\u6210**\u4E0E\u7F29\u7565\u56FE\u5B8C\u5168\u76F8\u540C\u7684\u673A\u5236**\uFF1A\u5185\u8054 onclick \u2192 \u5168\u5C40 window.__mcStep\u3002\n   \u771F\u6E90\u4ECD\u662F\u7F29\u7565\u56FE DOM\uFF08\u4E0D\u7528 hdMockupItems\uFF09\u3002 */\nwindow.__mcStep = function(d){\n  try{\n    /* 2026-10-17\uFF08\u7528\u6237\u5173\u952E\u63D0\u793A\uFF1A\u624B\u673A\u7AEF\u662F\u300C\u6ED1\u52A8\u5927\u56FE\u300D\u5207\u56FE\uFF0C\u7535\u8111\u7AEF\u53EA\u80FD\u70B9\u7BAD\u5934\uFF09\n       \u21D2 \u624B\u673A\u6ED1\u52A8\u90A3\u6761\u8DEF =  \u5B9A\u5F53\u524D + hdSelectMockup(nx) \u5207\u56FE\uFF0C**\u5DF2\u88AB\u8BC1\u660E\u6709\u6548**\u3002\n       \u7BAD\u5934\u6539\u4E3A**\u5B8C\u5168\u540C\u4E00\u6761\u8DEF**\uFF0C\u4E0D\u518D\u81EA\u9020 src \u6BD4\u5BF9\uFF08\u90A3\u5957\u6BD4\u5BF9\u4F1A\u56E0 URL \u5F62\u5F0F\u4E0D\u540C\u800C\u5931\u8D25 \u21D2 cur \u6052 0 \u21D2 \u5361\u4F4F\uFF09\u3002 */\n    var g=document.getElementById('pfmMockupGallery'); if(!g) return;\n    var t=g.querySelector('.pfm-carousel-thumbs'); if(!t) return;\n    var th=t.querySelectorAll('.pfm-mockup-thumb'); if(!th.length) return;\n    var cur=-1;\n    for(var i=0;i<th.length;i++){ if(th[i].classList.contains('active')){ cur=i; break; } }\n    if(cur<0) cur=0;\n    if(th.length<2) return;                       /* \u53EA\u6709\u4E00\u5F20\uFF0C\u65E0\u9700\u5207 */\n    var nx=cur+d;\n    /* 2026-10-25\uFF08\u7528\u6237\uFF1A\u70B9\u7BAD\u5934\u4F1A\u7A7A\u70B9\uFF09\u2014\u2014 \u539F\u5B9E\u73B0\u8FB9\u754C\u76F4\u63A5 return\uFF0C\u70B9\u4E86\u6BEB\u65E0\u53CD\u9988\u3002\n       \u7F29\u7565\u56FE\u5E26\u662F overflow:hidden + touch-action:none\uFF08\u6ED1\u4E0D\u52A8\uFF09\uFF0C\u7BAD\u5934\u662F\u552F\u4E00\u5207\u56FE\u5165\u53E3\n       \u21D2 \u8FB9\u754C\u5FC5\u987B**\u5FAA\u73AF**\uFF0C\u4E0D\u5141\u8BB8\"\u70B9\u4E86\u6CA1\u53CD\u5E94\"\u3002 */\n    if(nx<0) nx=th.length-1;\n    if(nx>=th.length) nx=0;\n    try{ if(typeof hdSelectMockup==='function') hdSelectMockup(nx); }catch(e){}\n    /* \u515C\u5E95\uFF1A\u82E5 hdSelectMockup \u6CA1\u6709\u66F4\u65B0 active\uFF08\u5F02\u5E38/\u6570\u636E\u7F3A\u5931\uFF09\uFF0C\u8FD9\u91CC\u81EA\u5DF1\u8865\u4E0A\u5E76\u8BBE\u5927\u56FE */\n    var still=-1;\n    for(var k=0;k<th.length;k++){ if(th[k].classList.contains('active')){ still=k; break; } }\n    if(still!==nx){\n      var main=document.getElementById('pfmMockupMain');\n      /* 2026-10-25 \u4FEE\uFF1A\u515C\u5E95\u5FC5\u987B\u7528**\u5168\u5C3A\u5BF8** src\u3002\u7F29\u7565\u56FE\u73B0\u5728\u662F &w=200 \u7684\u4E0B\u91C7\u6837\u7248\uFF0C\n         \u76F4\u63A5\u62FF\u5B83\u5F53\u5927\u56FE\u4F1A\u53D8\u6210 200px \u6A21\u7CCA\u56FE\uFF08\u9636\u6BB51 \u5F15\u5165\u7684\u9690\u60A3\uFF09\u3002 */\n      var _itm=(window.hdMockupItems||[])[nx];\n      var src=(_itm&&_itm.src)||th[nx].getAttribute('src')||'';\n      if(main&&src){ main.setAttribute('data-src',src); main.setAttribute('data-fail','0'); main.src=src; main.style.display=''; }\n      for(var m=0;m<th.length;m++) th[m].className=(m===nx)?'pfm-mockup-thumb active':'pfm-mockup-thumb';\n    }\n    /* 2026-10-17\uFF08\u7528\u6237\uFF1A\u7F29\u7565\u56FE\u4E0D\u4F1A\u8DDF\u7740\u8D70\uFF09\u2014\u2014 \u7BAD\u5934\u5207\u56FE\u540E\u628A\u7B2C nx \u5F20\u6A2A\u5411\u5C45\u4E2D\u5E26\u8FDB\u53EF\u89C6\u533A\u3002\n       \u7528 getBoundingClientRect \u5DEE\u503C\u800C\u975E offsetLeft\uFF08\u7F29\u7565\u56FE\u6761\u7684 offsetParent \u4E0D\u4E00\u5B9A\u662F\u5B83\u81EA\u5DF1\uFF09\uFF1B\n       \u7528 += \u800C\u975E =\uFF08\u672A\u6EA2\u51FA\u65F6\u6D4F\u89C8\u5668\u81EA\u52A8 clamp\uFF0C\u4E0D\u4F1A\u9519\u4F4D\uFF09\u3002 */\n    try{\n      var _row=g.querySelector('.pfm-carousel-thumbs');\n      if(_row && th[nx]){\n        var _rr=_row.getBoundingClientRect(), _tr=th[nx].getBoundingClientRect();\n        _row.scrollLeft += (_tr.left - _rr.left) - (_rr.width - _tr.width)/2;\n      }\n    }catch(e){}\n    try{ window.__mcArrowSync(); }catch(e){}\n  }catch(e){}\n};\nfunction hdShowMC(color){ window.__mcActive=color; hdRenderMC(color); }\nfunction hdAppendGroup(colorName, mockups, failed){\n  try{\n    var items=(mockups||[]).map(function(m){\n      var u=(typeof m==='string')?m:m.url;\n      var p=(typeof m==='object'&&m)?m.placement:null;\n      return { src:B+'/image-proxy?url='+encodeURIComponent(u), raw:u, placement:p, label:window.hdPlacementLabel(p) };\n    });\n    if(!items.length) return;\n    var st=hdMcGroups();\n    st.push({ color:colorName, items:items, failed:(failed||[]).slice() });\n    /* 2026-10-17\uFF1A\u591A\u8272\u8DEF\u5F84\u6BCF\u8272\u5B8C\u6210\u5373\u8BB0\u5F55\u300C\u8BE5\u8272\u7684\u6548\u679C\u56FE\u300D\uFF08\u8DF3\u8FC7 blank\uFF0C\u4F18\u5148 model/flat\uFF09\n       \u2192 window.__hdMockupByColor + localStorage\uFF0C\u52A0\u8D2D\u5EFA\u54C1\u65F6\u968F mockupByColor \u4F20\u540E\u7AEF\u6302\u53D8\u4F53\u56FE\u3002 */\n    try {\n      var _pkM='', _pkF='', _fb='';\n      for (var _i=0;_i<items.length;_i++){\n        var _u=items[_i].raw || items[_i].src;\n        var _p=items[_i].placement || '';\n        if(!_u) continue;\n        if(/blank/i.test(String(_p))) continue;\n        if(!_fb) _fb=_u;\n        if(!_pkM && /model/i.test(String(_p))) _pkM=_u;\n        if(!_pkF && /flat/i.test(String(_p))) _pkF=_u;\n      }\n      var _f=_pkM||_pkF||_fb;\n      if(_f){\n        if(!window.__hdMockupByColor) window.__hdMockupByColor={};\n        window.__hdMockupByColor[colorName]=_f;\n        var _dk=(window.__hdDesignId||'');\n        try{ localStorage.setItem('hd_mockup_by_color_' + _dk, JSON.stringify(window.__hdMockupByColor)); }catch(e){}\n        try{ console.log('[hd-mc] byColor['+colorName+']='+String(_f).slice(0,60)); }catch(e){}\n      }\n    }catch(e){}\n    if(!window.__mcActive) window.__mcActive=colorName;\n    hdRenderMC(window.__mcActive);\n  }catch(e){}\n}\ntry{ window.hdRenderMC=hdRenderMC; window.hdShowMC=hdShowMC; }catch(e){}\nfunction hdGenMultiRun(colors, faces){\n  var total=colors.length, done=0, t0=Date.now();\n  window.hdGenProgress={ colors:colors.map(function(x){return x.c;}), total:total, done:0,\n                         current:'', phase:'submitting', startedAt:t0 };\n  try{ window.__mcGroups=[]; window.__mcActive=''; }catch(e){}\n  window.hdGenStart(total);\n  var pageId = (window.__hdPageId = ('p' + Date.now() + '_' + Math.random().toString(36).slice(2, 8)));\n  var colorPayload = colors.map(function(x){ return { name: x.c, variantId: String(hdVariantFor(x.c) || currentVariantId) }; });\n  function finish(){ window.hdGenProgress.phase='done'; window.hdGenProgress.finishedAt=Date.now(); pfmGenBtn('done'); }\n  /* 2026-10-29\uFF08\u7528\u6237\u88C1\u51B3\u00B7\u7532\uFF09\uFF1Acompleted \u540E**\u4E0D\u7ACB\u5373 finish** \u2014\u2014 \u56FE\u7247\u8981\u7ECF /image-proxy \u4E0B\u8F7D + \u6D4F\u89C8\u5668\u89E3\u7801\uFF0C\n     \u7EA6 3~5 \u79D2\u3002\u671F\u95F4 phase='loading'\uFF0C\u8FDB\u5EA6\u6761\u7F13\u722C 99\u2192100\uFF08\u4E3B\u8F6E\u8BE2/\u5FC3\u8DF3\u5404\u6709 loading \u5206\u652F\uFF09\uFF0C\u7B49\u4E3B\u56FE\u771F\u6B63\n     \u52A0\u8F7D\u5B8C\uFF08img.complete && naturalWidth>0\uFF09\u6216\u515C\u5E95\u8D85\u65F6\uFF0C\u518D finish \u21D2 \u8FDB\u5EA6\u6761\u5168\u7A0B\u5728\u52A8\u3001\u56FE\u4E0E\u300CMockups ready\u300D\u540C\u5E27\u51FA\u73B0\u3002 */\n  function finishAfterPreview(){\n    var _t0 = Date.now(), _done = false;\n    function _ok(){ if(_done) return; _done = true; finish(); }\n    function _tick(){\n      var _img = q('pfmMockupMain');\n      var _loaded = !!(_img && _img.complete && _img.naturalWidth > 0);\n      if (_loaded && Date.now() - _t0 >= 1200) { _ok(); return; }   /* \u5DF2\u52A0\u8F7D + \u81F3\u5C11 1.2s\uFF08\u8BA9\u8FDB\u5EA6\u6761\u7F13\u722C\u4E00\u6BB5\uFF09 */\n      if (Date.now() - _t0 > 15000) { _ok(); return; }               /* \u515C\u5E95\uFF1A\u56FE\u5931\u8D25\u4E5F\u7EDD\u4E0D\u5361\u6B7B */\n      setTimeout(_tick, 120);\n    }\n    _tick();\n  }\n  /* 2026-10-17\uFF1A\u4E00\u6B21\u8BF7\u6C42\u585E\u5168\u90E8\u989C\u8272\uFF08\u670D\u52A1\u7AEF 1 \u4E2A\u4EFB\u52A1\u51FA\u6240\u6709\u53D8\u4F53\uFF09\u21D2 \u7ED5\u5F00 2/60s \u9650\u6D41\u3002\n     \u54CD\u5E94\u6309 variantId \u5206\u7EC4 \u21D2 \u524D\u7AEF\u7528 colorMap \u5BF9\u56DE\u989C\u8272\u3002 */\n  ft(B+'/mockup/create',{method:'POST',headers:{'Content-Type':'application/json'},\n    body:JSON.stringify({faces:faces, productId:pid, technique:currentTech, colors:colorPayload, pageId:pageId})\n  },240000).then(function(r){return r.json()}).then(function(d){\n    if(!(d && d.success)){\n      window.hdGenProgress.lastError='submit failed: '+((d&&(d.error||'failed'))||'unknown');\n      pfmGenBtn('error'); return;\n    }\n    try{ window.hdGenSubmitted(); }catch(e){}\n    /* \u8001\u540E\u7AEF\u517C\u5BB9\uFF08colorTasks / taskIds\uFF0C\u65E0 jobId\uFF09 */\n    if (!d.jobId) {\n      var tasks = (d.colorTasks && d.colorTasks.length) ? d.colorTasks : null;\n      if(!tasks){ var _ids=(d.taskIds&&d.taskIds.length)?d.taskIds:(d.taskId?[d.taskId]:[]); if(!_ids.length){ pfmGenBtn('error'); return; } tasks=[{color: colors[0].c, taskIds:_ids, failedFaces:d.failedFaces}]; }\n      var _rem = tasks.length, _fin = 0;\n      tasks.forEach(function(t){\n        if(!t.taskIds||!t.taskIds.length){ _fin++; _rem--; if(_rem<=0) finish(); return; }\n        (function(col, ids, ff){\n          var tries=0, MAX=120;\n          var iv=setInterval(function(){\n            tries++;\n            ft(B+'/mockup/status/'+ids.join(','),{},30000).then(function(r2){return r2.json()}).then(function(sd){\n              var st=(sd.status||'').toLowerCase();\n              if(st==='completed' && sd.mockups && sd.mockups.length){ clearInterval(iv); hdAppendGroup(col, sd.mockups, ff); _fin++; _rem--; done++; window.hdGenProgress.done=done; if(_rem<=0){ window.hdGenProgress.phase='loading'; window.__mcLoadingAt=Date.now(); finishAfterPreview(); } }\n              else if(st==='failed'||tries>=MAX){ clearInterval(iv); _fin++; _rem--; done++; window.hdGenProgress.done=done; if(_rem<=0) finish(); }\n              else { window.hdGenBusy('Color ' + col + ' \u2014 rendering\u2026'); }\n            }).catch(function(){});\n          },2000);\n        })(t.color, t.taskIds, t.failedFaces);\n      });\n      return;\n    }\n    /* \u65B0\u540E\u7AEF\uFF1A\u8F6E\u8BE2 job \u62FF taskIds + colorMap\uFF0C\u518D\u62C9 status \u6309 variantId \u5206\u7EC4 */\n    var ivj = setInterval(function(){\n      ft(B+'/mockup/job/'+encodeURIComponent(d.jobId),{},20000).then(function(r){return r.json()}).then(function(j){\n        if(j.status==='failed'){ clearInterval(ivj); window.hdGenProgress.lastError=j.error||'job failed'; pfmGenBtn('error'); return; }\n        if(j.taskIds && j.taskIds.length){ clearInterval(ivj); startPoll(j.taskIds, j.colorMap || {}); return; }\n        if(j.status==='done'){ clearInterval(ivj); pfmGenBtn('error'); }\n      }).catch(function(){});\n    }, 1500);\n    function startPoll(taskIds, colorMap){\n      var tries = 0, MAX = 180;   /* 180\u00D72s = 360s */\n      var iv = setInterval(function(){\n        tries++;\n        ft(B+'/mockup/status/'+taskIds.join(','),{},30000).then(function(r){return r.json()}).then(function(sd){\n          /* 2026-10-19\uFF1A\u591A\u9762\u5408\u4E00\u540E\u4E00\u4E2A\u989C\u8272=\u591A\u4E2A task\uFF08\u6BCF\u9762\u4E00\u4E2A\uFF09\uFF0C\u5206\u6279\u8FD4\u56DE\u3002\n             \u539F\u300C\u6309\u989C\u8272 seen \u53BB\u91CD\u300D\u21D2 \u5148\u5230\u7684\u9762\u6807\u8BB0\u989C\u8272\u5B8C\u6210\u3001\u540E\u5230\u7684\u9762\u88AB\u541E \u21D2 \u968F\u673A\u4E22\u9762\uFF08\u591A\u8272\u66F4\u72E0\uFF0Cgot \u5230\u8272\u6570\u5C31\u63D0\u524D finish\uFF09\u3002\n             \u6539\u4E3A\u7B49 sd.status==='completed'\uFF08\u5168\u90E8 task \u5B8C\u6210\u3001\u56FE\u9F50\u5168\uFF09\u518D\u4E00\u6B21\u6027\u6E32\u67D3\u3002 */\n          if (sd.status === 'completed') {\n            var groups = {};\n            (sd.mockups || []).forEach(function(m){\n              var vid = String(m.variantId || '');\n              var col = colorMap[vid];\n              if (!col) return;\n              (groups[col] = groups[col] || []).push(m);\n            });\n            Object.keys(groups).forEach(function(col){\n              window.hdGenProgress.current = col;\n              hdAppendGroup(col, groups[col]);\n              done++; window.hdGenProgress.done = done;\n            });\n            clearInterval(iv); window.hdGenProgress.phase='loading'; window.__mcLoadingAt=Date.now(); finishAfterPreview();\n          } else if (tries >= MAX) {\n            clearInterval(iv); finish();\n          }\n        }).catch(function(){});\n      }, 2000);\n    }\n  }).catch(function(e){\n    window.hdGenProgress.lastError='submit error: '+((e&&e.message)||e);\n    pfmGenBtn('error');\n  });\n}\n\n/* 2026-10-17\uFF1AhdVariantFor \u4E5F\u6302\u51FA\u53BB \u2014\u2014 \u52A0\u8D2D\u5728 depth-1\u3001\u672C\u51FD\u6570\u5728 depth-2\uFF0C\n   \u88F8\u540D\u8DE8\u4F5C\u7528\u57DF\u8C03\u7528\u4F1A ReferenceError\uFF08\u88AB try \u541E\u6389 \u21D2 \u9759\u9ED8\u65E0\u6548\uFF09\u3002 */\ntry{ window.hdGenColors=hdGenColors; window.hdGenMultiRun=hdGenMultiRun; window.hdVariantFor=hdVariantFor; }catch(e){}\n})();\n})();\n\n// ===== DEBUG PANEL (?debug=1 in URL) \u2014 shows print area specs & canvas state on-page =====\n(function(){\n  try{\n    if(!(window.__pfmParams||new URLSearchParams(location.search)).get('debug')) return; // 2026-08-30: params \u4E3A\u9876\u90E8\u5C40\u90E8\u53D8\u91CF\u4E0D\u5728\u672C\u4F5C\u7528\u57DF \u2192 ReferenceError \u4FEE\u590D\n    var dbg=document.createElement('div');\n    dbg.style.cssText='position:fixed;right:8px;bottom:8px;z-index:99999;background:#111;color:#0f0;font:11px/1.4 monospace;padding:10px;max-width:520px;max-height:70vh;overflow:auto;white-space:pre-wrap;border-radius:var(--pf-r-sm);box-shadow:0 4px 20px rgba(0,0,0,.5)';\n    document.body.appendChild(dbg);\n    function dumpDebug(){\n      var inner=document.getElementById('pfmCanvasInner');\n      var cont=document.querySelector('.canvas-container');\n      var _pas=window.__pfmPrintArea?window.__pfmPrintArea():null;\n      var spec=_pas && (_pas[currentPlacement]||_pas['front']||Object.values(_pas)[0]);\n      dbg.textContent='=== DEBUG (refresh every 3s) ===\\n'+\n        'currentPlacement='+currentPlacement+'\\n'+\n        'spec='+(spec?JSON.stringify(spec):'NONE')+'\\n'+\n        'canvas(logical)='+(canvas?canvas.width+'x'+canvas.height:'none')+'\\n'+\n        'inner(style)='+(inner?(inner.style.width+'x'+inner.style.height):'none')+'\\n'+\n        'inner(rect)='+(inner?Math.round(inner.getBoundingClientRect().width)+'x'+Math.round(inner.getBoundingClientRect().height):'none')+'\\n'+\n        'canvasContainer(rect)='+(cont?Math.round(cont.getBoundingClientRect().width)+'x'+Math.round(cont.getBoundingClientRect().height):'none')+'\\n'+\n        'ghostBg='+((function(){var b=document.getElementById('pfmProductBg');return b?(b.style.backgroundImage||'').slice(0,80):'';})())+'\\n'+\n        'innerBg='+(inner?(inner.style.backgroundImage||'').slice(0,80):'');\n    }\n    dumpDebug();\n    setInterval(dumpDebug,3000);\n  }catch(e){ console.error('[debug panel]', e); }\n\n  /* \u26A0\uFE0F 2026-09-14 \u4FEE\u590D\u8BF4\u660E\uFF1A\u672C IIFE \u9996\u884C\u662F\n        if(!(window.__pfmParams||...).get('debug')) return;\n     \u5373**\u65E0 ?debug=1 \u65F6\u6574\u5757\u4E0D\u6267\u884C**\u3002\u8DE8 IIFE \u7684\u4F5C\u7528\u57DF\u53E5\u67C4\uFF08__pfmSaveState /\n     __pfmGetPlacement / __pfmAddObject\uFF09\u539F\u5148\u9519\u653E\u5728\u8FD9\u91CC \u2192 \u6052\u4E3A undefined\u3002\n     \u73B0\u5DF2\u8FC1\u81F3**\u4E3B IIFE \u5185**\uFF08\u89C1\u4E0A\u65B9 hdDrawTextAt \u4E4B\u540E\u7684\u66B4\u9732\u5757\uFF09\u3002\n     \u65B0\u589E\u4F5C\u7528\u57DF\u6865\u63A5\u65F6\uFF0C\u52A1\u5FC5\u786E\u8BA4\u843D\u70B9\u5C5E\u4E8E\u300C\u4E00\u5B9A\u4F1A\u6267\u884C\u300D\u7684\u4F5C\u7528\u57DF\u3002 */\n})();\n\n/* ===== 2026-09-10: \u65B0\u8BBE\u8BA1\u53F0\u903B\u8F91\uFF08Affinity \u9AA8\u67B6 + Procreate \u89E6\u63A7 + \u5BF9\u79F0/\u91CD\u590D/\u9884\u89C8\uFF09===== */\n(function(){\n  'use strict';\n  var $=function(id){return document.getElementById(id);};\n  // 2026-09-10 \u4FEE\u590D\uFF1Acanvas \u58F0\u660E\u5728\u5DF2\u95ED\u5408\u7684\u4E0A\u4E00\u4E2A IIFE \u91CC\uFF0C\u6B64\u5904 `typeof canvas` \u6052\u4E3A 'undefined'\n  // \u2192 CV() \u6052 null\uFF0C\u300C\u5BF9\u79F0 / \u91CD\u590D / \u5B9E\u65F6\u9884\u89C8\u300D\u66FE\u5168\u90E8\u9759\u9ED8\u5931\u6548\u3001object:added \u6302\u94A9\u4ECE\u672A\u6CE8\u518C\u3002\n  // \u73B0\u6539\u7528\u4E3B IIFE \u663E\u5F0F\u66B4\u9732\u7684 window.__pfmCanvas\u3002\n  function CV(){return window.__pfmCanvas||null;}\n  // \u540C\u7406\uFF1AsaveState \u4E5F\u662F\u4E3B IIFE \u7684\u3002\u8FD9\u91CC\u58F0\u660E\u4E00\u4E2A\u540C\u540D\u59D4\u6258\uFF0C\u4F7F\u539F\u6709\u7684\n  // `if(typeof saveState==='function')saveState();` \u68C0\u67E5\u80FD\u901A\u8FC7\u5E76\u771F\u6B63\u843D\u5230\u4E3B IIFE \u7684\u5B9E\u73B0\u4E0A\u3002\n  function saveState(){ try{ if(window.__pfmSaveState) window.__pfmSaveState(); }catch(e){} }\n  function AO(){var c=CV();return c?c.getActiveObject():null;}\n  function toast(m){var t=$('hdcoToast');if(t){t.textContent=m;t.style.display='block';clearTimeout(t._h);t._h=setTimeout(function(){t.style.display='none';},3500);}}\n\n  /* 2026-09-19: \u7F29\u653E\u6ED1\u6746 \u2014\u2014 \u539F\u5E95\u680F\u90A3\u4E00\u6839\u642C\u5230\u300CSize\u300D\u533A\u5757\u9876\u90E8\uFF08\u7247\u6BB5\u89C1 snippets/design-board.liquid\uFF09\u3002\n     \u8BED\u4E49 = \u76F8\u5BF9**\u9009\u4E2D\u65F6**\u5927\u5C0F\u7684\u500D\u6570\uFF1A4 \u8868\u793A 1.0\u00D7\u30018 \u8868\u793A 2 \u500D\uFF0809-20 \u8D77\u7CBE\u786E\u3001\u7ED5\u4E2D\u5FC3\u3001\u4FDD\u7559\u975E\u7B49\u6BD4\uFF09\u3002\n     Opacity \u4E0D\u5728\u6B64\u5904\uFF08\u5DF2\u642C\u8FDB Effects \u9762\u677F\uFF0C\u89C1 assets/hd-image.js\uFF09\uFF1B\u7ED8\u677F\u81EA\u5E26\u7684\u7B14\u5237\u63A7\u4EF6\u4E0D\u53D7\u5F71\u54CD\u3002\n     \u672C\u6587\u4EF6\u4E0A\u65B9\u4E09\u5904 selection \u5904\u7406\u5668\u4E00\u76F4\u5728\u8C03\u7528\u540C\u6B65\u51FD\u6570\uFF0C\u91CD\u65B0\u5B9A\u4E49\u5B83\u5373\u53EF\u81EA\u52A8\u751F\u6548\u3002 */\n  (function(){\n    var sb=$('pfmBrushSizeBar'); if(!sb) return;\n     /* 2026-09-20\uFF08\u7528\u6237\u9009 A\uFF09\uFF1A\u91CF\u7A0B **0.1\u00D7~16\u00D7** + **\u7B49\u6BD4\u6620\u5C04**\n        \u2014\u2014 \u539F\u7EBF\u6027\u6620\u5C04\uFF08\u500D\u6570 = \u6ED1\u6746\u503C \u00F7 4\uFF09\u5728 160 \u500D\u8DE8\u5EA6\u4E0B\uFF0C\u4F4E\u500D\u533A\u4E00\u683C\u8DF3 12.5%\u3001\u9AD8\u500D\u533A 0.08%\uFF08\u76F8\u5DEE 160 \u500D\uFF09\u3002\n        \u516C\u5F0F\uFF1A\u500D\u6570 = SZ_K1 \u00D7 (SZ_K2/SZ_K1)^((v-SZ_V1)/(SZ_V2-SZ_V1))\n              \u21D2 v=1 \u2192 0.10\u00D7\u3001v=82.5\uFF08\u9ED8\u8BA4/\u590D\u4F4D\u70B9\uFF09\u2192 1.00\u00D7\u3001v=181 \u2192 16.00\u00D7\n        \u6BCF\u683C\uFF08step 0.5\uFF09\u6052\u5B9A \u00D71.0142 = **+1.42%**\uFF0C\u5168\u91CF\u7A0B\u624B\u611F\u4E00\u81F4\u3002 */\n     var SZ_V1=1, SZ_V2=181, SZ_K1=0.1, SZ_K2=16, SZ_V0=82.5;\n     function szK(v){\n       var t=(v-SZ_V1)/(SZ_V2-SZ_V1); if(!isFinite(t)) t=0; if(t<0) t=0; if(t>1) t=1;\n       return SZ_K1*Math.pow(SZ_K2/SZ_K1,t);\n     }\n     /* \u500D\u6570\u8BFB\u6570\uFF08#pfmSizeMult\uFF09\uFF1A\u7B49\u6BD4\u6620\u5C04\u4E0B v \u503C\u5931\u53BB\u76F4\u89C9\uFF0C\u5FC5\u987B\u6709\u6570\u5B57\u53C2\u7167\uFF08\u975E\u88C5\u9970\uFF09 */\n     var sm=$('pfmSizeMult');\n     function szShow(k){ if(!sm) return; sm.textContent=(Math.round(k*100)/100).toFixed(2)+'\u00D7'; }\n    /* 2026-09-20\uFF08step \u7EC6\u5316\u914D\u5957\uFF09\uFF1A\u5E27\u5185\u5408\u5E76\u7528\u7684 rAF \u53E5\u67C4 */\n    var _rafId=0;\n    sb.addEventListener('input',function(){\n      /* 2026-09-20: parseFloat\uFF08\u539F parseInt\uFF09\u2014\u2014 \u6ED1\u6746\u662F\u5C0F\u6570\u523B\u5EA6\uFF08\u73B0 step 0.5\uFF09\uFF0CparseInt \u4F1A\u628A 4.25/4.75\n         \u90FD\u622A\u6210 4 \u21D2 \u6ED1\u6746\u5361\u5728\u6574\u6570\u523B\u5EA6\u3001\u624B\u611F\u6BD4\u6539\u524D\u66F4\u987F\uFF08\u9875\u5185\u5B9E\u6D4B\u8FC7\uFF09\u3002 */\n      var v=parseFloat(this.value); if(!isFinite(v)) v=SZ_V0;\n      var c=CV(),o=AO(); if(!o||!c)return;\n      /* 2026-09-20\uFF08\u7528\u6237\u8981\u6C42\u300C\u4FEE\u300D\uFF09\uFF1A\u7CBE\u786E\u500D\u6570 + \u7ED5\u4E2D\u5FC3 + \u4FDD\u7559\u975E\u7B49\u6BD4\u3002\u65E7\u5B9E\u73B0 `o.scaleToWidth(_pfmW0*(v/4))` \u7684\u5B9E\u6D4B\u6BDB\u75C5\uFF1A\n         \u2460 \u500D\u6570\u504F\u5C0F\u4E14\u968F\u5C3A\u5BF8\u53D8 \u2014\u2014 fabric \u7684 scaleToWidth \u5206\u6BCD = \u300C\u542B padding \u7684\u5305\u56F4\u76D2\u5BBD / \u81EA\u8EAB\u5BBD\u300D\uFF0C\n            \u800C\u8BBE\u8BA1\u53F0\u7ED9\u5BF9\u8C61\u8BBE\u4E86 padding:6 \u21D2 \u5305\u56F4\u76D2\u6052\u591A 12px\uFF1A100px \u5BF9\u8C61 1.763\u00D7\u3001400px 1.940\u00D7\u30011600px 1.985\u00D7\uFF08\u76EE\u6807 2\u00D7\uFF09\uFF1B\n         \u2461 `fabric.scale(t)` \u628A scaleX/scaleY \u8BBE\u6210\u540C\u4E00\u4E2A\u503C \u21D2 \u975E\u7B49\u6BD4\u88AB\u62B9\u5E73\uFF08\u5B9E\u6D4B\u6BD4 2.000 \u2192 1.000\uFF09\uFF1B\n         \u2462 \u951A\u70B9\u662F\u5BF9\u8C61\u5DE6\u4E0A\u89D2 \u21D2 \u56FE\u7247\u5411\u53F3\u4E0B\u751F\u957F\uFF08\u5F62\u72B6/\u6587\u5B57\u539F\u70B9\u5728\u4E2D\u5FC3 \u21D2 \u4E2D\u5FC3\u56FA\u5B9A\uFF09\uFF0C\u4E24\u79CD\u884C\u4E3A\u5E76\u5B58\u3002\n         \u65B0\u5B9E\u73B0\uFF1A\u57FA\u51C6 `_pfmS0={scaleX,scaleY}`\uFF08\u9009\u4E2D\u90A3\u4E00\u523B\uFF0C\u5404\u81EA\u4E58 k \u21D2 \u4FDD\u7559\u975E\u7B49\u6BD4\uFF09\uFF1B\n         \u7ED5\u4E2D\u5FC3\u590D\u7528 `window.__pfmRecenter`\uFF08\u4E0E\u89D2\u5EA6 / W/H \u540C\u4E00\u5957\u53CD\u7B97\uFF0C\u552F\u4E00\u5B9E\u73B0\u5728 assets/hd-edit.js\uFF09\u3002 */\n      var _s=o._pfmS0; if(!_s){ _s=o._pfmS0={x:o.scaleX||1,y:o.scaleY||1}; }\n      var _k=szK(v), _c0=null; try{ _c0=o.getCenterPoint(); }catch(e2){}\n      try{ o.set({scaleX:_s.x*_k,scaleY:_s.y*_k}); if(o.setCoords)o.setCoords(); }catch(e2){}\n      if(_c0){\n        if(window.__pfmRecenter){ try{ window.__pfmRecenter(o,_c0); }catch(e2){} }\n        else { try{ var _c1=o.getCenterPoint(); o.set({left:(o.left||0)+(_c0.x-_c1.x),top:(o.top||0)+(_c0.y-_c1.y)}); if(o.setCoords)o.setCoords(); }catch(e2){} }\n      }\n      /* 2026-09-20\uFF1A**\u5E27\u5185\u5408\u5E76** \u2014\u2014 step \u5DF2\u7EC6\u5316\u5230 0.0625\uFF0C\u4E00\u6B21\u89E6\u6478\u79FB\u52A8\u4F1A\u8DE8\u591A\u683C\u3001input \u4E00\u5E27\u53EF\u80FD\u89E6\u53D1\u591A\u6B21\uFF1B\n         \u82E5\u6BCF\u6B21\u90FD\u300C\u91CD\u7ED8 + \u5B58\u5386\u53F2 + \u5237\u9762\u677F\u300D\uFF0C\u5355\u5E27\u6210\u672C\u4F1A\u88AB\u653E\u5927\u6570\u500D\uFF08\u53CD\u800C\u66F4\u5361\uFF09\u3002\n         \u6545\u7528 requestAnimationFrame \u9650\u5236\u4E3A**\u6BCF\u5E27\u6700\u591A\u4E00\u6B21**\uFF08\u540C\u4E00\u5E27\u5185\u53EA\u6309\u6700\u540E\u4E00\u4E2A\u503C\u6E32\u67D3\uFF0C\u7ED3\u679C\u4E0D\u53D8\uFF09\u3002 */\n      if(_rafId) return;\n      _rafId=requestAnimationFrame(function(){\n        _rafId=0;\n        szShow(szK(parseFloat(sb.value)));   /* \u6BCF\u5E27\u6700\u591A\u5199\u4E00\u6B21 DOM */\n        var c2=CV(); if(c2){ if(c2.requestRenderAll) c2.requestRenderAll(); else c2.renderAll(); }\n        saveState();\n        /* 2026-10-25\uFF08P1\uFF09\u62D6\u52A8\u4E2D\u4E0D\u518D syncXf \u56DE\u586B W/H \u2014\u2014 \u90A3\u662F DOM \u904D\u5386\u5199\u503C\uFF0C\u5C5E\u70ED\u8DEF\u5F84\u989D\u5916\u5F00\u9500\uFF1B\n           \u677E\u624B change \u5206\u652F\u7EDF\u4E00\u56DE\u586B\uFF08\u89C1\u4E0B\u65B9 change \u76D1\u542C\uFF09\uFF0C\u9762\u677F\u6570\u5B57\u4ECD\u4F1A\u6B63\u786E\u66F4\u65B0\u3002 */\n      });\n    });\n    /* 2026-09-20\uFF1A\u677E\u624B\uFF08change\uFF09\u65F6**\u7ACB\u5373\u63D0\u4EA4\u4E00\u6B21** \u2014\u2014 \u53D6\u6D88 pending \u7684 rAF \u5E76\u8865\u9F50\u300C\u6E32\u67D3 + \u5B58\u5386\u53F2 + \u5237\u9762\u677F\u300D\uFF0C\n       \u4FDD\u8BC1\u7EC8\u6001\u4E00\u5B9A\u843D\u5730\uFF08\u4F8B\u5982\u677E\u624B\u77AC\u95F4\u9875\u9762\u88AB\u5207\u8D70\u65F6 rAF \u4E0D\u518D\u89E6\u53D1\u7684\u60C5\u51B5\uFF09\u3002 */\n    sb.addEventListener('change',function(){\n      if(_rafId){ try{ cancelAnimationFrame(_rafId); }catch(e){} _rafId=0; }\n      szShow(szK(parseFloat(sb.value)));\n      var c3=CV(); if(c3){ if(c3.requestRenderAll) c3.requestRenderAll(); else c3.renderAll(); }\n      saveState();\n      try{if(window.__pfmEdit&&window.__pfmEdit.syncXf)window.__pfmEdit.syncXf();}catch(e){}\n    });\n    /* \u9009\u4E2D\u53D8\u5316\u65F6\u590D\u4F4D\uFF1A\u56DE\u5230 1.0\u00D7 \u5E76\u6E05\u6389\u65E7\u57FA\u51C6 \u2014\u2014 \u5426\u5219\u300C\u5148\u6539 W \u518D\u62D6\u6ED1\u6746\u300D\u4F1A\u6309\u65E7\u5BBD\u5EA6\u8DF3\u53D8\u3002 */\n    window.__pfmSyncBars=function(){\n      var o=AO(); sb.value=String(SZ_V0); szShow(szK(SZ_V0)); if(o){try{delete o._pfmW0;}catch(e){} try{delete o._pfmS0;}catch(e){}}\n      try{ if(window.__pfmAngSync) window.__pfmAngSync(); }catch(e){}   /* \u9009\u4E2D\u53D8\u5316\u65F6\u5237\u65B0\u89D2\u5EA6\u9AD8\u4EAE */\n    };\n  })();\n  /* ---------- \u89D2\u5EA6\u5FEB\u6377\u80F6\u56CA\uFF08Size \u533A\u5757\uFF0C2026-09-20 \u7528\u6237\u9009 C\uFF09 ----------\n     \u70B9\u51FB \u2192 window.__pfmEdit.setAngle(deg)\uFF08= applyXf('a')\uFF0C**\u7ED5\u4E2D\u5FC3** + \u8FDB\u64A4\u9500\u6808\uFF09\uFF1B\n     \u9AD8\u4EAE \u2192 \u4E0E\u5BF9\u8C61\u5B9E\u9645\u89D2\u5EA6\u5BF9\u9F50\uFF08\u53E3\u7B97\uFF1A0/45/90/135/180/-90\uFF0C\u00B11\u00B0 \u5BB9\u5DEE\uFF1B-90 \u4E0E 270 \u7B49\u4EF7\uFF09\u3002 */\n  (function(){\n    var row=$('pfmAngRow'); if(!row) return;\n    var chips=row.querySelectorAll('[data-ang]');   /* \uD83D\uDD34 \u9650\u5B9A\u5728 row \u5185\u53D6\uFF0C\u7981\u6B62\u6587\u6863\u7EA7 .pfm-chip \u67E5\u8BE2 */\n    function ndeg(a){ return ((Math.round(a||0)%360)+360)%360; }\n    function sync(){\n      var o=AO(), cur=null;\n      if(o){ try{ cur=ndeg(o.angle); }catch(e){} }\n      Array.prototype.forEach.call(chips,function(btn){\n        var v=ndeg(parseFloat(btn.getAttribute('data-ang'))||0);\n        btn.classList.toggle('sel', cur!==null && cur===v);\n      });\n    }\n    window.__pfmAngSync=sync;\n    row.addEventListener('click',function(ev){\n      var btn=(ev.target&&ev.target.closest)?ev.target.closest('[data-ang]'):null; if(!btn) return;\n      var v=parseFloat(btn.getAttribute('data-ang')); if(!isFinite(v)) return;\n      if(!AO()) return;\n      try{ if(window.__pfmEdit&&window.__pfmEdit.setAngle) window.__pfmEdit.setAngle(v); }catch(e){}\n      sync();\n    });\n    var a=$('pfmXfA'); if(a){ a.addEventListener('input',sync); a.addEventListener('change',sync); }\n    sync();\n  })();\n  /* ---------- 2) \u624B\u52BF\uFF1A\u53CC\u6307\u64A4\u9500 / \u4E09\u6307\u91CD\u505A / \u957F\u6309\u5438\u8272 ---------- */\n  (function(){\n    var host=$('pfmCanvasInner');if(!host)return;\n    var t0=0,n0=0,moved=false,longT=null;\n    host.addEventListener('touchstart',function(e){\n      var n=e.touches.length;\n      if(n>1){t0=Date.now();n0=n;moved=false;}\n      else if(n===1){\n        moved=false;\n        longT=setTimeout(function(){if(!moved)eyedrop(e);},550);\n      }\n    },{passive:true});\n    host.addEventListener('touchmove',function(){\n      moved=true;if(longT){clearTimeout(longT);longT=null;}\n    },{passive:true});\n    host.addEventListener('touchend',function(e){\n      if(longT){clearTimeout(longT);longT=null;}\n      if(n0>1&&e.touches.length===0){\n        var dt=Date.now()-t0;\n        if(dt<260&&!moved){\n          if(n0===2){var bu=$('pfmBtnUndo');if(bu)bu.click();toast('Undo');}\n          else if(n0>=3){var brd=$('pfmBtnRedo');if(brd)brd.click();toast('Redo');}\n        }\n        n0=0;\n      }\n    },{passive:true});\n    function eyedrop(e){\n      try{\n        var c=CV();if(!c)return;\n        var t=e.touches&&e.touches[0];if(!t)return;\n        var r=host.getBoundingClientRect();\n        var x=Math.round(((t.clientX-r.left)/r.width)*c.getWidth());\n        var y=Math.round(((t.clientY-r.top)/r.height)*c.getHeight());\n        var d=c.contextContainer.getImageData(x,y,1,1).data;\n        if(d&&d[3]>10){\n          var hex='#'+[d[0],d[1],d[2]].map(function(v){return ('0'+v.toString(16)).slice(-2);}).join('');\n          /* 2026-09-16: \u4E0E Actions \u884C\u7684\u300CPick\u300D\u6309\u94AE\u5171\u7528\u540C\u4E00\u4EFD\u5B9E\u73B0\uFF08hd-pick.js\uFF09\u3002\n             \u539F\u5B9E\u73B0\u53EA\u5199 #pfmDrawColorPicker\uFF08\u753B\u677F\u5F39\u7A97\u91CC\u7684\u63A7\u4EF6\uFF09\uFF0C\u800C\u957F\u6309\u7ED1\u7684\u662F\n             #pfmCanvasInner\uFF08\u8BBE\u8BA1\u677F\u753B\u5E03\uFF0C\u5728\u5F39\u7A97\u540E\u9762\uFF09\u21D2 \u5728\u8BBE\u8BA1\u677F\u53D6\u8272\u7B49\u4E8E\u96F6\u53CD\u9988\u3002 */\n          if(window.__pfmPickApply) window.__pfmPickApply(hex);\n        }\n      }catch(err){}\n    }\n  })();\n\n  /* ---------- 3) \u8BBE\u8BA1\u677F\u5F00\u5173\uFF08\u5C55\u793A\u6001 \u2194 \u7F16\u8F91\u6001\uFF09---------- */\n  (function(){\n    var bd=$('pfmBoard'),st=$('pfmStage'),btnD=$('pfmBtnDesign'),cl=$('pfmBoardClose');\n\n    function stagePreview(){\n      var img=$('pfmStageImg'),ph=$('pfmStagePh');\n      if(!img)return;\n      var url='',plWanted='front';\n      try{\n        if(typeof product!=='undefined'&&product&&product._prodPreview){\n          var pp=product._prodPreview;\n          // 2026-09-10 \u4FEE\u590D\uFF1AcurrentPlacement \u5728\u4E3B IIFE \u4F5C\u7528\u57DF\u5916\uFF0Ctypeof \u6052 undefined \u2192 \u66FE\u7ECF\u6052\u6309 'front' \u53D6\u56FE\u3002\n          // \u6539\u7528\u4E3B IIFE \u66B4\u9732\u7684 getter\u3002\n          var _pl=(window.__pfmGetPlacement&&window.__pfmGetPlacement())||'front';\n          plWanted=_pl;\n          url=pp[_pl]||pp['front']||'';\n          if(!url){var ks=Object.keys(pp);if(ks.length)url=pp[ks[0]];}\n        }\n        if(!url){\n          var hs=[$('pfmZoomLayer'),$('pfmProductBg')];\n          for(var hi=0;hi<hs.length;hi++){\n            var h=hs[hi];\n            if(h&&h.style.backgroundImage&&h.style.backgroundImage!=='none'){\n              var vv=h.style.backgroundImage.replace(/^url\\([\"']?/,'').replace(/[\"']?\\)$/,'');\n              if(vv){url=vv;break;}\n            }\n          }\n        }\n      }catch(e){}\n      if(url&&img.getAttribute('src')!==url){\n        /* 2026-09-17: \u9996\u5C4F hero \u56FE\u4E0E _prodPreview \u662F\u540C\u4E00\u5F20\u56FE\uFF08\u540C\u4E3A\u300CURL color\u300D\u751F\u6210\uFF09\u2192 \u9996\u6B21\u4E0D\u6362\u6210\u5B9E\u8272\u540D URL\uFF0C\n           \u907F\u514D\u540C\u56FE\u4E8C\u4E0B\uFF08\u5B9E\u6D4B hero 393~1870ms\u3001\u5B9E\u8272\u540D 2546~3444ms\uFF0C\u5404 100~200KB\uFF09\u3002\u5224\u65AD\u5931\u8D25\u6700\u591A 1s \u540E\u81EA\u6108\u3002 */\n        if(!window.__pfmHeroTarget)window.__pfmHeroTarget=url;   /* \u9996\u56FE\u5BF9\u5E94\u7684\u76EE\u6807\uFF08\u5B9E\u8272\u540D\uFF09URL */\n        if(img.getAttribute('data-pfm-hero')==='1'&&plWanted==='front'&&url===window.__pfmHeroTarget){/* \u4E0E hero \u540C\u4E00\u5F20\u56FE\uFF1A\u4FDD\u6301 hero URL\uFF0C\u4E0D\u518D\u4E0B\u8F7D */}\n        else{img.src=url;img.removeAttribute('data-pfm-hero');}   /* \u6362\u9762/\u6539\u8272\uFF1A\u6362\u56FE\u5E76\u64A4\u4E0B hero \u6807\u5FD7 */\n        img.style.display='block';if(ph)ph.style.display='none';\n      }\n    }\n\n    /* ---------- 3a-2) \u5C55\u793A\u53F0\u8BBE\u8BA1\u5C42\uFF082026-09-12\uFF09----------\n       \u5C55\u793A\u6001\u4EA7\u54C1\u56FE\u539F\u6765\u53EA\u8D34\u670D\u52A1\u5668\u9884\u751F\u6210\u7684\u7D20\u4EA7\u54C1\u56FE\uFF08prodimg\uFF09\uFF0C\u770B\u4E0D\u5230\u753B\u5E03\u4E0A\u7684\u8BBE\u8BA1\u3002\n       \u8FD9\u91CC\u5728\u540C\u4E00\u6B63\u65B9\u5F62\u6846\u5185\u53E0\u4E00\u5C42\u5F53\u524D View \u7684\u753B\u5E03\u5BFC\u51FA\uFF08\u900F\u660E PNG\uFF09\u2192 \u6240\u89C1\u5373\u6240\u5F97\u3002\n       \u5BF9\u9F50\u4F9D\u636E\uFF1Acanvas \u4E0E prodimg \u540C\u4E3A\u300C\u6574\u5E45\u6A21\u677F\u300D\u6B63\u65B9\u5F62\uFF08product 71 \u5B9E\u6D4B\uFF1Atemplate 3000x3000\u3001\n       prodimg 1000x1000\uFF0C\u6253\u5370\u533A 1010x1346@(1006,530) \u843D\u5728\u6574\u5E45\u5185\uFF09\uFF0C\u4E24\u5C42\u90FD contain \u94FA\u6EE1\u540C\u4E00\u6846\n       \u2192 \u65E0\u9700\u4EFB\u4F55\u5750\u6807\u6362\u7B97\u3002\n       \u65F6\u673A\uFF08\u5B9A\u7A3F\uFF09\uFF1A\u53EA\u5728\u5173\u677F / \u5207 View \u65F6\u5B9A\u683C\uFF0C\u7F16\u8F91\u8FC7\u7A0B\u4E2D\u4E0D\u5B9E\u65F6\u5237\u3002 */\n    function stageArt(){\n      var el=$('pfmStageArt');\n      if(!el) return;\n      /* 2026-10-25\uFF1A\u5C55\u793A\u53F0\u7684\u300C\u5E3D\u515C\u524D\u666F\u300D\u72EC\u7ACB\u540C\u6B65\uFF08\u4E0E\u6709\u65E0\u8BBE\u8BA1\u65E0\u5173\uFF09\u2014\u2014\n         \u677F\u5185(pfmProductBg)\u5DF2\u906E\u6321\u3001\u677F\u5916(#pfmStageImg \u4EA7\u54C1\u56FE + #pfmStageArt \u56FE\u6848)\u539F\u672C\u4E0D\u906E\u6321\u3002\n         \u8FD9\u91CC\u628A\u540C\u4E00\u4EFD\u300C\u53EA\u5E3D\u515C\u300D\u524D\u666F\u53E0\u5728\u56FE\u6848\u4E4B\u4E0A \u21D2 \u4E24\u5904\u8868\u73B0\u4E00\u81F4\u3002\u65E0 foreground \u7684\u4EA7\u54C1 \u21D2 \u9690\u85CF\uFF08\u96F6\u56DE\u5F52\uFF09\u3002 */\n      try {\n        var fg = $('pfmStageFg'), fgu = window.__pfmFgUrl || '';\n        if (fg) {\n          if (fgu) { if (fg.getAttribute('src') !== fgu) fg.setAttribute('src', fgu); fg.style.display = 'block'; }\n          else fg.style.display = 'none';\n        }\n      } catch (e) {}\n      function hide(){ if(el.style.display!=='none')el.style.display='none'; try{el.removeAttribute('src');}catch(e){} }\n      try{\n        var c=window.__pfmCanvas;\n        if(!c||typeof c.toDataURL!=='function') return hide();\n        var objs=c.getObjects()||[], have=false;\n        for(var i=0;i<objs.length;i++){ if(objs[i]&&!objs[i].isGrid&&!objs[i].isPreview){ have=true; break; } }\n        if(!have) return hide();   // \u7A7A\u8BBE\u8BA1 \u2192 \u4E0D\u53E0\u52A0\uFF0C\u907F\u514D\u76D6\u4F4F\u4EA7\u54C1\u56FE\n        // \u7F51\u683C\u4E0E\u4E34\u65F6\u9884\u89C8\u5C42\u4E0D\u5BFC\u51FA\uFF08\u4E0E exportAllPlacements \u540C\u89C4\u5219\uFF09\uFF1A\u4E34\u65F6\u9690\u85CF \u2192 \u5BFC\u51FA \u2192 \u8FD8\u539F\n        var stash=[];\n        for(var j=0;j<objs.length;j++){ var oo=objs[j]; if(oo&&(oo.isGrid||oo.isPreview)){ stash.push([oo,oo.visible]); oo.visible=false; } }\n        // \u753B\u5E03\u662F\u6574\u5E45\u6A21\u677F\uFF0871 = 3000\u00B2\uFF09\uFF0C\u4E0D\u80FD\u6309 multiplier:1 \u5BFC\uFF08\u6570 MB base64\uFF09\u3002\u5C55\u793A\u53F0\u6700\u5927\u663E\u793A 520px\uFF0C\n        // \u7559 DPR \u4F59\u91CF \u2192 \u8F93\u51FA\u4E0A\u9650 1200px\uFF0C\u52A8\u6001\u7B97\u500D\u7387\u3002\n        var cw=(c.getWidth&&c.getWidth())||0;\n        var _mult=cw>0?Math.min(1,1200/cw):0.4;\n        var url=c.toDataURL({format:'png',multiplier:_mult});\n        for(var k=0;k<stash.length;k++){ stash[k][0].visible=stash[k][1]; }\n        if(!url) return hide();\n        if(el.getAttribute('src')!==url) el.setAttribute('src',url);\n        el.style.display='block';\n      }catch(e){ hide(); }\n    }\n\n    // 2026-09-10: \u5207\u9762\uFF08\u5207\u89D2\u5EA6\uFF09\u2014 \u4ECE\u8BBE\u8BA1\u677F Placement chips \u540C\u6B65\u5230\u5C55\u793A\u53F0\uFF0C\u53CC\u5411\u8054\u52A8\n    function syncStageChips(){\n      var src=$('pfmPlacements'),dst=$('pfmStageFaces');\n      if(!src||!dst)return;\n      var chips=src.querySelectorAll('.pfm-chip');\n      if(!chips.length)return;\n      var html='';\n      for(var i=0;i<chips.length;i++){\n        var p=chips[i].getAttribute('data-p')||'front';\n        /* 2026-10-12: \u590D\u5236 **innerHTML**\uFF08\u542B .pfm-pdot \u7EA2\u70B9\u53CA\u5176 display \u72B6\u6001\uFF09\u2014\u2014\n           \u539F\u7528 textContent \u53EA\u53D6\u7EAF\u6587\u672C \u21D2 \u5C55\u793A\u53F0 View \u884C**\u6C38\u8FDC**\u4E0D\u663E\u793A\u300C\u54EA\u4E9B\u9762\u6709\u8BBE\u8BA1\u300D\u3002\n           .pfm-chip \u81EA\u5E26 position:relative\uFF08hd-canvas.css:245\uFF09\u21D2 dot \u7684\u5B9A\u4F4D\u4E0A\u4E0B\u6587\u4E24\u8FB9\u4E00\u81F4\u3002 */\n        var inner=(chips[i].innerHTML||'').trim() || (chips[i].textContent||'').trim();\n        var sel=chips[i].classList.contains('sel')?' sel':'';\n        html+='<div class=\"pfm-chip'+sel+'\" data-p=\"'+p+'\">'+inner+'</div>';\n      }\n      if(dst._sig!==html){dst._sig=html;dst.innerHTML=html;}\n    }\n\n    /* 2026-10-16\uFF1A\u66B4\u9732 stageArt \u4F9B pf-draft.js \u6062\u590D\u6D41\u7A0B\u8C03\u7528 \u2014\u2014\n       \u6062\u590D\u539F\u5148\u53EA c.renderAll()\uFF08\u753B\u5E03\uFF09\uFF0C\u6CA1\u628A\u8BBE\u8BA1\u5C42\u91CD\u753B\u5230\u4EA7\u54C1\u56FE \u21D2 \u8981\u624B\u52A8\u5207\u89D2\u5EA6\u624D\u770B\u5230\u3002 */\n    try { window.__pfmStageArt = stageArt; } catch (e) {}\n    function setFace(p){\n      var src=$('pfmPlacements');\n      if(!src||!p)return;\n      var chip=src.querySelector('.pfm-chip[data-p=\"'+p+'\"]');\n      if(chip)chip.click();\n      var dst=$('pfmStageFaces');\n      if(dst){\n        var all=dst.querySelectorAll('.pfm-chip');\n        for(var i=0;i<all.length;i++)all[i].classList.toggle('sel',all[i].getAttribute('data-p')===p);\n      }\n      /* 2026-09-17: \u4EA7\u54C1\u5E95\u56FE\uFF08\u9884\u8F7D\u597D\u3001\u5B9E\u6D4B 1~2ms \u547D\u4E2D\uFF09\u7ACB\u5373\u6362\uFF0C\u4E0D\u518D\u966A\u8BBE\u8BA1\u5C42\u7B49 450ms \u2014\u2014\n         \u539F\u6765\u53EA\u6709 setTimeout(450) \u624D\u6362\uFF0C\u5B9E\u6D4B\u300C\u70B9\u51FB\u2192\u56FE\u53D8\u300D\u56FA\u5B9A 464~472ms\uFF08\u7528\u6237\u53CD\u9988\u300C\u89D2\u5EA6\u5207\u6362\u5F88\u6162\u300D\uFF09\u3002\n         \u8BBE\u8BA1\u5C42 stageArt \u4ECD\u9700\u7B49\u753B\u5E03\u91CD\u5EFA\uFF0C\u6545\u4FDD\u7559\u4E0B\u9762 450/1300 \u515C\u5E95\uFF1B\u671F\u95F4\u5148\u6536\u8D77\u65E7\u9762\u8BBE\u8BA1\u5C42\u907F\u514D\u9519\u4F4D\u3002 */\n      stagePreview();\n      try{ var _pArt=$('pfmStageArt'); if(_pArt && _pArt.style.display!=='none') _pArt.style.display='none'; }catch(e){}\n      setTimeout(function(){stagePreview();stageArt();},450);\n      setTimeout(function(){stagePreview();stageArt();},1300);\n    }\n\n    (function(){\n      var dst=$('pfmStageFaces');\n      if(!dst)return;\n      dst.addEventListener('click',function(e){\n        var c=(e.target&&e.target.closest)?e.target.closest('.pfm-chip'):null;\n        if(!c)return;\n        setFace(c.getAttribute('data-p'));\n      });\n    })();\n\n    function openBoard(){\n      if(!bd)return;\n      bd.style.display='flex';bd.setAttribute('aria-hidden','false');\n      if(st)st.style.display='none';\n      document.documentElement.classList.add('pfm-board-open');\n      _pushBoardHist(); // 2026-09-11: \u538B\u5165\u4E00\u5C42\u5386\u53F2 \u2192 \u5B89\u5353/\u9E3F\u8499\u8FD4\u56DE\u952E\u3001iPad \u4FA7\u6ED1\u53EF\u6536\u8D77\u8BBE\u8BA1\u677F\n      // 2026-09-10: \u62C6\u5C42\u56DE\u5F52\u4FEE\u590D \u2014\u2014 \u753B\u5E03\u5728\u5168\u5C4F\u5C42\u91CC display:none\u2192flex\uFF0C\u9690\u85CF\u65F6 offsetWidth=0\uFF0C\n      // \u9996\u6B21\u5FC5\u987B\u7B49\u771F\u6B63\u53EF\u89C1\u540E\u591A\u6B21\u91CD\u7B97\uFF0C\u5426\u5219\u9996\u5C4F\u4EA7\u54C1\u56FE\u504F\u5C0F\uFF08\u5207\u9762\u540E\u624D\u6062\u590D\uFF09\u3002\n      function reflow(){\n        try{\n          // \u5173\u952E\uFF1AprintAreaSpecs \u5728\u672C IIFE \u4F5C\u7528\u57DF\u5916\uFF0C\u76F4\u63A5\u53D6\u4F1A undefined \u2192 \u5FC5\u987B\u6D3E\u53D1 resize\uFF0C\n          // \u590D\u7528\u6587\u4EF6\u9876\u90E8\u90A3\u4E2A\u80FD\u8BBF\u95EE printAreaSpecs \u7684\u5168\u5C40 resize \u76D1\u542C\uFF08\u5185\u542B 150ms \u9632\u6296\u91CD\u7B97\uFF09\u3002\n          window.dispatchEvent(new Event('resize'));\n        }catch(e){}\n        try{ if(typeof syncHeaderBar==='function')syncHeaderBar(); }catch(e){}\n      }\n      if(window.requestAnimationFrame){\n        requestAnimationFrame(function(){reflow();requestAnimationFrame(reflow);});\n      }\n      // \u9996\u6B21\u6253\u5F00\u65F6\u753B\u5E03\u533A\u5BBD\u5EA6\u5C1A\u672A\u7A33\u5B9A\uFF08\u5C55\u793A\u6001\u6B8B\u7559\u7684 600 \u2192 \u7A33\u5B9A\u540E 904\uFF09\uFF0C\n      // \u7528 ResizeObserver \u76EF\u4F4F\u753B\u5E03\u533A\uFF0C\u5E03\u5C40\u4E00\u53D8\u7ACB\u5373\u91CD\u7B97\uFF1B\u8F6E\u8BE2\u4F5C\u515C\u5E95\u3002\n      var _rt=null;\n      function reflowSoon(){if(_rt)return;_rt=setTimeout(function(){_rt=null;reflow();},120);}\n      try{\n        if(window.ResizeObserver&&!bd._pfmRO){\n          var _ca=$('pfmCanvasArea');\n          if(_ca){\n            bd._pfmRO=new ResizeObserver(function(){reflowSoon();});\n            bd._pfmRO.observe(_ca);\n          }\n        }\n      }catch(e){}\n      var _lw=0,_n=0;\n      var _iv=setInterval(function(){\n        try{\n          var a=$('pfmCanvasArea');\n          var w=a?a.clientWidth:0;\n          if(w&&w!==_lw){_lw=w;reflow();}\n        }catch(e){}\n        if(++_n>30){clearInterval(_iv);}\n      },400);\n      // \u6CE8\u610F\uFF1A\u4E0D\u6CE8\u518C window resize \u2192 reflow\uFF08reflow \u5185\u90E8\u4F1A\u6D3E\u53D1 resize\uFF0C\u4F1A\u81EA\u6FC0\u5FAA\u73AF\uFF09\n    }\n\n    function closeBoard(fromPop){\n      if(!bd)return;\n      bd.style.display='none';bd.setAttribute('aria-hidden','true');\n      if(st)st.style.display='flex';\n      document.documentElement.classList.remove('pfm-board-open');\n      // 2026-09-11: \u5173\u677F\u65F6\u628A\u5F00\u677F\u538B\u5165\u7684\u90A3\u5C42\u5386\u53F2\u5F39\u6389\uFF1B\u82E5\u662F popstate \u89E6\u53D1\u7684\u5173\u95ED\uFF08\u7CFB\u7EDF\u8FD4\u56DE/\u4FA7\u6ED1\uFF09\n      // \u5219\u4E0D\u80FD\u518D back\uFF0C\u5426\u5219\u4F1A\u591A\u9000\u4E00\u5C42\u628A\u9875\u9762\u5E26\u8D70\u3002\n      if(_boardHist){\n        _boardHist=false;\n        if(!fromPop){ try{ history.back(); }catch(e){} }\n      }\n      stagePreview();\n      stageArt();\n      syncStageChips();\n    }\n\n    /* ---------- 8d) \u63A5\u7BA1\u7CFB\u7EDF\u8FD4\u56DE\uFF082026-09-11\uFF09----------\n       \u8BBE\u8BA1\u677F\u662F position:fixed \u5168\u5C4F\u5C42\uFF0C\u6D4F\u89C8\u5668\u6CA1\u6709\u300C\u5173\u95ED\u6D6E\u5C42\u300D\u7684\u539F\u751F\u673A\u5236\uFF1A\u672A\u63A5\u7BA1\u65F6\uFF0C\n       \u5B89\u5353/\u9E3F\u8499\u5B9E\u4F53\u8FD4\u56DE\u952E\u4E0E iPad \u8FB9\u7F18\u4FA7\u6ED1\u4F1A**\u76F4\u63A5\u79BB\u5F00\u6574\u4E2A design-lab \u9875\u9762**\uFF08\u4E0D\u662F\u6536\u8D77\u7F16\u8F91\u5C42\uFF09\u3002\n       \u65B9\u6848\uFF1A\u5F00\u677F pushState \u4E00\u5C42 \u2192 \u7CFB\u7EDF\u8FD4\u56DE = popstate = \u6536\u8D77\u8BBE\u8BA1\u677F\uFF1B\u9876\u680F Back \u5173\u677F\u65F6 history.back()\n       \u5F39\u6389\u8BE5\u5C42 \u2192 \u300C\u7CFB\u7EDF\u8FD4\u56DE / \u4FA7\u6ED1 / \u9876\u680F Back\u300D\u4E09\u8005\u884C\u4E3A\u4E00\u81F4\uFF0C\u90FD\u662F\u9000\u51FA\u7F16\u8F91\u5C42\u56DE\u8BBE\u8BA1\u53F0\u3002 */\n    var _boardHist=false;\n    function _pushBoardHist(){\n      if(_boardHist)return;\n      try{ history.pushState({pfmBoard:1},''); _boardHist=true; }catch(e){}\n    }\n    window.addEventListener('popstate',function(){\n      if(_boardHist || (bd && bd.style.display!=='none')){\n        try{ closeBoard(true); }catch(e){}\n      }\n    });\n\n    if(btnD)window.__hdAct.bind('pfmBtnDesign',openBoard);\n    /* 2026-10-14 \u7532\uFF1A**\u5FC5\u987B\u5305\u4E00\u5C42**\uFF08\u4E0E #pfmBoardClose \u540C\u6B3E\u5199\u6CD5\uFF0C\u522B\u6539\u56DE\u76F4\u4F20\uFF09\u3002\n       __hdAct \u7684\u6D3E\u53D1\u662F a[i].call(n,e,n) \u2014\u2014 \u7B2C 1 \u53C2\u6052\u4E3A MouseEvent\uFF1B\u76F4\u4F20 closeBoard \u4F1A\u8BA9\n       fromPop \u6536\u5230\u4E8B\u4EF6\u5BF9\u8C61\uFF08\u771F\u503C\uFF09\u21D2 history.back() \u88AB\u8DF3\u8FC7 \u21D2 \u5F00\u677F\u90A3\u5C42\u5386\u53F2\u6C38\u8FDC\u7559\u5728\u6808\u91CC \u21D2\n       \u9875\u9762\u8FD4\u56DE\u952E\u8981\u70B9\u4E24\u6B21\u3002\u5305\u4E00\u5C42\u540E\u6309\u94AE\u8DEF\u5F84 fromPop=undefined \u21D2 \u6B63\u5E38\u5F39\u5C42\uFF1B\n       \u7CFB\u7EDF\u8FD4\u56DE/\u4FA7\u6ED1\uFF08popstate \u8DEF\u5F84\uFF09\u4E0D\u53D7\u5F71\u54CD\uFF0C\u539F\u5B88\u536B\uFF08\u9632\u591A\u9000\u4E00\u5C42\u628A\u9875\u9762\u5E26\u8D70\uFF09\u7167\u65E7\u751F\u6548\u3002 */\n    if(cl)window.__hdAct.bind('pfmBoardClose',function(){ closeBoard(); });\n    /* 2026-10-17\uFF08\u7532\uFF0C\u7528\u6237\uFF09\uFF1A#pfmBoardApply \u5DF2\u5220\u9664 \u2014\u2014 \u5B83\u4E0E \u2190 Back \u52A8\u4F5C\u5B8C\u5168\u76F8\u540C\uFF0C\n       \u8BBE\u8BA1\u677F\u7F16\u8F91\u5B9E\u65F6\u751F\u6548\u3001\u6CA1\u6709\u5F85\u63D0\u4EA4\u5185\u5BB9 \u21D2 \u53CC\u6309\u94AE\uFF08\u540C\u5916\u89C2 + \u540C\u6548\u679C\uFF09\u53EA\u4F1A\u8BEF\u5BFC\u3002 */\n    /* 2026-09-10: \u5C55\u793A\u533A\u300CAdd to Cart\u300D\u5DF2\u76F4\u63A5\u590D\u7528 #pfmBtnAddToCart\uFF08\u6309\u94AE\u5217\uFF09\uFF0C\u65E0\u9700\u8F6C\u53D1 */\n\n    /* ---------- 8c) \u624B\u673A\u7AEF\u5C5E\u6027\u9762\u677F\u62BD\u5C49\uFF08\u2264768px\uFF09---------- */\n    (function(){\n      function isMobile(){return window.__pfmTouchLayout();}\n      function drawer(open){\n        var p=$('pfmProps');if(!p)return;\n        if(open){ if(isMobile())p.classList.add('pfm-open'); }\n        else p.classList.remove('pfm-open');\n        /* 2026-10-29\uFF1A\u753B\u5E03\u7F29\u5C0F\u4E0E\u9762\u677F\u6ED1\u51FA**\u540C\u6B65** \u2014\u2014 \u539F MutationObserver(40ms)+resize debounce(150ms)\n           \u8BA9\u753B\u5E03\u6BD4\u9762\u677F\u665A ~190ms \u624D\u7F29\uFF08\u7528\u6237\u62A5\u300C\u5148\u6253\u5F00\u9762\u677F\uFF0C\u518D\u7F29\u5C0F\u300D\uFF09\u3002\u8FD9\u91CC\u7ACB\u5373\u91CD\u7B97\uFF0C\u5E76\u7ED9\u753B\u5E03\u52A0\n           \u4E0E\u62BD\u5C49\u540C\u957F(280ms = --pf-dur-2)\u7684\u8FC7\u6E21\u52A8\u753B \u21D2 \u4E24\u8005\u540C\u8D77\u540C\u843D\u3002 */\n        try{\n          var _in = q('pfmCanvasInner');\n          if(_in){\n            /* \u753B\u5E03\u663E\u793A\u7531 inner + .canvas-container + upper/lower canvas \u4E09\u5C42\u5171\u540C\u51B3\u5B9A\uFF0C\n               \u5FC5\u987B\u4E00\u8D77\u52A0\u8FC7\u6E21\uFF0C\u5426\u5219\u53EA\u6709\u5BB9\u5668\u7F29\u3001\u8863\u670D\u56FE\u4E0D\u7F29\u3002\u4F4D\u56FE\u56FA\u5B9A\u3001\u53EA\u5E73\u6ED1\u62C9\u4F38\u663E\u793A\u3002 */\n            var _els = [_in].concat(Array.prototype.slice.call(_in.querySelectorAll('.canvas-container, .canvas-container canvas')));\n            for(var _i=0;_i<_els.length;_i++){\n              (function(el){\n                el.style.transition = 'width 280ms ease,height 280ms ease';\n                clearTimeout(el.__pfmZoomTr);\n                el.__pfmZoomTr = setTimeout(function(){ try{ el.style.transition=''; }catch(e){} }, 320);\n              })(_els[_i]);\n            }\n          }\n          var _sp = (typeof printAreaSpecs!=='undefined') && printAreaSpecs[currentPlacement];\n          if(_sp) resizeCanvasToPrintArea(_sp);\n        }catch(e){}\n      }\n      window.__pfmDrawerOpen=function(){drawer(true);};\n      window.__pfmDrawerClose=function(){drawer(false);};\n      var pcl=$('pfmPropsClose');if(pcl)window.__hdAct.bind('pfmPropsClose',function(){drawer(false);});\n      /* \u70B9\u7A7A\u767D = \u6536\u8D77\u62BD\u5C49\uFF082026-09-12 \u6539\u9020\uFF0C\u539F\u4E3A\u300C\u70B9\u753B\u5E03\u300D\uFF09\n         \u65E7\u7248\u6302 #pfmCanvasArea \u7684 click\uFF08\u6C14\u6CE1\u9636\u6BB5\uFF09\uFF1A\u684C\u9762\u9F20\u6807\u6709\u6548\uFF0C\u624B\u673A\u7AEF\u5931\u6548 \u2014\u2014\n         Fabric \u5728 canvas \u4E0A preventDefault \u6389\u89E6\u6478\uFF0C\u6D4F\u89C8\u5668\u4E0D\u518D\u5408\u6210 click\uFF0C\u76D1\u542C\u5668\u6536\u4E0D\u5230\u3002\n         \u65B0\u7248\u6302 #pfmBoard \u7684**\u6355\u83B7\u9636\u6BB5**\uFF08\u7531\u5916\u5411\u5185\uFF0C\u5148\u4E8E Fabric \u89E6\u53D1\uFF0C\u541E\u4E8B\u4EF6\u4E5F\u62E6\u4E0D\u4F4F\uFF09\uFF0C\n         \u8303\u56F4 = \u9664\u300C\u62BD\u5C49 / \u9876\u680F / \u5DE5\u5177\u6761 / \u5E95\u680F / PLACEMENT \u5E38\u9A7B\u6761\u300D\u4EE5\u5916\u7684\u4E00\u5207\u533A\u57DF\uFF1B\n         \u6309\u4E0B\u5373\u6536\uFF08\u8DDF\u624B\uFF0C\u540C\u7CFB\u7EDF bottom sheet\uFF09\uFF1B\u672A\u5C55\u5F00\uFF08\u542B\u684C\u9762\u7AEF\uFF09\u6216\u5DF2\u6536\u8D77\u65F6\u76F4\u63A5 return\u3002 */\n      (function(){\n        var bdEl=$('pfmBoard');if(!bdEl)return;\n        /* \u786C\u8C41\u514D\uFF08\u7ED3\u6784\u6027\u533A\u57DF\uFF1A\u70B9\u5B83\u5185\u90E8\u4EFB\u4F55\u5730\u65B9\u90FD\u4E0D\u6536\u8D77\uFF0C\u542B\u7A7A\u767D\uFF09\n           \uD83D\uDD34 2026-09-19: #pfmProps \u5DF2\u4ECE\u4E2D\u79FB\u9664 \u2014\u2014 \u62BD\u5C49\u6539\u4E3A\u300C\u8F6F\u8C41\u514D\u300D\uFF08\u89C1\u4E0B\uFF09 */\n        /* 2026-09-20: \u53BB\u6389 `'pfmBottomBar'` \u2014\u2014 \u8BE5\u5143\u7D20\u5DF2\u4E0D\u5B58\u5728\uFF08\u5E95\u680F\u6574\u6761\u5220\u9664\uFF09\uFF0C\u6B7B\u540D\u6C38\u4E0D\u5339\u914D\u3002 */\n        var KEEP=['pfmBoardBar','pfmToolbar','pfmPlacementSection','pfmFontPick','pfmFontPop'];\n        var keeps=[];\n        for(var ki=0;ki<KEEP.length;ki++){var ke=$(KEEP[ki]);if(ke)keeps.push(ke);}\n        function inKeep(t){\n          for(var i=0;i<keeps.length;i++){try{if(keeps[i].contains(t))return true;}catch(e){}}\n          return false;\n        }\n        /* 2026-09-19: \u62BD\u5C49\u5185\u300C\u8F7B\u70B9\u7A7A\u767D\u4E5F\u6536\u8D77\u300D\u3002\n           \u76EE\u6807\uFF1A\u70B9\u533A\u5757\u6807\u9898 / \u63D0\u793A\u6587\u5B57 / \u7A7A\u9699 = \u6536\u8D77\uFF1B\u70B9\u63A7\u4EF6\uFF08\u6309\u94AE/\u8F93\u5165/\u6ED1\u6746/\u8272\u677F/\u5217\u8868\u9879\uFF09= \u4E0D\u6536\u3002\n           \uD83D\uDD34 \u62BD\u5C49\u5185\u5BB9\u8981\u80FD\u6EDA\u52A8 \u21D2 \u4E0D\u80FD\u50CF\u62BD\u5C49\u5916\u90A3\u6837 pointerdown \u5373\u6536\uFF1A\n              down \u8BB0\u8D77\u70B9\uFF0Cup \u65F6\u300C\u4F4D\u79FB < 8px \u4E14 < 500ms\u300D\u624D\u7B97\u8F7B\u70B9\uFF08\u6ED1\u52A8=\u6EDA\u5185\u5BB9\u3001\u957F\u6309=\u64CD\u4F5C\uFF0C\u90FD\u4FDD\u7559\uFF09\u3002 */\n        var SEL_UI='button,input,select,textarea,label,canvas,a,[role=\"button\"],[contenteditable],'\n                 +'.pfm-clipart-item,.pfm-chip,.pfm-btn,.pfm-fbtn,.pfm-xf-num,.pfm-img-btn,'\n                 +'.pfm-imgpop-range,.pfm-imgpop-chip,.pfm-imgpop-color,.pfm-imgpop-btn,.pfm-imgpop-x,'\n                 +'.pfm-font-item,.pfm-layer-row';\n        function isUI(t){try{return !!(t&&t.closest&&t.closest(SEL_UI));}catch(e){return false;}}\n        function ptOf(e){\n          if(e&&e.touches&&e.touches[0])return{x:e.touches[0].clientX,y:e.touches[0].clientY};\n          if(e&&e.changedTouches&&e.changedTouches[0])return{x:e.changedTouches[0].clientX,y:e.changedTouches[0].clientY};\n          if(e&&typeof e.clientX==='number')return{x:e.clientX,y:e.clientY};\n          return null;\n        }\n        var tapS=null;\n        function onDown(e){\n          try{\n            var p=$('pfmProps');\n            if(!p||!p.classList.contains('pfm-open'))return;\n            if(inKeep(e.target))return;\n            if(!p.contains(e.target)){drawer(false);return;}   /* \u62BD\u5C49\u5916\uFF08\u753B\u5E03\u7B49\uFF09\u2192 \u6309\u4E0B\u5373\u6536\uFF0C\u8DDF\u624B */\n            /* 2026-09-20 \u7528\u6237\u8981\u6C42\uFF1A\u62BD\u5C49\u5185\u70B9\u4EFB\u4F55\u5730\u65B9\u90FD\u4E0D\u6536\u8D77 \u2014\u2014 \u4E0D\u518D\u8BB0\u5F55\u300C\u8F7B\u70B9\u300D\uFF0C\n               onUp \u56E0 tapS \u6052\u4E3A null \u800C\u6C38\u4E0D\u6536\u8D77\uFF08\u6536\u8D77\u65B9\u5F0F = \u70B9\u62BD\u5C49\u5916 / \u70B9 #pfmPropsClose\uFF09\u3002 */\n          }catch(err){}\n        }\n        function onUp(e){\n          try{\n            if(!tapS)return;\n            var s=tapS;tapS=null;\n            if(s.ui)return;                                        /* \u70B9\u5728\u63A7\u4EF6\u4E0A */\n            var p=$('pfmProps');if(!p||!p.classList.contains('pfm-open'))return;\n            var pt=ptOf(e);if(!pt)return;\n            if(Math.abs(pt.x-s.x)>8||Math.abs(pt.y-s.y)>8)return;  /* \u6ED1\u52A8 = \u5728\u6EDA\u5185\u5BB9 */\n            if(Date.now()-s.t>500)return;                          /* \u957F\u6309 = \u5728\u64CD\u4F5C */\n            drawer(false);\n          }catch(err){}\n        }\n        bdEl.addEventListener('pointerdown',onDown,true);\n        bdEl.addEventListener('touchstart',onDown,true);\n        bdEl.addEventListener('click',onDown,true);\n        bdEl.addEventListener('pointerup',onUp,true);\n        bdEl.addEventListener('touchend',onUp,true);\n        bdEl.addEventListener('touchcancel',function(){tapS=null;},true);\n      })();\n      // \u6253\u5F00\u8BBE\u8BA1\u677F\u65F6\u62BD\u5C49\u9ED8\u8BA4\u6536\u8D77\n      if(btnD)window.__hdAct.bind('pfmBtnDesign',function(){drawer(false);});\n      // \u8F6C\u56DE\u684C\u9762\u5BBD\u5EA6\u65F6\u6E05\u6389\u72B6\u6001\n      window.addEventListener('resize',function(){if(!isMobile())drawer(false);});\n    })();\n\n    /* ---------- 8e) \u624B\u673A\u7AEF Placement \u5E38\u9A7B\uFF082026-09-12\uFF09----------\n       8c \u7684\u62BD\u5C49\u5728\u624B\u673A\u7AEF\u9ED8\u8BA4\u6536\u8D77\uFF0C\u800C #pfmPlacementSection\uFF08\u5207\u89D2\u5EA6\u6309\u94AE\uFF09\u662F\u62BD\u5C49\u7B2C\u4E00\u5757\n       \u2192 \u5F00\u677F\u5C31\u770B\u4E0D\u89C1\u6309\u94AE\u3002\u8FD9\u91CC\u628A\u5B83\u6574\u5757\u642C\u5230 .pfm-body \u76F4\u4E0B\u3001\u753B\u5E03\u4E4B\u524D\u5E38\u9A7B\uFF1B\n       \u5207\u56DE\u684C\u9762\u5BBD\u5EA6 / \u5173\u677F\u65F6\u539F\u6837\u642C\u56DE .pfm-props\u3002\n       \u53EA\u642C DOM\uFF1A\u7ED1\u5B9A\u90FD\u6302\u5728\u5143\u7D20\u672C\u8EAB\uFF08#pfmPlacements.onclick\u3001rerenderPlacements /\n       syncStageChips \u5747\u6309 id \u53D6\uFF09\uFF0C\u5143\u7D20\u642C\u8D70\u4E0D\u4E22\u4EFB\u4F55\u4E8B\u4EF6\u3002\u5E42\u7B49\uFF0C\u53EF\u5B89\u5168\u91CD\u590D\u8C03\u7528\u3002 */\n    (function(){\n      function isM(){return window.__pfmTouchLayout();}\n      var _home=null;\n      function placePlacement(){\n        var s=$(\"pfmPlacementSection\"); if(!s)return;\n        if(!_home) _home={p:s.parentNode,n:s.nextSibling};\n        var body=document.querySelector(\".pfm-body\"), ca=$(\"pfmCanvasArea\");\n        if(!body||!ca) return;\n        if(isM()){\n          if(s.parentNode!==body) body.insertBefore(s,ca);\n        }else{\n          if(_home.p&&s.parentNode!==_home.p) _home.p.insertBefore(s,_home.n);\n        }\n      }\n      window.__pfmPlacementHome=placePlacement;\n      window.addEventListener(\"resize\",placePlacement);\n      window.addEventListener(\"load\",placePlacement);\n      document.addEventListener(\"DOMContentLoaded\",placePlacement);\n      placePlacement();\n    })();\n\n    /* ---------- 8e-2) \u624B\u673A\u7AEF Actions \u5E38\u9A7B\uFF082026-09-13\uFF09----------\n       \u540C 8e\uFF1A\u62BD\u5C49\u5728\u624B\u673A\u7AEF\u9ED8\u8BA4\u6536\u8D77 \u2192 #pfmActionsSection\uFF08Flip H/V \u00B7 Copy \u00B7 Delete\uFF09\u770B\u4E0D\u89C1\u3002\n       \u6574\u5757\u642C\u5230\u753B\u5E03\u4E4B\u524D\u5E38\u9A7B\uFF0C\u5E76**\u6BCF\u6B21\u91CD\u6392\u4FDD\u8BC1\u987A\u5E8F = Placement \u2192 Actions \u2192 \u753B\u5E03**\uFF08\u5E42\u7B49\uFF09\u3002\n       \u672C IIFE \u5B9A\u4E49\u5728 8e \u4E4B\u540E \u2192 resize/load \u76D1\u542C\u6309\u6CE8\u518C\u987A\u5E8F\u540E\u6267\u884C\uFF0C\u53EF\u8986\u76D6 8e \u7684\u63D2\u5165\u7ED3\u679C\u3002\n       \u53EA\u642C DOM\uFF1A\u6309\u94AE\u4E8B\u4EF6\u90FD\u6302\u5728 #pfmFloatToolbar \u4E0A\uFF08\u59D4\u6258\uFF09\uFF0C\u642C\u8D70\u4E0D\u4E22\u4E8B\u4EF6\u3002 */\n    (function(){\n      function isM2(){return window.__pfmTouchLayout();}\n      var _homeA=null;\n      function placeActions(){\n        var s=$(\"pfmActionsSection\"); if(!s)return;\n        if(!_homeA) _homeA={p:s.parentNode,n:s.nextSibling};\n        var body=document.querySelector(\".pfm-body\"), ca=$(\"pfmCanvasArea\");\n        if(!body||!ca) return;\n        if(isM2()){\n          var ps=$(\"pfmPlacementSection\");\n          if(ps && ps.parentNode===body) body.insertBefore(ps,ca);   /* \u5148\u786E\u4FDD Placement \u7D27\u90BB\u753B\u5E03\u4E4B\u524D */\n          if(s.parentNode!==body || s.nextSibling!==ca) body.insertBefore(s,ca);  /* Actions \u63D2\u5230\u753B\u5E03\u4E4B\u524D = Placement \u4E4B\u540E */\n        }else{\n          if(_homeA.p && s.parentNode!==_homeA.p) _homeA.p.insertBefore(s,_homeA.n);\n        }\n        /* \u8DE8 IIFE\uFF1A\u5FC5\u987B\u8D70 window \u53E5\u67C4\uFF08\u76F4\u63A5\u8C03\u7528\u4F1A ReferenceError\uFF0C\u89C1\u4E3B IIFE \u7684\u66B4\u9732\u5904\uFF09 */\n        try{ if(window.__pfmUpdateFloat) window.__pfmUpdateFloat(); }catch(e){}\n      }\n      window.__pfmActionsHome=placeActions;\n      window.addEventListener(\"resize\",placeActions);\n      window.addEventListener(\"load\",placeActions);\n      document.addEventListener(\"DOMContentLoaded\",placeActions);\n      placeActions();\n    })();\n\n    window.__pfmOpenBoard=openBoard;\n    window.__pfmCloseBoard=closeBoard;\n    window.__pfmStagePreview=stagePreview;\n    window.__pfmStageArt=stageArt;\n    window.__pfmStageFace=setFace;\n    window.__pfmSyncStageChips=syncStageChips;\n    window.addEventListener('load',function(){setTimeout(stagePreview,1200);});\n    document.addEventListener('DOMContentLoaded',function(){setTimeout(stagePreview,700);});\n    var _pvN=0,_pvIv=setInterval(function(){stagePreview();syncStageChips();if(++_pvN>14)clearInterval(_pvIv);},1000);\n  })();\n})();\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   2026-10-15\uFF1A\u753B\u5E03\u5E95\u90E8\u300CColor\u300D\u8272\u5E26 \u2014\u2014 \u6362\u4EA7\u54C1\u5E95\u8272\uFF08**\u53EA\u6362\u5E95\u677F\uFF0C\u8BBE\u8BA1\u5BF9\u8C61\u4E00\u6839\u4E0D\u52A8**\uFF09\n   \u6570\u636E\u6E90\uFF1A\u2460 sessionStorage['hdTeamCombos'] \u91CC\u672C\u5546\u54C1\u7684\u8272\uFF08\u7F6E\u9876 = \u7528\u6237\u81EA\u5DF1\u9009\u7684\uFF09\n           \u2461 window.__dsVariants \u8BE5\u5546\u54C1\u5176\u4F59\u8272\uFF08\u53BB\u91CD\uFF09\n   \u6362\u8272\uFF1A\u76F4\u63A5\u590D\u7528\u73B0\u6210\u7684 window.__hdSwapColor()\uFF08\u5B83\u53EA\u6539 _colorName + \u5E95\u677F + \u5F53\u524D\u53D8\u4F53\uFF09\n   \uD83D\uDD34 \u677F\u5185\u5E95\u56FE\u662F #pfmZoomLayer\uFF08\u5728 design-board.liquid \u91CC\uFF09\uFF1B\u677F\u5916 #pfmStageImg \u7531\n      stagePreview() \u7BA1 \u2014\u2014 \u4E24\u8005\u5DF2\u5728 loadProductBackground() \u4E2D\u540C\u6B65\u3002\n   \u5E42\u7B49\u5B88\u536B __pfmColorInit\uFF1BDOM \u7531 design-board.liquid \u8F93\u51FA\uFF08SPA \u663E\u9690 \u21D2 \u8F6E\u8BE2\u7B49\u5B83\uFF09\u3002\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n(function(){\n  function esc(s){ return String(s==null?'':s).replace(/[&<>\"']/g, function(c){\n    return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]; }); }\n  function curColor(){ try{ return String((window.__dsPick||{}).color||''); }catch(e){ return ''; } }\n  function hexOf(cn){\n    try{ var vs=window.__dsVariants||[];\n      for(var i=0;i<vs.length;i++){ if(String(vs[i].color||'')===cn && vs[i].color_code) return String(vs[i].color_code); }\n    }catch(e){}\n    return '';\n  }\n  /* 2026-10-15\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A\u8272\u5E26**\u53EA\u5E73\u94FA\u300C\u4E0A\u4E00\u6B65 combos \u91CC\u9009\u4E2D\u7684\u8272\u300D**\uFF0C\u4E0D\u518D\u5217\u8BE5\u5546\u54C1\u5168\u90E8\u8272\u3002\n     combos \u4E3A\u7A7A\uFF08\u6CA1\u8D70\u76EE\u5F55\u9875\uFF09\u21D2 \u9000\u5316\u4E3A\u53EA\u663E\u793A\u5F53\u524D\u8272 1 \u4E2A\u70B9\uFF0C\u6309\u94AE\u4ECD\u5728\uFF08\u4E0D\u81F3\u4E8E\u300C\u529F\u80FD\u6D88\u5931\u300D\uFF09\u3002 */\n  function colors(){\n    var out=[], seen={};\n    try{\n      var pid=String(new URLSearchParams(location.search).get('product_id')||'');\n      var o=JSON.parse(sessionStorage.getItem('hdTeamCombos')||'null');\n      if(o && String(o.pid||'')===pid) (o.items||[]).forEach(function(it){\n        var c=String((it&&it.c)||''); if(!c || seen[c]) return;\n        seen[c]=1; out.push({c:c, hex:String((it&&it.hex)||'')||hexOf(c)});\n      });\n    }catch(e){}\n    if(!out.length){ var _cur=curColor(); if(_cur) out.push({c:_cur, hex:hexOf(_cur)}); }\n    return out;\n  }\n\n  function ready(){\n    var host=document.getElementById('pfmStageColor');\n    var strip=document.getElementById('pfmColorStrip');\n    /* 2026-10-15\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A**\u8272\u5E26\u5E38\u9A7B\u5E73\u94FA\u3001\u4E0D\u6536\u8D77** \u21D2 \u5DF2\u53BB\u6389 Color \u6309\u94AE\uFF0C\u8FD9\u91CC\u4E0D\u518D\u53D6\u5B83\u3002 */\n    if(!host || !strip || host.__pfmColorInit) return !!host;\n    host.__pfmColorInit=1;\n\n    function render(){\n      /* 2026-10-15\uFF08\u7528\u6237\uFF09\uFF1A\u8272\u5E26\u524D\u9762\u5E26\u4E00\u4E2A\u6587\u5B57\u6807\u7B7E \u2014\u2014 \u53EA\u6709\u4E00\u6392\u8272\u5757\u592A\u7A81\u5140\u3002 */\n      var list=colors(), cur=curColor(), html='<span class=\"pfm-color-label\">Color</span>';\n      list.forEach(function(x){\n        html+='<button type=\"button\" class=\"pfm-cdot'+(x.c===cur?' sel':'')+'\"'\n             + ' data-pfm-color=\"'+esc(x.c)+'\" title=\"'+esc(x.c)+'\" aria-label=\"'+esc(x.c)+'\"'\n             + ' style=\"background:'+esc(x.hex||'#EFEFEF')+'\"></button>';\n      });\n      strip.innerHTML=html;\n    }\n    function sync(){\n      try{\n        var cur=curColor(), ds=strip.querySelectorAll('.pfm-cdot');\n        for(var i=0;i<ds.length;i++) ds[i].classList.toggle('sel', ds[i].getAttribute('data-pfm-color')===cur);\n      }catch(e){}\n    }\n    /* 2026-10-14 \u94C1\u5F8B\uFF1A\u7FFB\u8BD1\u4F1A\u628A\u6587\u672C\u5305 <font> \u21D2 \u4E00\u5F8B\u7528 composedPath\uFF08closest \u53EF\u80FD\u6052 null\uFF09 */\n    strip.addEventListener('click', function(e){\n      var p=e.composedPath?e.composedPath():[], el=null;\n      for(var i=0;i<p.length;i++){ if(p[i] && p[i].getAttribute && p[i].getAttribute('data-pfm-color')){ el=p[i]; break; } }\n      if(!el) return;\n      var nm=el.getAttribute('data-pfm-color');\n      try{ if(typeof window.__hdSwapColor==='function') window.__hdSwapColor(nm); }catch(e2){}\n      setTimeout(sync, 60); setTimeout(sync, 700);\n    });\n    /* 2026-10-15\uFF08\u7528\u6237\u88C1\u51B3\uFF09\uFF1A**\u8272\u5E26\u5E38\u9A7B\u5E73\u94FA\u3001\u4E0D\u6536\u8D77** \u21D2 \u53BB\u6389\u5C55\u5F00\u903B\u8F91\uFF0C\u5C31\u7EEA\u5373\u6E32\u67D3\u3002\n       combos \u81EA\u5E26 hex\uFF1B\u8001\u6570\u636E\u7F3A hex \u65F6\u8981\u9760 hexOf() \u8BFB __dsVariants\uFF0C\u800C\u90A3\u65F6\u5B83\u53EF\u80FD\u8FD8\u6CA1\u5C31\u7EEA\n       \u21D2 \u7528\u300C\u7B7E\u540D\u6BD4\u5BF9\u300D\u5728\u5F00\u5934\u51E0\u62CD\u8865\u6E32\u67D3\uFF08\u53EA\u5728\u5185\u5BB9\u771F\u53D8\u65F6\u624D\u91CD\u5199 DOM\uFF0C\u907F\u514D\u95EA\uFF09\u3002 */\n    var _lastSig='';\n    function refresh(){\n      try{\n        var list=colors(), sig=list.map(function(x){ return x.c+'|'+x.hex; }).join(',');\n        if(sig===_lastSig) return;\n        _lastSig=sig; render(); sync();\n      }catch(e){}\n    }\n    refresh();\n    [1200,3200,8000].forEach(function(_ms){ setTimeout(refresh, _ms); });\n    return true;\n  }\n\n  var tries=0;\n  (function tick(){ if(ready()) return; if(++tries>300) return; setTimeout(tick, 200); })();\n})();\n"],
  "mappings": "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",
  "names": ["canvas", "product", "currentPlacement", "printAreaSpecs", "q", "fin", "resizeCanvasToPrintArea", "section", "p", "cached", "pid", "_fallback", "syncHeaderBar", "pfmTapTrack", "pfmTsH", "pfmTmH", "pfmTeH", "pfmBindTouchTarget", "hdGenColors", "i", "esc", "dumpDebug", "a"]
}
