{"id":24993,"date":"2026-10-28T01:34:16","date_gmt":"2026-10-28T01:34:16","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24993"},"modified":"2026-10-28T01:45:26","modified_gmt":"2026-10-28T01:45:26","slug":"material-density-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/pt\/material-density-calculator\/","title":{"rendered":"Material Density Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Material Density Calculator<\/strong> is a free online tool designed to help engineers, manufacturers, and material professionals accurately calculate density, mass, volume, and material weight. By entering mass, volume, or material dimensions, users can quickly obtain precise results with automatic unit conversions. This calculator supports various materials, including steel, stainless steel, aluminum, copper, plastics, and alloys. Ideal for metal fabrication, mechanical engineering, material selection, and industrial manufacturing, the Material Density Calculator simplifies material calculations, improves production planning, and helps estimate material requirements efficiently.<\/p>\n\n\n\n<iframe class=\"mdc-frame skip-lazy no-lazyload\" data-no-lazy=\"1\" data-skip-lazy=\"1\" title=\"Material Density Calculator\" scrolling=\"no\" style=\"display:block !important;width:100% !important;max-width:1200px !important;height:900px;border:0 !important;margin:0 auto !important;padding:0 !important;overflow:hidden;background:transparent;float:none !important\" srcdoc=\"&lt;!DOCTYPE html&gt;&#10;&lt;html lang=&quot;en&quot;&gt;&#10;&lt;head&gt;&#10;&lt;meta charset=&quot;UTF-8&quot;&gt;&#10;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;&#10;&lt;title&gt;Material Density Calculator&lt;\/title&gt;&#10;&lt;style&gt;&#10;\/* =====================================================================&#10;   Material Density Calculator \u2014 all selectors scoped under .mdc-root&#10;   so the calculator never changes how the rest of a WordPress page looks.&#10;   ===================================================================== *\/&#10;.mdc-root{&#10;  --mdc-blue:#1e3a8a;--mdc-blue-2:#1d4ed8;--mdc-blue-soft:#e8eefb;--mdc-blue-line:#c7d4f0;&#10;  --mdc-bg:#f3f5f8;--mdc-card:#ffffff;--mdc-text:#1f2937;--mdc-heading:#111827;--mdc-muted:#5b6574;&#10;  --mdc-border:#d6dce5;--mdc-field:#fbfcfe;--mdc-danger:#b42318;--mdc-danger-bg:#fef3f2;&#10;  --mdc-ok:#067647;--mdc-ok-bg:#ecfdf3;--mdc-warn:#b54708;--mdc-warn-bg:#fffaeb;--mdc-dim:#c2410c;&#10;  --mdc-radius:12px;--mdc-shadow:0 1px 2px rgba(16,24,40,.06),0 6px 16px rgba(16,24,40,.06);&#10;  font-family:system-ui,-apple-system,&quot;Segoe UI&quot;,Roboto,&quot;Helvetica Neue&quot;,Arial,&quot;Noto Sans&quot;,sans-serif;&#10;  font-size:16px;line-height:1.55;color:var(--mdc-text);background:var(--mdc-bg);&#10;  max-width:1200px;margin:0 auto;padding:28px 16px 36px;text-align:left;border-radius:16px;&#10;  -webkit-text-size-adjust:100%;&#10;}&#10;.mdc-root *,.mdc-root *::before,.mdc-root *::after{box-sizing:border-box}&#10;.mdc-root [hidden]{display:none !important}&#10;.mdc-root h1,.mdc-root h2,.mdc-root h3,.mdc-root h4{font-family:inherit;color:var(--mdc-heading);line-height:1.25;margin:0 0 .5em;padding:0;letter-spacing:normal;text-transform:none;font-weight:700;border:0;background:none}&#10;.mdc-root h1{font-size:clamp(1.65rem,3.2vw,2.25rem)}&#10;.mdc-root h2{font-size:clamp(1.25rem,2.2vw,1.5rem)}&#10;.mdc-root h3{font-size:1.08rem}&#10;.mdc-root h4{font-size:.88rem;color:var(--mdc-muted);font-weight:700;margin:0 0 .45em}&#10;.mdc-root p{margin:0 0 .85em;padding:0}&#10;.mdc-root ul,.mdc-root ol{margin:0 0 .9em;padding-left:1.35em}&#10;.mdc-root li{margin:0 0 .35em}&#10;.mdc-root a{color:var(--mdc-blue-2)}&#10;.mdc-root strong{font-weight:700}&#10;.mdc-root code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.92em;background:var(--mdc-blue-soft);padding:1px 5px;border-radius:4px;color:var(--mdc-blue)}&#10;&#10;\/* ---------- layout ---------- *\/&#10;.mdc-root .mdc-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:22px;align-items:start}&#10;.mdc-root .mdc-card{background:var(--mdc-card);border:1px solid var(--mdc-border);border-radius:var(--mdc-radius);box-shadow:var(--mdc-shadow);padding:22px}&#10;.mdc-root .mdc-card + .mdc-card{margin-top:0}&#10;.mdc-root .mdc-section{margin-top:22px}&#10;.mdc-root .mdc-card-title{display:flex;align-items:center;gap:10px;margin-bottom:14px}&#10;.mdc-root .mdc-card-title h2{margin:0}&#10;.mdc-root .mdc-icon{width:22px;height:22px;flex:0 0 auto;color:var(--mdc-blue)}&#10;&#10;\/* ---------- mode switch ---------- *\/&#10;.mdc-root .mdc-modes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;background:#e9edf4;padding:4px;border-radius:10px;margin:0 0 6px;border:0}&#10;.mdc-root .mdc-modes legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}&#10;.mdc-root .mdc-mode{position:relative;display:block;margin:0;cursor:pointer}&#10;.mdc-root .mdc-mode input{position:absolute;opacity:0;width:1px;height:1px;margin:0}&#10;.mdc-root .mdc-mode span{display:block;text-align:center;padding:9px 6px;border-radius:8px;font-size:.88rem;font-weight:600;color:var(--mdc-muted);line-height:1.2;transition:background .15s,color .15s}&#10;.mdc-root .mdc-mode span small{display:block;font-weight:500;font-size:.74rem;opacity:.85;margin-top:2px}&#10;.mdc-root .mdc-mode:hover span{color:var(--mdc-blue)}&#10;.mdc-root .mdc-mode input:checked + span{background:#fff;color:var(--mdc-blue);box-shadow:0 1px 3px rgba(16,24,40,.12)}&#10;.mdc-root .mdc-mode input:focus-visible + span{outline:2px solid var(--mdc-blue-2);outline-offset:1px}&#10;.mdc-root .mdc-mode-hint{font-size:.88rem;color:var(--mdc-muted);margin:6px 2px 16px}&#10;&#10;\/* ---------- fieldsets &amp; fields ---------- *\/&#10;.mdc-root .mdc-set{border:1px solid var(--mdc-border);border-radius:10px;padding:14px 14px 4px;margin:0 0 14px;min-width:0;background:#fff}&#10;.mdc-root .mdc-set &gt; legend{font-weight:700;font-size:.92rem;color:var(--mdc-blue);padding:0 6px;margin:0;width:auto;border:0;float:none}&#10;.mdc-root .mdc-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 12px}&#10;.mdc-root .mdc-span2{grid-column:1 \/ -1}&#10;.mdc-root .mdc-field{margin:0 0 12px;min-width:0}&#10;.mdc-root .mdc-field &gt; label,.mdc-root .mdc-label{display:block;font-size:.86rem;font-weight:600;color:var(--mdc-text);margin:0 0 5px;line-height:1.3}&#10;.mdc-root .mdc-inline{display:flex;gap:8px;align-items:stretch}&#10;.mdc-root .mdc-inline .mdc-input{flex:1 1 auto;min-width:0}&#10;.mdc-root .mdc-inline .mdc-unit{flex:0 0 auto;width:auto;min-width:96px;max-width:46%}&#10;.mdc-root .mdc-input,.mdc-root .mdc-select{&#10;  display:block;width:100%;height:42px;margin:0;padding:8px 12px;font:inherit;font-size:15px;line-height:1.3;color:var(--mdc-text);&#10;  background-color:var(--mdc-field);border:1px solid var(--mdc-border);border-radius:8px;box-shadow:none;outline:none;&#10;  transition:border-color .15s,box-shadow .15s;max-width:none;min-height:0;text-transform:none;letter-spacing:normal}&#10;.mdc-root .mdc-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:32px;cursor:pointer;&#10;  background-image:url(&quot;data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%231e3a8a' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'\/%3E%3C\/svg%3E&quot;);&#10;  background-repeat:no-repeat;background-position:right 11px center;background-size:12px 8px}&#10;.mdc-root .mdc-input:hover,.mdc-root .mdc-select:hover{border-color:#b6c0ce}&#10;.mdc-root .mdc-input:focus,.mdc-root .mdc-select:focus{border-color:var(--mdc-blue-2);box-shadow:0 0 0 3px rgba(29,78,216,.18);background-color:#fff}&#10;.mdc-root .mdc-input.mdc-invalid{border-color:var(--mdc-danger);background-color:var(--mdc-danger-bg)}&#10;.mdc-root .mdc-input.mdc-invalid:focus{box-shadow:0 0 0 3px rgba(180,35,24,.15)}&#10;.mdc-root .mdc-err{color:var(--mdc-danger);font-size:.82rem;margin:5px 0 0;line-height:1.35}&#10;.mdc-root .mdc-help{color:var(--mdc-muted);font-size:.8rem;margin:5px 0 0;line-height:1.35}&#10;.mdc-root .mdc-suffix{position:relative}&#10;.mdc-root .mdc-suffix .mdc-input{padding-right:46px}&#10;.mdc-root .mdc-suffix-u{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:.82rem;color:var(--mdc-muted);pointer-events:none}&#10;.mdc-root .mdc-badge{display:inline-block;font-size:.72rem;font-weight:700;padding:2px 8px;border-radius:999px;margin-left:6px;vertical-align:1px;background:var(--mdc-blue-soft);color:var(--mdc-blue)}&#10;.mdc-root .mdc-badge.mdc-badge-warn{background:var(--mdc-warn-bg);color:var(--mdc-warn)}&#10;.mdc-root .mdc-badge.mdc-badge-ok{background:var(--mdc-ok-bg);color:var(--mdc-ok)}&#10;.mdc-root .mdc-shape-formula{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.85rem;background:var(--mdc-blue-soft);color:var(--mdc-blue);border-radius:8px;padding:8px 10px;margin:0 0 12px}&#10;&#10;\/* ---------- buttons ---------- *\/&#10;.mdc-root .mdc-btns{display:flex;flex-wrap:wrap;gap:10px;margin-top:6px}&#10;.mdc-root .mdc-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:42px;padding:0 16px;margin:0;font:inherit;font-size:.92rem;font-weight:650;line-height:1;&#10;  border-radius:8px;border:1px solid var(--mdc-border);background:#fff;color:var(--mdc-blue);cursor:pointer;text-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;&#10;  transition:background .15s,border-color .15s,color .15s;white-space:nowrap;width:auto;min-width:0}&#10;.mdc-root .mdc-btn svg{width:16px;height:16px;flex:0 0 auto}&#10;.mdc-root .mdc-btn:hover{background:var(--mdc-blue-soft);border-color:var(--mdc-blue-line);color:var(--mdc-blue)}&#10;.mdc-root .mdc-btn:focus-visible{outline:2px solid var(--mdc-blue-2);outline-offset:2px}&#10;.mdc-root .mdc-btn.mdc-btn-primary{background:var(--mdc-blue);border-color:var(--mdc-blue);color:#fff}&#10;.mdc-root .mdc-btn.mdc-btn-primary:hover{background:#172f73;border-color:#172f73;color:#fff}&#10;.mdc-root .mdc-btn.mdc-btn-sm{height:34px;padding:0 11px;font-size:.82rem}&#10;\/* Calculate button: centred, hardened against theme button\/float\/width rules *\/&#10;.mdc-root .mdc-calc-wrap{display:block !important;width:100% !important;text-align:center !important;margin:8px 0 0 !important;padding:0 !important;float:none !important;clear:both}&#10;.mdc-root .mdc-calc-wrap .mdc-btn{display:inline-flex !important;float:none !important;width:auto !important;min-width:180px;margin:0 auto !important;position:static !important;left:auto !important;right:auto !important}&#10;.mdc-root .mdc-examples{margin-top:14px;padding-top:12px;border-top:1px dashed var(--mdc-border)}&#10;.mdc-root .mdc-examples .mdc-label{margin-bottom:8px}&#10;.mdc-root .mdc-status{min-height:1.3em;font-size:.84rem;color:var(--mdc-ok);margin:10px 0 0}&#10;&#10;\/* ---------- results ---------- *\/&#10;.mdc-root .mdc-alert{border:1px solid #fecdca;background:var(--mdc-danger-bg);color:var(--mdc-danger);border-radius:10px;padding:12px 14px;margin:0 0 14px;font-size:.9rem}&#10;.mdc-root .mdc-alert ul{margin:6px 0 0;padding-left:1.2em}&#10;.mdc-root .mdc-primary{display:grid;gap:12px;margin-bottom:12px}&#10;.mdc-root .mdc-pcard{border-radius:12px;padding:16px 16px 14px;background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 100%);color:#fff}&#10;.mdc-root .mdc-pcard.mdc-pcard-alt{background:linear-gradient(135deg,#0f2a5f 0%,#1e3a8a 100%)}&#10;.mdc-root .mdc-pcard-head{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:6px}&#10;.mdc-root .mdc-pcard-label{font-size:.82rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;opacity:.92}&#10;.mdc-root .mdc-pcard .mdc-select{height:32px;width:auto;min-width:96px;font-size:13px;padding:4px 28px 4px 10px;background-color:rgba(255,255,255,.14);border-color:rgba(255,255,255,.35);color:#fff;&#10;  background-image:url(&quot;data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%23ffffff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'\/%3E%3C\/svg%3E&quot;)}&#10;.mdc-root .mdc-pcard .mdc-select option{color:#111827;background:#fff}&#10;.mdc-root .mdc-pcard .mdc-select:focus{box-shadow:0 0 0 3px rgba(255,255,255,.35)}&#10;.mdc-root .mdc-pcard-value{font-size:clamp(1.7rem,3.6vw,2.3rem);font-weight:800;line-height:1.15;word-break:break-word;font-variant-numeric:tabular-nums}&#10;.mdc-root .mdc-pcard-unit{font-size:.55em;font-weight:700;opacity:.92;margin-left:4px}&#10;.mdc-root .mdc-pcard-sub{font-size:.86rem;opacity:.9;margin-top:6px}&#10;.mdc-root .mdc-note{font-size:.84rem;color:var(--mdc-muted);background:#f6f8fb;border-left:3px solid var(--mdc-blue-line);padding:8px 11px;border-radius:0 8px 8px 0;margin:0 0 14px}&#10;.mdc-root .mdc-res-block{border-top:1px solid #e7ebf1;padding-top:14px;margin-top:14px}&#10;.mdc-root .mdc-res-block &gt; h3{display:flex;align-items:center;gap:8px}&#10;.mdc-root .mdc-eq-group{margin-bottom:12px}&#10;.mdc-root .mdc-eq-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:8px}&#10;.mdc-root .mdc-eq{border:1px solid #e3e8f0;border-radius:8px;padding:8px 10px;background:#fafbfd;min-width:0}&#10;.mdc-root .mdc-eq-v{display:block;font-weight:700;font-size:.95rem;word-break:break-word;font-variant-numeric:tabular-nums;color:var(--mdc-heading)}&#10;.mdc-root .mdc-eq-u{display:block;font-size:.78rem;color:var(--mdc-muted)}&#10;.mdc-root .mdc-formula{background:#0f1f45;color:#e6edff;border-radius:10px;padding:14px 16px}&#10;.mdc-root .mdc-formula-main{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:1.05rem;font-weight:700;margin-bottom:6px;word-break:break-word}&#10;.mdc-root .mdc-formula ul{margin:0;padding-left:1.1em;font-size:.84rem;color:#c3d0f2}&#10;.mdc-root .mdc-formula li{margin:2px 0}&#10;.mdc-root .mdc-steps{counter-reset:mdcstep;list-style:none;padding:0;margin:0}&#10;.mdc-root .mdc-steps li{counter-increment:mdcstep;position:relative;padding:3px 0 7px 34px;font-size:.9rem;word-break:break-word}&#10;.mdc-root .mdc-steps li::before{content:counter(mdcstep);position:absolute;left:0;top:2px;width:23px;height:23px;border-radius:50%;background:var(--mdc-blue-soft);color:var(--mdc-blue);font-size:.76rem;font-weight:700;display:flex;align-items:center;justify-content:center}&#10;.mdc-root .mdc-dl{display:grid;grid-template-columns:minmax(120px,40%) 1fr;gap:0;margin:0;font-size:.89rem;border:1px solid #e7ebf1;border-radius:8px;overflow:hidden}&#10;.mdc-root .mdc-dl dt,.mdc-root .mdc-dl dd{margin:0;padding:7px 10px;border-bottom:1px solid #eef1f5;word-break:break-word}&#10;.mdc-root .mdc-dl dt{font-weight:600;color:var(--mdc-muted);background:#fafbfd}&#10;.mdc-root .mdc-dl dt:last-of-type,.mdc-root .mdc-dl dd:last-of-type{border-bottom:0}&#10;.mdc-root .mdc-matches{list-style:none;padding:0;margin:8px 0 0}&#10;.mdc-root .mdc-matches li{display:flex;justify-content:space-between;gap:10px;padding:6px 10px;border:1px solid #e7ebf1;border-radius:8px;margin-bottom:6px;font-size:.88rem}&#10;.mdc-root .mdc-shape-box{border:1px solid #e3e8f0;border-radius:10px;background:linear-gradient(180deg,#fbfcfe,#f2f5fa);padding:10px}&#10;.mdc-root .mdc-small{font-size:.8rem;color:var(--mdc-muted);margin:8px 0 0}&#10;&#10;\/* ---------- responsive ---------- *\/&#10;@media (max-width:960px){&#10;  .mdc-root .mdc-grid{grid-template-columns:minmax(0,1fr)}&#10;}&#10;@media (max-width:560px){&#10;  .mdc-root{padding:20px 12px 28px;border-radius:0}&#10;  .mdc-root .mdc-card{padding:16px}&#10;  .mdc-root .mdc-modes{grid-template-columns:repeat(2,minmax(0,1fr))}&#10;  .mdc-root .mdc-row{grid-template-columns:minmax(0,1fr)}&#10;  .mdc-root .mdc-btns .mdc-btn{flex:1 1 auto}&#10;  .mdc-root .mdc-dl{grid-template-columns:minmax(0,1fr)}&#10;  .mdc-root .mdc-dl dt{border-bottom:0;padding-bottom:2px}&#10;}&#10;@media (prefers-reduced-motion:reduce){&#10;  .mdc-root *{transition:none !important}&#10;}&#10;html,body{margin:0;padding:0;background:transparent}&#10;&lt;\/style&gt;&#10;&lt;\/head&gt;&#10;&lt;body&gt;&#10;&#10;&lt;div class=&quot;mdc-root&quot; id=&quot;mdc-app&quot;&gt;&#10;&#10;  &lt;div class=&quot;mdc-grid&quot;&gt;&#10;&#10;    &lt;!-- ================= INPUT PANEL ================= --&gt;&#10;    &lt;section class=&quot;mdc-card&quot; aria-labelledby=&quot;mdc-inputs-title&quot;&gt;&#10;      &lt;div class=&quot;mdc-card-title&quot;&gt;&#10;        &lt;svg class=&quot;mdc-icon&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.8&quot; stroke-linecap=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 6h10M18 6h2M4 12h4M12 12h8M4 18h12M20 18h0&quot;\/&gt;&lt;circle cx=&quot;16&quot; cy=&quot;6&quot; r=&quot;2&quot;\/&gt;&lt;circle cx=&quot;10&quot; cy=&quot;12&quot; r=&quot;2&quot;\/&gt;&lt;circle cx=&quot;18&quot; cy=&quot;18&quot; r=&quot;2&quot;\/&gt;&lt;\/svg&gt;&#10;        &lt;h2 id=&quot;mdc-inputs-title&quot;&gt;Calculation Inputs&lt;\/h2&gt;&#10;      &lt;\/div&gt;&#10;&#10;      &lt;form id=&quot;mdc-form&quot; novalidate autocomplete=&quot;off&quot;&gt;&#10;        &lt;fieldset class=&quot;mdc-modes&quot;&gt;&#10;          &lt;legend&gt;Calculation mode&lt;\/legend&gt;&#10;          &lt;label class=&quot;mdc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;mdc-mode&quot; value=&quot;density&quot; checked&gt;&lt;span&gt;Density&lt;small&gt;\u03c1 = m \/ V&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;          &lt;label class=&quot;mdc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;mdc-mode&quot; value=&quot;mass&quot;&gt;&lt;span&gt;Mass&lt;small&gt;m = \u03c1 \u00d7 V&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;          &lt;label class=&quot;mdc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;mdc-mode&quot; value=&quot;volume&quot;&gt;&lt;span&gt;Volume&lt;small&gt;V = m \/ \u03c1&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;          &lt;label class=&quot;mdc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;mdc-mode&quot; value=&quot;geometry&quot;&gt;&lt;span&gt;Shape Weight&lt;small&gt;Geometry&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;        &lt;\/fieldset&gt;&#10;        &lt;p class=&quot;mdc-mode-hint&quot; id=&quot;mdc-mode-hint&quot;&gt;&lt;\/p&gt;&#10;&#10;        &lt;!-- Material selection --&gt;&#10;        &lt;fieldset class=&quot;mdc-set&quot; id=&quot;mdc-material-set&quot;&gt;&#10;          &lt;legend&gt;Material&lt;\/legend&gt;&#10;          &lt;div class=&quot;mdc-row&quot;&gt;&#10;            &lt;div class=&quot;mdc-field&quot;&gt;&#10;              &lt;label for=&quot;mdc-mat-cat&quot;&gt;Material category&lt;\/label&gt;&#10;              &lt;select id=&quot;mdc-mat-cat&quot; class=&quot;mdc-select&quot;&gt;&#10;                &lt;option value=&quot;all&quot;&gt;All categories&lt;\/option&gt;&#10;                &lt;option value=&quot;carbon&quot;&gt;Carbon Steel&lt;\/option&gt;&#10;                &lt;option value=&quot;stainless&quot;&gt;Stainless Steel&lt;\/option&gt;&#10;                &lt;option value=&quot;aluminum&quot;&gt;Aluminum&lt;\/option&gt;&#10;                &lt;option value=&quot;copper&quot;&gt;Copper &amp;amp; Copper Alloys&lt;\/option&gt;&#10;                &lt;option value=&quot;metals&quot;&gt;Other Metals&lt;\/option&gt;&#10;                &lt;option value=&quot;plastics&quot;&gt;Plastics&lt;\/option&gt;&#10;                &lt;option value=&quot;other&quot;&gt;Other Materials&lt;\/option&gt;&#10;                &lt;option value=&quot;custom&quot;&gt;Custom Material&lt;\/option&gt;&#10;              &lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-field&quot;&gt;&#10;              &lt;label for=&quot;mdc-mat-search&quot;&gt;Search materials&lt;\/label&gt;&#10;              &lt;input id=&quot;mdc-mat-search&quot; class=&quot;mdc-input&quot; type=&quot;search&quot; placeholder=&quot;e.g. 316, brass, PTFE&quot; aria-describedby=&quot;mdc-mat-count&quot;&gt;&#10;              &lt;p class=&quot;mdc-help&quot; id=&quot;mdc-mat-count&quot; aria-live=&quot;polite&quot;&gt;&lt;\/p&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-field mdc-span2&quot;&gt;&#10;              &lt;label for=&quot;mdc-material&quot;&gt;Material selection&lt;\/label&gt;&#10;              &lt;select id=&quot;mdc-material&quot; class=&quot;mdc-select&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-field mdc-span2&quot; id=&quot;mdc-custom-wrap&quot; hidden&gt;&#10;              &lt;label for=&quot;mdc-custom-name&quot;&gt;Custom material name&lt;\/label&gt;&#10;              &lt;input id=&quot;mdc-custom-name&quot; class=&quot;mdc-input&quot; type=&quot;text&quot; maxlength=&quot;60&quot; placeholder=&quot;e.g. Cast iron sample A&quot;&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-field mdc-span2&quot;&gt;&#10;              &lt;label for=&quot;mdc-density&quot;&gt;Material density (\u03c1) &lt;span class=&quot;mdc-badge&quot; id=&quot;mdc-density-badge&quot;&gt;Reference value&lt;\/span&gt;&lt;\/label&gt;&#10;              &lt;div class=&quot;mdc-inline&quot;&gt;&#10;                &lt;input id=&quot;mdc-density&quot; class=&quot;mdc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;mdc-density-err mdc-density-help&quot;&gt;&#10;                &lt;select id=&quot;mdc-density-unit&quot; class=&quot;mdc-select mdc-unit&quot; data-mdc-units=&quot;density&quot; data-mdc-for=&quot;mdc-density&quot; aria-label=&quot;Density unit&quot;&gt;&lt;\/select&gt;&#10;              &lt;\/div&gt;&#10;              &lt;p class=&quot;mdc-err&quot; id=&quot;mdc-density-err&quot; hidden&gt;&lt;\/p&gt;&#10;              &lt;p class=&quot;mdc-help&quot; id=&quot;mdc-density-help&quot;&gt;Preset values are approximate references and can be edited.&lt;\/p&gt;&#10;            &lt;\/div&gt;&#10;          &lt;\/div&gt;&#10;        &lt;\/fieldset&gt;&#10;&#10;        &lt;!-- Mass &amp; volume --&gt;&#10;        &lt;fieldset class=&quot;mdc-set&quot; id=&quot;mdc-qty-set&quot;&gt;&#10;          &lt;legend&gt;Known quantities&lt;\/legend&gt;&#10;          &lt;div class=&quot;mdc-field&quot; id=&quot;mdc-mass-wrap&quot;&gt;&#10;            &lt;label for=&quot;mdc-mass&quot;&gt;Mass (m)&lt;\/label&gt;&#10;            &lt;div class=&quot;mdc-inline&quot;&gt;&#10;              &lt;input id=&quot;mdc-mass&quot; class=&quot;mdc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;mdc-mass-err&quot;&gt;&#10;              &lt;select id=&quot;mdc-mass-unit&quot; class=&quot;mdc-select mdc-unit&quot; data-mdc-units=&quot;mass&quot; data-mdc-for=&quot;mdc-mass&quot; aria-label=&quot;Mass unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;p class=&quot;mdc-err&quot; id=&quot;mdc-mass-err&quot; hidden&gt;&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;          &lt;div class=&quot;mdc-field&quot; id=&quot;mdc-volume-wrap&quot;&gt;&#10;            &lt;label for=&quot;mdc-volume&quot;&gt;Volume (V)&lt;\/label&gt;&#10;            &lt;div class=&quot;mdc-inline&quot;&gt;&#10;              &lt;input id=&quot;mdc-volume&quot; class=&quot;mdc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;mdc-volume-err&quot;&gt;&#10;              &lt;select id=&quot;mdc-volume-unit&quot; class=&quot;mdc-select mdc-unit&quot; data-mdc-units=&quot;volume&quot; data-mdc-for=&quot;mdc-volume&quot; aria-label=&quot;Volume unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;p class=&quot;mdc-err&quot; id=&quot;mdc-volume-err&quot; hidden&gt;&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;        &lt;\/fieldset&gt;&#10;&#10;        &lt;!-- Geometry --&gt;&#10;        &lt;fieldset class=&quot;mdc-set&quot; id=&quot;mdc-shape-set&quot; hidden&gt;&#10;          &lt;legend&gt;Shape &amp;amp; dimensions&lt;\/legend&gt;&#10;          &lt;div class=&quot;mdc-row&quot;&gt;&#10;            &lt;div class=&quot;mdc-field&quot;&gt;&#10;              &lt;label for=&quot;mdc-shape&quot;&gt;Shape selection&lt;\/label&gt;&#10;              &lt;select id=&quot;mdc-shape&quot; class=&quot;mdc-select&quot;&gt;&#10;                &lt;option value=&quot;block&quot;&gt;Rectangular Block&lt;\/option&gt;&#10;                &lt;option value=&quot;cylinder&quot;&gt;Solid Cylinder&lt;\/option&gt;&#10;                &lt;option value=&quot;pipe&quot;&gt;Hollow Cylinder \/ Pipe&lt;\/option&gt;&#10;                &lt;option value=&quot;sphere&quot;&gt;Solid Sphere&lt;\/option&gt;&#10;                &lt;option value=&quot;hsphere&quot;&gt;Hollow Sphere&lt;\/option&gt;&#10;                &lt;option value=&quot;plate&quot;&gt;Flat Sheet \/ Plate&lt;\/option&gt;&#10;                &lt;option value=&quot;roundbar&quot;&gt;Round Bar&lt;\/option&gt;&#10;                &lt;option value=&quot;squarebar&quot;&gt;Square Bar&lt;\/option&gt;&#10;                &lt;option value=&quot;recttube&quot;&gt;Rectangular Tube&lt;\/option&gt;&#10;              &lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-field&quot;&gt;&#10;              &lt;label for=&quot;mdc-dim-unit&quot;&gt;Dimension unit&lt;\/label&gt;&#10;              &lt;select id=&quot;mdc-dim-unit&quot; class=&quot;mdc-select&quot; data-mdc-units=&quot;length&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;          &lt;\/div&gt;&#10;          &lt;div class=&quot;mdc-shape-formula&quot; id=&quot;mdc-shape-formula&quot; aria-live=&quot;polite&quot;&gt;&lt;\/div&gt;&#10;          &lt;div class=&quot;mdc-row&quot; id=&quot;mdc-dims&quot;&gt;&lt;\/div&gt;&#10;        &lt;\/fieldset&gt;&#10;&#10;        &lt;div class=&quot;mdc-calc-wrap&quot;&gt;&#10;          &lt;button type=&quot;submit&quot; class=&quot;mdc-btn mdc-btn-primary&quot; id=&quot;mdc-btn-calc&quot;&gt;Calculate&lt;\/button&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;mdc-examples&quot;&gt;&#10;          &lt;span class=&quot;mdc-label&quot;&gt;Built-in examples&lt;\/span&gt;&#10;          &lt;div class=&quot;mdc-btns&quot;&gt;&#10;            &lt;button type=&quot;button&quot; class=&quot;mdc-btn mdc-btn-sm&quot; data-mdc-example=&quot;1&quot;&gt;Ex. 1 \u00b7 Density (785 g \/ 100 cm\u00b3)&lt;\/button&gt;&#10;            &lt;button type=&quot;button&quot; class=&quot;mdc-btn mdc-btn-sm&quot; data-mdc-example=&quot;2&quot;&gt;Ex. 2 \u00b7 Steel mass (0.01 m\u00b3)&lt;\/button&gt;&#10;            &lt;button type=&quot;button&quot; class=&quot;mdc-btn mdc-btn-sm&quot; data-mdc-example=&quot;3&quot;&gt;Ex. 3 \u00b7 Sheet 2000\u00d71000\u00d75 mm&lt;\/button&gt;&#10;          &lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;        &lt;p class=&quot;mdc-status&quot; id=&quot;mdc-input-status&quot; role=&quot;status&quot; aria-live=&quot;polite&quot;&gt;&lt;\/p&gt;&#10;      &lt;\/form&gt;&#10;    &lt;\/section&gt;&#10;&#10;    &lt;!-- ================= RESULTS PANEL ================= --&gt;&#10;    &lt;section class=&quot;mdc-card&quot; aria-labelledby=&quot;mdc-results-title&quot; id=&quot;mdc-results&quot; tabindex=&quot;-1&quot; hidden&gt;&#10;      &lt;div class=&quot;mdc-card-title&quot;&gt;&#10;        &lt;svg class=&quot;mdc-icon&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.8&quot; stroke-linecap=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 20V10M10 20V4M16 20v-7M22 20H2&quot;\/&gt;&lt;\/svg&gt;&#10;        &lt;h2 id=&quot;mdc-results-title&quot;&gt;Results&lt;\/h2&gt;&#10;      &lt;\/div&gt;&#10;&#10;      &lt;div class=&quot;mdc-alert&quot; id=&quot;mdc-error&quot; role=&quot;alert&quot; hidden&gt;&lt;\/div&gt;&#10;&#10;      &lt;div id=&quot;mdc-result-body&quot;&gt;&#10;        &lt;div class=&quot;mdc-primary&quot; aria-live=&quot;polite&quot;&gt;&#10;          &lt;div class=&quot;mdc-pcard&quot; id=&quot;mdc-pc-density&quot;&gt;&#10;            &lt;div class=&quot;mdc-pcard-head&quot;&gt;&#10;              &lt;span class=&quot;mdc-pcard-label&quot; id=&quot;mdc-pl-density&quot;&gt;Calculated Density&lt;\/span&gt;&#10;              &lt;select id=&quot;mdc-res-density-unit&quot; class=&quot;mdc-select&quot; data-mdc-units=&quot;density&quot; aria-label=&quot;Density result unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-pcard-value&quot;&gt;&lt;span id=&quot;mdc-pv-density&quot;&gt;\u2014&lt;\/span&gt;&lt;span class=&quot;mdc-pcard-unit&quot; id=&quot;mdc-pu-density&quot;&gt;&lt;\/span&gt;&lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-pcard-sub&quot; id=&quot;mdc-ps-density&quot;&gt;&lt;\/div&gt;&#10;          &lt;\/div&gt;&#10;          &lt;div class=&quot;mdc-pcard&quot; id=&quot;mdc-pc-volume&quot;&gt;&#10;            &lt;div class=&quot;mdc-pcard-head&quot;&gt;&#10;              &lt;span class=&quot;mdc-pcard-label&quot; id=&quot;mdc-pl-volume&quot;&gt;Calculated Volume&lt;\/span&gt;&#10;              &lt;select id=&quot;mdc-res-volume-unit&quot; class=&quot;mdc-select&quot; data-mdc-units=&quot;volume&quot; data-mdc-auto=&quot;1&quot; aria-label=&quot;Volume result unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-pcard-value&quot;&gt;&lt;span id=&quot;mdc-pv-volume&quot;&gt;\u2014&lt;\/span&gt;&lt;span class=&quot;mdc-pcard-unit&quot; id=&quot;mdc-pu-volume&quot;&gt;&lt;\/span&gt;&lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-pcard-sub&quot; id=&quot;mdc-ps-volume&quot;&gt;&lt;\/div&gt;&#10;          &lt;\/div&gt;&#10;          &lt;div class=&quot;mdc-pcard mdc-pcard-alt&quot; id=&quot;mdc-pc-mass&quot;&gt;&#10;            &lt;div class=&quot;mdc-pcard-head&quot;&gt;&#10;              &lt;span class=&quot;mdc-pcard-label&quot; id=&quot;mdc-pl-mass&quot;&gt;Calculated Mass&lt;\/span&gt;&#10;              &lt;select id=&quot;mdc-res-mass-unit&quot; class=&quot;mdc-select&quot; data-mdc-units=&quot;mass&quot; data-mdc-auto=&quot;1&quot; aria-label=&quot;Mass result unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-pcard-value&quot;&gt;&lt;span id=&quot;mdc-pv-mass&quot;&gt;\u2014&lt;\/span&gt;&lt;span class=&quot;mdc-pcard-unit&quot; id=&quot;mdc-pu-mass&quot;&gt;&lt;\/span&gt;&lt;\/div&gt;&#10;            &lt;div class=&quot;mdc-pcard-sub&quot; id=&quot;mdc-ps-mass&quot;&gt;&lt;\/div&gt;&#10;          &lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;p class=&quot;mdc-note&quot; id=&quot;mdc-weight-note&quot; hidden&gt;In manufacturing and procurement, \u201cweight\u201d stated in kg or lb conventionally means &lt;strong&gt;mass&lt;\/strong&gt;. Physical weight is a force: F = m \u00d7 g, with standard gravity g = 9.80665 m\/s\u00b2, expressed in newtons (N).&lt;\/p&gt;&#10;&#10;        &lt;div class=&quot;mdc-res-block&quot;&gt;&#10;          &lt;h3&gt;Equivalent Unit Values&lt;\/h3&gt;&#10;          &lt;div id=&quot;mdc-equiv&quot;&gt;&lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;mdc-res-block&quot;&gt;&#10;          &lt;h3&gt;Calculation Formula&lt;\/h3&gt;&#10;          &lt;div class=&quot;mdc-formula&quot; id=&quot;mdc-formula&quot;&gt;&lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;mdc-res-block&quot;&gt;&#10;          &lt;h3&gt;Calculation Steps&lt;\/h3&gt;&#10;          &lt;ol class=&quot;mdc-steps&quot; id=&quot;mdc-steps&quot;&gt;&lt;\/ol&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;mdc-res-block&quot;&gt;&#10;          &lt;h3&gt;Input Summary&lt;\/h3&gt;&#10;          &lt;dl class=&quot;mdc-dl&quot; id=&quot;mdc-details&quot;&gt;&lt;\/dl&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;mdc-res-block&quot;&gt;&#10;          &lt;h3&gt;Material Information&lt;\/h3&gt;&#10;          &lt;div id=&quot;mdc-matinfo&quot;&gt;&lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;      &lt;\/div&gt;&#10;&#10;      &lt;div class=&quot;mdc-res-block&quot; id=&quot;mdc-shape-card&quot; hidden&gt;&#10;        &lt;h3&gt;Shape Illustration&lt;\/h3&gt;&#10;        &lt;div class=&quot;mdc-shape-box&quot; id=&quot;mdc-svg&quot;&gt;&lt;\/div&gt;&#10;        &lt;p class=&quot;mdc-small&quot;&gt;Geometric formulas represent ideal shapes. They do not account for manufacturing tolerances, corner radii, holes, coatings, or material defects unless these are explicitly modeled.&lt;\/p&gt;&#10;      &lt;\/div&gt;&#10;&#10;    &lt;\/section&gt;&#10;  &lt;\/div&gt;&#10;&#10;&lt;\/div&gt;&#10;&#10;&lt;script&gt;&#10;\/* =====================================================================&#10;   Material Density Calculator \u2014 Vanilla JavaScript&#10;   Everything is wrapped in an IIFE so no global variables are created.&#10;   Internal calculations use SI base units: kg, m\u00b3, kg\/m\u00b3, m.&#10;   ===================================================================== *\/&#10;(function () {&#10;  'use strict';&#10;&#10;  var root = document.getElementById('mdc-app');&#10;  if (!root || root.getAttribute('data-mdc-ready') === '1') return;&#10;  root.setAttribute('data-mdc-ready', '1');&#10;&#10;  function $(id) { return document.getElementById(id); }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     1. Constants and unit definitions (factor f converts to SI)&#10;     ------------------------------------------------------------------ *\/&#10;  var G0 = 9.80665;                 \/\/ standard gravity, m\/s\u00b2&#10;  var LB_KG = 0.45359237;           \/\/ 1 lb in kg (exact)&#10;  var OZ_KG = 0.028349523125;       \/\/ 1 oz in kg (exact)&#10;  var IN3_M3 = 1.6387064e-5;        \/\/ 1 in\u00b3 in m\u00b3 (exact)&#10;  var FT3_M3 = 0.028316846592;      \/\/ 1 ft\u00b3 in m\u00b3 (exact)&#10;  var LBF_N = LB_KG * G0;           \/\/ 1 lbf in N&#10;  var WATER = 1000;                 \/\/ reference water density for specific gravity, kg\/m\u00b3&#10;&#10;  var UNITS = {&#10;    mass: [&#10;      { k: 'mg', name: 'mg', sym: 'mg', f: 1e-6 },&#10;      { k: 'g', name: 'g', sym: 'g', f: 1e-3 },&#10;      { k: 'kg', name: 'kg', sym: 'kg', f: 1 },&#10;      { k: 't', name: 't (metric ton)', sym: 't', f: 1000 },&#10;      { k: 'oz', name: 'oz', sym: 'oz', f: OZ_KG },&#10;      { k: 'lb', name: 'lb', sym: 'lb', f: LB_KG }&#10;    ],&#10;    volume: [&#10;      { k: 'mm3', name: 'mm\u00b3', sym: 'mm\u00b3', f: 1e-9 },&#10;      { k: 'cm3', name: 'cm\u00b3', sym: 'cm\u00b3', f: 1e-6 },&#10;      { k: 'm3', name: 'm\u00b3', sym: 'm\u00b3', f: 1 },&#10;      { k: 'mL', name: 'mL', sym: 'mL', f: 1e-6 },&#10;      { k: 'L', name: 'L', sym: 'L', f: 1e-3 },&#10;      { k: 'in3', name: 'in\u00b3', sym: 'in\u00b3', f: IN3_M3 },&#10;      { k: 'ft3', name: 'ft\u00b3', sym: 'ft\u00b3', f: FT3_M3 }&#10;    ],&#10;    density: [&#10;      { k: 'kgm3', name: 'kg\/m\u00b3', sym: 'kg\/m\u00b3', f: 1 },&#10;      { k: 'gcm3', name: 'g\/cm\u00b3', sym: 'g\/cm\u00b3', f: 1000 },&#10;      { k: 'gmL', name: 'g\/mL', sym: 'g\/mL', f: 1000 },&#10;      { k: 'kgL', name: 'kg\/L', sym: 'kg\/L', f: 1000 },&#10;      { k: 'lbft3', name: 'lb\/ft\u00b3', sym: 'lb\/ft\u00b3', f: LB_KG \/ FT3_M3 },&#10;      { k: 'lbin3', name: 'lb\/in\u00b3', sym: 'lb\/in\u00b3', f: LB_KG \/ IN3_M3 }&#10;    ],&#10;    length: [&#10;      { k: 'mm', name: 'Millimetres (mm)', sym: 'mm', f: 0.001 },&#10;      { k: 'cm', name: 'Centimetres (cm)', sym: 'cm', f: 0.01 },&#10;      { k: 'm', name: 'Metres (m)', sym: 'm', f: 1 },&#10;      { k: 'in', name: 'Inches (in)', sym: 'in', f: 0.0254 },&#10;      { k: 'ft', name: 'Feet (ft)', sym: 'ft', f: 0.3048 }&#10;    ],&#10;    force: [&#10;      { k: 'N', sym: 'N', f: 1 },&#10;      { k: 'kN', sym: 'kN', f: 1000 },&#10;      { k: 'lbf', sym: 'lbf', f: LBF_N }&#10;    ]&#10;  };&#10;&#10;  function unit(type, k) {&#10;    var list = UNITS[type];&#10;    for (var i = 0; i &lt; list.length; i++) if (list[i].k === k) return list[i];&#10;    return list[0];&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     2. Material density database (approximate reference values, kg\/m\u00b3)&#10;     ------------------------------------------------------------------ *\/&#10;  var CATS = [&#10;    { k: 'carbon', name: 'Carbon Steel' },&#10;    { k: 'stainless', name: 'Stainless Steel' },&#10;    { k: 'aluminum', name: 'Aluminum' },&#10;    { k: 'copper', name: 'Copper &amp; Copper Alloys' },&#10;    { k: 'metals', name: 'Other Metals' },&#10;    { k: 'plastics', name: 'Plastics' },&#10;    { k: 'other', name: 'Other Materials' }&#10;  ];&#10;  var CAT_NAME = { custom: 'Custom Material' };&#10;  CATS.forEach(function (c) { CAT_NAME[c.k] = c.name; });&#10;&#10;  var MATERIALS = [&#10;    { id: 'carbon-steel', name: 'Carbon Steel', cat: 'carbon', rho: 7850 },&#10;    { id: 'mild-steel', name: 'Mild Steel', cat: 'carbon', rho: 7850 },&#10;    { id: 'stainless-304', name: 'Stainless Steel 304', cat: 'stainless', rho: 7930 },&#10;    { id: 'stainless-316', name: 'Stainless Steel 316', cat: 'stainless', rho: 8000 },&#10;    { id: 'stainless-430', name: 'Stainless Steel 430', cat: 'stainless', rho: 7750 },&#10;    { id: 'aluminum-pure', name: 'Pure Aluminum', cat: 'aluminum', rho: 2700 },&#10;    { id: 'aluminum-6061', name: 'Aluminum 6061', cat: 'aluminum', rho: 2700 },&#10;    { id: 'aluminum-7075', name: 'Aluminum 7075', cat: 'aluminum', rho: 2810 },&#10;    { id: 'copper', name: 'Copper', cat: 'copper', rho: 8960 },&#10;    { id: 'brass', name: 'Brass', cat: 'copper', rho: 8500 },&#10;    { id: 'bronze', name: 'Bronze', cat: 'copper', rho: 8800 },&#10;    { id: 'titanium', name: 'Titanium', cat: 'metals', rho: 4500 },&#10;    { id: 'zinc', name: 'Zinc', cat: 'metals', rho: 7140 },&#10;    { id: 'nickel', name: 'Nickel', cat: 'metals', rho: 8900 },&#10;    { id: 'lead', name: 'Lead', cat: 'metals', rho: 11340 },&#10;    { id: 'tungsten', name: 'Tungsten', cat: 'metals', rho: 19300 },&#10;    { id: 'magnesium', name: 'Magnesium', cat: 'metals', rho: 1740 },&#10;    { id: 'pvc', name: 'PVC', cat: 'plastics', rho: 1400 },&#10;    { id: 'abs', name: 'ABS', cat: 'plastics', rho: 1050 },&#10;    { id: 'pe', name: 'Polyethylene (PE)', cat: 'plastics', rho: 950 },&#10;    { id: 'pp', name: 'Polypropylene (PP)', cat: 'plastics', rho: 900 },&#10;    { id: 'ptfe', name: 'PTFE', cat: 'plastics', rho: 2200 },&#10;    { id: 'nylon', name: 'Nylon', cat: 'plastics', rho: 1140 },&#10;    { id: 'glass', name: 'Glass', cat: 'other', rho: 2500 },&#10;    { id: 'concrete', name: 'Concrete', cat: 'other', rho: 2400 },&#10;    { id: 'rubber', name: 'Rubber', cat: 'other', rho: 1100 },&#10;    { id: 'water', name: 'Water', cat: 'other', rho: 1000 }&#10;  ];&#10;  var MAT = {};&#10;  MATERIALS.forEach(function (m) { MAT[m.id] = m; });&#10;&#10;  \/* ------------------------------------------------------------------&#10;     3. Number parsing and formatting helpers&#10;     ------------------------------------------------------------------ *\/&#10;  var SUP = { '-': '\u207b', '0': '\u2070', '1': '\u00b9', '2': '\u00b2', '3': '\u00b3', '4': '\u2074', '5': '\u2075', '6': '\u2076', '7': '\u2077', '8': '\u2078', '9': '\u2079' };&#10;&#10;  \/** Adaptive display format; scientific notation for very large\/small values. *\/&#10;  function fmt(n, sig) {&#10;    sig = sig || 6;&#10;    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';&#10;    if (n === 0) return '0';&#10;    var a = Math.abs(n);&#10;    if (a &gt;= 1e9 || a &lt; 1e-4) {&#10;      var parts = n.toExponential(sig - 1).split('e');&#10;      var mant = parts[0];&#10;      if (mant.indexOf('.') &gt;= 0) mant = mant.replace(\/0+$\/, '').replace(\/\\.$\/, '');&#10;      var exp = String(parseInt(parts[1], 10)).split('').map(function (c) { return SUP[c] || c; }).join('');&#10;      return mant + ' \u00d7 10' + exp;&#10;    }&#10;    return Number(n.toPrecision(sig)).toLocaleString('en-US', { maximumFractionDigits: 12 });&#10;  }&#10;  \/** Plain machine-readable number for CSV export. *\/&#10;  \/** Value written back into an input after a unit conversion. *\/&#10;  function fmtInput(n) { return (typeof n === 'number' &amp;&amp; isFinite(n)) ? String(Number(n.toPrecision(10))) : ''; }&#10;&#10;  \/** Parses user text. Accepts &quot;1,5&quot; (decimal comma), &quot;1,000.5&quot;, and scientific notation. *\/&#10;  function parseNum(raw) {&#10;    var s = String(raw == null ? '' : raw).trim().replace(\/\\s+\/g, '');&#10;    if (s === '') return { empty: true, ok: false };&#10;    if (\/^[+-]?\\d{1,3}(,\\d{3})+(\\.\\d+)?$\/.test(s)) s = s.replace(\/,\/g, '');&#10;    else if (\/^[+-]?\\d*,\\d+$\/.test(s)) s = s.replace(',', '.');&#10;    if (!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(s)) return { empty: false, ok: false };&#10;    var n = Number(s);&#10;    if (!isFinite(n)) return { empty: false, ok: false };&#10;    return { empty: false, ok: true, n: n };&#10;  }&#10;&#10;  function esc(s) {&#10;    return String(s).replace(\/[&amp;&lt;&gt;&quot;']\/g, function (c) {&#10;      return { '&amp;': '&amp;amp;', '&lt;': '&amp;lt;', '&gt;': '&amp;gt;', '&quot;': '&amp;quot;', &quot;'&quot;: '&amp;#39;' }[c];&#10;    });&#10;  }&#10;&#10;  \/** Automatic display units chosen by magnitude. *\/&#10;  function autoMassUnit(kg) {&#10;    var a = Math.abs(kg);&#10;    if (a &gt;= 1000) return 't';&#10;    if (a &gt;= 1 || a === 0) return 'kg';&#10;    if (a &gt;= 1e-3) return 'g';&#10;    return 'mg';&#10;  }&#10;  function autoVolumeUnit(m3) {&#10;    var a = Math.abs(m3);&#10;    if (a &gt;= 0.01 || a === 0) return 'm3';&#10;    if (a &gt;= 1e-3) return 'L';&#10;    if (a &gt;= 1e-6) return 'cm3';&#10;    return 'mm3';&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     4. Geometric shapes: dimensions, volume formulas, SVG drawings&#10;        All calc() functions receive dimensions in metres.&#10;     ------------------------------------------------------------------ *\/&#10;  var PI = Math.PI;&#10;  var n6 = function (x) { return fmt(x, 6); };&#10;&#10;  var SHAPES = {&#10;    block: {&#10;      name: 'Rectangular Block',&#10;      dims: [{ k: 'L', label: 'Length', def: 200 }, { k: 'W', label: 'Width', def: 100 }, { k: 'H', label: 'Height', def: 50 }],&#10;      formula: 'V = L \u00d7 W \u00d7 H',&#10;      calc: function (d) { return { V: d.L * d.W * d.H, sub: n6(d.L) + ' \u00d7 ' + n6(d.W) + ' \u00d7 ' + n6(d.H), errs: [], extra: [] }; }&#10;    },&#10;    cylinder: {&#10;      name: 'Solid Cylinder',&#10;      dims: [{ k: 'r', label: 'Radius', def: 25 }, { k: 'L', label: 'Length', def: 500 }],&#10;      formula: 'V = \u03c0 \u00d7 r\u00b2 \u00d7 L',&#10;      calc: function (d) { return { V: PI * d.r * d.r * d.L, sub: '\u03c0 \u00d7 ' + n6(d.r) + '\u00b2 \u00d7 ' + n6(d.L), errs: [], extra: [] }; }&#10;    },&#10;    pipe: {&#10;      name: 'Hollow Cylinder \/ Pipe',&#10;      dims: [{ k: 'OD', label: 'Outer diameter', def: 60 }, { k: 'ID', label: 'Inner diameter', def: 50 }, { k: 'L', label: 'Length', def: 1000 }],&#10;      formula: 'V = \u03c0 \u00d7 (R\u00b2 \u2212 r\u00b2) \u00d7 L,  R = OD\/2, r = ID\/2',&#10;      calc: function (d) {&#10;        var R = d.OD \/ 2, r = d.ID \/ 2, errs = [];&#10;        if (d.ID &gt;= d.OD) errs.push({ k: 'ID', msg: 'Inner diameter must be smaller than the outer diameter.' });&#10;        return {&#10;          V: PI * (R * R - r * r) * d.L, errs: errs,&#10;          extra: ['Radii: R = OD \/ 2 = ' + n6(R) + ' m, r = ID \/ 2 = ' + n6(r) + ' m',&#10;                  'Wall thickness = (OD \u2212 ID) \/ 2 = ' + n6((d.OD - d.ID) \/ 2) + ' m'],&#10;          sub: '\u03c0 \u00d7 (' + n6(R) + '\u00b2 \u2212 ' + n6(r) + '\u00b2) \u00d7 ' + n6(d.L)&#10;        };&#10;      }&#10;    },&#10;    sphere: {&#10;      name: 'Solid Sphere',&#10;      dims: [{ k: 'r', label: 'Radius', def: 50 }],&#10;      formula: 'V = (4\/3) \u00d7 \u03c0 \u00d7 r\u00b3',&#10;      calc: function (d) { return { V: 4 \/ 3 * PI * Math.pow(d.r, 3), sub: '(4\/3) \u00d7 \u03c0 \u00d7 ' + n6(d.r) + '\u00b3', errs: [], extra: [] }; }&#10;    },&#10;    hsphere: {&#10;      name: 'Hollow Sphere',&#10;      dims: [{ k: 'R', label: 'Outer radius', def: 50 }, { k: 'r', label: 'Inner radius', def: 45 }],&#10;      formula: 'V = (4\/3) \u00d7 \u03c0 \u00d7 (R\u00b3 \u2212 r\u00b3)',&#10;      calc: function (d) {&#10;        var errs = [];&#10;        if (d.r &gt;= d.R) errs.push({ k: 'r', msg: 'Inner radius must be smaller than the outer radius.' });&#10;        return { V: 4 \/ 3 * PI * (Math.pow(d.R, 3) - Math.pow(d.r, 3)), sub: '(4\/3) \u00d7 \u03c0 \u00d7 (' + n6(d.R) + '\u00b3 \u2212 ' + n6(d.r) + '\u00b3)', errs: errs,&#10;                 extra: ['Shell thickness = R \u2212 r = ' + n6(d.R - d.r) + ' m'] };&#10;      }&#10;    },&#10;    plate: {&#10;      name: 'Flat Sheet \/ Plate',&#10;      dims: [{ k: 'L', label: 'Length', def: 2000 }, { k: 'W', label: 'Width', def: 1000 }, { k: 'T', label: 'Thickness', def: 5 }],&#10;      formula: 'V = L \u00d7 W \u00d7 T',&#10;      calc: function (d) { return { V: d.L * d.W * d.T, sub: n6(d.L) + ' \u00d7 ' + n6(d.W) + ' \u00d7 ' + n6(d.T), errs: [], extra: [] }; }&#10;    },&#10;    roundbar: {&#10;      name: 'Round Bar',&#10;      dims: [{ k: 'D', label: 'Diameter', def: 20 }, { k: 'L', label: 'Length', def: 1000 }],&#10;      formula: 'V = \u03c0 \u00d7 (D\u00b2 \/ 4) \u00d7 L',&#10;      calc: function (d) { return { V: PI * d.D * d.D \/ 4 * d.L, sub: '\u03c0 \u00d7 (' + n6(d.D) + '\u00b2 \/ 4) \u00d7 ' + n6(d.L), errs: [], extra: [] }; }&#10;    },&#10;    squarebar: {&#10;      name: 'Square Bar',&#10;      dims: [{ k: 'a', label: 'Side length', def: 20 }, { k: 'L', label: 'Length', def: 1000 }],&#10;      formula: 'V = a\u00b2 \u00d7 L',&#10;      calc: function (d) { return { V: d.a * d.a * d.L, sub: n6(d.a) + '\u00b2 \u00d7 ' + n6(d.L), errs: [], extra: [] }; }&#10;    },&#10;    recttube: {&#10;      name: 'Rectangular Tube',&#10;      dims: [&#10;        { k: 'W', label: 'Outer width', def: 50 },&#10;        { k: 'H', label: 'Outer height', def: 30 },&#10;        { k: 't', label: 'Wall thickness', def: 2, method: 'wall' },&#10;        { k: 'Wi', label: 'Inner width', def: 46, method: 'inner' },&#10;        { k: 'Hi', label: 'Inner height', def: 26, method: 'inner' },&#10;        { k: 'L', label: 'Length', def: 1000 }&#10;      ],&#10;      formula: 'V = (W \u00d7 H \u2212 Wi \u00d7 Hi) \u00d7 L',&#10;      calc: function (d, method) {&#10;        var Wi, Hi, errs = [], extra = [];&#10;        if (method === 'wall') {&#10;          Wi = d.W - 2 * d.t; Hi = d.H - 2 * d.t;&#10;          extra.push('Inner width: Wi = W \u2212 2t = ' + n6(d.W) + ' \u2212 2 \u00d7 ' + n6(d.t) + ' = ' + n6(Wi) + ' m');&#10;          extra.push('Inner height: Hi = H \u2212 2t = ' + n6(d.H) + ' \u2212 2 \u00d7 ' + n6(d.t) + ' = ' + n6(Hi) + ' m');&#10;          if (Wi &lt;= 0 || Hi &lt;= 0) errs.push({ k: 't', msg: 'Wall thickness is too large: 2 \u00d7 t must be less than both the outer width and the outer height.' });&#10;        } else {&#10;          Wi = d.Wi; Hi = d.Hi;&#10;          if (Wi &gt;= d.W) errs.push({ k: 'Wi', msg: 'Inner width must be smaller than the outer width.' });&#10;          if (Hi &gt;= d.H) errs.push({ k: 'Hi', msg: 'Inner height must be smaller than the outer height.' });&#10;        }&#10;        return { V: (d.W * d.H - Wi * Hi) * d.L, sub: '(' + n6(d.W) + ' \u00d7 ' + n6(d.H) + ' \u2212 ' + n6(Wi) + ' \u00d7 ' + n6(Hi) + ') \u00d7 ' + n6(d.L), errs: errs, extra: extra, derived: { Wi: Wi, Hi: Hi } };&#10;      }&#10;    }&#10;  };&#10;&#10;  \/* ---- SVG drawing helpers (presentation attributes inline so the SVG also prints standalone) ---- *\/&#10;  var SC = { face: '#dbe5f5', top: '#eef3fb', side: '#bfcde6', line: '#1e3a8a', dim: '#c2410c', hole: '#f8fafc', ext: '#94a3b8' };&#10;&#10;  function svgDoc(inner, title) {&#10;    return '&lt;svg xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot; viewBox=&quot;0 0 360 240&quot; role=&quot;img&quot; aria-label=&quot;' + esc(title) + '&quot; style=&quot;width:100%;height:auto;max-height:280px;display:block&quot;&gt;' +&#10;      '&lt;title&gt;' + esc(title) + '&lt;\/title&gt;&lt;defs&gt;' +&#10;      '&lt;marker id=&quot;mdc-arw&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;7&quot; markerHeight=&quot;7&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; fill=&quot;' + SC.dim + '&quot;\/&gt;&lt;\/marker&gt;' +&#10;      '&lt;radialGradient id=&quot;mdc-sph&quot; cx=&quot;38%&quot; cy=&quot;35%&quot; r=&quot;70%&quot;&gt;&lt;stop offset=&quot;0&quot; stop-color=&quot;#f5f8fd&quot;\/&gt;&lt;stop offset=&quot;1&quot; stop-color=&quot;#9fb3d6&quot;\/&gt;&lt;\/radialGradient&gt;' +&#10;      '&lt;\/defs&gt;' + inner + '&lt;\/svg&gt;';&#10;  }&#10;  function dimLine(x1, y1, x2, y2, both) {&#10;    return '&lt;line x1=&quot;' + x1 + '&quot; y1=&quot;' + y1 + '&quot; x2=&quot;' + x2 + '&quot; y2=&quot;' + y2 + '&quot; stroke=&quot;' + SC.dim + '&quot; stroke-width=&quot;1.6&quot;' +&#10;      (both === false ? '' : ' marker-start=&quot;url(#mdc-arw)&quot;') + ' marker-end=&quot;url(#mdc-arw)&quot;\/&gt;';&#10;  }&#10;  function extLine(x1, y1, x2, y2) {&#10;    return '&lt;line x1=&quot;' + x1 + '&quot; y1=&quot;' + y1 + '&quot; x2=&quot;' + x2 + '&quot; y2=&quot;' + y2 + '&quot; stroke=&quot;' + SC.ext + '&quot; stroke-width=&quot;1&quot; stroke-dasharray=&quot;3 3&quot;\/&gt;';&#10;  }&#10;  function txt(x, y, s, anchor) {&#10;    return '&lt;text x=&quot;' + x + '&quot; y=&quot;' + y + '&quot; text-anchor=&quot;' + (anchor || 'middle') + '&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Arial,sans-serif&quot; font-size=&quot;13&quot; font-weight=&quot;700&quot; fill=&quot;' + SC.dim + '&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;4&quot; stroke-linejoin=&quot;round&quot; paint-order=&quot;stroke&quot;&gt;' + esc(s) + '&lt;\/text&gt;';&#10;  }&#10;  function poly(pts, fill) {&#10;    return '&lt;polygon points=&quot;' + pts + '&quot; fill=&quot;' + fill + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot; stroke-linejoin=&quot;round&quot;\/&gt;';&#10;  }&#10;  function box(x, y, w, h, dx, dy) {&#10;    return poly(x + ',' + y + ' ' + (x + dx) + ',' + (y - dy) + ' ' + (x + w + dx) + ',' + (y - dy) + ' ' + (x + w) + ',' + y, SC.top) +&#10;      poly((x + w) + ',' + y + ' ' + (x + w + dx) + ',' + (y - dy) + ' ' + (x + w + dx) + ',' + (y + h - dy) + ' ' + (x + w) + ',' + (y + h), SC.side) +&#10;      '&lt;rect x=&quot;' + x + '&quot; y=&quot;' + y + '&quot; width=&quot;' + w + '&quot; height=&quot;' + h + '&quot; fill=&quot;' + SC.face + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot;\/&gt;';&#10;  }&#10;  function cyl(x1, x2, cy, rx, ry) {&#10;    return '&lt;path d=&quot;M' + x1 + ' ' + (cy - ry) + ' H' + x2 + ' A' + rx + ' ' + ry + ' 0 0 1 ' + x2 + ' ' + (cy + ry) + ' H' + x1 + ' A' + rx + ' ' + ry + ' 0 0 1 ' + x1 + ' ' + (cy - ry) + ' Z&quot; fill=&quot;' + SC.face + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot;\/&gt;' +&#10;      '&lt;ellipse cx=&quot;' + x2 + '&quot; cy=&quot;' + cy + '&quot; rx=&quot;' + rx + '&quot; ry=&quot;' + ry + '&quot; fill=&quot;' + SC.top + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot;\/&gt;';&#10;  }&#10;  function centerLine(x1, x2, y) {&#10;    return '&lt;line x1=&quot;' + x1 + '&quot; y1=&quot;' + y + '&quot; x2=&quot;' + x2 + '&quot; y2=&quot;' + y + '&quot; stroke=&quot;' + SC.ext + '&quot; stroke-width=&quot;1&quot; stroke-dasharray=&quot;8 3 2 3&quot;\/&gt;';&#10;  }&#10;&#10;  var SHAPE_SVG = {&#10;    block: function (lab) {&#10;      return box(120, 90, 150, 90, 55, 40) +&#10;        extLine(120, 182, 120, 206) + extLine(270, 182, 270, 206) + dimLine(120, 200, 270, 200) + txt(195, 222, lab('L')) +&#10;        extLine(118, 90, 94, 90) + extLine(118, 180, 94, 180) + dimLine(100, 90, 100, 180) + txt(94, 139, lab('H'), 'end') +&#10;        dimLine(113, 80, 168, 40) + txt(132, 54, lab('W'), 'end');&#10;    },&#10;    plate: function (lab) {&#10;      return box(60, 150, 200, 14, 80, 56) +&#10;        extLine(60, 166, 60, 192) + extLine(260, 166, 260, 192) + dimLine(60, 186, 260, 186) + txt(160, 208, lab('L')) +&#10;        dimLine(53, 140, 133, 84) + txt(92, 100, lab('W'), 'end') +&#10;        extLine(58, 150, 28, 150) + extLine(58, 164, 28, 164) + dimLine(36, 126, 36, 150, false) + dimLine(36, 188, 36, 164, false) + txt(40, 208, lab('T'));&#10;    },&#10;    cylinder: function (lab) {&#10;      return centerLine(36, 262, 115) + cyl(60, 230, 115, 24, 62) +&#10;        '&lt;circle cx=&quot;230&quot; cy=&quot;115&quot; r=&quot;2.5&quot; fill=&quot;' + SC.line + '&quot;\/&gt;' +&#10;        dimLine(230, 115, 230, 54, false) + txt(244, 90, lab('r'), 'start') +&#10;        extLine(60, 180, 60, 204) + extLine(230, 180, 230, 204) + dimLine(60, 198, 230, 198) + txt(145, 222, lab('L'));&#10;    },&#10;    pipe: function (lab) {&#10;      return centerLine(36, 262, 115) + cyl(60, 230, 115, 24, 62) +&#10;        '&lt;ellipse cx=&quot;230&quot; cy=&quot;115&quot; rx=&quot;14&quot; ry=&quot;38&quot; fill=&quot;' + SC.hole + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot;\/&gt;' +&#10;        extLine(232, 53, 330, 53) + extLine(232, 177, 330, 177) + dimLine(318, 53, 318, 177) + txt(312, 42, lab('OD'), 'end') +&#10;        dimLine(230, 77, 230, 153) + '&lt;line x1=&quot;230&quot; y1=&quot;153&quot; x2=&quot;258&quot; y2=&quot;200&quot; stroke=&quot;' + SC.dim + '&quot; stroke-width=&quot;1&quot;\/&gt;' + txt(262, 214, lab('ID'), 'start') +&#10;        extLine(60, 180, 60, 204) + dimLine(60, 198, 206, 198) + txt(132, 222, lab('L'));&#10;    },&#10;    sphere: function (lab) {&#10;      return '&lt;circle cx=&quot;170&quot; cy=&quot;118&quot; r=&quot;88&quot; fill=&quot;url(#mdc-sph)&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot;\/&gt;' +&#10;        '&lt;ellipse cx=&quot;170&quot; cy=&quot;118&quot; rx=&quot;88&quot; ry=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1&quot; stroke-dasharray=&quot;4 4&quot; opacity=&quot;.6&quot;\/&gt;' +&#10;        '&lt;circle cx=&quot;170&quot; cy=&quot;118&quot; r=&quot;2.5&quot; fill=&quot;' + SC.line + '&quot;\/&gt;' +&#10;        dimLine(170, 118, 257, 118, false) + txt(214, 92, lab('r'));&#10;    },&#10;    hsphere: function (lab) {&#10;      return '&lt;circle cx=&quot;170&quot; cy=&quot;118&quot; r=&quot;88&quot; fill=&quot;url(#mdc-sph)&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.5&quot;\/&gt;' +&#10;        '&lt;circle cx=&quot;170&quot; cy=&quot;118&quot; r=&quot;56&quot; fill=&quot;' + SC.hole + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.2&quot; stroke-dasharray=&quot;5 4&quot;\/&gt;' +&#10;        '&lt;circle cx=&quot;170&quot; cy=&quot;118&quot; r=&quot;2.5&quot; fill=&quot;' + SC.line + '&quot;\/&gt;' +&#10;        dimLine(170, 118, 241, 68, false) + txt(248, 58, lab('R'), 'start') +&#10;        dimLine(170, 118, 125, 150, false) + txt(170, 196, lab('r'));&#10;    },&#10;    roundbar: function (lab) {&#10;      return centerLine(30, 276, 110) + cyl(50, 250, 110, 14, 34) +&#10;        extLine(252, 76, 302, 76) + extLine(252, 144, 302, 144) + dimLine(290, 76, 290, 144) + txt(290, 66, lab('D')) +&#10;        extLine(50, 146, 50, 176) + extLine(250, 146, 250, 176) + dimLine(50, 170, 250, 170) + txt(150, 192, lab('L'));&#10;    },&#10;    squarebar: function (lab) {&#10;      return box(100, 100, 190, 40, 30, 26) +&#10;        extLine(98, 100, 78, 100) + extLine(98, 140, 78, 140) + dimLine(86, 100, 86, 140) + txt(80, 125, lab('a'), 'end') +&#10;        extLine(100, 142, 100, 170) + extLine(290, 142, 290, 170) + dimLine(100, 164, 290, 164) + txt(195, 186, lab('L'));&#10;    },&#10;    recttube: function (lab, method) {&#10;      var s = box(120, 72, 130, 100, 60, 40) +&#10;        '&lt;rect x=&quot;132&quot; y=&quot;84&quot; width=&quot;106&quot; height=&quot;76&quot; fill=&quot;' + SC.hole + '&quot; stroke=&quot;' + SC.line + '&quot; stroke-width=&quot;1.2&quot;\/&gt;' +&#10;        extLine(120, 174, 120, 200) + extLine(250, 174, 250, 200) + dimLine(120, 194, 250, 194) + txt(185, 216, lab('W')) +&#10;        extLine(118, 72, 92, 72) + extLine(118, 172, 92, 172) + dimLine(98, 72, 98, 172) + txt(92, 126, lab('H'), 'end') +&#10;        dimLine(113, 62, 173, 22) + txt(134, 38, lab('L'), 'end');&#10;      if (method === 'inner') s += txt(185, 116, lab('Wi')) + txt(185, 138, lab('Hi'));&#10;      else s += '&lt;line x1=&quot;185&quot; y1=&quot;72&quot; x2=&quot;185&quot; y2=&quot;84&quot; stroke=&quot;' + SC.dim + '&quot; stroke-width=&quot;3.5&quot;\/&gt;' + txt(185, 104, lab('t'));&#10;      return s;&#10;    }&#10;  };&#10;&#10;  \/* ------------------------------------------------------------------&#10;     5. State and defaults&#10;     ------------------------------------------------------------------ *\/&#10;  var DEFAULTS = {&#10;    mass: '785', massUnit: 'g',&#10;    volume: '100', volumeUnit: 'cm3',&#10;    material: 'carbon-steel', densityUnit: 'kgm3',&#10;    shape: 'plate', dimUnit: 'mm', tubeMethod: 'wall',&#10;    resDensity: 'gcm3', resMass: 'auto', resVolume: 'auto'&#10;  };&#10;  var MODE_INFO = {&#10;    density: { label: 'Density Calculation', hint: 'Enter a known mass and volume to calculate density: \u03c1 = m \/ V.' },&#10;    mass: { label: 'Mass Calculation', hint: 'Choose a material (or enter a density) and a volume to calculate mass: m = \u03c1 \u00d7 V.' },&#10;    volume: { label: 'Volume Calculation', hint: 'Choose a material (or enter a density) and a mass to calculate volume: V = m \/ \u03c1.' },&#10;    geometry: { label: 'Geometric Material Density &amp; Weight', hint: 'Pick a shape and enter its dimensions; volume is calculated first, then mass: m = \u03c1 \u00d7 V.' }&#10;  };&#10;&#10;  var state = {&#10;    mode: 'density',&#10;    materialId: DEFAULTS.material,&#10;    densityEdited: false,&#10;    shape: DEFAULTS.shape,&#10;    tubeMethod: DEFAULTS.tubeMethod,&#10;    dims: {},          \/\/ shape -&gt; { key: raw string in current dimension unit }&#10;    last: null         \/\/ last successful result (for copy \/ CSV \/ print)&#10;  };&#10;&#10;  function resetDimStore() {&#10;    state.dims = {};&#10;    Object.keys(SHAPES).forEach(function (s) {&#10;      state.dims[s] = {};&#10;      SHAPES[s].dims.forEach(function (d) { state.dims[s][d.k] = String(d.def); });&#10;    });&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     6. Building select menus&#10;     ------------------------------------------------------------------ *\/&#10;  function fillUnitSelects() {&#10;    Array.prototype.forEach.call(root.querySelectorAll('select[data-mdc-units]'), function (sel) {&#10;      var type = sel.getAttribute('data-mdc-units');&#10;      var html = sel.getAttribute('data-mdc-auto') ? '&lt;option value=&quot;auto&quot;&gt;Auto&lt;\/option&gt;' : '';&#10;      UNITS[type].forEach(function (u) { html += '&lt;option value=&quot;' + u.k + '&quot;&gt;' + esc(u.name) + '&lt;\/option&gt;'; });&#10;      sel.innerHTML = html;&#10;    });&#10;  }&#10;&#10;  function setSelect(id, value) {&#10;    var sel = $(id);&#10;    sel.value = value;&#10;    sel.setAttribute('data-prev', value);&#10;  }&#10;&#10;  \/** Rebuilds the material dropdown from the category filter and search text. *\/&#10;  function buildMaterialOptions() {&#10;    var sel = $('mdc-material');&#10;    var cat = $('mdc-mat-cat').value;&#10;    var qy = $('mdc-mat-search').value.trim().toLowerCase();&#10;    var matches = MATERIALS.filter(function (m) {&#10;      var catOk = cat === 'all' || m.cat === cat;&#10;      var hay = (m.name + ' ' + CAT_NAME[m.cat] + ' ' + m.rho).toLowerCase();&#10;      return catOk &amp;&amp; (!qy || hay.indexOf(qy) &gt;= 0);&#10;    });&#10;    var html = '';&#10;    CATS.forEach(function (c) {&#10;      var list = matches.filter(function (m) { return m.cat === c.k; });&#10;      if (!list.length) return;&#10;      html += '&lt;optgroup label=&quot;' + esc(c.name) + '&quot;&gt;' + list.map(function (m) {&#10;        return '&lt;option value=&quot;' + m.id + '&quot;&gt;' + esc(m.name) + ' \u2014 ' + fmt(m.rho) + ' kg\/m\u00b3&lt;\/option&gt;';&#10;      }).join('') + '&lt;\/optgroup&gt;';&#10;    });&#10;    html += '&lt;optgroup label=&quot;Custom&quot;&gt;&lt;option value=&quot;custom&quot;&gt;Custom Material (enter your own density)&lt;\/option&gt;&lt;\/optgroup&gt;';&#10;    sel.innerHTML = html;&#10;&#10;    var target = state.materialId;&#10;    var ids = matches.map(function (m) { return m.id; });&#10;    if (cat === 'custom') target = 'custom';&#10;    else if (target !== 'custom' &amp;&amp; ids.indexOf(target) &lt; 0) target = ids.length ? ids[0] : 'custom';&#10;    else if (target === 'custom' &amp;&amp; qy &amp;&amp; ids.length) target = ids[0];&#10;    sel.value = target;&#10;&#10;    $('mdc-mat-count').textContent = (qy || cat !== 'all')&#10;      ? matches.length + ' preset material' + (matches.length === 1 ? '' : 's') + ' match.'&#10;      : MATERIALS.length + ' preset materials available.';&#10;    if (target !== state.materialId) applyMaterial(target);&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     7. Material handling&#10;     ------------------------------------------------------------------ *\/&#10;  function applyMaterial(id) {&#10;    state.materialId = id;&#10;    var custom = id === 'custom';&#10;    $('mdc-custom-wrap').hidden = !custom;&#10;    if (!custom &amp;&amp; MAT[id]) {&#10;      $('mdc-density').value = fmtInput(MAT[id].rho \/ unit('density', $('mdc-density-unit').value).f);&#10;    }&#10;    updateDensityBadge();&#10;  }&#10;&#10;  \/** Flags preset densities that the user has manually changed. *\/&#10;  function updateDensityBadge() {&#10;    var badge = $('mdc-density-badge');&#10;    if (state.materialId === 'custom') {&#10;      state.densityEdited = false;&#10;      badge.textContent = 'User-defined';&#10;      badge.className = 'mdc-badge mdc-badge-ok';&#10;      return;&#10;    }&#10;    var p = parseNum($('mdc-density').value);&#10;    var ref = MAT[state.materialId].rho;&#10;    var si = p.ok ? p.n * unit('density', $('mdc-density-unit').value).f : NaN;&#10;    state.densityEdited = !(p.ok &amp;&amp; Math.abs(si - ref) &lt;= ref * 1e-7);&#10;    badge.textContent = state.densityEdited ? 'Edited value' : 'Reference value';&#10;    badge.className = 'mdc-badge' + (state.densityEdited ? ' mdc-badge-warn' : '');&#10;  }&#10;&#10;  function materialLabel() {&#10;    if (state.materialId === 'custom') {&#10;      var nm = $('mdc-custom-name').value.trim();&#10;      return nm || 'Custom Material';&#10;    }&#10;    return MAT[state.materialId].name + (state.densityEdited ? ' (user-edited density)' : '');&#10;  }&#10;  function materialCategory() {&#10;    return state.materialId === 'custom' ? 'Custom Material' : CAT_NAME[MAT[state.materialId].cat];&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     8. Unit conversion of entered values (keeps the physical quantity)&#10;     ------------------------------------------------------------------ *\/&#10;  function convertUnitField(sel) {&#10;    var type = sel.getAttribute('data-mdc-units');&#10;    var input = $(sel.getAttribute('data-mdc-for'));&#10;    var prev = sel.getAttribute('data-prev') || sel.value;&#10;    var p = parseNum(input.value);&#10;    if (p.ok &amp;&amp; prev !== sel.value) {&#10;      input.value = fmtInput(p.n * unit(type, prev).f \/ unit(type, sel.value).f);&#10;    }&#10;    sel.setAttribute('data-prev', sel.value);&#10;  }&#10;&#10;  \/** Converts every stored dimension (all shapes) to a new length unit. *\/&#10;  function convertDimsTo(newUnit) {&#10;    var sel = $('mdc-dim-unit');&#10;    var prev = sel.getAttribute('data-prev') || sel.value;&#10;    if (prev !== newUnit) {&#10;      var ratio = unit('length', prev).f \/ unit('length', newUnit).f;&#10;      Object.keys(state.dims).forEach(function (s) {&#10;        Object.keys(state.dims[s]).forEach(function (k) {&#10;          var p = parseNum(state.dims[s][k]);&#10;          if (p.ok) state.dims[s][k] = fmtInput(p.n * ratio);&#10;        });&#10;      });&#10;    }&#10;    setSelect('mdc-dim-unit', newUnit);&#10;    renderDimFields();&#10;  }&#10;&#10;  \/** Keeps tube inner size consistent when switching between wall\/inner input methods. *\/&#10;  function switchTubeMethod(method) {&#10;    var d = state.dims.recttube;&#10;    var W = parseNum(d.W), H = parseNum(d.H);&#10;    if (method === 'inner') {&#10;      var t = parseNum(d.t);&#10;      if (W.ok &amp;&amp; H.ok &amp;&amp; t.ok &amp;&amp; W.n - 2 * t.n &gt; 0 &amp;&amp; H.n - 2 * t.n &gt; 0) {&#10;        d.Wi = fmtInput(W.n - 2 * t.n); d.Hi = fmtInput(H.n - 2 * t.n);&#10;      }&#10;    } else {&#10;      var Wi = parseNum(d.Wi), Hi = parseNum(d.Hi);&#10;      if (W.ok &amp;&amp; H.ok &amp;&amp; Wi.ok &amp;&amp; Hi.ok) {&#10;        var t1 = (W.n - Wi.n) \/ 2, t2 = (H.n - Hi.n) \/ 2;&#10;        if (Math.abs(t1 - t2) &lt; 1e-9 * Math.max(1, Math.abs(t1)) &amp;&amp; t1 &gt; 0) d.t = fmtInput(t1);&#10;      }&#10;    }&#10;    state.tubeMethod = method;&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     9. Dynamic dimension fields&#10;     ------------------------------------------------------------------ *\/&#10;  function renderDimFields() {&#10;    var sh = SHAPES[state.shape];&#10;    var u = unit('length', $('mdc-dim-unit').value).sym;&#10;    var html = '';&#10;    if (state.shape === 'recttube') {&#10;      html += '&lt;div class=&quot;mdc-field mdc-span2&quot;&gt;&lt;label for=&quot;mdc-tube-method&quot;&gt;Inner size defined by&lt;\/label&gt;' +&#10;        '&lt;select id=&quot;mdc-tube-method&quot; class=&quot;mdc-select&quot;&gt;&lt;option value=&quot;wall&quot;&gt;Wall thickness (t) \u2014 inner size calculated&lt;\/option&gt;&lt;option value=&quot;inner&quot;&gt;Inner width and inner height&lt;\/option&gt;&lt;\/select&gt;&lt;\/div&gt;';&#10;    }&#10;    sh.dims.forEach(function (dm) {&#10;      if (dm.method &amp;&amp; dm.method !== state.tubeMethod) return;&#10;      var id = 'mdc-dim-' + dm.k;&#10;      html += '&lt;div class=&quot;mdc-field&quot;&gt;&lt;label for=&quot;' + id + '&quot;&gt;' + esc(dm.label) + ' (' + esc(dm.k) + ')&lt;\/label&gt;' +&#10;        '&lt;div class=&quot;mdc-suffix&quot;&gt;&lt;input id=&quot;' + id + '&quot; class=&quot;mdc-input mdc-dim-input&quot; data-k=&quot;' + dm.k + '&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; autocomplete=&quot;off&quot; value=&quot;' +&#10;        esc(state.dims[state.shape][dm.k]) + '&quot; aria-describedby=&quot;' + id + '-err&quot;&gt;&lt;span class=&quot;mdc-suffix-u&quot; aria-hidden=&quot;true&quot;&gt;' + esc(u) + '&lt;\/span&gt;&lt;\/div&gt;' +&#10;        '&lt;p class=&quot;mdc-err&quot; id=&quot;' + id + '-err&quot; hidden&gt;&lt;\/p&gt;&lt;\/div&gt;';&#10;    });&#10;    $('mdc-dims').innerHTML = html;&#10;    if ($('mdc-tube-method')) $('mdc-tube-method').value = state.tubeMethod;&#10;    $('mdc-shape-formula').textContent = sh.name + ':  ' + sh.formula;&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     10. Validation helpers&#10;     ------------------------------------------------------------------ *\/&#10;  function clearErrors() {&#10;    Array.prototype.forEach.call(root.querySelectorAll('#mdc-form .mdc-invalid'), function (el) {&#10;      el.classList.remove('mdc-invalid'); el.removeAttribute('aria-invalid');&#10;    });&#10;    Array.prototype.forEach.call(root.querySelectorAll('#mdc-form .mdc-err'), function (el) { el.hidden = true; el.textContent = ''; });&#10;  }&#10;  function markError(id, msg) {&#10;    var el = $(id), er = $(id + '-err');&#10;    if (el) { el.classList.add('mdc-invalid'); el.setAttribute('aria-invalid', 'true'); }&#10;    if (er) { er.textContent = msg; er.hidden = false; }&#10;  }&#10;  \/**&#10;   * Reads a numeric field. opt.strict = value must be &gt; 0 (otherwise &gt;= 0).&#10;   * Returns the number or null (and records an error).&#10;   *\/&#10;  function readNum(id, label, errs, opt) {&#10;    opt = opt || {};&#10;    var p = parseNum($(id).value), msg = null;&#10;    if (p.empty) msg = label + ' is required.';&#10;    else if (!p.ok) msg = label + ' must be a valid number (e.g. 12.5 or 1.2e-3).';&#10;    else if (p.n &lt; 0) msg = label + ' cannot be negative.';&#10;    else if (opt.strict &amp;&amp; p.n === 0) msg = opt.zeroMsg || (label + ' must be greater than zero.');&#10;    if (msg) { markError(id, msg); errs.push(msg); return null; }&#10;    return p.n;&#10;  }&#10;&#10;  \/** Reads and validates all dimensions of the current shape. *\/&#10;  function readDims(errs) {&#10;    var sh = SHAPES[state.shape];&#10;    var lu = unit('length', $('mdc-dim-unit').value);&#10;    var d = {}, raw = {}, ok = true, used = [];&#10;    sh.dims.forEach(function (dm) {&#10;      if (dm.method &amp;&amp; dm.method !== state.tubeMethod) return;&#10;      used.push(dm);&#10;      var v = readNum('mdc-dim-' + dm.k, dm.label + ' (' + dm.k + ')', errs, { strict: true });&#10;      if (v === null) { ok = false; return; }&#10;      raw[dm.k] = v; d[dm.k] = v * lu.f;&#10;    });&#10;    if (!ok) return null;&#10;    var r = sh.calc(d, state.tubeMethod);&#10;    r.errs.forEach(function (e) { markError('mdc-dim-' + e.k, e.msg); errs.push(e.msg); });&#10;    if (r.errs.length) return null;&#10;    return { d: d, raw: raw, r: r, lu: lu, used: used };&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     11. Core calculation&#10;     ------------------------------------------------------------------ *\/&#10;  function density(m, V) { return m \/ V; }   \/\/ \u03c1 = m \/ V&#10;  function mass(rho, V) { return rho * V; }    \/\/ m = \u03c1 \u00d7 V&#10;  function volume(m, rho) { return m \/ rho; }  \/\/ V = m \/ \u03c1&#10;&#10;  function compute() {&#10;    clearErrors();&#10;    var mode = state.mode, errs = [];&#10;    var dU = unit('density', $('mdc-density-unit').value);&#10;    var mU = unit('mass', $('mdc-mass-unit').value);&#10;    var vU = unit('volume', $('mdc-volume-unit').value);&#10;    var rho = null, m = null, V = null, rhoIn = null, mIn = null, vIn = null, geo = null;&#10;&#10;    if (mode !== 'density') {&#10;      rhoIn = readNum('mdc-density', 'Density', errs, { strict: true, zeroMsg: 'Density must be greater than zero.' });&#10;      if (rhoIn !== null) rho = rhoIn * dU.f;&#10;    }&#10;    if (mode === 'density' || mode === 'volume') {&#10;      mIn = readNum('mdc-mass', 'Mass', errs);&#10;      if (mIn !== null) m = mIn * mU.f;&#10;    }&#10;    if (mode === 'density' || mode === 'mass') {&#10;      vIn = readNum('mdc-volume', 'Volume', errs, mode === 'density'&#10;        ? { strict: true, zeroMsg: 'Volume must be greater than zero to calculate density (division by zero).' } : {});&#10;      if (vIn !== null) V = vIn * vU.f;&#10;    }&#10;    if (mode === 'geometry') {&#10;      geo = readDims(errs);&#10;      if (geo) V = geo.r.V;&#10;    }&#10;&#10;    renderShape();&#10;&#10;    if (!errs.length) {&#10;      if (mode === 'density') rho = density(m, V);&#10;      else if (mode === 'mass') m = mass(rho, V);&#10;      else if (mode === 'volume') V = volume(m, rho);&#10;      else m = mass(rho, V);&#10;      if (!isFinite(rho) || !isFinite(m) || !isFinite(V)) {&#10;        errs.push('The result is outside the numeric range that can be represented. Check the magnitude of your inputs.');&#10;      }&#10;    }&#10;&#10;    if (errs.length) {&#10;      state.last = null;&#10;      showErrors(errs);&#10;      return;&#10;    }&#10;&#10;    var R = buildResult({ mode: mode, rho: rho, m: m, V: V, rhoIn: rhoIn, mIn: mIn, vIn: vIn, dU: dU, mU: mU, vU: vU, geo: geo });&#10;    state.last = R;&#10;    renderResult(R);&#10;  }&#10;&#10;  \/** Assembles every piece of result information used by the UI and the exports. *\/&#10;  function buildResult(c) {&#10;    var mode = c.mode, steps = [], inputs = [], equiv = [], formula = {};&#10;    var F = c.m * G0;&#10;    var R = { mode: mode, modeLabel: MODE_INFO[mode].label, rho: c.rho, m: c.m, V: c.V, F: F, material: null, shape: null };&#10;&#10;    \/\/ Display units for primary results&#10;    var dRes = unit('density', $('mdc-res-density-unit').value);&#10;    var mKey = $('mdc-res-mass-unit').value, vKey = $('mdc-res-volume-unit').value;&#10;    var mRes = unit('mass', mKey === 'auto' ? autoMassUnit(c.m) : mKey);&#10;    var vRes = unit('volume', vKey === 'auto' ? autoVolumeUnit(c.V) : vKey);&#10;    R.units = { d: dRes, m: mRes, v: vRes };&#10;&#10;    if (mode !== 'density') {&#10;      R.material = {&#10;        label: materialLabel(), cat: materialCategory(),&#10;        ref: state.materialId === 'custom' ? null : MAT[state.materialId].rho,&#10;        edited: state.densityEdited&#10;      };&#10;      inputs.push(['Selected material', R.material.label]);&#10;      inputs.push(['Material density', fmt(c.rhoIn) + ' ' + c.dU.sym + (c.dU.k !== 'kgm3' ? ' (= ' + fmt(c.rho) + ' kg\/m\u00b3)' : '')]);&#10;    }&#10;    if (c.mIn !== null) inputs.push(['Input mass', fmt(c.mIn) + ' ' + c.mU.sym + (c.mU.k !== 'kg' ? ' (= ' + fmt(c.m) + ' kg)' : '')]);&#10;    if (c.vIn !== null) inputs.push(['Input volume', fmt(c.vIn) + ' ' + c.vU.sym + (c.vU.k !== 'm3' ? ' (= ' + fmt(c.V) + ' m\u00b3)' : '')]);&#10;&#10;    if (mode === 'density') {&#10;      formula = { main: '\u03c1 = m \/ V', where: ['\u03c1 = density (kg\/m\u00b3)', 'm = mass (kg)', 'V = volume (m\u00b3)'] };&#10;      steps.push('Convert mass to kilograms: ' + fmt(c.mIn) + ' ' + c.mU.sym + ' = ' + fmt(c.m) + ' kg');&#10;      steps.push('Convert volume to cubic metres: ' + fmt(c.vIn) + ' ' + c.vU.sym + ' = ' + fmt(c.V) + ' m\u00b3');&#10;      steps.push('Apply \u03c1 = m \/ V = ' + fmt(c.m) + ' kg \u00f7 ' + fmt(c.V) + ' m\u00b3 = ' + fmt(c.rho) + ' kg\/m\u00b3');&#10;      if (dRes.k !== 'kgm3') steps.push('Convert to ' + dRes.sym + ': ' + fmt(c.rho) + ' \u00f7 ' + fmt(dRes.f, 9) + ' = ' + fmt(c.rho \/ dRes.f) + ' ' + dRes.sym);&#10;      steps.push('Specific gravity (relative to water, 1,000 kg\/m\u00b3) = ' + fmt(c.rho \/ WATER, 5));&#10;    } else if (mode === 'mass') {&#10;      formula = { main: 'm = \u03c1 \u00d7 V', where: ['m = mass (kg)', '\u03c1 = density (kg\/m\u00b3)', 'V = volume (m\u00b3)', 'Weight force: F = m \u00d7 g, g = 9.80665 m\/s\u00b2'] };&#10;      steps.push('Density of ' + R.material.label + ': ' + fmt(c.rhoIn) + ' ' + c.dU.sym + ' = ' + fmt(c.rho) + ' kg\/m\u00b3');&#10;      steps.push('Convert volume to cubic metres: ' + fmt(c.vIn) + ' ' + c.vU.sym + ' = ' + fmt(c.V) + ' m\u00b3');&#10;      steps.push('Apply m = \u03c1 \u00d7 V = ' + fmt(c.rho) + ' \u00d7 ' + fmt(c.V) + ' = ' + fmt(c.m) + ' kg');&#10;      if (mRes.k !== 'kg') steps.push('Convert to ' + mRes.sym + ': ' + fmt(c.m) + ' kg = ' + fmt(c.m \/ mRes.f) + ' ' + mRes.sym);&#10;      steps.push('Weight force: F = m \u00d7 g = ' + fmt(c.m) + ' \u00d7 9.80665 = ' + fmt(F) + ' N');&#10;    } else if (mode === 'volume') {&#10;      formula = { main: 'V = m \/ \u03c1', where: ['V = volume (m\u00b3)', 'm = mass (kg)', '\u03c1 = density (kg\/m\u00b3)'] };&#10;      steps.push('Density of ' + R.material.label + ': ' + fmt(c.rhoIn) + ' ' + c.dU.sym + ' = ' + fmt(c.rho) + ' kg\/m\u00b3');&#10;      steps.push('Convert mass to kilograms: ' + fmt(c.mIn) + ' ' + c.mU.sym + ' = ' + fmt(c.m) + ' kg');&#10;      steps.push('Apply V = m \/ \u03c1 = ' + fmt(c.m) + ' \u00f7 ' + fmt(c.rho) + ' = ' + fmt(c.V) + ' m\u00b3');&#10;      if (vRes.k !== 'm3') steps.push('Convert to ' + vRes.sym + ': ' + fmt(c.V) + ' m\u00b3 = ' + fmt(c.V \/ vRes.f) + ' ' + vRes.sym);&#10;    } else {&#10;      var sh = SHAPES[state.shape], g = c.geo, lu = g.lu;&#10;      var dimTxt = g.used.map(function (dm) { return dm.k + ' = ' + fmt(g.raw[dm.k]) + ' ' + lu.sym; }).join(', ');&#10;      R.shape = { name: sh.name, dims: dimTxt, svg: currentSvg() };&#10;      inputs.push(['Selected shape', sh.name]);&#10;      inputs.push(['Shape dimensions', dimTxt]);&#10;      if (state.shape === 'recttube' &amp;&amp; state.tubeMethod === 'wall') {&#10;        inputs.push(['Calculated inner size', 'Wi = ' + fmt(g.r.derived.Wi \/ lu.f) + ' ' + lu.sym + ', Hi = ' + fmt(g.r.derived.Hi \/ lu.f) + ' ' + lu.sym]);&#10;      }&#10;      formula = { main: sh.formula + '   \u2192   m = \u03c1 \u00d7 V', where: ['V = geometric volume (m\u00b3)', '\u03c1 = material density (kg\/m\u00b3)', 'm = estimated material mass (kg)', 'Weight force: F = m \u00d7 g, g = 9.80665 m\/s\u00b2'] };&#10;      steps.push('Convert dimensions to metres: ' + g.used.map(function (dm) {&#10;        return dm.k + ' = ' + fmt(g.raw[dm.k]) + ' ' + lu.sym + (lu.k !== 'm' ? ' = ' + fmt(g.d[dm.k]) + ' m' : '');&#10;      }).join('; '));&#10;      g.r.extra.forEach(function (s) { steps.push(s); });&#10;      steps.push('Volume: ' + sh.formula.split(',')[0] + ' = ' + g.r.sub + ' = ' + fmt(c.V) + ' m\u00b3');&#10;      steps.push('Density of ' + R.material.label + ': \u03c1 = ' + fmt(c.rho) + ' kg\/m\u00b3');&#10;      steps.push('Mass: m = \u03c1 \u00d7 V = ' + fmt(c.rho) + ' \u00d7 ' + fmt(c.V) + ' = ' + fmt(c.m) + ' kg');&#10;      if (mRes.k !== 'kg') steps.push('Convert to ' + mRes.sym + ': ' + fmt(c.m) + ' kg = ' + fmt(c.m \/ mRes.f) + ' ' + mRes.sym);&#10;      steps.push('Weight force: F = m \u00d7 g = ' + fmt(c.m) + ' \u00d7 9.80665 = ' + fmt(F) + ' N');&#10;    }&#10;&#10;    \/\/ Primary results&#10;    var primary = [];&#10;    if (mode === 'density') primary.push({ key: 'density', label: 'Calculated Density', n: c.rho \/ dRes.f, u: dRes.sym });&#10;    if (mode === 'mass') primary.push({ key: 'mass', label: 'Calculated Mass', n: c.m \/ mRes.f, u: mRes.sym });&#10;    if (mode === 'volume') primary.push({ key: 'volume', label: 'Calculated Volume', n: c.V \/ vRes.f, u: vRes.sym });&#10;    if (mode === 'geometry') {&#10;      primary.push({ key: 'volume', label: 'Geometric Material Volume', n: c.V \/ vRes.f, u: vRes.sym });&#10;      primary.push({ key: 'mass', label: 'Estimated Material Weight (mass)', n: c.m \/ mRes.f, u: mRes.sym });&#10;    }&#10;&#10;    \/\/ Equivalent unit values&#10;    if (mode === 'density') equiv.push({ title: 'Density', rows: UNITS.density.map(function (u) { return { u: u.sym, n: c.rho \/ u.f }; }) });&#10;    if (mode === 'volume' || mode === 'geometry') equiv.push({ title: 'Volume', rows: UNITS.volume.map(function (u) { return { u: u.sym, n: c.V \/ u.f }; }) });&#10;    if (mode === 'mass' || mode === 'geometry') {&#10;      equiv.push({ title: 'Mass', rows: UNITS.mass.map(function (u) { return { u: u.sym, n: c.m \/ u.f }; }) });&#10;      equiv.push({ title: 'Weight force (g = 9.80665 m\/s\u00b2)', rows: UNITS.force.map(function (u) { return { u: u.sym, n: F \/ u.f }; }) });&#10;    }&#10;&#10;    R.primary = primary; R.equiv = equiv; R.formula = formula; R.steps = steps; R.inputs = inputs;&#10;    return R;&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     12. Rendering&#10;     ------------------------------------------------------------------ *\/&#10;  function showErrors(errs) {&#10;    var box = $('mdc-error');&#10;    box.innerHTML = '&lt;strong&gt;Please correct the following input' + (errs.length &gt; 1 ? 's' : '') + ':&lt;\/strong&gt;&lt;ul&gt;' +&#10;      errs.map(function (e) { return '&lt;li&gt;' + esc(e) + '&lt;\/li&gt;'; }).join('') + '&lt;\/ul&gt;';&#10;    box.hidden = false;&#10;    $('mdc-result-body').hidden = true;&#10;  }&#10;&#10;  function renderResult(R) {&#10;    $('mdc-error').hidden = true;&#10;    $('mdc-result-body').hidden = false;&#10;&#10;    \/\/ Primary cards&#10;    ['density', 'volume', 'mass'].forEach(function (k) { $('mdc-pc-' + k).hidden = true; });&#10;    R.primary.forEach(function (p) {&#10;      $('mdc-pc-' + p.key).hidden = false;&#10;      $('mdc-pl-' + p.key).textContent = p.label;&#10;      $('mdc-pv-' + p.key).textContent = fmt(p.n);&#10;      $('mdc-pu-' + p.key).textContent = p.u;&#10;    });&#10;    if (R.mode === 'density') {&#10;      $('mdc-ps-density').textContent = '= ' + fmt(R.rho) + ' kg\/m\u00b3  \u00b7  Specific gravity \u2248 ' + fmt(R.rho \/ WATER, 4);&#10;    }&#10;    $('mdc-ps-volume').textContent = '= ' + fmt(R.V) + ' m\u00b3  \u00b7  ' + fmt(R.V \/ 1e-3) + ' L';&#10;    $('mdc-ps-mass').textContent = 'Weight force \u2248 ' + fmt(R.F) + ' N (' + fmt(R.F \/ LBF_N) + ' lbf) at standard gravity';&#10;    $('mdc-weight-note').hidden = !(R.mode === 'mass' || R.mode === 'geometry');&#10;&#10;    \/\/ Equivalent values&#10;    $('mdc-equiv').innerHTML = R.equiv.map(function (g) {&#10;      return '&lt;div class=&quot;mdc-eq-group&quot;&gt;&lt;h4&gt;' + esc(g.title) + '&lt;\/h4&gt;&lt;div class=&quot;mdc-eq-grid&quot;&gt;' + g.rows.map(function (r) {&#10;        return '&lt;div class=&quot;mdc-eq&quot;&gt;&lt;span class=&quot;mdc-eq-v&quot;&gt;' + esc(fmt(r.n)) + '&lt;\/span&gt;&lt;span class=&quot;mdc-eq-u&quot;&gt;' + esc(r.u) + '&lt;\/span&gt;&lt;\/div&gt;';&#10;      }).join('') + '&lt;\/div&gt;&lt;\/div&gt;';&#10;    }).join('');&#10;&#10;    \/\/ Formula &amp; steps&#10;    $('mdc-formula').innerHTML = '&lt;div class=&quot;mdc-formula-main&quot;&gt;' + esc(R.formula.main) + '&lt;\/div&gt;&lt;ul&gt;' +&#10;      R.formula.where.map(function (w) { return '&lt;li&gt;' + esc(w) + '&lt;\/li&gt;'; }).join('') + '&lt;\/ul&gt;';&#10;    $('mdc-steps').innerHTML = R.steps.map(function (s) { return '&lt;li&gt;' + esc(s) + '&lt;\/li&gt;'; }).join('');&#10;&#10;    \/\/ Input summary&#10;    var rows = [['Calculation mode', R.modeLabel]].concat(R.inputs);&#10;    $('mdc-details').innerHTML = rows.map(function (r) { return '&lt;dt&gt;' + esc(r[0]) + '&lt;\/dt&gt;&lt;dd&gt;' + esc(r[1]) + '&lt;\/dd&gt;'; }).join('');&#10;&#10;    \/\/ Material information&#10;    $('mdc-matinfo').innerHTML = materialInfoHtml(R);&#10;  }&#10;&#10;  function materialInfoHtml(R) {&#10;    var html = '';&#10;    if (R.mode === 'density') {&#10;      var ranked = MATERIALS.slice().sort(function (a, b) { return Math.abs(a.rho - R.rho) - Math.abs(b.rho - R.rho); }).slice(0, 3);&#10;      html += '&lt;dl class=&quot;mdc-dl&quot;&gt;&lt;dt&gt;Calculated density&lt;\/dt&gt;&lt;dd&gt;' + esc(fmt(R.rho) + ' kg\/m\u00b3 = ' + fmt(R.rho \/ 1000) + ' g\/cm\u00b3 = ' + fmt(R.rho \/ unit('density', 'lbin3').f) + ' lb\/in\u00b3') + '&lt;\/dd&gt;' +&#10;        '&lt;dt&gt;Specific gravity&lt;\/dt&gt;&lt;dd&gt;' + esc(fmt(R.rho \/ WATER, 5)) + ' (relative to water at \u2248 1,000 kg\/m\u00b3)&lt;\/dd&gt;&lt;\/dl&gt;';&#10;      html += '&lt;p class=&quot;mdc-small&quot;&gt;&lt;strong&gt;Closest reference densities in the database:&lt;\/strong&gt;&lt;\/p&gt;&lt;ul class=&quot;mdc-matches&quot;&gt;' + ranked.map(function (m) {&#10;        var diff = (R.rho - m.rho) \/ m.rho * 100;&#10;        return '&lt;li&gt;&lt;span&gt;' + esc(m.name) + ' &lt;span class=&quot;mdc-small&quot;&gt;(' + esc(CAT_NAME[m.cat]) + ')&lt;\/span&gt;&lt;\/span&gt;&lt;span&gt;' + esc(fmt(m.rho)) + ' kg\/m\u00b3 \u00b7 ' + (diff &gt;= 0 ? '+' : '\u2212') + esc(fmt(Math.abs(diff), 3)) + '%&lt;\/span&gt;&lt;\/li&gt;';&#10;      }).join('') + '&lt;\/ul&gt;&lt;p class=&quot;mdc-small&quot;&gt;A matching density alone does not identify a material; different materials can share similar densities.&lt;\/p&gt;';&#10;      return html;&#10;    }&#10;    var M = R.material;&#10;    html += '&lt;dl class=&quot;mdc-dl&quot;&gt;&lt;dt&gt;Material&lt;\/dt&gt;&lt;dd&gt;' + esc(M.label) + '&lt;\/dd&gt;&lt;dt&gt;Category&lt;\/dt&gt;&lt;dd&gt;' + esc(M.cat) + '&lt;\/dd&gt;';&#10;    html += '&lt;dt&gt;Reference density&lt;\/dt&gt;&lt;dd&gt;' + (M.ref !== null ? esc(fmt(M.ref) + ' kg\/m\u00b3 (' + fmt(M.ref \/ 1000) + ' g\/cm\u00b3) \u2014 approximate') : 'Not applicable (user-defined)') + '&lt;\/dd&gt;';&#10;    html += '&lt;dt&gt;Density used&lt;\/dt&gt;&lt;dd&gt;' + esc(fmt(R.rho) + ' kg\/m\u00b3 = ' + fmt(R.rho \/ 1000) + ' g\/cm\u00b3 = ' + fmt(R.rho \/ unit('density', 'lbft3').f) + ' lb\/ft\u00b3 = ' + fmt(R.rho \/ unit('density', 'lbin3').f) + ' lb\/in\u00b3') + '&lt;\/dd&gt;';&#10;    html += '&lt;dt&gt;Specific gravity&lt;\/dt&gt;&lt;dd&gt;' + esc(fmt(R.rho \/ WATER, 5)) + '&lt;\/dd&gt;&lt;\/dl&gt;';&#10;    if (M.edited) html += '&lt;p class=&quot;mdc-small&quot;&gt;&lt;strong&gt;Note:&lt;\/strong&gt; the density was edited and differs from the database reference value.&lt;\/p&gt;';&#10;    html += '&lt;p class=&quot;mdc-small&quot;&gt;Preset densities are approximate reference values, not certified specifications. Actual density varies with alloy composition, grade, temperature, porosity, moisture content, and manufacturing conditions.&lt;\/p&gt;';&#10;    return html;&#10;  }&#10;&#10;  \/** Builds the SVG for the current shape with live dimension labels. *\/&#10;  function currentSvg() {&#10;    var sh = SHAPES[state.shape];&#10;    var u = unit('length', $('mdc-dim-unit').value).sym;&#10;    var lab = function (k) {&#10;      var p = parseNum(state.dims[state.shape][k]);&#10;      return (p.ok &amp;&amp; p.n &gt; 0) ? k + ' = ' + fmt(p.n, 5) + ' ' + u : k;&#10;    };&#10;    return svgDoc(SHAPE_SVG[state.shape](lab, state.tubeMethod), sh.name + ' illustration');&#10;  }&#10;  function renderShape() {&#10;    var show = state.mode === 'geometry';&#10;    $('mdc-shape-card').hidden = !show;&#10;    if (show) $('mdc-svg').innerHTML = currentSvg();&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     14. Mode switching, reset, examples&#10;     ------------------------------------------------------------------ *\/&#10;  function setMode(mode) {&#10;    state.mode = mode;&#10;    Array.prototype.forEach.call(root.querySelectorAll('input[name=&quot;mdc-mode&quot;]'), function (r) { r.checked = r.value === mode; });&#10;    $('mdc-mode-hint').textContent = MODE_INFO[mode].hint;&#10;    $('mdc-material-set').hidden = mode === 'density';&#10;    $('mdc-mass-wrap').hidden = !(mode === 'density' || mode === 'volume');&#10;    $('mdc-volume-wrap').hidden = !(mode === 'density' || mode === 'mass');&#10;    $('mdc-qty-set').hidden = mode === 'geometry';&#10;    $('mdc-shape-set').hidden = mode !== 'geometry';&#10;    compute();&#10;  }&#10;&#10;  function selectMaterial(id) {&#10;    $('mdc-mat-cat').value = 'all';&#10;    $('mdc-mat-search').value = '';&#10;    state.materialId = id;&#10;    buildMaterialOptions();&#10;    $('mdc-material').value = id;&#10;    applyMaterial(id);&#10;  }&#10;&#10;  function resetAll() {&#10;    $('mdc-mass').value = DEFAULTS.mass; setSelect('mdc-mass-unit', DEFAULTS.massUnit);&#10;    $('mdc-volume').value = DEFAULTS.volume; setSelect('mdc-volume-unit', DEFAULTS.volumeUnit);&#10;    setSelect('mdc-density-unit', DEFAULTS.densityUnit);&#10;    $('mdc-custom-name').value = '';&#10;    selectMaterial(DEFAULTS.material);&#10;    resetDimStore();&#10;    setSelect('mdc-dim-unit', DEFAULTS.dimUnit);&#10;    state.shape = DEFAULTS.shape; state.tubeMethod = DEFAULTS.tubeMethod;&#10;    $('mdc-shape').value = state.shape;&#10;    renderDimFields();&#10;    $('mdc-res-density-unit').value = DEFAULTS.resDensity;&#10;    $('mdc-res-mass-unit').value = DEFAULTS.resMass;&#10;    $('mdc-res-volume-unit').value = DEFAULTS.resVolume;&#10;  }&#10;&#10;  var EXAMPLES = {&#10;    1: { mode: 'density', msg: 'Example 1 loaded: 785 g \u00f7 100 cm\u00b3 = 7.85 g\/cm\u00b3 (7,850 kg\/m\u00b3).',&#10;         apply: function () { $('mdc-mass').value = '785'; setSelect('mdc-mass-unit', 'g'); $('mdc-volume').value = '100'; setSelect('mdc-volume-unit', 'cm3'); $('mdc-res-density-unit').value = 'gcm3'; } },&#10;    2: { mode: 'mass', msg: 'Example 2 loaded: carbon steel, 7,850 kg\/m\u00b3 \u00d7 0.01 m\u00b3 = 78.5 kg.',&#10;         apply: function () { setSelect('mdc-density-unit', 'kgm3'); selectMaterial('carbon-steel'); $('mdc-volume').value = '0.01'; setSelect('mdc-volume-unit', 'm3'); $('mdc-res-mass-unit').value = 'kg'; } },&#10;    3: { mode: 'geometry', msg: 'Example 3 loaded: carbon steel sheet 2000 \u00d7 1000 \u00d7 5 mm \u2192 0.01 m\u00b3 \u2192 78.5 kg.',&#10;         apply: function () {&#10;           setSelect('mdc-density-unit', 'kgm3'); selectMaterial('carbon-steel');&#10;           convertDimsTo('mm');&#10;           state.shape = 'plate'; $('mdc-shape').value = 'plate';&#10;           state.dims.plate = { L: '2000', W: '1000', T: '5' };&#10;           renderDimFields();&#10;           $('mdc-res-volume-unit').value = 'm3'; $('mdc-res-mass-unit').value = 'kg';&#10;         } },&#10;    4: { mode: 'volume', msg: 'Volume example loaded: 78.5 kg of carbon steel \u00f7 7,850 kg\/m\u00b3 = 0.01 m\u00b3.',&#10;         apply: function () { setSelect('mdc-density-unit', 'kgm3'); selectMaterial('carbon-steel'); $('mdc-mass').value = '78.5'; setSelect('mdc-mass-unit', 'kg'); $('mdc-res-volume-unit').value = 'm3'; } }&#10;  };&#10;  function loadExample(n) {&#10;    var ex = EXAMPLES[n];&#10;    ex.apply();&#10;    setMode(ex.mode);&#10;    status('mdc-input-status', ex.msg);&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     15. Status messages&#10;     ------------------------------------------------------------------ *\/&#10;  var timers = {};&#10;  function status(id, msg, isError) {&#10;    var el = $(id);&#10;    el.textContent = msg;&#10;    el.style.color = isError ? 'var(--mdc-danger)' : 'var(--mdc-ok)';&#10;    clearTimeout(timers[id]);&#10;    timers[id] = setTimeout(function () { el.textContent = ''; }, 5000);&#10;  }&#10;&#10;  \/* ------------------------------------------------------------------&#10;     16. Event wiring (delegated, scoped to the calculator root)&#10;     ------------------------------------------------------------------ *\/&#10;  root.addEventListener('input', function (e) {&#10;    var t = e.target;&#10;    if (t.id === 'mdc-mat-search') { buildMaterialOptions(); compute(); return; }&#10;    if (t.id === 'mdc-density') updateDensityBadge();&#10;    if (t.classList.contains('mdc-dim-input')) state.dims[state.shape][t.getAttribute('data-k')] = t.value;&#10;    if (t.classList.contains('mdc-input')) compute();&#10;  });&#10;&#10;  root.addEventListener('change', function (e) {&#10;    var t = e.target;&#10;    if (t.name === 'mdc-mode') { setMode(t.value); return; }&#10;    if (t.id === 'mdc-mat-cat') { buildMaterialOptions(); compute(); return; }&#10;    if (t.id === 'mdc-material') { applyMaterial(t.value); compute(); return; }&#10;    if (t.getAttribute('data-mdc-for')) {&#10;      convertUnitField(t);&#10;      if (t.id === 'mdc-density-unit') updateDensityBadge();&#10;      compute(); return;&#10;    }&#10;    if (t.id === 'mdc-dim-unit') { convertDimsTo(t.value); compute(); return; }&#10;    if (t.id === 'mdc-shape') { state.shape = t.value; renderDimFields(); compute(); return; }&#10;    if (t.id === 'mdc-tube-method') { switchTubeMethod(t.value); renderDimFields(); compute(); return; }&#10;    if (t.id &amp;&amp; t.id.indexOf('mdc-res-') === 0) { compute(); return; }&#10;  });&#10;&#10;  $('mdc-form').addEventListener('submit', function (e) {&#10;    e.preventDefault();&#10;    var res = $('mdc-results'), first = res.hidden;&#10;    res.hidden = false;&#10;    compute();&#10;    if (first &amp;&amp; res.scrollIntoView) res.scrollIntoView({ behavior: 'smooth', block: 'start' });&#10;    if (state.last) status('mdc-input-status', 'Calculation updated.');&#10;    else status('mdc-input-status', 'Please correct the highlighted inputs.', true);&#10;  });&#10;&#10;  root.addEventListener('click', function (e) {&#10;    var b = e.target.closest ? e.target.closest('button') : null;&#10;    if (!b || !root.contains(b)) return;&#10;    if (b.hasAttribute('data-mdc-example')) { loadExample(Number(b.getAttribute('data-mdc-example'))); return; }&#10;  });&#10;&#10;  \/* ------------------------------------------------------------------&#10;     17. Initialisation&#10;     ------------------------------------------------------------------ *\/&#10;  fillUnitSelects();&#10;  resetAll();&#10;  setMode('density');&#10;})();&#10;&lt;\/script&gt;&#10;&lt;script&gt;&#10;(function () {&#10;  var f = null;&#10;  try { f = window.frameElement; } catch (e) { f = null; }&#10;  if (!f) return;&#10;  var root = document.getElementById('mdc-app');&#10;  function fit() {&#10;    var h = Math.ceil((root || document.body).getBoundingClientRect().height);&#10;    if (h &gt; 0) f.style.setProperty('height', h + 'px', 'important');&#10;  }&#10;  fit();&#10;  if (window.ResizeObserver) new ResizeObserver(fit).observe(root || document.body);&#10;  window.addEventListener('load', fit);&#10;  window.addEventListener('resize', fit);&#10;  setTimeout(fit, 300);&#10;})();&#10;&lt;\/script&gt;&#10;&lt;\/body&gt;&#10;&lt;\/html&gt;&#10;\"><\/iframe>\n","protected":false},"excerpt":{"rendered":"<p>The Material Density Calculator is a free online tool designed to help engineers, manufacturers, and material professionals accurately calculate density, mass, volume, and material weight&#8230;.<\/p>","protected":false},"author":2,"featured_media":24994,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8796,8798,8797,8799],"class_list":["post-24993","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-density-calculator","tag-material-density","tag-material-weight","tag-metal-density","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/10\/Material-Density-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24993","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/comments?post=24993"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24993\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media\/24994"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media?parent=24993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/categories?post=24993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/tags?post=24993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}