Use our interactive Injection Molding Unit Cost Breakdown & What-If Analyzer below to model your exact piece price across resin weight, runner regrind recovery, press hourly rate, cycle time, cavity count, scrap rate, and mold amortization.
.imc-wrap *{box-sizing:border-box;margin:0;padding:0;}
.imc-wrap{
–cb:#fff;–cs:#f8f9fb;–cs2:#f1f4f8;
–bd:#e4e7ec;–bdm:#cbd0d8;
–tx:#111827;–mu:#6b7280;–hi:#9ca3af;
–bl:#2563eb;–bl-l:#eff6ff;–bl-b:#bfdbfe;–bl-t:#1d4ed8;
–pu:#7c3aed;–pu-l:#f5f3ff;–pu-b:#ddd6fe;–pu-t:#5b21b6;
–te:#0d9488;–te-l:#f0fdfa;–te-b:#99f6e4;–te-t:#0f766e;
–gn:#16a34a;–gn-l:#f0fdf4;–gn-b:#bbf7d0;–gn-t:#166534;
–am:#d97706;–am-l:#fffbeb;–am-b:#fde68a;–am-t:#92400e;
–re:#dc2626;–re-l:#fef2f2;–re-b:#fecaca;–re-t:#991b1b;
–gy:#6b7280;–gy-l:#f9fafb;–gy-b:#e5e7eb;–gy-t:#374151;
–mn:’Courier New’,Courier,monospace;
–sf:-apple-system,BlinkMacSystemFont,’Segoe UI’,Roboto,Helvetica,Arial,sans-serif;
–r:8px;–rl:12px;
font-family:var(–sf);font-size:15px;color:var(–tx);background:transparent;line-height:1.5;
}
@media(prefers-color-scheme:dark){.imc-wrap{
–cb:#1e2025;–cs:#272b33;–cs2:#2f3440;–bd:#363c47;–bdm:#4a5261;
–tx:#f1f3f7;–mu:#8d96a5;–hi:#5c6575;
–bl:#60a5fa;–bl-l:#1e2d45;–bl-b:#2d4a7a;–bl-t:#93c5fd;
–pu:#a78bfa;–pu-l:#2e1065;–pu-b:#4c1d95;–pu-t:#c4b5fd;
–te:#2dd4bf;–te-l:#042f2e;–te-b:#115e59;–te-t:#5eead4;
–gn:#4ade80;–gn-l:#052e16;–gn-b:#166534;–gn-t:#86efac;
–am:#fbbf24;–am-l:#2d1f00;–am-b:#78350f;–am-t:#fcd34d;
–re:#f87171;–re-l:#2d0a0a;–re-b:#7f1d1d;–re-t:#fca5a5;
–gy:#9ca3af;–gy-l:#1f2937;–gy-b:#374151;–gy-t:#d1d5db;
}}
body.dark .imc-wrap,.dark .imc-wrap{
–cb:#1e2025;–cs:#272b33;–cs2:#2f3440;–bd:#363c47;–bdm:#4a5261;
–tx:#f1f3f7;–mu:#8d96a5;–hi:#5c6575;
–bl:#60a5fa;–bl-l:#1e2d45;–bl-b:#2d4a7a;–bl-t:#93c5fd;
–pu:#a78bfa;–pu-l:#2e1065;–pu-b:#4c1d95;–pu-t:#c4b5fd;
–te:#2dd4bf;–te-l:#042f2e;–te-b:#115e59;–te-t:#5eead4;
–gn:#4ade80;–gn-l:#052e16;–gn-b:#166534;–gn-t:#86efac;
–am:#fbbf24;–am-l:#2d1f00;–am-b:#78350f;–am-t:#fcd34d;
–re:#f87171;–re-l:#2d0a0a;–re-b:#7f1d1d;–re-t:#fca5a5;
–gy:#9ca3af;–gy-l:#1f2937;–gy-b:#374151;–gy-t:#d1d5db;
}
.imc-card{background:var(–cb);border:1px solid var(–bd);border-radius:var(–rl);padding:1.75rem 1.75rem 2rem;max-width:960px;margin:0 auto;}
.imc-hdr{display:flex;align-items:center;gap:10px;margin-bottom:1.75rem;padding-bottom:1.25rem;border-bottom:1px solid var(–bd);flex-wrap:wrap;}
.imc-badge{font-family:var(–mn);font-size:10px;letter-spacing:.08em;background:var(–cs);border:1px solid var(–bd);border-radius:4px;padding:3px 8px;color:var(–mu);white-space:nowrap;}
.imc-hdr h2{font-size:17px;font-weight:600;color:var(–tx);margin:0;border:none;padding:0;flex:1;min-width:0;}
.imc-ts{font-family:var(–mn);font-size:10px;color:var(–hi);}
.imc-sec{margin-bottom:1.5rem;}
.imc-sec-hd{font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(–mu);margin-bottom:12px;padding-bottom:6px;border-bottom:1px solid var(–bd);}
.imc-lbl{display:block;font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(–mu);margin-bottom:6px;}
.imc-hint{font-size:11px;color:var(–hi);margin-top:4px;line-height:1.5;}
.imc-g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;}
.imc-g4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;}
@media(max-width:580px){.imc-g3,.imc-g4{grid-template-columns:1fr 1fr;}}
@media(max-width:380px){.imc-g3,.imc-g4{grid-template-columns:1fr;}}
.imc-ni{display:flex;align-items:center;border:1px solid var(–bd);border-radius:var(–r);overflow:hidden;background:var(–cb);}/* FIX 1: 移除 all: unset, 使用安全的浏览器重置 */
.imc-ni input[type=number]{-webkit-appearance:none;appearance:none;background:transparent;border:none;outline:none;flex:1;font-family:var(–mn);font-size:16px;font-weight:700;color:var(–tx);padding:9px 12px;-moz-appearance:textfield;}
.imc-ni input[type=number]::-webkit-inner-spin-button,.imc-ni input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0;}
.imc-ni-unit{font-size:11px;font-weight:600;color:var(–mu);padding:0 10px 0 0;white-space:nowrap;}
.imc-qp{display:flex;gap:4px;margin-top:5px;flex-wrap:wrap;}/* FIX 2: 修复按键的 all: unset */
.imc-qb{-webkit-appearance:none;appearance:none;background:var(–cb);border:1px solid var(–bd);outline:none;font-family:var(–mn);font-size:10px;font-weight:600;padding:3px 8px;border-radius:var(–r);color:var(–mu);cursor:pointer;transition:all .12s;}
.imc-qb:hover{background:var(–cs);border-color:var(–bdm);color:var(–tx);}
.imc-rr{display:flex;align-items:center;gap:8px;}/* FIX 3: 修复滑块的原生拖动能力 */
.imc-rr input[type=range]{-webkit-appearance:none;appearance:none;background:var(–bd);border:none;outline:none;flex:1;height:4px;border-radius:2px;cursor:pointer;margin:0;}
.imc-rr input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;background:var(–bl);border:2px solid var(–cb);box-shadow:0 0 0 1px var(–bl);}
.imc-rr input[type=range]::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(–bl);border:2px solid var(–cb);}.imc-rv{font-family:var(–mn);font-size:11px;font-weight:700;color:var(–tx);min-width:48px;text-align:right;white-space:nowrap;}
.imc-div{height:1px;background:var(–bd);margin:1.5rem 0;}
.imc-total-band{display:flex;align-items:center;justify-content:space-between;background:var(–cs);border:1px solid var(–bd);border-radius:var(–rl);padding:1.25rem 1.5rem;margin-bottom:1.25rem;flex-wrap:wrap;gap:12px;}
.imc-total-lbl{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;color:var(–mu);margin-bottom:4px;}
.imc-total-val{font-family:var(–mn);font-size:36px;font-weight:700;color:var(–tx);line-height:1;}
.imc-total-unit{font-size:13px;color:var(–mu);margin-left:4px;}
.imc-total-right{display:flex;gap:12px;flex-wrap:wrap;}
.imc-kpi{background:var(–cb);border:1px solid var(–bd);border-radius:var(–r);padding:10px 14px;text-align:center;min-width:80px;}
.imc-kpi-lbl{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(–hi);margin-bottom:3px;}
.imc-kpi-val{font-family:var(–mn);font-size:16px;font-weight:700;color:var(–tx);}
.imc-wf-wrap{margin-bottom:1.25rem;}
.imc-wf-ttl{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(–mu);margin-bottom:10px;}
.imc-wf-svg{width:100%;display:block;}
.imc-comps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-bottom:1.25rem;}
@media(max-width:600px){.imc-comps{grid-template-columns:1fr 1fr;}}
@media(max-width:380px){.imc-comps{grid-template-columns:1fr;}}
.imc-comp{border-radius:var(–r);padding:12px 14px;border:1px solid var(–bd);background:var(–cb);position:relative;overflow:hidden;}
.imc-comp-bar{position:absolute;bottom:0;left:0;height:3px;transition:width .4s ease;}
.imc-comp-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;}
.imc-comp-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.imc-comp-name{font-size:11px;font-weight:600;color:var(–mu);flex:1;margin:0 6px;}
.imc-comp-rank{font-size:9px;font-family:var(–mn);font-weight:700;padding:2px 5px;border-radius:3px;}
.imc-comp-val{font-family:var(–mn);font-size:18px;font-weight:700;color:var(–tx);margin-bottom:2px;}
.imc-comp-sub{font-size:12px;font-weight:600;color:var(–mu);}
.imc-comp-delta{font-size:11px;font-family:var(–mn);font-weight:700;margin-top:4px;}
.imc-comp-delta.dn{color:var(–gn);}
.imc-comp-delta.up{color:var(–re);}
.imc-opp{background:var(–cs);border:1px solid var(–bd);border-radius:var(–rl);padding:1.25rem 1.5rem;margin-bottom:1.25rem;}
.imc-opp-ttl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(–mu);margin-bottom:12px;}
.imc-opp-row{display:flex;align-items:flex-start;gap:10px;padding:8px 0;border-bottom:1px solid var(–bd);}
.imc-opp-row:last-child{border-bottom:none;padding-bottom:0;}
.imc-opp-rk{font-family:var(–mn);font-size:11px;font-weight:700;width:20px;flex-shrink:0;color:var(–hi);padding-top:1px;}
.imc-opp-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;margin-top:4px;}
.imc-opp-body{flex:1;min-width:0;}
.imc-opp-lv{font-size:12px;font-weight:600;color:var(–tx);}
.imc-opp-lv span{font-size:10px;color:var(–mu);font-weight:400;margin-left:4px;}
.imc-opp-ac{font-size:11px;color:var(–mu);margin-top:2px;line-height:1.4;}
.imc-opp-sv{font-family:var(–mn);font-size:12px;font-weight:700;color:var(–gn);flex-shrink:0;white-space:nowrap;text-align:right;}
.imc-wi-btn{display:flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(–bd);border-radius:var(–r);background:var(–cs);cursor:pointer;font-size:13px;font-weight:600;color:var(–mu);width:100%;margin-bottom:12px;transition:all .15s;font-family:var(–sf);}
.imc-wi-btn:hover{border-color:var(–bdm);color:var(–tx);}
.imc-wi-btn.on{background:var(–bl-l);border-color:var(–bl-b);color:var(–bl-t);}
.imc-wi-sw{width:36px;height:20px;border-radius:10px;background:var(–bd);position:relative;flex-shrink:0;transition:background .2s;}
.imc-wi-btn.on .imc-wi-sw{background:var(–bl);}
.imc-wi-kn{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .2s;}
.imc-wi-btn.on .imc-wi-kn{left:18px;}
.imc-wi-panel{display:none;}
.imc-wi-panel.show{display:block;}
.imc-wi-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:1.25rem;}
@media(max-width:560px){.imc-wi-grid{grid-template-columns:1fr 1fr;}}
.imc-wi-lv{background:var(–cs);border:1px solid var(–bd);border-radius:var(–r);padding:12px 14px;}
.imc-wi-lv-nm{font-size:11px;font-weight:600;color:var(–mu);text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px;}
.imc-wi-lv-bs{font-size:10px;color:var(–hi);margin-bottom:8px;}
.imc-cmp-wrap{background:var(–cs);border:1px solid var(–bd);border-radius:var(–rl);overflow:hidden;margin-bottom:1.25rem;}
.imc-cmp-hdr{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1.5fr) minmax(0,1.5fr) minmax(0,1.2fr);background:var(–cs2);padding:8px 14px;gap:8px;border-bottom:1px solid var(–bd);}
.imc-cmp-hdr span{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(–mu);}
.imc-cmp-row{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1.5fr) minmax(0,1.5fr) minmax(0,1.2fr);padding:8px 14px;border-bottom:1px solid var(–bd);gap:8px;align-items:center;}
.imc-cmp-row:last-child{border-bottom:none;background:var(–bl-l);}
.imc-cmp-nm{font-size:12px;color:var(–mu);display:flex;align-items:center;gap:6px;}
.imc-cmp-d{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.imc-cmp-v{font-family:var(–mn);font-size:12px;font-weight:600;color:var(–tx);}
.imc-cmp-dl{font-family:var(–mn);font-size:12px;font-weight:700;}
.imc-cmp-dl.pos{color:var(–gn);}
.imc-cmp-dl.neg{color:var(–re);}
.imc-alerts{display:flex;flex-direction:column;gap:8px;}
.imc-alert{display:flex;gap:10px;align-items:flex-start;padding:10px 14px;border-radius:var(–r);font-size:12px;line-height:1.6;border-left:3px solid transparent;}
.imc-alert.ao{background:var(–gn-l);border-left-color:#22c55e;color:var(–gn-t);}
.imc-alert.aw{background:var(–am-l);border-left-color:#f59e0b;color:var(–am-t);}
.imc-alert.ae{background:var(–re-l);border-left-color:#ef4444;color:var(–re-t);}
.imc-alert.ai{background:var(–bl-l);border-left-color:var(–bl);color:var(–bl-t);}
.imc-alert.at{background:var(–te-l);border-left-color:#0d9488;color:var(–te-t);}
.imc-alert-ico{font-size:13px;flex-shrink:0;margin-top:1px;font-weight:700;}
/* FIX 4: 增加防御性分号 ;(function(){…})(); 防止 WP 插件压缩合并时抛错 */
;(function(){
‘use strict’;/* 增加防冲突寻址:如果同一页面被 Gutenberg 插入了多次,确保只取当前容器内的节点 */
var wrap = document.getElementById(‘imc-root’) || document;
function el(id){ return wrap.querySelector(‘#’+id) || document.getElementById(id); }var st={pwt:25,rwt:8,mp:2.20,reg:60,mr:65,lr:8,ct:28,cav:4,scr:2.0,oh:18,mold:0.015};
var wi={ct:28,cav:4,pwt:25,mp:2.2,scr:2.0,mr:65};
var wiOn=false;var COMPS=[
{id:’mat’, name:’Material’, hex:’#3b82f6′},
{id:’mach’, name:’Machine time’, hex:’#7c3aed’},
{id:’labor’,name:’Labor’, hex:’#0d9488′},
{id:’scrap’,name:’Scrap loss’, hex:’#ef4444′},
{id:’oh’, name:’Overhead’, hex:’#d97706′},
{id:’mold’, name:’Mold amor.’, hex:’#6b7280′}
];function calcCosts(p){
var cav=Math.max(p.cav,1);
var runnerPc=p.rwt/cav;
var mat=(p.pwt/1000)*p.mp+(runnerPc/1000)*p.mp*(1-p.reg/100);
var mach=(p.mr/3600)*(p.ct/cav);
var labor=(p.lr/3600)*(p.ct/cav);
var scrF=p.scr>=100?999:p.scr/100/Math.max(1-p.scr/100,0.001);
var varBase=mat+mach+labor;
var scrap=varBase*scrF;
var oh=(varBase+scrap)*(p.oh/100);
var mold=p.mold||0;
var total=varBase+scrap+oh+mold;
return{mat:mat,mach:mach,labor:labor,scrap:scrap,oh:oh,mold:mold,total:total,varBase:varBase};
}function fmtC(n){
if(n<0.01)return '$'+n.toFixed(5);
if(n<0.1)return '$'+n.toFixed(4);
if(n<1)return '$'+n.toFixed(4);
return '$'+n.toFixed(3);
}
function fmtD(n){
var abs=Math.abs(n);
var s=(n<0?'-':'+');
if(abs<0.00001)return '—';
return s+(abs*100).toFixed(3)+'c';
}function drawWaterfall(costs,wiCosts){
var svg=el('imcWfSvg');
if(!svg)return;
var W=800,H=88,pL=4,pT=22,pB=20,gap=2;
var cW=W-pL*2;
var barH=H-pT-pB;
var total=costs.total||1;
var html='';
var x=pL;
for(var i=0;i<COMPS.length;i++){
var c=COMPS[i];
var v=costs[c.id];
if(v<=0)continue;
var w=Math.max(v/total*cW-gap,6);
var cx=(x+w/2).toFixed(1);
html+='’;
if(w>30){
var pv=Math.round(v/total*100);
html+=”+pv+’%’;
}
html+=”+c.name.split(‘ ‘)[0]+”;
if(wiOn&&wiCosts){
var wv=wiCosts[c.id];
var ww=Math.max(wv/total*cW-gap,6);
if(Math.abs(ww-w)>2){
var barCol=ww<w?'#22c55e':'#ef4444';
html+='’;
}
}
var lx=(x+w/2).toFixed(1);
html+=”+fmtC(v)+”;
x+=w+gap;
}
svg.innerHTML=html;
}function renderComps(costs,wiCosts){
var total=costs.total||1;
var ranked=COMPS.slice().sort(function(a,b){return costs[b.id]-costs[a.id];});
var html=”;
for(var i=0;i<COMPS.length;i++){
var c=COMPS[i];
var v=costs[c.id];
var pct=Math.round(v/total*100);
var rank=1;
for(var j=0;j<ranked.length;j++){if(ranked[j].id===c.id){rank=j+1;break;}}
var rankBg='',rankColor='var(–hi)';
if(rank===1){rankBg=c.hex;rankColor='#fff';}
else if(rank0.000001){
var dcls=d<0?'dn':'up';
var arrow=d<0?'↓':'↑';
deltaHtml='
COST BREAKDOWN v2
Unit Cost Breakdown & What-If Analyzer
liveMaterial & product
Part weight (g)
g
Runner weight (g/shot)
g
Total per shot, shared across all cavities
Material price (USD/kg)
$/kg
Regrind recovery (%)
60%
Runner recovered at 60% of virgin price
Machine & process
Machine rate (USD/hr)
$/hr
Labor rate (USD/hr)
$/hr
Set 0 for fully automated cell
Cycle time (s/shot)
s
Number of cavities
cav
Quality & overhead
Scrap / defect rate (%)
2.0%
World-class: <0.5% · Typical: 1–3% · Poor: >5%
Overhead / admin rate (%)
18%
Covers facility, utilities, admin on top of variable costs
Mold amortization (USD/pc)
$/pc
Mold cost ÷ lifetime parts. Set 0 to exclude.
Unit cost per good part
0.2543USD/pc
Cost / 1K pcs
$254
Output
4/shot
Pcs/hr
514
Mat% of total
22%
Cost composition — proportional waterfall
Optimization opportunities — ranked by cost impact
Cycle time
Base: 28s
28s
Cavities
Base: 4
4
Part weight
Base: 25g
25g
Material price
Base: $2.20/kg
$2.2
Scrap rate
Base: 2.0%
2.0%
Machine rate
Base: $65/hr
$65
‘+arrow+’ ‘+(Math.abs(d)*100).toFixed(3)+’¢
‘;
}
}
html+=’‘
+’‘
+’
‘;
}
el(‘imcComps’).innerHTML=html;
}function renderOpps(costs){
var ranked=COMPS.slice().filter(function(c){return costs[c.id]>0.000001;})
.sort(function(a,b){return costs[b.id]-costs[a.id];});
var actions={
mat:[‘Reduce part weight or resin cost’,’Each gram off saves ‘+(costs.mat/st.pwt*100).toFixed(3)+’c/pc. Run wall thickness audit or switch to an equivalent-MFI grade with lower price.’],
mach:[‘Reduce cycle time or increase cavity count’,’Rule of thumb: -10% cycle = -10% machine cost. Adding cavities divides press time per part — assess tooling ROI.’],
labor:[‘Automate or share operator across presses’,’Take-out robot typically pays back in under 18 months at this labor rate. One operator across two presses halves this cost line.’],
scrap:[‘Improve first-pass yield’,’Each 1pp reduction saves ‘+(costs.varBase*0.01/(1-Math.min(st.scr/100,0.99))*100).toFixed(2)+’c/pc. Prioritize SPC on top-3 defect modes.’],
oh:[‘Increase throughput to dilute fixed overhead’,’Overhead per unit drops as volume rises. Doubling annual output can reduce this line by 30-40%.’],
mold:[‘Extend mold life to amortize over more parts’,’Preventive maintenance every 100K shots typically adds 20-30% to mold service life.’]
};
var html=”;
for(var i=0;i<Math.min(ranked.length,4);i++){
var c=ranked[i];
var act=actions[c.id];
if(!act)continue;
var save10=fmtC(costs[c.id]*0.10);
html+='‘
+’‘
+’‘+c.name+’‘
+’#’+rank+’‘
+’
‘
+’‘+fmtC(v)+’
‘
+’‘+pct+’% of total
‘
+deltaHtml
+’‘
+’#’+(i+1)+’‘
+’‘
+’
‘;
}
el(‘imcOpps’).innerHTML=html;
}function renderCmpTable(base,wiC){
var cmpEl=el(‘imcCmpTable’);
if(!wiOn||!wiC){cmpEl.innerHTML=”;return;}
var html=’‘
+’
‘
+’‘+act[0]+’ (‘+c.name+’)
‘
+’‘+act[1]+’
‘
+’‘+save10+’/pc
per 10% cut
‘
+’per 10% cut
ComponentBaseWhat-ifDelta
‘;
for(var i=0;i<COMPS.length;i++){
var c=COMPS[i];
var b=base[c.id],w=wiC[c.id],d=w-b;
var dcls=d0.000001?’neg’:”;
html+=’‘
+’
‘;
}
var bd=base.total,wd=wiC.total,dd=wd-bd;
var dcls2=dd0.000001?’neg’:”;
html+=’‘+c.name+’
‘
+’‘+fmtC(b)+’
‘
+’‘+fmtC(w)+’
‘
+’‘+fmtD(d)+’
‘
+’‘
+’
‘;
cmpEl.innerHTML=html;
}function render(){
var costs=calcCosts(st);
var wiP=wiOn?{pwt:wi.pwt,rwt:st.rwt,mp:wi.mp,reg:st.reg,mr:wi.mr,lr:st.lr,ct:wi.ct,cav:wi.cav,scr:wi.scr,oh:st.oh,mold:st.mold}:null;
var wiC=wiP?calcCosts(wiP):null;el(‘imcTotal’).textContent=costs.total.toFixed(4);
el(‘imcPer1k’).textContent=’$’+Math.round(costs.total*1000).toLocaleString();
var pph=Math.round(Math.max(st.cav,1)*3600/Math.max(st.ct,1));
el(‘imcOut’).textContent=Math.max(st.cav,1)+’/shot’;
el(‘imcPph’).textContent=pph.toLocaleString();
el(‘imcMatPct’).textContent=Math.round(costs.mat/costs.total*100)+’%’;drawWaterfall(costs,wiC);
renderComps(costs,wiC);
renderOpps(costs);
renderCmpTable(costs,wiC);var alerts=[];
var matPct=costs.mat/costs.total*100;
var machPct=costs.mach/costs.total*100;
if(matPct>55)alerts.push({c:’ai’,i:’i’,m:’Material is ‘+Math.round(matPct)+’% of unit cost. A 10% weight reduction saves ‘+fmtC(costs.mat*0.10)+’/pc — run a wall-thickness audit first.’});
if(machPct>45)alerts.push({c:’aw’,i:’!’,m:’Machine time dominates at ‘+Math.round(machPct)+’%. Cycle reduction or higher cavity count will have the best ROI at $’+st.mr+’/hr.’});
if(st.scr>5)alerts.push({c:’ae’,i:’X’,m:’Scrap rate ‘+st.scr+’% is high — investigate top defect modes before using this as a quoted cost basis.’});
if(st.cavcosts.mat)alerts.push({c:’at’,i:’i’,m:’Single cavity: machine cost exceeds material cost. A 2-cavity tool would halve machine cost per part.’});
if(st.mold>0&&st.mold/costs.total>0.15)alerts.push({c:’aw’,i:’!’,m:’Mold amortization is ‘+Math.round(st.mold/costs.total*100)+’% of unit cost — volume is low. Consider a prototype tool or increase run quantities.’});
if(wiOn&&wiC){
var d=wiC.total-costs.total;
if(Math.abs(d)>0.000001){
var yr1M=Math.round(Math.abs(d)*1000000);
var cls=d<0?'ao':'aw';
alerts.push({c:cls,i:d<0?'$':'!',m:'What-if '+(d<0?'reduces':'increases')+' unit cost by '+(Math.abs(d)*100).toFixed(3)+'¢/pc ('+Math.round(Math.abs(d)/costs.total*100)+'%). At 1M pcs/year: $'+yr1M.toLocaleString()+'/yr.'});
}
}
if(alerts.length===0)alerts.push({c:'ao',i:'OK',m:'Parameters look balanced. Use the What-if toggle to model improvement scenarios.'});
var aHtml='';
for(var i=0;i<alerts.length;i++){
aHtml+='TOTAL
‘
+’‘+fmtC(bd)+’
‘
+’‘+fmtC(wd)+’
‘
+’‘+fmtD(dd)+’
‘
+’‘+alerts[i].i+’‘+alerts[i].m+’
‘;
}
el(‘imcAlerts’).innerHTML=aHtml;
el(‘imcTs’).textContent=’updated ‘+new Date().toLocaleTimeString([],{hour:’2-digit’,minute:’2-digit’,second:’2-digit’});
}function syncWi(){
el(‘wiCt’).value=st.ct; el(‘wiCtOut’).textContent=st.ct+’s’; wi.ct=st.ct; el(‘wiCtBase’).textContent=’Base: ‘+st.ct+’s’;
el(‘wiCav’).value=st.cav; el(‘wiCavOut’).textContent=st.cav; wi.cav=st.cav; el(‘wiCavBase’).textContent=’Base: ‘+st.cav;
el(‘wiPwt’).value=st.pwt; el(‘wiPwtOut’).textContent=st.pwt+’g’; wi.pwt=st.pwt; el(‘wiPwtBase’).textContent=’Base: ‘+st.pwt+’g’;
el(‘wiMp’).value=st.mp; el(‘wiMpOut’).textContent=’$’+st.mp; wi.mp=st.mp; el(‘wiMpBase’).textContent=’Base: $’+st.mp+’/kg’;
el(‘wiScr’).value=st.scr; el(‘wiScrOut’).textContent=st.scr+’%’; wi.scr=st.scr; el(‘wiScrBase’).textContent=’Base: ‘+st.scr+’%’;
el(‘wiMr’).value=st.mr; el(‘wiMrOut’).textContent=’$’+st.mr; wi.mr=st.mr; el(‘wiMrBase’).textContent=’Base: $’+st.mr+’/hr’;
}
function updateWiBases(){
el(‘wiCtBase’).textContent=’Base: ‘+st.ct+’s’;
el(‘wiCavBase’).textContent=’Base: ‘+st.cav;
el(‘wiPwtBase’).textContent=’Base: ‘+st.pwt+’g’;
el(‘wiMpBase’).textContent=’Base: $’+st.mp+’/kg’;
el(‘wiScrBase’).textContent=’Base: ‘+st.scr+’%’;
el(‘wiMrBase’).textContent=’Base: $’+st.mr+’/hr’;
}var numFields=[
{id:’imcPwt’,key:’pwt’},{id:’imcRwt’,key:’rwt’},{id:’imcMp’,key:’mp’},
{id:’imcMr’,key:’mr’},{id:’imcLr’,key:’lr’},{id:’imcCt’,key:’ct’},
{id:’imcCav’,key:’cav’},{id:’imcMold’,key:’mold’}
];
for(var ni=0;ni<numFields.length;ni++){
(function(f){
var inp=el(f.id);
if(!inp)return;
inp.addEventListener('input',function(e){
var v=parseFloat(e.target.value);
if(isNaN(v)||v<0)return;
st[f.key]=v;
if(wiOn)updateWiBases();
render();
});
})(numFields[ni]);
}if(el('imcReg')){
el('imcReg').addEventListener('input',function(e){
st.reg=parseFloat(e.target.value);
el('imcRegOut').textContent=st.reg+'%';
el('imcRegHint').textContent='Runner recovered at '+st.reg+'% of virgin price';
render();
});
}
if(el('imcScr')){
el('imcScr').addEventListener('input',function(e){
st.scr=parseFloat(e.target.value);
el('imcScrOut').textContent=st.scr.toFixed(1)+'%';
if(wiOn)updateWiBases();
render();
});
}
if(el('imcOh')){
el('imcOh').addEventListener('input',function(e){
st.oh=parseFloat(e.target.value);
el('imcOhOut').textContent=st.oh+'%';
render();
});
}var qbs=wrap.querySelectorAll('.imc-qb');
for(var qi=0;qi<qbs.length;qi++){
(function(b){
b.addEventListener('click',function(){
var t=b.dataset.t,v=parseFloat(b.dataset.v);
if(isNaN(v))return;
st[t]=v;
var inp=el('imc'+t.charAt(0).toUpperCase()+t.slice(1));
if(inp)inp.value=v;
if(wiOn)updateWiBases();
render();
});
})(qbs[qi]);
}if(el('imcWiBtn')){
el('imcWiBtn').addEventListener('click',function(){
wiOn=!wiOn;
this.classList.toggle('on',wiOn);
el('imcWiPanel').classList.toggle('show',wiOn);
if(wiOn)syncWi();
render();
});
}var wiDefs=[
{id:'wiCt',key:'ct',out:'wiCtOut',fmt:function(v){return v+'s';}},
{id:'wiCav',key:'cav',out:'wiCavOut',fmt:function(v){return ''+v;}},
{id:'wiPwt',key:'pwt',out:'wiPwtOut',fmt:function(v){return v+'g';}},
{id:'wiMp',key:'mp',out:'wiMpOut',fmt:function(v){return '$'+v;}},
{id:'wiScr',key:'scr',out:'wiScrOut',fmt:function(v){return v+'%';}},
{id:'wiMr',key:'mr',out:'wiMrOut',fmt:function(v){return '$'+v;}}
];
for(var wi2=0;wi2<wiDefs.length;wi2++){
(function(d){
var inp=el(d.id);
if(!inp)return;
inp.addEventListener('input',function(e){
wi[d.key]=parseFloat(e.target.value);
el(d.out).textContent=d.fmt(wi[d.key]);
render();
});
})(wiDefs[wi2]);
}render();
})();

