{"id":25054,"date":"2026-11-06T03:00:51","date_gmt":"2026-11-06T03:00:51","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=25054"},"modified":"2026-11-06T03:31:19","modified_gmt":"2026-11-06T03:31:19","slug":"shearing-force-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/fr\/shearing-force-calculator\/","title":{"rendered":"Shearing Force Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Shearing Force Calculator<\/strong> estimates the force required to cut sheet metal or plate based on material shear strength, thickness, and cutting length. Enter your material and cutting details to get an estimated force in kN and metric tons-force. Use the result as a planning guide and confirm machine capacity with the manufacturer, since actual requirements can vary with material properties, blade clearance, cutting angle, and machine design.<\/p>\n\n\n\n<!-- Shearing Force Calculator \u2014 paste this whole snippet into a WordPress Custom HTML block.\n     Everything is isolated inside a Shadow DOM, so it does not change any other part of the page. -->\n<div id=\"sfc-host\"><\/div>\n<template id=\"sfc-tpl\">\n<style>\n:host{all:initial;display:block;contain:layout style}\n\/* =====================================================================\n   Shearing Force Calculator \u2014 these styles live inside a Shadow DOM,\n   so they cannot reach the rest of the page and theme styles cannot reach in.\n   ===================================================================== *\/\n.sfc-root{\n  --sfc-blue:#1e3a8a;--sfc-blue-2:#1d4ed8;--sfc-blue-soft:#e8eefb;--sfc-blue-line:#c7d4f0;\n  --sfc-bg:#f3f5f8;--sfc-card:#ffffff;--sfc-text:#1f2937;--sfc-heading:#111827;--sfc-muted:#525c6b;\n  --sfc-border:#d6dce5;--sfc-field:#fbfcfe;--sfc-danger:#b42318;--sfc-danger-bg:#fef3f2;\n  --sfc-radius:12px;--sfc-shadow:0 1px 2px rgba(16,24,40,.06),0 6px 16px rgba(16,24,40,.06);\n  font-family:system-ui,-apple-system,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n  font-size:16px;line-height:1.55;color:var(--sfc-text);background:var(--sfc-bg);\n  max-width:1000px;margin:0 auto;padding:28px 16px 36px;text-align:left;border-radius:16px;\n  -webkit-text-size-adjust:100%;\n}\n.sfc-root *,.sfc-root *::before,.sfc-root *::after{box-sizing:border-box}\n.sfc-root [hidden]{display:none !important}\n.sfc-root h2,.sfc-root h3{font-family:inherit;color:var(--sfc-heading);line-height:1.25;margin:0 0 .5em;padding:0;letter-spacing:normal;text-transform:none;font-weight:700;border:0;background:none}\n.sfc-root h2.sfc-h{font-size:clamp(1.1rem,2vw,1.3rem);margin:0 0 14px}\n.sfc-root h3{font-size:.95rem}\n.sfc-root p{margin:0 0 .85em;padding:0}\n.sfc-root ul{margin:0;padding-left:1.2em}\n.sfc-root li{margin:0 0 .3em}\n\/* ---------- layout ---------- *\/\n.sfc-root .sfc-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:22px}\n.sfc-root .sfc-card{background:var(--sfc-card);border:1px solid var(--sfc-border);border-radius:var(--sfc-radius);box-shadow:var(--sfc-shadow);padding:22px}\n.sfc-root .sfc-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 16px}\n\/* ---------- fields ---------- *\/\n.sfc-root .sfc-field{margin:0 0 16px;min-width:0}\n.sfc-root .sfc-field > label{display:block;font-size:.88rem;font-weight:600;color:var(--sfc-text);margin:0 0 5px;line-height:1.3}\n.sfc-root .sfc-req{color:var(--sfc-danger);font-weight:700;margin-left:2px}\n.sfc-root .sfc-opt{color:var(--sfc-muted);font-weight:500;font-size:.82rem;margin-left:4px}\n.sfc-root .sfc-inline{display:flex;gap:8px;align-items:stretch}\n.sfc-root .sfc-inline .sfc-input{flex:1 1 auto;min-width:0}\n.sfc-root .sfc-inline .sfc-unit{flex:0 0 auto;width:auto;min-width:96px;max-width:45%}\n.sfc-root .sfc-input,.sfc-root .sfc-select{\n  display:block;width:100%;height:42px;margin:0;padding:8px 12px;font:inherit;font-size:15px;line-height:1.3;color:var(--sfc-text);\n  background-color:var(--sfc-field);border:1px solid #b9c2cf;border-radius:8px;box-shadow:none;outline:none;\n  transition:border-color .15s,box-shadow .15s;max-width:none;min-height:0;text-transform:none;letter-spacing:normal}\n.sfc-root .sfc-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:32px;cursor:pointer;\n  background-image:url(\"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\");\n  background-repeat:no-repeat;background-position:right 11px center;background-size:12px 8px}\n.sfc-root .sfc-input:hover,.sfc-root .sfc-select:hover{border-color:#8f9bab}\n.sfc-root .sfc-input:focus,.sfc-root .sfc-select:focus{border-color:var(--sfc-blue-2);box-shadow:0 0 0 3px rgba(29,78,216,.25);background-color:#fff}\n.sfc-root .sfc-input.sfc-invalid{border-color:var(--sfc-danger);background-color:var(--sfc-danger-bg)}\n.sfc-root .sfc-input.sfc-invalid:focus{box-shadow:0 0 0 3px rgba(180,35,24,.2)}\n.sfc-root .sfc-err{color:var(--sfc-danger);font-size:.83rem;margin:5px 0 0;line-height:1.35;font-weight:500}\n.sfc-root .sfc-help{color:var(--sfc-muted);font-size:.82rem;margin:5px 0 0;line-height:1.4}\n\/* ---------- buttons (hardened against theme button rules) ---------- *\/\n.sfc-root .sfc-actions{display:flex !important;flex-wrap:wrap;justify-content:center;gap:10px;width:100%;margin:8px 0 0 !important;padding:0 !important;float:none !important;clear:both}\n.sfc-root .sfc-btn{display:inline-flex !important;align-items:center;justify-content:center;float:none !important;width:auto !important;min-width:140px;height:42px;padding:0 20px;margin:0 !important;\n  position:static !important;font:inherit;font-size:.95rem;font-weight:650;line-height:1;border-radius:8px;border:1px solid var(--sfc-blue);background:var(--sfc-blue);color:#fff;cursor:pointer;\n  text-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;transition:background .15s,border-color .15s,color .15s}\n.sfc-root .sfc-btn:hover{background:#172f73;border-color:#172f73;color:#fff}\n.sfc-root .sfc-btn.sfc-btn-2{background:#fff;color:var(--sfc-blue);border-color:#9fb1db}\n.sfc-root .sfc-btn.sfc-btn-2:hover{background:var(--sfc-blue-soft);color:var(--sfc-blue);border-color:var(--sfc-blue)}\n.sfc-root .sfc-btn:focus-visible{outline:3px solid var(--sfc-blue-2);outline-offset:2px}\n\/* ---------- results ---------- *\/\n.sfc-root .sfc-results:focus{outline:none}\n.sfc-root .sfc-alert{border:1px solid #fecdca;background:var(--sfc-danger-bg);color:var(--sfc-danger);border-radius:10px;padding:12px 14px;margin:0;font-size:.9rem}\n.sfc-root .sfc-alert ul{margin:6px 0 0;padding-left:1.2em}\n.sfc-root .sfc-sub-h{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin:0 0 8px}\n.sfc-root .sfc-rgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.sfc-root .sfc-rcard{border:1px solid var(--sfc-blue-line);background:var(--sfc-blue-soft);border-radius:12px;padding:16px 16px 14px;min-width:0}\n.sfc-root .sfc-rcard-label{display:block;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin-bottom:6px}\n.sfc-root .sfc-rcard-value{font-size:clamp(1.5rem,3.2vw,2rem);font-weight:800;line-height:1.15;color:var(--sfc-heading);word-break:break-word;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-rcard-unit{font-size:.5em;font-weight:700;margin-left:5px;color:var(--sfc-muted)}\n.sfc-root .sfc-rcard-sub{font-size:.82rem;color:var(--sfc-muted);margin-top:6px;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj{margin-top:14px;border-radius:12px;padding:18px;background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 100%);color:#fff}\n.sfc-root .sfc-adj .sfc-rcard-label{color:#dbe5ff}\n.sfc-root .sfc-adj-main{font-size:clamp(1.7rem,3.6vw,2.3rem);font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj-main .sfc-rcard-unit{color:#dbe5ff}\n.sfc-root .sfc-adj-alt{margin-top:6px;font-size:.92rem;color:#e9efff;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj-note{margin-top:8px;font-size:.82rem;color:#e9efff}\n.sfc-root .sfc-table{width:100%;border-collapse:collapse;margin:14px 0 0;font-size:.9rem;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-table caption{text-align:left;caption-side:top;padding:0 0 4px}\n.sfc-root .sfc-table th,.sfc-root .sfc-table td{text-align:left;padding:9px 10px;border:0;border-bottom:1px solid var(--sfc-border);vertical-align:top;background:none}\n.sfc-root .sfc-table th{font-weight:600;color:var(--sfc-muted);width:42%}\n.sfc-root .sfc-table td{color:var(--sfc-heading);font-weight:600}\n.sfc-root .sfc-table tr:last-child th,.sfc-root .sfc-table tr:last-child td{border-bottom:0}\n.sfc-root .sfc-formula{background:#0f1f45;color:#e6edff;padding:14px 16px;border-radius:10px;margin:14px 0 0}\n.sfc-root .sfc-formula-label{display:block;font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#b4c4ec;margin-bottom:4px}\n.sfc-root .sfc-formula-sub{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.86rem;color:#e6edff;word-break:break-word;margin:0;line-height:1.6}\n.sfc-root .sfc-disclaimer{font-size:.85rem;color:var(--sfc-muted);background:#f6f8fb;border-left:3px solid var(--sfc-blue-line);padding:10px 12px;border-radius:0 8px 8px 0;margin:16px 0 0}\n.sfc-root .sfc-disclaimer strong{color:var(--sfc-heading)}\n.sfc-root .sfc-sr{position:absolute !important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n\/* ---------- responsive ---------- *\/\n@media (max-width:600px){\n  .sfc-root{padding:20px 12px 28px;border-radius:0}\n  .sfc-root .sfc-card{padding:16px}\n  .sfc-root .sfc-row,.sfc-root .sfc-rgrid{grid-template-columns:minmax(0,1fr)}\n  .sfc-root .sfc-btn{flex:1 1 100%}\n  .sfc-root .sfc-table th{width:50%}\n}\n@media (prefers-reduced-motion:reduce){\n  .sfc-root *{transition:none !important}\n}\n<\/style>\n<div class=\"sfc-root\" id=\"sfc-app\">\n  <div class=\"sfc-stack\">\n    <!-- ================= INPUTS ================= -->\n    <section class=\"sfc-card\" aria-labelledby=\"sfc-inputs-title\">\n      <h2 class=\"sfc-h\" id=\"sfc-inputs-title\">Shearing Inputs<\/h2>\n      <form id=\"sfc-form\" novalidate autocomplete=\"off\">\n        <div class=\"sfc-row\">\n          <!-- Material -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-mat\">Material Type<\/label>\n            <select id=\"sfc-mat\" class=\"sfc-select\" aria-describedby=\"sfc-mat-help\">\n              <option value=\"mild\">Mild Steel (\u2248 350 MPa)<\/option>\n              <option value=\"stainless\">Stainless Steel (\u2248 500 MPa)<\/option>\n              <option value=\"aluminum\">Aluminum (\u2248 140 MPa)<\/option>\n              <option value=\"custom\">Custom (enter shear strength)<\/option>\n            <\/select>\n            <p class=\"sfc-help\" id=\"sfc-mat-help\"><\/p>\n          <\/div>\n          <!-- Shear strength -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-ss\">Material Shear Strength<span class=\"sfc-req\" id=\"sfc-ss-req\" aria-hidden=\"true\" hidden>*<\/span><\/label>\n            <div class=\"sfc-inline\">\n              <input id=\"sfc-ss\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-ss-err sfc-ss-help\">\n              <select id=\"sfc-ss-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Shear strength unit\">\n                <option value=\"mpa\">MPa<\/option>\n                <option value=\"nmm2\">N\/mm\u00b2<\/option>\n                <option value=\"psi\">psi<\/option>\n              <\/select>\n            <\/div>\n            <p class=\"sfc-err\" id=\"sfc-ss-err\" hidden><\/p>\n            <p class=\"sfc-help\" id=\"sfc-ss-help\"><\/p>\n          <\/div>\n          <!-- Thickness -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-t\">Material Thickness<\/label>\n            <div class=\"sfc-inline\">\n              <input id=\"sfc-t\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-t-err\">\n              <select id=\"sfc-t-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Thickness unit\">\n                <option value=\"mm\">mm<\/option>\n                <option value=\"in\">in<\/option>\n              <\/select>\n            <\/div>\n            <p class=\"sfc-err\" id=\"sfc-t-err\" hidden><\/p>\n          <\/div>\n          <!-- Cutting length -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-l\">Cutting Length<\/label>\n            <div class=\"sfc-inline\">\n              <input id=\"sfc-l\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-l-err sfc-l-help\">\n              <select id=\"sfc-l-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Cutting length unit\">\n                <option value=\"mm\">mm<\/option>\n                <option value=\"in\">in<\/option>\n              <\/select>\n            <\/div>\n            <p class=\"sfc-err\" id=\"sfc-l-err\" hidden><\/p>\n            <p class=\"sfc-help\" id=\"sfc-l-help\">Length of the cut edge being sheared at once.<\/p>\n          <\/div>\n          <!-- Safety factor -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-sf\">Safety Factor<span class=\"sfc-opt\">(optional)<\/span><\/label>\n            <input id=\"sfc-sf\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-sf-err sfc-sf-help\">\n            <p class=\"sfc-err\" id=\"sfc-sf-err\" hidden><\/p>\n            <p class=\"sfc-help\" id=\"sfc-sf-help\">Must be 1 or greater. Default 1.2. Leave blank to skip the adjusted force.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"sfc-actions\">\n          <button type=\"submit\" class=\"sfc-btn\" id=\"sfc-calc\">Calculate<\/button>\n        <\/div>\n        <p class=\"sfc-sr\" id=\"sfc-status\" role=\"status\" aria-live=\"polite\"><\/p>\n      <\/form>\n    <\/section>\n    <!-- ================= RESULTS ================= -->\n    <section class=\"sfc-card sfc-results\" aria-labelledby=\"sfc-results-title\" id=\"sfc-results\" tabindex=\"-1\" hidden>\n      <h2 class=\"sfc-h\" id=\"sfc-results-title\">Results<\/h2>\n      <div class=\"sfc-alert\" id=\"sfc-error\" role=\"alert\" hidden><\/div>\n      <div id=\"sfc-body\">\n        <p class=\"sfc-sub-h\">Estimated shearing force<\/p>\n        <div class=\"sfc-rgrid\">\n          <div class=\"sfc-rcard\">\n            <span class=\"sfc-rcard-label\">Force<\/span>\n            <div class=\"sfc-rcard-value\"><span id=\"sfc-r-kn\"><\/span><span class=\"sfc-rcard-unit\">kN<\/span><\/div>\n            <div class=\"sfc-rcard-sub\" id=\"sfc-r-n\"><\/div>\n          <\/div>\n          <div class=\"sfc-rcard\">\n            <span class=\"sfc-rcard-label\">Metric tons-force<\/span>\n            <div class=\"sfc-rcard-value\"><span id=\"sfc-r-tf\"><\/span><span class=\"sfc-rcard-unit\">tf<\/span><\/div>\n            <div class=\"sfc-rcard-sub\">1 tf \u2248 9.80665 kN<\/div>\n          <\/div>\n        <\/div>\n        <div class=\"sfc-adj\" id=\"sfc-adj\">\n          <span class=\"sfc-rcard-label\" id=\"sfc-adj-label\">Adjusted force with safety factor<\/span>\n          <div class=\"sfc-adj-main\"><span id=\"sfc-r-adj-kn\"><\/span><span class=\"sfc-rcard-unit\">kN<\/span><\/div>\n          <div class=\"sfc-adj-alt\" id=\"sfc-r-adj-tf\"><\/div>\n          <div class=\"sfc-adj-note\" id=\"sfc-r-adj-note\"><\/div>\n        <\/div>\n        <table class=\"sfc-table\">\n          <caption class=\"sfc-sub-h\">Calculation summary<\/caption>\n          <tbody>\n            <tr><th scope=\"row\">Material<\/th><td id=\"sfc-s-mat\"><\/td><\/tr>\n            <tr><th scope=\"row\">Shear strength used<\/th><td id=\"sfc-s-ss\"><\/td><\/tr>\n            <tr><th scope=\"row\">Material thickness<\/th><td id=\"sfc-s-t\"><\/td><\/tr>\n            <tr><th scope=\"row\">Cutting length<\/th><td id=\"sfc-s-l\"><\/td><\/tr>\n            <tr><th scope=\"row\">Safety factor<\/th><td id=\"sfc-s-sf\"><\/td><\/tr>\n          <\/tbody>\n        <\/table>\n        <div class=\"sfc-formula\">\n          <span class=\"sfc-formula-label\">Calculation<\/span>\n          <p class=\"sfc-formula-sub\" id=\"sfc-d\"><\/p>\n        <\/div>\n      <\/div>\n      <p class=\"sfc-disclaimer\"><strong>Important:<\/strong> This calculator provides an engineering estimate. Actual machine capacity requirements may vary with material grade, blade condition, cutting angle or rake, clearance, machine design, and operating conditions. Confirm the required capacity with the machine manufacturer or a qualified engineer.<\/p>\n    <\/section>\n  <\/div>\n<\/div>\n<\/template>\n<script>\n\/* =====================================================================\n   Shearing Force Calculator \u2014 vanilla JavaScript, no globals.\n   Internal units: lengths in mm, strength in N\/mm\u00b2 (= MPa), force in N.\n   ===================================================================== *\/\n(function () {\n  'use strict';\n  var host = document.getElementById('sfc-host');\n  var tpl = document.getElementById('sfc-tpl');\n  if (!host || !tpl || host.getAttribute('data-sfc-ready') === '1') return;\n  host.setAttribute('data-sfc-ready', '1');\n  \/\/ Isolate the calculator in a Shadow DOM: its CSS and IDs stay inside it.\n  var scope = host.attachShadow ? host.attachShadow({ mode: 'open' }) : host;\n  scope.appendChild(tpl.content ? tpl.content.cloneNode(true) : document.createRange().createContextualFragment(tpl.innerHTML));\n  if (tpl.parentNode) tpl.parentNode.removeChild(tpl);\n  function $(id) { return scope.getElementById ? scope.getElementById(id) : scope.querySelector('#' + id); }\n  var root = $('sfc-app');\n  if (!root) return;\n  \/* ---------- 1. Reference data ---------- *\/\n  var MM_PER_IN = 25.4;\n  var PSI_PER_MPA = 145.0377377;   \/\/ 1 MPa = 145.0377 psi\n  var KN_PER_TF = 9.80665;         \/\/ 1 metric ton-force\n  var DEFAULT_SF = '1.2';\n  var MATERIALS = {\n    mild:      { name: 'Mild Steel',      ss: 350, note: 'Typical shear strength of low-carbon steel (\u2248 350 MPa). Edit to match your grade.' },\n    stainless: { name: 'Stainless Steel', ss: 500, note: 'Typical for annealed austenitic grades such as 304 (\u2248 500 MPa). Edit to match your grade.' },\n    aluminum:  { name: 'Aluminum',        ss: 140, note: 'Typical for 5052-H32 sheet (\u2248 140 MPa). Alloys and tempers vary widely.' },\n    custom:    { name: 'Custom material', ss: null, note: 'Enter the shear strength from your material certificate or datasheet.' }\n  };\n  \/* ---------- 2. Parsing & formatting ---------- *\/\n  \/** Accepts \"1,5\" (decimal comma), \"1,000.5\" and scientific notation. *\/\n  function parseNum(raw) {\n    var s = String(raw == null ? '' : raw).trim().replace(\/\\s+\/g, '');\n    if (s === '') return { empty: true, ok: false };\n    if (\/^[+-]?\\d{1,3}(,\\d{3})+(\\.\\d+)?$\/.test(s)) s = s.replace(\/,\/g, '');\n    else if (\/^[+-]?\\d*,\\d+$\/.test(s)) s = s.replace(',', '.');\n    if (!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(s)) return { empty: false, ok: false };\n    var n = Number(s);\n    if (!isFinite(n)) return { empty: false, ok: false };\n    return { empty: false, ok: true, n: n };\n  }\n  \/** Practical decimals: more places for small values so precision is not hidden. *\/\n  function fmt(n) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    var a = Math.abs(n), d;\n    if (a === 0) d = 2;\n    else if (a >= 1000) d = 1;\n    else if (a >= 1) d = 2;\n    else if (a >= 0.01) d = 4;\n    else return Number(n.toPrecision(3)).toString();\n    return n.toLocaleString('en-US', { minimumFractionDigits: d, maximumFractionDigits: d });\n  }\n  function g(n, p) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    return Number(n.toPrecision(p || 6)).toLocaleString('en-US', { maximumFractionDigits: 10 });\n  }\n  function plain(n, p) { return String(Number(n.toPrecision(p || 6))); }\n  function esc(s) {\n    return String(s).replace(\/[&<>\"']\/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n  \/* ---------- 3. Unit helpers ---------- *\/\n  function toMm(v, u) { return u === 'in' ? v * MM_PER_IN : v; }\n  function fromMm(mm, u) { return u === 'in' ? mm \/ MM_PER_IN : mm; }\n  function toNmm2(v, u) { return u === 'psi' ? v \/ PSI_PER_MPA : v; }      \/\/ MPa and N\/mm\u00b2 are identical\n  function fromNmm2(v, u) { return u === 'psi' ? v * PSI_PER_MPA : v; }\n  var SS_LABEL = { mpa: 'MPa', nmm2: 'N\/mm\u00b2', psi: 'psi' };\n  \/* ---------- 4. Validation ---------- *\/\n  var LABEL = { ss: 'Shear strength', t: 'Material thickness', l: 'Cutting length', sf: 'Safety factor' };\n  var KEYS = ['ss', 't', 'l', 'sf'];\n  function setErr(key, msg) {\n    var el = $('sfc-' + key), er = $('sfc-' + key + '-err');\n    if (msg) {\n      el.classList.add('sfc-invalid'); el.setAttribute('aria-invalid', 'true');\n      er.textContent = msg; er.hidden = false;\n    } else {\n      el.classList.remove('sfc-invalid'); el.removeAttribute('aria-invalid');\n      er.textContent = ''; er.hidden = true;\n    }\n  }\n  function clearAllErrors() { KEYS.forEach(function (k) { setErr(k, null); }); }\n  function check(key) {\n    var p = parseNum($('sfc-' + key).value);\n    if (key === 'sf') {\n      if (p.empty) return null;                       \/\/ optional\n      if (!p.ok) return 'Safety factor must be a valid number.';\n      if (p.n < 1) return 'Safety factor must be 1 or greater.';\n      return null;\n    }\n    if (p.empty) {\n      if (key === 'ss' &#038;&#038; $('sfc-mat').value === 'custom') return 'Shear strength is required for a custom material.';\n      return LABEL[key] + ' is required.';\n    }\n    if (!p.ok) return LABEL[key] + ' must be a valid number.';\n    if (p.n <= 0) return LABEL[key] + ' must be greater than zero.';\n    return null;\n  }\n  \/* ---------- 5. Material handling ---------- *\/\n  function applyMaterial(focusCustom) {\n    var key = $('sfc-mat').value, m = MATERIALS[key];\n    $('sfc-mat-help').textContent = m.note;\n    $('sfc-ss-req').hidden = key !== 'custom';\n    if (key === 'custom') $('sfc-ss').setAttribute('aria-required', 'true');\n    else $('sfc-ss').removeAttribute('aria-required');\n    setErr('ss', null);\n    if (m.ss === null) {\n      $('sfc-ss').value = '';\n      $('sfc-ss-help').textContent = 'Required for a custom material.';\n      if (focusCustom) $('sfc-ss').focus();\n    } else {\n      $('sfc-ss').value = plain(fromNmm2(m.ss, $('sfc-ss-unit').value), 5);\n      $('sfc-ss-help').textContent = 'Pre-filled from the selected material. You can edit it.';\n    }\n  }\n  \/* ---------- 6. Calculation ---------- *\/\n  function compute() {\n    clearAllErrors();\n    var errs = [];\n    KEYS.forEach(function (k) { var m = check(k); if (m) { setErr(k, m); errs.push(m); } });\n    if (errs.length) { showErrors(errs); return false; }\n    var u = { ss: $('sfc-ss-unit').value, t: $('sfc-t-unit').value, l: $('sfc-l-unit').value };\n    var ssIn = parseNum($('sfc-ss').value).n, tIn = parseNum($('sfc-t').value).n, lIn = parseNum($('sfc-l').value).n;\n    var sfP = parseNum($('sfc-sf').value), sf = sfP.ok ? sfP.n : null;\n    \/\/ Convert every input to mm and N\/mm\u00b2\n    var ss = toNmm2(ssIn, u.ss), t = toMm(tIn, u.t), L = toMm(lIn, u.l);\n    \/\/ F (N) = L (mm) \u00d7 t (mm) \u00d7 \u03c4 (N\/mm\u00b2)\n    var F_N = L * t * ss;\n    if (!isFinite(F_N) || F_N <= 0) {\n      showErrors(['The result is outside the numeric range that can be represented. Check the magnitude of your inputs.']);\n      return false;\n    }\n    var F_kN = F_N \/ 1000, F_tf = F_kN \/ KN_PER_TF;\n    var adj_kN = sf !== null ? F_kN * sf : null;\n    render({ mat: $('sfc-mat').value, u: u, ssIn: ssIn, tIn: tIn, lIn: lIn, ss: ss, t: t, L: L, sf: sf,\n             F_N: F_N, F_kN: F_kN, F_tf: F_tf, adj_kN: adj_kN });\n    return true;\n  }\n  \/* ---------- 7. Rendering ---------- *\/\n  function showErrors(errs) {\n    var box = $('sfc-error');\n    box.innerHTML = '<strong>Please correct the following input' + (errs.length > 1 ? 's' : '') + ':<\/strong><ul>' +\n      errs.map(function (e) { return '<li>' + esc(e) + '<\/li>'; }).join('') + '<\/ul>';\n    box.hidden = false;\n    $('sfc-body').hidden = true;\n  }\n  function render(R) {\n    $('sfc-error').hidden = true;\n    $('sfc-body').hidden = false;\n    $('sfc-r-kn').textContent = fmt(R.F_kN);\n    $('sfc-r-n').textContent = '= ' + fmt(R.F_N) + ' N';\n    $('sfc-r-tf').textContent = fmt(R.F_tf);\n    var adj = $('sfc-adj');\n    if (R.adj_kN !== null) {\n      adj.hidden = false;\n      $('sfc-r-adj-kn').textContent = fmt(R.adj_kN);\n      $('sfc-r-adj-tf').textContent = '= ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf';\n      $('sfc-r-adj-note').textContent = 'Estimated shearing force \u00d7 safety factor ' + g(R.sf, 4) + '.';\n    } else {\n      adj.hidden = true;\n    }\n    var m = MATERIALS[R.mat];\n    $('sfc-s-mat').textContent = m.name;\n    var ssTxt = g(R.ss, 5) + ' N\/mm\u00b2';\n    if (R.u.ss === 'psi') ssTxt += ' (from ' + g(R.ssIn) + ' psi)';\n    else if (m.ss !== null && Math.abs(R.ss - m.ss) > 0.05) ssTxt += ' (edited from ' + m.ss + ' default)';\n    $('sfc-s-ss').textContent = ssTxt;\n    $('sfc-s-t').textContent = g(R.t) + ' mm' + (R.u.t === 'in' ? ' (from ' + g(R.tIn) + ' in)' : '');\n    $('sfc-s-l').textContent = g(R.L) + ' mm' + (R.u.l === 'in' ? ' (from ' + g(R.lIn) + ' in)' : '');\n    $('sfc-s-sf').textContent = R.sf !== null ? g(R.sf, 4) : 'Not applied';\n    var lines = [];\n    if (R.u.ss === 'psi') lines.push('Shear strength = ' + g(R.ssIn) + ' psi \u00f7 145.0377 = ' + g(R.ss, 5) + ' N\/mm\u00b2');\n    if (R.u.t === 'in') lines.push('Thickness = ' + g(R.tIn) + ' in \u00d7 25.4 = ' + g(R.t) + ' mm');\n    if (R.u.l === 'in') lines.push('Cutting length = ' + g(R.lIn) + ' in \u00d7 25.4 = ' + g(R.L) + ' mm');\n    lines.push('Force = ' + g(R.L) + ' mm \u00d7 ' + g(R.t) + ' mm \u00d7 ' + g(R.ss, 5) + ' N\/mm\u00b2 = ' + fmt(R.F_N) + ' N = ' + fmt(R.F_kN) + ' kN');\n    lines.push('Tons-force = ' + fmt(R.F_kN) + ' kN \u00f7 9.80665 = ' + fmt(R.F_tf) + ' tf');\n    if (R.adj_kN !== null) lines.push('Adjusted = ' + fmt(R.F_kN) + ' kN \u00d7 ' + g(R.sf, 4) + ' = ' + fmt(R.adj_kN) + ' kN = ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf');\n    $('sfc-d').innerHTML = lines.map(esc).join('<br>');\n    $('sfc-status').textContent = 'Calculated. Estimated shearing force ' + fmt(R.F_kN) + ' kilonewtons, ' + fmt(R.F_tf) + ' metric tons-force' +\n      (R.adj_kN !== null ? '. Adjusted force ' + fmt(R.adj_kN) + ' kilonewtons.' : '.');\n  }\n  \/* ---------- 8. Reset & example ---------- *\/\n  function setUnit(id, val) { var s = $(id); s.value = val; s.setAttribute('data-prev', val); }\n  function hideResults() { $('sfc-results').hidden = true; $('sfc-error').hidden = true; $('sfc-status').textContent = ''; }\n  function doReset() {\n    $('sfc-mat').value = 'mild';\n    setUnit('sfc-ss-unit', 'mpa'); setUnit('sfc-t-unit', 'mm'); setUnit('sfc-l-unit', 'mm');\n    $('sfc-t').value = ''; $('sfc-l').value = ''; $('sfc-sf').value = DEFAULT_SF;\n    clearAllErrors();\n    applyMaterial(false);\n    hideResults();\n  }\n  \/* ---------- 9. Events ---------- *\/\n  root.querySelectorAll('select.sfc-unit').forEach(function (s) { s.setAttribute('data-prev', s.value); });\n  root.addEventListener('change', function (e) {\n    var el = e.target;\n    if (el.id === 'sfc-mat') { applyMaterial(true); return; }\n    if (el.classList.contains('sfc-unit')) {\n      \/\/ Convert the entered quantity to the new unit instead of reinterpreting it\n      var key = el.id.replace('sfc-', '').replace('-unit', '');\n      var input = $('sfc-' + key), prev = el.getAttribute('data-prev'), next = el.value;\n      var p = parseNum(input.value);\n      if (p.ok && prev && prev !== next) {\n        var v = key === 'ss' ? fromNmm2(toNmm2(p.n, prev), next) : fromMm(toMm(p.n, prev), next);\n        input.value = plain(v, 6);\n      }\n      el.setAttribute('data-prev', next);\n    }\n  });\n  root.addEventListener('input', function (e) {\n    var el = e.target;\n    if (!el.classList || !el.classList.contains('sfc-input')) return;\n    var key = el.id.replace('sfc-', '');\n    if (el.classList.contains('sfc-invalid') && !check(key)) setErr(key, null);\n  });\n  $('sfc-form').addEventListener('submit', function (e) {\n    e.preventDefault();\n    var res = $('sfc-results'), first = res.hidden;\n    res.hidden = false;\n    if (!compute()) {\n      $('sfc-status').textContent = 'Some inputs need attention.';\n      var bad = root.querySelector('.sfc-invalid');\n      if (bad) bad.focus();\n    } else if (first && res.scrollIntoView) {\n      res.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    }\n  });\n  \/* ---------- 10. Init ---------- *\/\n  doReset();\n})();\n<\/script>\n\n\n\n<!-- Shearing Force Calculator \u2014 paste this whole snippet into a WordPress Custom HTML block.\n     Everything is isolated inside a Shadow DOM, so it does not change any other part of the page. -->\n<div id=\"sfc-host\"><\/div>\n<template id=\"sfc-tpl\">\n<style>\n:host{all:initial;display:block;contain:layout style}\n\/* =====================================================================\n   Shearing Force Calculator \u2014 these styles live inside a Shadow DOM,\n   so they cannot reach the rest of the page and theme styles cannot reach in.\n   ===================================================================== *\/\n.sfc-root{\n  --sfc-blue:#1e3a8a;--sfc-blue-2:#1d4ed8;--sfc-blue-soft:#e8eefb;--sfc-blue-line:#c7d4f0;\n  --sfc-bg:#f3f5f8;--sfc-card:#ffffff;--sfc-text:#1f2937;--sfc-heading:#111827;--sfc-muted:#525c6b;\n  --sfc-border:#d6dce5;--sfc-field:#fbfcfe;--sfc-danger:#b42318;--sfc-danger-bg:#fef3f2;\n  --sfc-radius:12px;--sfc-shadow:0 1px 2px rgba(16,24,40,.06),0 6px 16px rgba(16,24,40,.06);\n  font-family:system-ui,-apple-system,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\n  font-size:16px;line-height:1.55;color:var(--sfc-text);background:var(--sfc-bg);\n  max-width:1000px;margin:0 auto;padding:28px 16px 36px;text-align:left;border-radius:16px;\n  -webkit-text-size-adjust:100%;\n}\n.sfc-root *,.sfc-root *::before,.sfc-root *::after{box-sizing:border-box}\n.sfc-root [hidden]{display:none !important}\n.sfc-root h2,.sfc-root h3{font-family:inherit;color:var(--sfc-heading);line-height:1.25;margin:0 0 .5em;padding:0;letter-spacing:normal;text-transform:none;font-weight:700;border:0;background:none}\n.sfc-root h2.sfc-h{font-size:clamp(1.1rem,2vw,1.3rem);margin:0 0 14px}\n.sfc-root h3{font-size:.95rem}\n.sfc-root p{margin:0 0 .85em;padding:0}\n.sfc-root ul{margin:0;padding-left:1.2em}\n.sfc-root li{margin:0 0 .3em}\n\/* ---------- layout ---------- *\/\n.sfc-root .sfc-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:22px}\n.sfc-root .sfc-card{background:var(--sfc-card);border:1px solid var(--sfc-border);border-radius:var(--sfc-radius);box-shadow:var(--sfc-shadow);padding:22px}\n.sfc-root .sfc-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 16px}\n\/* ---------- fields ---------- *\/\n.sfc-root .sfc-field{margin:0 0 16px;min-width:0}\n.sfc-root .sfc-field > label{display:block;font-size:.88rem;font-weight:600;color:var(--sfc-text);margin:0 0 5px;line-height:1.3}\n.sfc-root .sfc-req{color:var(--sfc-danger);font-weight:700;margin-left:2px}\n.sfc-root .sfc-opt{color:var(--sfc-muted);font-weight:500;font-size:.82rem;margin-left:4px}\n.sfc-root .sfc-inline{display:flex;gap:8px;align-items:stretch}\n.sfc-root .sfc-inline .sfc-input{flex:1 1 auto;min-width:0}\n.sfc-root .sfc-inline .sfc-unit{flex:0 0 auto;width:auto;min-width:96px;max-width:45%}\n.sfc-root .sfc-input,.sfc-root .sfc-select{\n  display:block;width:100%;height:42px;margin:0;padding:8px 12px;font:inherit;font-size:15px;line-height:1.3;color:var(--sfc-text);\n  background-color:var(--sfc-field);border:1px solid #b9c2cf;border-radius:8px;box-shadow:none;outline:none;\n  transition:border-color .15s,box-shadow .15s;max-width:none;min-height:0;text-transform:none;letter-spacing:normal}\n.sfc-root .sfc-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:32px;cursor:pointer;\n  background-image:url(\"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\");\n  background-repeat:no-repeat;background-position:right 11px center;background-size:12px 8px}\n.sfc-root .sfc-input:hover,.sfc-root .sfc-select:hover{border-color:#8f9bab}\n.sfc-root .sfc-input:focus,.sfc-root .sfc-select:focus{border-color:var(--sfc-blue-2);box-shadow:0 0 0 3px rgba(29,78,216,.25);background-color:#fff}\n.sfc-root .sfc-input.sfc-invalid{border-color:var(--sfc-danger);background-color:var(--sfc-danger-bg)}\n.sfc-root .sfc-input.sfc-invalid:focus{box-shadow:0 0 0 3px rgba(180,35,24,.2)}\n.sfc-root .sfc-err{color:var(--sfc-danger);font-size:.83rem;margin:5px 0 0;line-height:1.35;font-weight:500}\n.sfc-root .sfc-help{color:var(--sfc-muted);font-size:.82rem;margin:5px 0 0;line-height:1.4}\n\/* ---------- buttons (hardened against theme button rules) ---------- *\/\n.sfc-root .sfc-actions{display:flex !important;flex-wrap:wrap;justify-content:center;gap:10px;width:100%;margin:8px 0 0 !important;padding:0 !important;float:none !important;clear:both}\n.sfc-root .sfc-btn{display:inline-flex !important;align-items:center;justify-content:center;float:none !important;width:auto !important;min-width:140px;height:42px;padding:0 20px;margin:0 !important;\n  position:static !important;font:inherit;font-size:.95rem;font-weight:650;line-height:1;border-radius:8px;border:1px solid var(--sfc-blue);background:var(--sfc-blue);color:#fff;cursor:pointer;\n  text-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;transition:background .15s,border-color .15s,color .15s}\n.sfc-root .sfc-btn:hover{background:#172f73;border-color:#172f73;color:#fff}\n.sfc-root .sfc-btn.sfc-btn-2{background:#fff;color:var(--sfc-blue);border-color:#9fb1db}\n.sfc-root .sfc-btn.sfc-btn-2:hover{background:var(--sfc-blue-soft);color:var(--sfc-blue);border-color:var(--sfc-blue)}\n.sfc-root .sfc-btn:focus-visible{outline:3px solid var(--sfc-blue-2);outline-offset:2px}\n\/* ---------- results ---------- *\/\n.sfc-root .sfc-results:focus{outline:none}\n.sfc-root .sfc-alert{border:1px solid #fecdca;background:var(--sfc-danger-bg);color:var(--sfc-danger);border-radius:10px;padding:12px 14px;margin:0;font-size:.9rem}\n.sfc-root .sfc-alert ul{margin:6px 0 0;padding-left:1.2em}\n.sfc-root .sfc-sub-h{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin:0 0 8px}\n.sfc-root .sfc-rgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.sfc-root .sfc-rcard{border:1px solid var(--sfc-blue-line);background:var(--sfc-blue-soft);border-radius:12px;padding:16px 16px 14px;min-width:0}\n.sfc-root .sfc-rcard-label{display:block;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin-bottom:6px}\n.sfc-root .sfc-rcard-value{font-size:clamp(1.5rem,3.2vw,2rem);font-weight:800;line-height:1.15;color:var(--sfc-heading);word-break:break-word;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-rcard-unit{font-size:.5em;font-weight:700;margin-left:5px;color:var(--sfc-muted)}\n.sfc-root .sfc-rcard-sub{font-size:.82rem;color:var(--sfc-muted);margin-top:6px;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj{margin-top:14px;border-radius:12px;padding:18px;background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 100%);color:#fff}\n.sfc-root .sfc-adj .sfc-rcard-label{color:#dbe5ff}\n.sfc-root .sfc-adj-main{font-size:clamp(1.7rem,3.6vw,2.3rem);font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj-main .sfc-rcard-unit{color:#dbe5ff}\n.sfc-root .sfc-adj-alt{margin-top:6px;font-size:.92rem;color:#e9efff;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj-note{margin-top:8px;font-size:.82rem;color:#e9efff}\n.sfc-root .sfc-table{width:100%;border-collapse:collapse;margin:14px 0 0;font-size:.9rem;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-table caption{text-align:left;caption-side:top;padding:0 0 4px}\n.sfc-root .sfc-table th,.sfc-root .sfc-table td{text-align:left;padding:9px 10px;border:0;border-bottom:1px solid var(--sfc-border);vertical-align:top;background:none}\n.sfc-root .sfc-table th{font-weight:600;color:var(--sfc-muted);width:42%}\n.sfc-root .sfc-table td{color:var(--sfc-heading);font-weight:600}\n.sfc-root .sfc-table tr:last-child th,.sfc-root .sfc-table tr:last-child td{border-bottom:0}\n.sfc-root .sfc-formula{background:#0f1f45;color:#e6edff;padding:14px 16px;border-radius:10px;margin:14px 0 0}\n.sfc-root .sfc-formula-label{display:block;font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#b4c4ec;margin-bottom:4px}\n.sfc-root .sfc-formula-sub{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.86rem;color:#e6edff;word-break:break-word;margin:0;line-height:1.6}\n.sfc-root .sfc-disclaimer{font-size:.85rem;color:var(--sfc-muted);background:#f6f8fb;border-left:3px solid var(--sfc-blue-line);padding:10px 12px;border-radius:0 8px 8px 0;margin:16px 0 0}\n.sfc-root .sfc-disclaimer strong{color:var(--sfc-heading)}\n.sfc-root .sfc-sr{position:absolute !important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n\/* ---------- responsive ---------- *\/\n@media (max-width:600px){\n  .sfc-root{padding:20px 12px 28px;border-radius:0}\n  .sfc-root .sfc-card{padding:16px}\n  .sfc-root .sfc-row,.sfc-root .sfc-rgrid{grid-template-columns:minmax(0,1fr)}\n  .sfc-root .sfc-btn{flex:1 1 100%}\n  .sfc-root .sfc-table th{width:50%}\n}\n@media (prefers-reduced-motion:reduce){\n  .sfc-root *{transition:none !important}\n}\n<\/style>\n<div class=\"sfc-root\" id=\"sfc-app\">\n  <div class=\"sfc-stack\">\n    <!-- ================= INPUTS ================= -->\n    <section class=\"sfc-card\" aria-labelledby=\"sfc-inputs-title\">\n      <h2 class=\"sfc-h\" id=\"sfc-inputs-title\">Shearing Inputs<\/h2>\n      <form id=\"sfc-form\" novalidate autocomplete=\"off\">\n        <div class=\"sfc-row\">\n          <!-- Material -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-mat\">Material Type<\/label>\n            <select id=\"sfc-mat\" class=\"sfc-select\" aria-describedby=\"sfc-mat-help\">\n              <option value=\"mild\">Mild Steel (\u2248 350 MPa)<\/option>\n              <option value=\"stainless\">Stainless Steel (\u2248 500 MPa)<\/option>\n              <option value=\"aluminum\">Aluminum (\u2248 140 MPa)<\/option>\n              <option value=\"custom\">Custom (enter shear strength)<\/option>\n            <\/select>\n            <p class=\"sfc-help\" id=\"sfc-mat-help\"><\/p>\n          <\/div>\n          <!-- Shear strength -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-ss\">Material Shear Strength<span class=\"sfc-req\" id=\"sfc-ss-req\" aria-hidden=\"true\" hidden>*<\/span><\/label>\n            <div class=\"sfc-inline\">\n              <input id=\"sfc-ss\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-ss-err sfc-ss-help\">\n              <select id=\"sfc-ss-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Shear strength unit\">\n                <option value=\"mpa\">MPa<\/option>\n                <option value=\"nmm2\">N\/mm\u00b2<\/option>\n                <option value=\"psi\">psi<\/option>\n              <\/select>\n            <\/div>\n            <p class=\"sfc-err\" id=\"sfc-ss-err\" hidden><\/p>\n            <p class=\"sfc-help\" id=\"sfc-ss-help\"><\/p>\n          <\/div>\n          <!-- Thickness -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-t\">Material Thickness<\/label>\n            <div class=\"sfc-inline\">\n              <input id=\"sfc-t\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-t-err\">\n              <select id=\"sfc-t-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Thickness unit\">\n                <option value=\"mm\">mm<\/option>\n                <option value=\"in\">in<\/option>\n              <\/select>\n            <\/div>\n            <p class=\"sfc-err\" id=\"sfc-t-err\" hidden><\/p>\n          <\/div>\n          <!-- Cutting length -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-l\">Cutting Length<\/label>\n            <div class=\"sfc-inline\">\n              <input id=\"sfc-l\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-l-err sfc-l-help\">\n              <select id=\"sfc-l-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Cutting length unit\">\n                <option value=\"mm\">mm<\/option>\n                <option value=\"in\">in<\/option>\n              <\/select>\n            <\/div>\n            <p class=\"sfc-err\" id=\"sfc-l-err\" hidden><\/p>\n            <p class=\"sfc-help\" id=\"sfc-l-help\">Length of the cut edge being sheared at once.<\/p>\n          <\/div>\n          <!-- Safety factor -->\n          <div class=\"sfc-field\">\n            <label for=\"sfc-sf\">Safety Factor<span class=\"sfc-opt\">(optional)<\/span><\/label>\n            <input id=\"sfc-sf\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-sf-err sfc-sf-help\">\n            <p class=\"sfc-err\" id=\"sfc-sf-err\" hidden><\/p>\n            <p class=\"sfc-help\" id=\"sfc-sf-help\">Must be 1 or greater. Default 1.2. Leave blank to skip the adjusted force.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"sfc-actions\">\n          <button type=\"submit\" class=\"sfc-btn\" id=\"sfc-calc\">Calculate<\/button>\n        <\/div>\n        <p class=\"sfc-sr\" id=\"sfc-status\" role=\"status\" aria-live=\"polite\"><\/p>\n      <\/form>\n    <\/section>\n    <!-- ================= RESULTS ================= -->\n    <section class=\"sfc-card sfc-results\" aria-labelledby=\"sfc-results-title\" id=\"sfc-results\" tabindex=\"-1\" hidden>\n      <h2 class=\"sfc-h\" id=\"sfc-results-title\">Results<\/h2>\n      <div class=\"sfc-alert\" id=\"sfc-error\" role=\"alert\" hidden><\/div>\n      <div id=\"sfc-body\">\n        <p class=\"sfc-sub-h\">Estimated shearing force<\/p>\n        <div class=\"sfc-rgrid\">\n          <div class=\"sfc-rcard\">\n            <span class=\"sfc-rcard-label\">Force<\/span>\n            <div class=\"sfc-rcard-value\"><span id=\"sfc-r-kn\"><\/span><span class=\"sfc-rcard-unit\">kN<\/span><\/div>\n            <div class=\"sfc-rcard-sub\" id=\"sfc-r-n\"><\/div>\n          <\/div>\n          <div class=\"sfc-rcard\">\n            <span class=\"sfc-rcard-label\">Metric tons-force<\/span>\n            <div class=\"sfc-rcard-value\"><span id=\"sfc-r-tf\"><\/span><span class=\"sfc-rcard-unit\">tf<\/span><\/div>\n            <div class=\"sfc-rcard-sub\">1 tf \u2248 9.80665 kN<\/div>\n          <\/div>\n        <\/div>\n        <div class=\"sfc-adj\" id=\"sfc-adj\">\n          <span class=\"sfc-rcard-label\" id=\"sfc-adj-label\">Adjusted force with safety factor<\/span>\n          <div class=\"sfc-adj-main\"><span id=\"sfc-r-adj-kn\"><\/span><span class=\"sfc-rcard-unit\">kN<\/span><\/div>\n          <div class=\"sfc-adj-alt\" id=\"sfc-r-adj-tf\"><\/div>\n          <div class=\"sfc-adj-note\" id=\"sfc-r-adj-note\"><\/div>\n        <\/div>\n        <table class=\"sfc-table\">\n          <caption class=\"sfc-sub-h\">Calculation summary<\/caption>\n          <tbody>\n            <tr><th scope=\"row\">Material<\/th><td id=\"sfc-s-mat\"><\/td><\/tr>\n            <tr><th scope=\"row\">Shear strength used<\/th><td id=\"sfc-s-ss\"><\/td><\/tr>\n            <tr><th scope=\"row\">Material thickness<\/th><td id=\"sfc-s-t\"><\/td><\/tr>\n            <tr><th scope=\"row\">Cutting length<\/th><td id=\"sfc-s-l\"><\/td><\/tr>\n            <tr><th scope=\"row\">Safety factor<\/th><td id=\"sfc-s-sf\"><\/td><\/tr>\n          <\/tbody>\n        <\/table>\n        <div class=\"sfc-formula\">\n          <span class=\"sfc-formula-label\">Calculation<\/span>\n          <p class=\"sfc-formula-sub\" id=\"sfc-d\"><\/p>\n        <\/div>\n      <\/div>\n      <p class=\"sfc-disclaimer\"><strong>Important:<\/strong> This calculator provides an engineering estimate. Actual machine capacity requirements may vary with material grade, blade condition, cutting angle or rake, clearance, machine design, and operating conditions. Confirm the required capacity with the machine manufacturer or a qualified engineer.<\/p>\n    <\/section>\n  <\/div>\n<\/div>\n<\/template>\n<script>\n\/* =====================================================================\n   Shearing Force Calculator \u2014 vanilla JavaScript, no globals.\n   Internal units: lengths in mm, strength in N\/mm\u00b2 (= MPa), force in N.\n   ===================================================================== *\/\n(function () {\n  'use strict';\n  var host = document.getElementById('sfc-host');\n  var tpl = document.getElementById('sfc-tpl');\n  if (!host || !tpl || host.getAttribute('data-sfc-ready') === '1') return;\n  host.setAttribute('data-sfc-ready', '1');\n  \/\/ Isolate the calculator in a Shadow DOM: its CSS and IDs stay inside it.\n  var scope = host.attachShadow ? host.attachShadow({ mode: 'open' }) : host;\n  scope.appendChild(tpl.content ? tpl.content.cloneNode(true) : document.createRange().createContextualFragment(tpl.innerHTML));\n  if (tpl.parentNode) tpl.parentNode.removeChild(tpl);\n  function $(id) { return scope.getElementById ? scope.getElementById(id) : scope.querySelector('#' + id); }\n  var root = $('sfc-app');\n  if (!root) return;\n  \/* ---------- 1. Reference data ---------- *\/\n  var MM_PER_IN = 25.4;\n  var PSI_PER_MPA = 145.0377377;   \/\/ 1 MPa = 145.0377 psi\n  var KN_PER_TF = 9.80665;         \/\/ 1 metric ton-force\n  var DEFAULT_SF = '1.2';\n  var MATERIALS = {\n    mild:      { name: 'Mild Steel',      ss: 350, note: 'Typical shear strength of low-carbon steel (\u2248 350 MPa). Edit to match your grade.' },\n    stainless: { name: 'Stainless Steel', ss: 500, note: 'Typical for annealed austenitic grades such as 304 (\u2248 500 MPa). Edit to match your grade.' },\n    aluminum:  { name: 'Aluminum',        ss: 140, note: 'Typical for 5052-H32 sheet (\u2248 140 MPa). Alloys and tempers vary widely.' },\n    custom:    { name: 'Custom material', ss: null, note: 'Enter the shear strength from your material certificate or datasheet.' }\n  };\n  \/* ---------- 2. Parsing & formatting ---------- *\/\n  \/** Accepts \"1,5\" (decimal comma), \"1,000.5\" and scientific notation. *\/\n  function parseNum(raw) {\n    var s = String(raw == null ? '' : raw).trim().replace(\/\\s+\/g, '');\n    if (s === '') return { empty: true, ok: false };\n    if (\/^[+-]?\\d{1,3}(,\\d{3})+(\\.\\d+)?$\/.test(s)) s = s.replace(\/,\/g, '');\n    else if (\/^[+-]?\\d*,\\d+$\/.test(s)) s = s.replace(',', '.');\n    if (!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(s)) return { empty: false, ok: false };\n    var n = Number(s);\n    if (!isFinite(n)) return { empty: false, ok: false };\n    return { empty: false, ok: true, n: n };\n  }\n  \/** Practical decimals: more places for small values so precision is not hidden. *\/\n  function fmt(n) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    var a = Math.abs(n), d;\n    if (a === 0) d = 2;\n    else if (a >= 1000) d = 1;\n    else if (a >= 1) d = 2;\n    else if (a >= 0.01) d = 4;\n    else return Number(n.toPrecision(3)).toString();\n    return n.toLocaleString('en-US', { minimumFractionDigits: d, maximumFractionDigits: d });\n  }\n  function g(n, p) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    return Number(n.toPrecision(p || 6)).toLocaleString('en-US', { maximumFractionDigits: 10 });\n  }\n  function plain(n, p) { return String(Number(n.toPrecision(p || 6))); }\n  function esc(s) {\n    return String(s).replace(\/[&<>\"']\/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n  \/* ---------- 3. Unit helpers ---------- *\/\n  function toMm(v, u) { return u === 'in' ? v * MM_PER_IN : v; }\n  function fromMm(mm, u) { return u === 'in' ? mm \/ MM_PER_IN : mm; }\n  function toNmm2(v, u) { return u === 'psi' ? v \/ PSI_PER_MPA : v; }      \/\/ MPa and N\/mm\u00b2 are identical\n  function fromNmm2(v, u) { return u === 'psi' ? v * PSI_PER_MPA : v; }\n  var SS_LABEL = { mpa: 'MPa', nmm2: 'N\/mm\u00b2', psi: 'psi' };\n  \/* ---------- 4. Validation ---------- *\/\n  var LABEL = { ss: 'Shear strength', t: 'Material thickness', l: 'Cutting length', sf: 'Safety factor' };\n  var KEYS = ['ss', 't', 'l', 'sf'];\n  function setErr(key, msg) {\n    var el = $('sfc-' + key), er = $('sfc-' + key + '-err');\n    if (msg) {\n      el.classList.add('sfc-invalid'); el.setAttribute('aria-invalid', 'true');\n      er.textContent = msg; er.hidden = false;\n    } else {\n      el.classList.remove('sfc-invalid'); el.removeAttribute('aria-invalid');\n      er.textContent = ''; er.hidden = true;\n    }\n  }\n  function clearAllErrors() { KEYS.forEach(function (k) { setErr(k, null); }); }\n  function check(key) {\n    var p = parseNum($('sfc-' + key).value);\n    if (key === 'sf') {\n      if (p.empty) return null;                       \/\/ optional\n      if (!p.ok) return 'Safety factor must be a valid number.';\n      if (p.n < 1) return 'Safety factor must be 1 or greater.';\n      return null;\n    }\n    if (p.empty) {\n      if (key === 'ss' &#038;&#038; $('sfc-mat').value === 'custom') return 'Shear strength is required for a custom material.';\n      return LABEL[key] + ' is required.';\n    }\n    if (!p.ok) return LABEL[key] + ' must be a valid number.';\n    if (p.n <= 0) return LABEL[key] + ' must be greater than zero.';\n    return null;\n  }\n  \/* ---------- 5. Material handling ---------- *\/\n  function applyMaterial(focusCustom) {\n    var key = $('sfc-mat').value, m = MATERIALS[key];\n    $('sfc-mat-help').textContent = m.note;\n    $('sfc-ss-req').hidden = key !== 'custom';\n    if (key === 'custom') $('sfc-ss').setAttribute('aria-required', 'true');\n    else $('sfc-ss').removeAttribute('aria-required');\n    setErr('ss', null);\n    if (m.ss === null) {\n      $('sfc-ss').value = '';\n      $('sfc-ss-help').textContent = 'Required for a custom material.';\n      if (focusCustom) $('sfc-ss').focus();\n    } else {\n      $('sfc-ss').value = plain(fromNmm2(m.ss, $('sfc-ss-unit').value), 5);\n      $('sfc-ss-help').textContent = 'Pre-filled from the selected material. You can edit it.';\n    }\n  }\n  \/* ---------- 6. Calculation ---------- *\/\n  function compute() {\n    clearAllErrors();\n    var errs = [];\n    KEYS.forEach(function (k) { var m = check(k); if (m) { setErr(k, m); errs.push(m); } });\n    if (errs.length) { showErrors(errs); return false; }\n    var u = { ss: $('sfc-ss-unit').value, t: $('sfc-t-unit').value, l: $('sfc-l-unit').value };\n    var ssIn = parseNum($('sfc-ss').value).n, tIn = parseNum($('sfc-t').value).n, lIn = parseNum($('sfc-l').value).n;\n    var sfP = parseNum($('sfc-sf').value), sf = sfP.ok ? sfP.n : null;\n    \/\/ Convert every input to mm and N\/mm\u00b2\n    var ss = toNmm2(ssIn, u.ss), t = toMm(tIn, u.t), L = toMm(lIn, u.l);\n    \/\/ F (N) = L (mm) \u00d7 t (mm) \u00d7 \u03c4 (N\/mm\u00b2)\n    var F_N = L * t * ss;\n    if (!isFinite(F_N) || F_N <= 0) {\n      showErrors(['The result is outside the numeric range that can be represented. Check the magnitude of your inputs.']);\n      return false;\n    }\n    var F_kN = F_N \/ 1000, F_tf = F_kN \/ KN_PER_TF;\n    var adj_kN = sf !== null ? F_kN * sf : null;\n    render({ mat: $('sfc-mat').value, u: u, ssIn: ssIn, tIn: tIn, lIn: lIn, ss: ss, t: t, L: L, sf: sf,\n             F_N: F_N, F_kN: F_kN, F_tf: F_tf, adj_kN: adj_kN });\n    return true;\n  }\n  \/* ---------- 7. Rendering ---------- *\/\n  function showErrors(errs) {\n    var box = $('sfc-error');\n    box.innerHTML = '<strong>Please correct the following input' + (errs.length > 1 ? 's' : '') + ':<\/strong><ul>' +\n      errs.map(function (e) { return '<li>' + esc(e) + '<\/li>'; }).join('') + '<\/ul>';\n    box.hidden = false;\n    $('sfc-body').hidden = true;\n  }\n  function render(R) {\n    $('sfc-error').hidden = true;\n    $('sfc-body').hidden = false;\n    $('sfc-r-kn').textContent = fmt(R.F_kN);\n    $('sfc-r-n').textContent = '= ' + fmt(R.F_N) + ' N';\n    $('sfc-r-tf').textContent = fmt(R.F_tf);\n    var adj = $('sfc-adj');\n    if (R.adj_kN !== null) {\n      adj.hidden = false;\n      $('sfc-r-adj-kn').textContent = fmt(R.adj_kN);\n      $('sfc-r-adj-tf').textContent = '= ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf';\n      $('sfc-r-adj-note').textContent = 'Estimated shearing force \u00d7 safety factor ' + g(R.sf, 4) + '.';\n    } else {\n      adj.hidden = true;\n    }\n    var m = MATERIALS[R.mat];\n    $('sfc-s-mat').textContent = m.name;\n    var ssTxt = g(R.ss, 5) + ' N\/mm\u00b2';\n    if (R.u.ss === 'psi') ssTxt += ' (from ' + g(R.ssIn) + ' psi)';\n    else if (m.ss !== null && Math.abs(R.ss - m.ss) > 0.05) ssTxt += ' (edited from ' + m.ss + ' default)';\n    $('sfc-s-ss').textContent = ssTxt;\n    $('sfc-s-t').textContent = g(R.t) + ' mm' + (R.u.t === 'in' ? ' (from ' + g(R.tIn) + ' in)' : '');\n    $('sfc-s-l').textContent = g(R.L) + ' mm' + (R.u.l === 'in' ? ' (from ' + g(R.lIn) + ' in)' : '');\n    $('sfc-s-sf').textContent = R.sf !== null ? g(R.sf, 4) : 'Not applied';\n    var lines = [];\n    if (R.u.ss === 'psi') lines.push('Shear strength = ' + g(R.ssIn) + ' psi \u00f7 145.0377 = ' + g(R.ss, 5) + ' N\/mm\u00b2');\n    if (R.u.t === 'in') lines.push('Thickness = ' + g(R.tIn) + ' in \u00d7 25.4 = ' + g(R.t) + ' mm');\n    if (R.u.l === 'in') lines.push('Cutting length = ' + g(R.lIn) + ' in \u00d7 25.4 = ' + g(R.L) + ' mm');\n    lines.push('Force = ' + g(R.L) + ' mm \u00d7 ' + g(R.t) + ' mm \u00d7 ' + g(R.ss, 5) + ' N\/mm\u00b2 = ' + fmt(R.F_N) + ' N = ' + fmt(R.F_kN) + ' kN');\n    lines.push('Tons-force = ' + fmt(R.F_kN) + ' kN \u00f7 9.80665 = ' + fmt(R.F_tf) + ' tf');\n    if (R.adj_kN !== null) lines.push('Adjusted = ' + fmt(R.F_kN) + ' kN \u00d7 ' + g(R.sf, 4) + ' = ' + fmt(R.adj_kN) + ' kN = ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf');\n    $('sfc-d').innerHTML = lines.map(esc).join('<br>');\n    $('sfc-status').textContent = 'Calculated. Estimated shearing force ' + fmt(R.F_kN) + ' kilonewtons, ' + fmt(R.F_tf) + ' metric tons-force' +\n      (R.adj_kN !== null ? '. Adjusted force ' + fmt(R.adj_kN) + ' kilonewtons.' : '.');\n  }\n  \/* ---------- 8. Reset & example ---------- *\/\n  function setUnit(id, val) { var s = $(id); s.value = val; s.setAttribute('data-prev', val); }\n  function hideResults() { $('sfc-results').hidden = true; $('sfc-error').hidden = true; $('sfc-status').textContent = ''; }\n  function doReset() {\n    $('sfc-mat').value = 'mild';\n    setUnit('sfc-ss-unit', 'mpa'); setUnit('sfc-t-unit', 'mm'); setUnit('sfc-l-unit', 'mm');\n    $('sfc-t').value = ''; $('sfc-l').value = ''; $('sfc-sf').value = DEFAULT_SF;\n    clearAllErrors();\n    applyMaterial(false);\n    hideResults();\n  }\n  \/* ---------- 9. Events ---------- *\/\n  root.querySelectorAll('select.sfc-unit').forEach(function (s) { s.setAttribute('data-prev', s.value); });\n  root.addEventListener('change', function (e) {\n    var el = e.target;\n    if (el.id === 'sfc-mat') { applyMaterial(true); return; }\n    if (el.classList.contains('sfc-unit')) {\n      \/\/ Convert the entered quantity to the new unit instead of reinterpreting it\n      var key = el.id.replace('sfc-', '').replace('-unit', '');\n      var input = $('sfc-' + key), prev = el.getAttribute('data-prev'), next = el.value;\n      var p = parseNum(input.value);\n      if (p.ok && prev && prev !== next) {\n        var v = key === 'ss' ? fromNmm2(toNmm2(p.n, prev), next) : fromMm(toMm(p.n, prev), next);\n        input.value = plain(v, 6);\n      }\n      el.setAttribute('data-prev', next);\n    }\n  });\n  root.addEventListener('input', function (e) {\n    var el = e.target;\n    if (!el.classList || !el.classList.contains('sfc-input')) return;\n    var key = el.id.replace('sfc-', '');\n    if (el.classList.contains('sfc-invalid') && !check(key)) setErr(key, null);\n  });\n  $('sfc-form').addEventListener('submit', function (e) {\n    e.preventDefault();\n    var res = $('sfc-results'), first = res.hidden;\n    res.hidden = false;\n    if (!compute()) {\n      $('sfc-status').textContent = 'Some inputs need attention.';\n      var bad = root.querySelector('.sfc-invalid');\n      if (bad) bad.focus();\n    } else if (first && res.scrollIntoView) {\n      res.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    }\n  });\n  \/* ---------- 10. Init ---------- *\/\n  doReset();\n})();\n<\/script>\n\n\n\n<div id=\"sfc-host\"><\/div>\n<script>\n\/* =====================================================================\n   Shearing Force Calculator \u2014 vanilla JavaScript, no globals.\n   Internal units: lengths in mm, strength in N\/mm\u00b2 (= MPa), force in N.\n   ===================================================================== *\/\n(function () {\n  'use strict';\n  var CSS = \":host{all:initial;display:block;contain:layout style}\\n.sfc-root{\\n--sfc-blue:#1e3a8a;--sfc-blue-2:#1d4ed8;--sfc-blue-soft:#e8eefb;--sfc-blue-line:#c7d4f0;\\n--sfc-bg:#f3f5f8;--sfc-card:#ffffff;--sfc-text:#1f2937;--sfc-heading:#111827;--sfc-muted:#525c6b;\\n--sfc-border:#d6dce5;--sfc-field:#fbfcfe;--sfc-danger:#b42318;--sfc-danger-bg:#fef3f2;\\n--sfc-radius:12px;--sfc-shadow:0 1px 2px rgba(16,24,40,.06),0 6px 16px rgba(16,24,40,.06);\\nfont-family:system-ui,-apple-system,\\\"Segoe UI\\\",Roboto,\\\"Helvetica Neue\\\",Arial,\\\"Noto Sans\\\",sans-serif;\\nfont-size:16px;line-height:1.55;color:var(--sfc-text);background:var(--sfc-bg);\\nmax-width:1000px;margin:0 auto;padding:28px 16px 36px;text-align:left;border-radius:16px;\\n-webkit-text-size-adjust:100%;\\n}\\n.sfc-root *,.sfc-root *::before,.sfc-root *::after{box-sizing:border-box}\\n.sfc-root [hidden]{display:none !important}\\n.sfc-root h2,.sfc-root h3{font-family:inherit;color:var(--sfc-heading);line-height:1.25;margin:0 0 .5em;padding:0;letter-spacing:normal;text-transform:none;font-weight:700;border:0;background:none}\\n.sfc-root h2.sfc-h{font-size:clamp(1.1rem,2vw,1.3rem);margin:0 0 14px}\\n.sfc-root h3{font-size:.95rem}\\n.sfc-root p{margin:0 0 .85em;padding:0}\\n.sfc-root ul{margin:0;padding-left:1.2em}\\n.sfc-root li{margin:0 0 .3em}\\n.sfc-root .sfc-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:22px}\\n.sfc-root .sfc-card{background:var(--sfc-card);border:1px solid var(--sfc-border);border-radius:var(--sfc-radius);box-shadow:var(--sfc-shadow);padding:22px}\\n.sfc-root .sfc-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 16px}\\n.sfc-root .sfc-field{margin:0 0 16px;min-width:0}\\n.sfc-root .sfc-field \\u003e label{display:block;font-size:.88rem;font-weight:600;color:var(--sfc-text);margin:0 0 5px;line-height:1.3}\\n.sfc-root .sfc-req{color:var(--sfc-danger);font-weight:700;margin-left:2px}\\n.sfc-root .sfc-opt{color:var(--sfc-muted);font-weight:500;font-size:.82rem;margin-left:4px}\\n.sfc-root .sfc-inline{display:flex;gap:8px;align-items:stretch}\\n.sfc-root .sfc-inline .sfc-input{flex:1 1 auto;min-width:0}\\n.sfc-root .sfc-inline .sfc-unit{flex:0 0 auto;width:auto;min-width:96px;max-width:45%}\\n.sfc-root .sfc-input,.sfc-root .sfc-select{\\ndisplay:block;width:100%;height:42px;margin:0;padding:8px 12px;font:inherit;font-size:15px;line-height:1.3;color:var(--sfc-text);\\nbackground-color:var(--sfc-field);border:1px solid #b9c2cf;border-radius:8px;box-shadow:none;outline:none;\\ntransition:border-color .15s,box-shadow .15s;max-width:none;min-height:0;text-transform:none;letter-spacing:normal}\\n.sfc-root .sfc-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:32px;cursor:pointer;\\nbackground-image:url(\\\"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\\\");\\nbackground-repeat:no-repeat;background-position:right 11px center;background-size:12px 8px}\\n.sfc-root .sfc-input:hover,.sfc-root .sfc-select:hover{border-color:#8f9bab}\\n.sfc-root .sfc-input:focus,.sfc-root .sfc-select:focus{border-color:var(--sfc-blue-2);box-shadow:0 0 0 3px rgba(29,78,216,.25);background-color:#fff}\\n.sfc-root .sfc-input.sfc-invalid{border-color:var(--sfc-danger);background-color:var(--sfc-danger-bg)}\\n.sfc-root .sfc-input.sfc-invalid:focus{box-shadow:0 0 0 3px rgba(180,35,24,.2)}\\n.sfc-root .sfc-err{color:var(--sfc-danger);font-size:.83rem;margin:5px 0 0;line-height:1.35;font-weight:500}\\n.sfc-root .sfc-help{color:var(--sfc-muted);font-size:.82rem;margin:5px 0 0;line-height:1.4}\\n.sfc-root .sfc-actions{display:flex !important;flex-wrap:wrap;justify-content:center;gap:10px;width:100%;margin:8px 0 0 !important;padding:0 !important;float:none !important;clear:both}\\n.sfc-root .sfc-btn{display:inline-flex !important;align-items:center;justify-content:center;float:none !important;width:auto !important;min-width:140px;height:42px;padding:0 20px;margin:0 !important;\\nposition:static !important;font:inherit;font-size:.95rem;font-weight:650;line-height:1;border-radius:8px;border:1px solid var(--sfc-blue);background:var(--sfc-blue);color:#fff;cursor:pointer;\\ntext-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;transition:background .15s,border-color .15s,color .15s}\\n.sfc-root .sfc-btn:hover{background:#172f73;border-color:#172f73;color:#fff}\\n.sfc-root .sfc-btn.sfc-btn-2{background:#fff;color:var(--sfc-blue);border-color:#9fb1db}\\n.sfc-root .sfc-btn.sfc-btn-2:hover{background:var(--sfc-blue-soft);color:var(--sfc-blue);border-color:var(--sfc-blue)}\\n.sfc-root .sfc-btn:focus-visible{outline:3px solid var(--sfc-blue-2);outline-offset:2px}\\n.sfc-root .sfc-results:focus{outline:none}\\n.sfc-root .sfc-alert{border:1px solid #fecdca;background:var(--sfc-danger-bg);color:var(--sfc-danger);border-radius:10px;padding:12px 14px;margin:0;font-size:.9rem}\\n.sfc-root .sfc-alert ul{margin:6px 0 0;padding-left:1.2em}\\n.sfc-root .sfc-sub-h{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin:0 0 8px}\\n.sfc-root .sfc-rgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\\n.sfc-root .sfc-rcard{border:1px solid var(--sfc-blue-line);background:var(--sfc-blue-soft);border-radius:12px;padding:16px 16px 14px;min-width:0}\\n.sfc-root .sfc-rcard-label{display:block;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin-bottom:6px}\\n.sfc-root .sfc-rcard-value{font-size:clamp(1.5rem,3.2vw,2rem);font-weight:800;line-height:1.15;color:var(--sfc-heading);word-break:break-word;font-variant-numeric:tabular-nums}\\n.sfc-root .sfc-rcard-unit{font-size:.5em;font-weight:700;margin-left:5px;color:var(--sfc-muted)}\\n.sfc-root .sfc-rcard-sub{font-size:.82rem;color:var(--sfc-muted);margin-top:6px;font-variant-numeric:tabular-nums}\\n.sfc-root .sfc-adj{margin-top:14px;border-radius:12px;padding:18px;background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 100%);color:#fff}\\n.sfc-root .sfc-adj .sfc-rcard-label{color:#dbe5ff}\\n.sfc-root .sfc-adj-main{font-size:clamp(1.7rem,3.6vw,2.3rem);font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums}\\n.sfc-root .sfc-adj-main .sfc-rcard-unit{color:#dbe5ff}\\n.sfc-root .sfc-adj-alt{margin-top:6px;font-size:.92rem;color:#e9efff;font-variant-numeric:tabular-nums}\\n.sfc-root .sfc-adj-note{margin-top:8px;font-size:.82rem;color:#e9efff}\\n.sfc-root .sfc-table{width:100%;border-collapse:collapse;margin:14px 0 0;font-size:.9rem;font-variant-numeric:tabular-nums}\\n.sfc-root .sfc-table caption{text-align:left;caption-side:top;padding:0 0 4px}\\n.sfc-root .sfc-table th,.sfc-root .sfc-table td{text-align:left;padding:9px 10px;border:0;border-bottom:1px solid var(--sfc-border);vertical-align:top;background:none}\\n.sfc-root .sfc-table th{font-weight:600;color:var(--sfc-muted);width:42%}\\n.sfc-root .sfc-table td{color:var(--sfc-heading);font-weight:600}\\n.sfc-root .sfc-table tr:last-child th,.sfc-root .sfc-table tr:last-child td{border-bottom:0}\\n.sfc-root .sfc-formula{background:#0f1f45;color:#e6edff;padding:14px 16px;border-radius:10px;margin:14px 0 0}\\n.sfc-root .sfc-formula-label{display:block;font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#b4c4ec;margin-bottom:4px}\\n.sfc-root .sfc-formula-sub{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.86rem;color:#e6edff;word-break:break-word;margin:0;line-height:1.6}\\n.sfc-root .sfc-disclaimer{font-size:.85rem;color:var(--sfc-muted);background:#f6f8fb;border-left:3px solid var(--sfc-blue-line);padding:10px 12px;border-radius:0 8px 8px 0;margin:16px 0 0}\\n.sfc-root .sfc-disclaimer strong{color:var(--sfc-heading)}\\n.sfc-root .sfc-sr{position:absolute !important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\\n@media (max-width:600px){\\n.sfc-root{padding:20px 12px 28px;border-radius:0}\\n.sfc-root .sfc-card{padding:16px}\\n.sfc-root .sfc-row,.sfc-root .sfc-rgrid{grid-template-columns:minmax(0,1fr)}\\n.sfc-root .sfc-btn{flex:1 1 100%}\\n.sfc-root .sfc-table th{width:50%}\\n}\\n@media (prefers-reduced-motion:reduce){\\n.sfc-root *{transition:none !important}\\n}\";\n  var HTML = \"\\u003cdiv class=\\\"sfc-root\\\" id=\\\"sfc-app\\\"\\u003e\\n\\u003cdiv class=\\\"sfc-stack\\\"\\u003e\\n\\u003csection class=\\\"sfc-card\\\" aria-labelledby=\\\"sfc-inputs-title\\\"\\u003e\\n\\u003ch2 class=\\\"sfc-h\\\" id=\\\"sfc-inputs-title\\\"\\u003eShearing Inputs\\u003c\/h2\\u003e\\n\\u003cform id=\\\"sfc-form\\\" novalidate autocomplete=\\\"off\\\"\\u003e\\n\\u003cdiv class=\\\"sfc-row\\\"\\u003e\\n\\u003cdiv class=\\\"sfc-field\\\"\\u003e\\n\\u003clabel for=\\\"sfc-mat\\\"\\u003eMaterial Type\\u003c\/label\\u003e\\n\\u003cselect id=\\\"sfc-mat\\\" class=\\\"sfc-select\\\" aria-describedby=\\\"sfc-mat-help\\\"\\u003e\\n\\u003coption value=\\\"mild\\\"\\u003eMild Steel (\u2248 350 MPa)\\u003c\/option\\u003e\\n\\u003coption value=\\\"stainless\\\"\\u003eStainless Steel (\u2248 500 MPa)\\u003c\/option\\u003e\\n\\u003coption value=\\\"aluminum\\\"\\u003eAluminum (\u2248 140 MPa)\\u003c\/option\\u003e\\n\\u003coption value=\\\"custom\\\"\\u003eCustom (enter shear strength)\\u003c\/option\\u003e\\n\\u003c\/select\\u003e\\n\\u003cp class=\\\"sfc-help\\\" id=\\\"sfc-mat-help\\\"\\u003e\\u003c\/p\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-field\\\"\\u003e\\n\\u003clabel for=\\\"sfc-ss\\\"\\u003eMaterial Shear Strength\\u003cspan class=\\\"sfc-req\\\" id=\\\"sfc-ss-req\\\" aria-hidden=\\\"true\\\" hidden\\u003e*\\u003c\/span\\u003e\\u003c\/label\\u003e\\n\\u003cdiv class=\\\"sfc-inline\\\"\\u003e\\n\\u003cinput id=\\\"sfc-ss\\\" class=\\\"sfc-input\\\" type=\\\"text\\\" inputmode=\\\"decimal\\\" aria-describedby=\\\"sfc-ss-err sfc-ss-help\\\"\\u003e\\n\\u003cselect id=\\\"sfc-ss-unit\\\" class=\\\"sfc-select sfc-unit\\\" aria-label=\\\"Shear strength unit\\\"\\u003e\\n\\u003coption value=\\\"mpa\\\"\\u003eMPa\\u003c\/option\\u003e\\n\\u003coption value=\\\"nmm2\\\"\\u003eN\/mm\u00b2\\u003c\/option\\u003e\\n\\u003coption value=\\\"psi\\\"\\u003epsi\\u003c\/option\\u003e\\n\\u003c\/select\\u003e\\n\\u003c\/div\\u003e\\n\\u003cp class=\\\"sfc-err\\\" id=\\\"sfc-ss-err\\\" hidden\\u003e\\u003c\/p\\u003e\\n\\u003cp class=\\\"sfc-help\\\" id=\\\"sfc-ss-help\\\"\\u003e\\u003c\/p\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-field\\\"\\u003e\\n\\u003clabel for=\\\"sfc-t\\\"\\u003eMaterial Thickness\\u003c\/label\\u003e\\n\\u003cdiv class=\\\"sfc-inline\\\"\\u003e\\n\\u003cinput id=\\\"sfc-t\\\" class=\\\"sfc-input\\\" type=\\\"text\\\" inputmode=\\\"decimal\\\" aria-describedby=\\\"sfc-t-err\\\"\\u003e\\n\\u003cselect id=\\\"sfc-t-unit\\\" class=\\\"sfc-select sfc-unit\\\" aria-label=\\\"Thickness unit\\\"\\u003e\\n\\u003coption value=\\\"mm\\\"\\u003emm\\u003c\/option\\u003e\\n\\u003coption value=\\\"in\\\"\\u003ein\\u003c\/option\\u003e\\n\\u003c\/select\\u003e\\n\\u003c\/div\\u003e\\n\\u003cp class=\\\"sfc-err\\\" id=\\\"sfc-t-err\\\" hidden\\u003e\\u003c\/p\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-field\\\"\\u003e\\n\\u003clabel for=\\\"sfc-l\\\"\\u003eCutting Length\\u003c\/label\\u003e\\n\\u003cdiv class=\\\"sfc-inline\\\"\\u003e\\n\\u003cinput id=\\\"sfc-l\\\" class=\\\"sfc-input\\\" type=\\\"text\\\" inputmode=\\\"decimal\\\" aria-describedby=\\\"sfc-l-err sfc-l-help\\\"\\u003e\\n\\u003cselect id=\\\"sfc-l-unit\\\" class=\\\"sfc-select sfc-unit\\\" aria-label=\\\"Cutting length unit\\\"\\u003e\\n\\u003coption value=\\\"mm\\\"\\u003emm\\u003c\/option\\u003e\\n\\u003coption value=\\\"in\\\"\\u003ein\\u003c\/option\\u003e\\n\\u003c\/select\\u003e\\n\\u003c\/div\\u003e\\n\\u003cp class=\\\"sfc-err\\\" id=\\\"sfc-l-err\\\" hidden\\u003e\\u003c\/p\\u003e\\n\\u003cp class=\\\"sfc-help\\\" id=\\\"sfc-l-help\\\"\\u003eLength of the cut edge being sheared at once.\\u003c\/p\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-field\\\"\\u003e\\n\\u003clabel for=\\\"sfc-sf\\\"\\u003eSafety Factor\\u003cspan class=\\\"sfc-opt\\\"\\u003e(optional)\\u003c\/span\\u003e\\u003c\/label\\u003e\\n\\u003cinput id=\\\"sfc-sf\\\" class=\\\"sfc-input\\\" type=\\\"text\\\" inputmode=\\\"decimal\\\" aria-describedby=\\\"sfc-sf-err sfc-sf-help\\\"\\u003e\\n\\u003cp class=\\\"sfc-err\\\" id=\\\"sfc-sf-err\\\" hidden\\u003e\\u003c\/p\\u003e\\n\\u003cp class=\\\"sfc-help\\\" id=\\\"sfc-sf-help\\\"\\u003eMust be 1 or greater. Default 1.2. Leave blank to skip the adjusted force.\\u003c\/p\\u003e\\n\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-actions\\\"\\u003e\\n\\u003cbutton type=\\\"submit\\\" class=\\\"sfc-btn\\\" id=\\\"sfc-calc\\\"\\u003eCalculate\\u003c\/button\\u003e\\n\\u003c\/div\\u003e\\n\\u003cp class=\\\"sfc-sr\\\" id=\\\"sfc-status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\"\\u003e\\u003c\/p\\u003e\\n\\u003c\/form\\u003e\\n\\u003c\/section\\u003e\\n\\u003csection class=\\\"sfc-card sfc-results\\\" aria-labelledby=\\\"sfc-results-title\\\" id=\\\"sfc-results\\\" tabindex=\\\"-1\\\" hidden\\u003e\\n\\u003ch2 class=\\\"sfc-h\\\" id=\\\"sfc-results-title\\\"\\u003eResults\\u003c\/h2\\u003e\\n\\u003cdiv class=\\\"sfc-alert\\\" id=\\\"sfc-error\\\" role=\\\"alert\\\" hidden\\u003e\\u003c\/div\\u003e\\n\\u003cdiv id=\\\"sfc-body\\\"\\u003e\\n\\u003cp class=\\\"sfc-sub-h\\\"\\u003eEstimated shearing force\\u003c\/p\\u003e\\n\\u003cdiv class=\\\"sfc-rgrid\\\"\\u003e\\n\\u003cdiv class=\\\"sfc-rcard\\\"\\u003e\\n\\u003cspan class=\\\"sfc-rcard-label\\\"\\u003eForce\\u003c\/span\\u003e\\n\\u003cdiv class=\\\"sfc-rcard-value\\\"\\u003e\\u003cspan id=\\\"sfc-r-kn\\\"\\u003e\\u003c\/span\\u003e\\u003cspan class=\\\"sfc-rcard-unit\\\"\\u003ekN\\u003c\/span\\u003e\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-rcard-sub\\\" id=\\\"sfc-r-n\\\"\\u003e\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-rcard\\\"\\u003e\\n\\u003cspan class=\\\"sfc-rcard-label\\\"\\u003eMetric tons-force\\u003c\/span\\u003e\\n\\u003cdiv class=\\\"sfc-rcard-value\\\"\\u003e\\u003cspan id=\\\"sfc-r-tf\\\"\\u003e\\u003c\/span\\u003e\\u003cspan class=\\\"sfc-rcard-unit\\\"\\u003etf\\u003c\/span\\u003e\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-rcard-sub\\\"\\u003e1 tf \u2248 9.80665 kN\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-adj\\\" id=\\\"sfc-adj\\\"\\u003e\\n\\u003cspan class=\\\"sfc-rcard-label\\\" id=\\\"sfc-adj-label\\\"\\u003eAdjusted force with safety factor\\u003c\/span\\u003e\\n\\u003cdiv class=\\\"sfc-adj-main\\\"\\u003e\\u003cspan id=\\\"sfc-r-adj-kn\\\"\\u003e\\u003c\/span\\u003e\\u003cspan class=\\\"sfc-rcard-unit\\\"\\u003ekN\\u003c\/span\\u003e\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-adj-alt\\\" id=\\\"sfc-r-adj-tf\\\"\\u003e\\u003c\/div\\u003e\\n\\u003cdiv class=\\\"sfc-adj-note\\\" id=\\\"sfc-r-adj-note\\\"\\u003e\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\\n\\u003ctable class=\\\"sfc-table\\\"\\u003e\\n\\u003ccaption class=\\\"sfc-sub-h\\\"\\u003eCalculation summary\\u003c\/caption\\u003e\\n\\u003ctbody\\u003e\\n\\u003ctr\\u003e\\u003cth scope=\\\"row\\\"\\u003eMaterial\\u003c\/th\\u003e\\u003ctd id=\\\"sfc-s-mat\\\"\\u003e\\u003c\/td\\u003e\\u003c\/tr\\u003e\\n\\u003ctr\\u003e\\u003cth scope=\\\"row\\\"\\u003eShear strength used\\u003c\/th\\u003e\\u003ctd id=\\\"sfc-s-ss\\\"\\u003e\\u003c\/td\\u003e\\u003c\/tr\\u003e\\n\\u003ctr\\u003e\\u003cth scope=\\\"row\\\"\\u003eMaterial thickness\\u003c\/th\\u003e\\u003ctd id=\\\"sfc-s-t\\\"\\u003e\\u003c\/td\\u003e\\u003c\/tr\\u003e\\n\\u003ctr\\u003e\\u003cth scope=\\\"row\\\"\\u003eCutting length\\u003c\/th\\u003e\\u003ctd id=\\\"sfc-s-l\\\"\\u003e\\u003c\/td\\u003e\\u003c\/tr\\u003e\\n\\u003ctr\\u003e\\u003cth scope=\\\"row\\\"\\u003eSafety factor\\u003c\/th\\u003e\\u003ctd id=\\\"sfc-s-sf\\\"\\u003e\\u003c\/td\\u003e\\u003c\/tr\\u003e\\n\\u003c\/tbody\\u003e\\n\\u003c\/table\\u003e\\n\\u003cdiv class=\\\"sfc-formula\\\"\\u003e\\n\\u003cspan class=\\\"sfc-formula-label\\\"\\u003eCalculation\\u003c\/span\\u003e\\n\\u003cp class=\\\"sfc-formula-sub\\\" id=\\\"sfc-d\\\"\\u003e\\u003c\/p\\u003e\\n\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\\n\\u003cp class=\\\"sfc-disclaimer\\\"\\u003e\\u003cstrong\\u003eImportant:\\u003c\/strong\\u003e This calculator provides an engineering estimate. Actual machine capacity requirements may vary with material grade, blade condition, cutting angle or rake, clearance, machine design, and operating conditions. Confirm the required capacity with the machine manufacturer or a qualified engineer.\\u003c\/p\\u003e\\n\\u003c\/section\\u003e\\n\\u003c\/div\\u003e\\n\\u003c\/div\\u003e\";\n  var host = document.getElementById('sfc-host');\n  if (!host || host.getAttribute('data-sfc-ready') === '1') return;\n  host.setAttribute('data-sfc-ready', '1');\n  \/\/ Isolate the calculator in a Shadow DOM: its CSS and IDs stay inside it.\n  var scope = host.attachShadow ? host.attachShadow({ mode: 'open' }) : host;\n  var styleEl = document.createElement('style');\n  styleEl.textContent = host.attachShadow ? CSS : CSS.replace(\/:host\\{[^}]*\\}\/, '');\n  var wrap = document.createElement('div');\n  wrap.innerHTML = HTML;\n  scope.appendChild(styleEl);\n  while (wrap.firstChild) scope.appendChild(wrap.firstChild);\n  function $(id) { return scope.getElementById ? scope.getElementById(id) : scope.querySelector('#' + id); }\n  var root = $('sfc-app');\n  if (!root) return;\n  \/* ---------- 1. Reference data ---------- *\/\n  var MM_PER_IN = 25.4;\n  var PSI_PER_MPA = 145.0377377;   \/\/ 1 MPa = 145.0377 psi\n  var KN_PER_TF = 9.80665;         \/\/ 1 metric ton-force\n  var DEFAULT_SF = '1.2';\n  var MATERIALS = {\n    mild:      { name: 'Mild Steel',      ss: 350, note: 'Typical shear strength of low-carbon steel (\u2248 350 MPa). Edit to match your grade.' },\n    stainless: { name: 'Stainless Steel', ss: 500, note: 'Typical for annealed austenitic grades such as 304 (\u2248 500 MPa). Edit to match your grade.' },\n    aluminum:  { name: 'Aluminum',        ss: 140, note: 'Typical for 5052-H32 sheet (\u2248 140 MPa). Alloys and tempers vary widely.' },\n    custom:    { name: 'Custom material', ss: null, note: 'Enter the shear strength from your material certificate or datasheet.' }\n  };\n  \/* ---------- 2. Parsing & formatting ---------- *\/\n  \/** Accepts \"1,5\" (decimal comma), \"1,000.5\" and scientific notation. *\/\n  function parseNum(raw) {\n    var s = String(raw == null ? '' : raw).trim().replace(\/\\s+\/g, '');\n    if (s === '') return { empty: true, ok: false };\n    if (\/^[+-]?\\d{1,3}(,\\d{3})+(\\.\\d+)?$\/.test(s)) s = s.replace(\/,\/g, '');\n    else if (\/^[+-]?\\d*,\\d+$\/.test(s)) s = s.replace(',', '.');\n    if (!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(s)) return { empty: false, ok: false };\n    var n = Number(s);\n    if (!isFinite(n)) return { empty: false, ok: false };\n    return { empty: false, ok: true, n: n };\n  }\n  \/** Practical decimals: more places for small values so precision is not hidden. *\/\n  function fmt(n) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    var a = Math.abs(n), d;\n    if (a === 0) d = 2;\n    else if (a >= 1000) d = 1;\n    else if (a >= 1) d = 2;\n    else if (a >= 0.01) d = 4;\n    else return Number(n.toPrecision(3)).toString();\n    return n.toLocaleString('en-US', { minimumFractionDigits: d, maximumFractionDigits: d });\n  }\n  function g(n, p) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    return Number(n.toPrecision(p || 6)).toLocaleString('en-US', { maximumFractionDigits: 10 });\n  }\n  function plain(n, p) { return String(Number(n.toPrecision(p || 6))); }\n  function esc(s) {\n    return String(s).replace(\/[&<>\"']\/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n  \/* ---------- 3. Unit helpers ---------- *\/\n  function toMm(v, u) { return u === 'in' ? v * MM_PER_IN : v; }\n  function fromMm(mm, u) { return u === 'in' ? mm \/ MM_PER_IN : mm; }\n  function toNmm2(v, u) { return u === 'psi' ? v \/ PSI_PER_MPA : v; }      \/\/ MPa and N\/mm\u00b2 are identical\n  function fromNmm2(v, u) { return u === 'psi' ? v * PSI_PER_MPA : v; }\n  var SS_LABEL = { mpa: 'MPa', nmm2: 'N\/mm\u00b2', psi: 'psi' };\n  \/* ---------- 4. Validation ---------- *\/\n  var LABEL = { ss: 'Shear strength', t: 'Material thickness', l: 'Cutting length', sf: 'Safety factor' };\n  var KEYS = ['ss', 't', 'l', 'sf'];\n  function setErr(key, msg) {\n    var el = $('sfc-' + key), er = $('sfc-' + key + '-err');\n    if (msg) {\n      el.classList.add('sfc-invalid'); el.setAttribute('aria-invalid', 'true');\n      er.textContent = msg; er.hidden = false;\n    } else {\n      el.classList.remove('sfc-invalid'); el.removeAttribute('aria-invalid');\n      er.textContent = ''; er.hidden = true;\n    }\n  }\n  function clearAllErrors() { KEYS.forEach(function (k) { setErr(k, null); }); }\n  function check(key) {\n    var p = parseNum($('sfc-' + key).value);\n    if (key === 'sf') {\n      if (p.empty) return null;                       \/\/ optional\n      if (!p.ok) return 'Safety factor must be a valid number.';\n      if (p.n < 1) return 'Safety factor must be 1 or greater.';\n      return null;\n    }\n    if (p.empty) {\n      if (key === 'ss' &#038;&#038; $('sfc-mat').value === 'custom') return 'Shear strength is required for a custom material.';\n      return LABEL[key] + ' is required.';\n    }\n    if (!p.ok) return LABEL[key] + ' must be a valid number.';\n    if (p.n <= 0) return LABEL[key] + ' must be greater than zero.';\n    return null;\n  }\n  \/* ---------- 5. Material handling ---------- *\/\n  function applyMaterial(focusCustom) {\n    var key = $('sfc-mat').value, m = MATERIALS[key];\n    $('sfc-mat-help').textContent = m.note;\n    $('sfc-ss-req').hidden = key !== 'custom';\n    if (key === 'custom') $('sfc-ss').setAttribute('aria-required', 'true');\n    else $('sfc-ss').removeAttribute('aria-required');\n    setErr('ss', null);\n    if (m.ss === null) {\n      $('sfc-ss').value = '';\n      $('sfc-ss-help').textContent = 'Required for a custom material.';\n      if (focusCustom) $('sfc-ss').focus();\n    } else {\n      $('sfc-ss').value = plain(fromNmm2(m.ss, $('sfc-ss-unit').value), 5);\n      $('sfc-ss-help').textContent = 'Pre-filled from the selected material. You can edit it.';\n    }\n  }\n  \/* ---------- 6. Calculation ---------- *\/\n  function compute() {\n    clearAllErrors();\n    var errs = [];\n    KEYS.forEach(function (k) { var m = check(k); if (m) { setErr(k, m); errs.push(m); } });\n    if (errs.length) { showErrors(errs); return false; }\n    var u = { ss: $('sfc-ss-unit').value, t: $('sfc-t-unit').value, l: $('sfc-l-unit').value };\n    var ssIn = parseNum($('sfc-ss').value).n, tIn = parseNum($('sfc-t').value).n, lIn = parseNum($('sfc-l').value).n;\n    var sfP = parseNum($('sfc-sf').value), sf = sfP.ok ? sfP.n : null;\n    \/\/ Convert every input to mm and N\/mm\u00b2\n    var ss = toNmm2(ssIn, u.ss), t = toMm(tIn, u.t), L = toMm(lIn, u.l);\n    \/\/ F (N) = L (mm) \u00d7 t (mm) \u00d7 \u03c4 (N\/mm\u00b2)\n    var F_N = L * t * ss;\n    if (!isFinite(F_N) || F_N <= 0) {\n      showErrors(['The result is outside the numeric range that can be represented. Check the magnitude of your inputs.']);\n      return false;\n    }\n    var F_kN = F_N \/ 1000, F_tf = F_kN \/ KN_PER_TF;\n    var adj_kN = sf !== null ? F_kN * sf : null;\n    render({ mat: $('sfc-mat').value, u: u, ssIn: ssIn, tIn: tIn, lIn: lIn, ss: ss, t: t, L: L, sf: sf,\n             F_N: F_N, F_kN: F_kN, F_tf: F_tf, adj_kN: adj_kN });\n    return true;\n  }\n  \/* ---------- 7. Rendering ---------- *\/\n  function showErrors(errs) {\n    var box = $('sfc-error');\n    box.innerHTML = '<strong>Please correct the following input' + (errs.length > 1 ? 's' : '') + ':<\/strong><ul>' +\n      errs.map(function (e) { return '<li>' + esc(e) + '<\/li>'; }).join('') + '<\/ul>';\n    box.hidden = false;\n    $('sfc-body').hidden = true;\n  }\n  function render(R) {\n    $('sfc-error').hidden = true;\n    $('sfc-body').hidden = false;\n    $('sfc-r-kn').textContent = fmt(R.F_kN);\n    $('sfc-r-n').textContent = '= ' + fmt(R.F_N) + ' N';\n    $('sfc-r-tf').textContent = fmt(R.F_tf);\n    var adj = $('sfc-adj');\n    if (R.adj_kN !== null) {\n      adj.hidden = false;\n      $('sfc-r-adj-kn').textContent = fmt(R.adj_kN);\n      $('sfc-r-adj-tf').textContent = '= ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf';\n      $('sfc-r-adj-note').textContent = 'Estimated shearing force \u00d7 safety factor ' + g(R.sf, 4) + '.';\n    } else {\n      adj.hidden = true;\n    }\n    var m = MATERIALS[R.mat];\n    $('sfc-s-mat').textContent = m.name;\n    var ssTxt = g(R.ss, 5) + ' N\/mm\u00b2';\n    if (R.u.ss === 'psi') ssTxt += ' (from ' + g(R.ssIn) + ' psi)';\n    else if (m.ss !== null && Math.abs(R.ss - m.ss) > 0.05) ssTxt += ' (edited from ' + m.ss + ' default)';\n    $('sfc-s-ss').textContent = ssTxt;\n    $('sfc-s-t').textContent = g(R.t) + ' mm' + (R.u.t === 'in' ? ' (from ' + g(R.tIn) + ' in)' : '');\n    $('sfc-s-l').textContent = g(R.L) + ' mm' + (R.u.l === 'in' ? ' (from ' + g(R.lIn) + ' in)' : '');\n    $('sfc-s-sf').textContent = R.sf !== null ? g(R.sf, 4) : 'Not applied';\n    var lines = [];\n    if (R.u.ss === 'psi') lines.push('Shear strength = ' + g(R.ssIn) + ' psi \u00f7 145.0377 = ' + g(R.ss, 5) + ' N\/mm\u00b2');\n    if (R.u.t === 'in') lines.push('Thickness = ' + g(R.tIn) + ' in \u00d7 25.4 = ' + g(R.t) + ' mm');\n    if (R.u.l === 'in') lines.push('Cutting length = ' + g(R.lIn) + ' in \u00d7 25.4 = ' + g(R.L) + ' mm');\n    lines.push('Force = ' + g(R.L) + ' mm \u00d7 ' + g(R.t) + ' mm \u00d7 ' + g(R.ss, 5) + ' N\/mm\u00b2 = ' + fmt(R.F_N) + ' N = ' + fmt(R.F_kN) + ' kN');\n    lines.push('Tons-force = ' + fmt(R.F_kN) + ' kN \u00f7 9.80665 = ' + fmt(R.F_tf) + ' tf');\n    if (R.adj_kN !== null) lines.push('Adjusted = ' + fmt(R.F_kN) + ' kN \u00d7 ' + g(R.sf, 4) + ' = ' + fmt(R.adj_kN) + ' kN = ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf');\n    $('sfc-d').innerHTML = lines.map(esc).join('<br>');\n    $('sfc-status').textContent = 'Calculated. Estimated shearing force ' + fmt(R.F_kN) + ' kilonewtons, ' + fmt(R.F_tf) + ' metric tons-force' +\n      (R.adj_kN !== null ? '. Adjusted force ' + fmt(R.adj_kN) + ' kilonewtons.' : '.');\n  }\n  \/* ---------- 8. Reset & example ---------- *\/\n  function setUnit(id, val) { var s = $(id); s.value = val; s.setAttribute('data-prev', val); }\n  function hideResults() { $('sfc-results').hidden = true; $('sfc-error').hidden = true; $('sfc-status').textContent = ''; }\n  function doReset() {\n    $('sfc-mat').value = 'mild';\n    setUnit('sfc-ss-unit', 'mpa'); setUnit('sfc-t-unit', 'mm'); setUnit('sfc-l-unit', 'mm');\n    $('sfc-t').value = ''; $('sfc-l').value = ''; $('sfc-sf').value = DEFAULT_SF;\n    clearAllErrors();\n    applyMaterial(false);\n    hideResults();\n  }\n  \/* ---------- 9. Events ---------- *\/\n  root.querySelectorAll('select.sfc-unit').forEach(function (s) { s.setAttribute('data-prev', s.value); });\n  root.addEventListener('change', function (e) {\n    var el = e.target;\n    if (el.id === 'sfc-mat') { applyMaterial(true); return; }\n    if (el.classList.contains('sfc-unit')) {\n      \/\/ Convert the entered quantity to the new unit instead of reinterpreting it\n      var key = el.id.replace('sfc-', '').replace('-unit', '');\n      var input = $('sfc-' + key), prev = el.getAttribute('data-prev'), next = el.value;\n      var p = parseNum(input.value);\n      if (p.ok && prev && prev !== next) {\n        var v = key === 'ss' ? fromNmm2(toNmm2(p.n, prev), next) : fromMm(toMm(p.n, prev), next);\n        input.value = plain(v, 6);\n      }\n      el.setAttribute('data-prev', next);\n    }\n  });\n  root.addEventListener('input', function (e) {\n    var el = e.target;\n    if (!el.classList || !el.classList.contains('sfc-input')) return;\n    var key = el.id.replace('sfc-', '');\n    if (el.classList.contains('sfc-invalid') && !check(key)) setErr(key, null);\n  });\n  $('sfc-form').addEventListener('submit', function (e) {\n    e.preventDefault();\n    var res = $('sfc-results'), first = res.hidden;\n    res.hidden = false;\n    if (!compute()) {\n      $('sfc-status').textContent = 'Some inputs need attention.';\n      var bad = root.querySelector('.sfc-invalid');\n      if (bad) bad.focus();\n    } else if (first && res.scrollIntoView) {\n      res.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    }\n  });\n  \/* ---------- 10. Init ---------- *\/\n  doReset();\n})();\n<\/script>\n\n\n\n<div id=\"sfc-host\">\n<style>\n:host{all:initial;display:block;contain:layout style}\n.sfc-root{\n--sfc-blue:#1e3a8a;--sfc-blue-2:#1d4ed8;--sfc-blue-soft:#e8eefb;--sfc-blue-line:#c7d4f0;\n--sfc-bg:#f3f5f8;--sfc-card:#ffffff;--sfc-text:#1f2937;--sfc-heading:#111827;--sfc-muted:#525c6b;\n--sfc-border:#d6dce5;--sfc-field:#fbfcfe;--sfc-danger:#b42318;--sfc-danger-bg:#fef3f2;\n--sfc-radius:12px;--sfc-shadow:0 1px 2px rgba(16,24,40,.06),0 6px 16px rgba(16,24,40,.06);\nfont-family:system-ui,-apple-system,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;\nfont-size:16px;line-height:1.55;color:var(--sfc-text);background:var(--sfc-bg);\nmax-width:1000px;margin:0 auto;padding:28px 16px 36px;text-align:left;border-radius:16px;\n-webkit-text-size-adjust:100%;\n}\n.sfc-root *,.sfc-root *::before,.sfc-root *::after{box-sizing:border-box}\n.sfc-root [hidden]{display:none !important}\n.sfc-root h2,.sfc-root h3{font-family:inherit;color:var(--sfc-heading);line-height:1.25;margin:0 0 .5em;padding:0;letter-spacing:normal;text-transform:none;font-weight:700;border:0;background:none}\n.sfc-root h2.sfc-h{font-size:clamp(1.1rem,2vw,1.3rem);margin:0 0 14px}\n.sfc-root p{margin:0 0 .85em;padding:0}\n.sfc-root ul{margin:0;padding-left:1.2em}\n.sfc-root li{margin:0 0 .3em}\n.sfc-root .sfc-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:22px}\n.sfc-root .sfc-card{background:var(--sfc-card);border:1px solid var(--sfc-border);border-radius:var(--sfc-radius);box-shadow:var(--sfc-shadow);padding:22px}\n.sfc-root .sfc-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 16px}\n.sfc-root .sfc-field{margin:0 0 16px;min-width:0}\n.sfc-root .sfc-field > label{display:block;font-size:.88rem;font-weight:600;color:var(--sfc-text);margin:0 0 5px;line-height:1.3}\n.sfc-root .sfc-req{color:var(--sfc-danger);font-weight:700;margin-left:2px}\n.sfc-root .sfc-opt{color:var(--sfc-muted);font-weight:500;font-size:.82rem;margin-left:4px}\n.sfc-root .sfc-inline{display:flex;gap:8px;align-items:stretch}\n.sfc-root .sfc-inline .sfc-input{flex:1 1 auto;min-width:0}\n.sfc-root .sfc-inline .sfc-unit{flex:0 0 auto;width:auto;min-width:96px;max-width:45%}\n.sfc-root .sfc-input,.sfc-root .sfc-select{\ndisplay:block;width:100%;height:42px;margin:0;padding:8px 12px;font:inherit;font-size:15px;line-height:1.3;color:var(--sfc-text);\nbackground-color:var(--sfc-field);border:1px solid #b9c2cf;border-radius:8px;box-shadow:none;outline:none;\ntransition:border-color .15s,box-shadow .15s;max-width:none;min-height:0;text-transform:none;letter-spacing:normal}\n.sfc-root .sfc-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:32px;cursor:pointer;\nbackground-image:url(\"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\");\nbackground-repeat:no-repeat;background-position:right 11px center;background-size:12px 8px}\n.sfc-root .sfc-input:hover,.sfc-root .sfc-select:hover{border-color:#8f9bab}\n.sfc-root .sfc-input:focus,.sfc-root .sfc-select:focus{border-color:var(--sfc-blue-2);box-shadow:0 0 0 3px rgba(29,78,216,.25);background-color:#fff}\n.sfc-root .sfc-input.sfc-invalid{border-color:var(--sfc-danger);background-color:var(--sfc-danger-bg)}\n.sfc-root .sfc-input.sfc-invalid:focus{box-shadow:0 0 0 3px rgba(180,35,24,.2)}\n.sfc-root .sfc-err{color:var(--sfc-danger);font-size:.83rem;margin:5px 0 0;line-height:1.35;font-weight:500}\n.sfc-root .sfc-help{color:var(--sfc-muted);font-size:.82rem;margin:5px 0 0;line-height:1.4}\n.sfc-root .sfc-actions{display:flex !important;flex-wrap:wrap;justify-content:center;gap:10px;width:100%;margin:8px 0 0 !important;padding:0 !important;float:none !important;clear:both}\n.sfc-root .sfc-btn{display:inline-flex !important;align-items:center;justify-content:center;float:none !important;width:auto !important;min-width:130px;height:42px;padding:0 20px;margin:0 !important;\nposition:static !important;font:inherit;font-size:.95rem;font-weight:650;line-height:1;border-radius:8px;border:1px solid var(--sfc-blue);background:var(--sfc-blue);color:#fff;cursor:pointer;\ntext-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;transition:background .15s,border-color .15s,color .15s}\n.sfc-root .sfc-btn:hover{background:#172f73;border-color:#172f73;color:#fff}\n.sfc-root .sfc-btn.sfc-btn-2{background:#fff;color:var(--sfc-blue);border-color:#9fb1db}\n.sfc-root .sfc-btn.sfc-btn-2:hover{background:var(--sfc-blue-soft);color:var(--sfc-blue);border-color:var(--sfc-blue)}\n.sfc-root .sfc-btn:focus-visible{outline:3px solid var(--sfc-blue-2);outline-offset:2px}\n.sfc-root .sfc-results:focus{outline:none}\n.sfc-root .sfc-alert{border:1px solid #fecdca;background:var(--sfc-danger-bg);color:var(--sfc-danger);border-radius:10px;padding:12px 14px;margin:0;font-size:.9rem}\n.sfc-root .sfc-alert ul{margin:6px 0 0;padding-left:1.2em}\n.sfc-root .sfc-sub-h{font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin:0 0 8px}\n.sfc-root .sfc-rgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.sfc-root .sfc-rcard{border:1px solid var(--sfc-blue-line);background:var(--sfc-blue-soft);border-radius:12px;padding:16px 16px 14px;min-width:0}\n.sfc-root .sfc-rcard-label{display:block;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--sfc-blue);margin-bottom:6px}\n.sfc-root .sfc-rcard-value{font-size:clamp(1.5rem,3.2vw,2rem);font-weight:800;line-height:1.15;color:var(--sfc-heading);word-break:break-word;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-rcard-unit{font-size:.5em;font-weight:700;margin-left:5px;color:var(--sfc-muted)}\n.sfc-root .sfc-rcard-sub{font-size:.82rem;color:var(--sfc-muted);margin-top:6px;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj{margin-top:14px;border-radius:12px;padding:18px;background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 100%);color:#fff}\n.sfc-root .sfc-adj .sfc-rcard-label{color:#dbe5ff}\n.sfc-root .sfc-adj-main{font-size:clamp(1.7rem,3.6vw,2.3rem);font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj-main .sfc-rcard-unit{color:#dbe5ff}\n.sfc-root .sfc-adj-alt{margin-top:6px;font-size:.92rem;color:#e9efff;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-adj-note{margin-top:8px;font-size:.82rem;color:#e9efff}\n.sfc-root .sfc-table{width:100%;border-collapse:collapse;margin:14px 0 0;font-size:.9rem;font-variant-numeric:tabular-nums}\n.sfc-root .sfc-table caption{text-align:left;caption-side:top;padding:0 0 4px}\n.sfc-root .sfc-table th,.sfc-root .sfc-table td{text-align:left;padding:9px 10px;border:0;border-bottom:1px solid var(--sfc-border);vertical-align:top;background:none}\n.sfc-root .sfc-table th{font-weight:600;color:var(--sfc-muted);width:42%}\n.sfc-root .sfc-table td{color:var(--sfc-heading);font-weight:600}\n.sfc-root .sfc-table tr:last-child th,.sfc-root .sfc-table tr:last-child td{border-bottom:0}\n.sfc-root .sfc-formula{background:#0f1f45;color:#e6edff;padding:14px 16px;border-radius:10px;margin:14px 0 0}\n.sfc-root .sfc-formula-label{display:block;font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#b4c4ec;margin-bottom:4px}\n.sfc-root .sfc-formula-sub{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.86rem;color:#e6edff;word-break:break-word;margin:0;line-height:1.6}\n.sfc-root .sfc-disclaimer{font-size:.85rem;color:var(--sfc-muted);background:#f6f8fb;border-left:3px solid var(--sfc-blue-line);padding:10px 12px;border-radius:0 8px 8px 0;margin:16px 0 0}\n.sfc-root .sfc-disclaimer strong{color:var(--sfc-heading)}\n.sfc-root .sfc-sr{position:absolute !important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n@media (max-width:600px){\n.sfc-root{padding:20px 12px 28px;border-radius:0}\n.sfc-root .sfc-card{padding:16px}\n.sfc-root .sfc-row,.sfc-root .sfc-rgrid{grid-template-columns:minmax(0,1fr)}\n.sfc-root .sfc-btn{flex:1 1 100%}\n.sfc-root .sfc-table th{width:50%}\n}\n@media (prefers-reduced-motion:reduce){\n.sfc-root *{transition:none !important}\n}\n<\/style>\n<div class=\"sfc-root\" id=\"sfc-app\">\n<div class=\"sfc-stack\">\n<section class=\"sfc-card\" aria-labelledby=\"sfc-inputs-title\">\n<h2 class=\"sfc-h\" id=\"sfc-inputs-title\">Shearing Inputs<\/h2>\n<form id=\"sfc-form\" novalidate autocomplete=\"off\">\n<div class=\"sfc-row\">\n<div class=\"sfc-field\">\n<label for=\"sfc-mat\">Material Type<\/label>\n<select id=\"sfc-mat\" class=\"sfc-select\" aria-describedby=\"sfc-mat-help\">\n<option value=\"mild\">Mild Steel (\u2248 350 MPa)<\/option>\n<option value=\"stainless\">Stainless Steel (\u2248 500 MPa)<\/option>\n<option value=\"aluminum\">Aluminum (\u2248 140 MPa)<\/option>\n<option value=\"custom\">Custom (enter shear strength)<\/option>\n<\/select>\n<p class=\"sfc-help\" id=\"sfc-mat-help\"><\/p>\n<\/div>\n<div class=\"sfc-field\">\n<label for=\"sfc-ss\">Material Shear Strength<span class=\"sfc-req\" id=\"sfc-ss-req\" aria-hidden=\"true\" hidden>*<\/span><\/label>\n<div class=\"sfc-inline\">\n<input id=\"sfc-ss\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-ss-err sfc-ss-help\">\n<select id=\"sfc-ss-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Shear strength unit\">\n<option value=\"mpa\">MPa<\/option>\n<option value=\"nmm2\">N\/mm\u00b2<\/option>\n<option value=\"psi\">psi<\/option>\n<\/select>\n<\/div>\n<p class=\"sfc-err\" id=\"sfc-ss-err\" hidden><\/p>\n<p class=\"sfc-help\" id=\"sfc-ss-help\"><\/p>\n<\/div>\n<div class=\"sfc-field\">\n<label for=\"sfc-t\">Material Thickness<span class=\"sfc-req\" aria-hidden=\"true\">*<\/span><\/label>\n<div class=\"sfc-inline\">\n<input id=\"sfc-t\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-required=\"true\" aria-describedby=\"sfc-t-err\">\n<select id=\"sfc-t-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Thickness unit\">\n<option value=\"mm\">mm<\/option>\n<option value=\"in\">in<\/option>\n<\/select>\n<\/div>\n<p class=\"sfc-err\" id=\"sfc-t-err\" hidden><\/p>\n<\/div>\n<div class=\"sfc-field\">\n<label for=\"sfc-l\">Cutting Length<span class=\"sfc-req\" aria-hidden=\"true\">*<\/span><\/label>\n<div class=\"sfc-inline\">\n<input id=\"sfc-l\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-required=\"true\" aria-describedby=\"sfc-l-err sfc-l-help\">\n<select id=\"sfc-l-unit\" class=\"sfc-select sfc-unit\" aria-label=\"Cutting length unit\">\n<option value=\"mm\">mm<\/option>\n<option value=\"in\">in<\/option>\n<\/select>\n<\/div>\n<p class=\"sfc-err\" id=\"sfc-l-err\" hidden><\/p>\n<p class=\"sfc-help\" id=\"sfc-l-help\">Length of the cut edge being sheared at once.<\/p>\n<\/div>\n<div class=\"sfc-field\">\n<label for=\"sfc-sf\">Safety Factor<span class=\"sfc-opt\">(optional)<\/span><\/label>\n<input id=\"sfc-sf\" class=\"sfc-input\" type=\"text\" inputmode=\"decimal\" aria-describedby=\"sfc-sf-err sfc-sf-help\">\n<p class=\"sfc-err\" id=\"sfc-sf-err\" hidden><\/p>\n<p class=\"sfc-help\" id=\"sfc-sf-help\">Must be 1 or greater. Default 1.2. Leave blank to skip the adjusted force.<\/p>\n<\/div>\n<\/div>\n<div class=\"sfc-actions\">\n<button type=\"submit\" class=\"sfc-btn\" id=\"sfc-calc\">Calculate<\/button>\n<\/div>\n<p class=\"sfc-sr\" id=\"sfc-status\" role=\"status\" aria-live=\"polite\"><\/p>\n<\/form>\n<\/section>\n<section class=\"sfc-card sfc-results\" aria-labelledby=\"sfc-results-title\" id=\"sfc-results\" tabindex=\"-1\" hidden>\n<h2 class=\"sfc-h\" id=\"sfc-results-title\">Results<\/h2>\n<div class=\"sfc-alert\" id=\"sfc-error\" role=\"alert\" hidden><\/div>\n<div id=\"sfc-body\">\n<p class=\"sfc-sub-h\">Estimated shearing force<\/p>\n<div class=\"sfc-rgrid\">\n<div class=\"sfc-rcard\">\n<span class=\"sfc-rcard-label\">Force<\/span>\n<div class=\"sfc-rcard-value\"><span id=\"sfc-r-kn\"><\/span><span class=\"sfc-rcard-unit\">kN<\/span><\/div>\n<div class=\"sfc-rcard-sub\" id=\"sfc-r-n\"><\/div>\n<\/div>\n<div class=\"sfc-rcard\">\n<span class=\"sfc-rcard-label\">Metric tons-force<\/span>\n<div class=\"sfc-rcard-value\"><span id=\"sfc-r-tf\"><\/span><span class=\"sfc-rcard-unit\">tf<\/span><\/div>\n<div class=\"sfc-rcard-sub\">1 tf \u2248 9.80665 kN<\/div>\n<\/div>\n<\/div>\n<div class=\"sfc-adj\" id=\"sfc-adj\">\n<span class=\"sfc-rcard-label\">Adjusted force with safety factor<\/span>\n<div class=\"sfc-adj-main\"><span id=\"sfc-r-adj-kn\"><\/span><span class=\"sfc-rcard-unit\">kN<\/span><\/div>\n<div class=\"sfc-adj-alt\" id=\"sfc-r-adj-tf\"><\/div>\n<div class=\"sfc-adj-note\" id=\"sfc-r-adj-note\"><\/div>\n<\/div>\n<table class=\"sfc-table\">\n<caption class=\"sfc-sub-h\">Calculation summary<\/caption>\n<tbody>\n<tr><th scope=\"row\">Material<\/th><td id=\"sfc-s-mat\"><\/td><\/tr>\n<tr><th scope=\"row\">Shear strength used<\/th><td id=\"sfc-s-ss\"><\/td><\/tr>\n<tr><th scope=\"row\">Material thickness<\/th><td id=\"sfc-s-t\"><\/td><\/tr>\n<tr><th scope=\"row\">Cutting length<\/th><td id=\"sfc-s-l\"><\/td><\/tr>\n<tr><th scope=\"row\">Safety factor<\/th><td id=\"sfc-s-sf\"><\/td><\/tr>\n<\/tbody>\n<\/table>\n<div class=\"sfc-formula\">\n<span class=\"sfc-formula-label\">Calculation<\/span>\n<p class=\"sfc-formula-sub\" id=\"sfc-d\"><\/p>\n<\/div>\n<\/div>\n<p class=\"sfc-disclaimer\"><strong>Important:<\/strong> This calculator provides an engineering estimate. Actual machine capacity requirements may vary with material grade, blade condition, cutting angle or rake, clearance, machine design, and operating conditions. Confirm the required capacity with the machine manufacturer or a qualified engineer.<\/p>\n<\/section>\n<\/div>\n<\/div>\n<\/div>\n<script>\n\/* Shearing Force Calculator \u2014 vanilla JS, Shadow DOM isolated, no globals.\n   Internal units: lengths in mm, strength in N\/mm\u00b2 (= MPa), force in N. *\/\n(function () {\n  'use strict';\n  var host = document.getElementById('sfc-host');\n  if (!host || host.getAttribute('data-sfc-ready') === '1') return;\n  host.setAttribute('data-sfc-ready', '1');\n  var scope = host;\n  if (host.attachShadow) {\n    scope = host.attachShadow({ mode: 'open' });\n    while (host.firstChild) scope.appendChild(host.firstChild);\n  }\n  function $(id) { return scope.getElementById ? scope.getElementById(id) : scope.querySelector('#' + id); }\n  var root = $('sfc-app');\n  if (!root) return;\n\n  var MM_PER_IN = 25.4;\n  var PSI_PER_MPA = 145.0377377;\n  var KN_PER_TF = 9.80665;\n  var DEFAULT_SF = '1.2';\n  var MATERIALS = {\n    mild:      { name: 'Mild Steel',      ss: 350, note: 'Typical shear strength of low-carbon steel (\u2248 350 MPa). Edit to match your grade.' },\n    stainless: { name: 'Stainless Steel', ss: 500, note: 'Typical for annealed austenitic grades such as 304 (\u2248 500 MPa). Edit to match your grade.' },\n    aluminum:  { name: 'Aluminum',        ss: 140, note: 'Typical for 5052-H32 sheet (\u2248 140 MPa). Alloys and tempers vary widely.' },\n    custom:    { name: 'Custom material', ss: null, note: 'Enter the shear strength from your material certificate or datasheet.' }\n  };\n\n  function parseNum(raw) {\n    var s = String(raw == null ? '' : raw).trim().replace(\/\\s+\/g, '');\n    if (s === '') return { empty: true, ok: false };\n    if (\/^[+-]?\\d{1,3}(,\\d{3})+(\\.\\d+)?$\/.test(s)) s = s.replace(\/,\/g, '');\n    else if (\/^[+-]?\\d*,\\d+$\/.test(s)) s = s.replace(',', '.');\n    if (!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(s)) return { empty: false, ok: false };\n    var n = Number(s);\n    if (!isFinite(n)) return { empty: false, ok: false };\n    return { empty: false, ok: true, n: n };\n  }\n  function fmt(n) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    var a = Math.abs(n), d;\n    if (a === 0) d = 2;\n    else if (a >= 1000) d = 1;\n    else if (a >= 1) d = 2;\n    else if (a >= 0.01) d = 4;\n    else return Number(n.toPrecision(3)).toString();\n    return n.toLocaleString('en-US', { minimumFractionDigits: d, maximumFractionDigits: d });\n  }\n  function g(n, p) {\n    if (typeof n !== 'number' || !isFinite(n)) return '\u2014';\n    return Number(n.toPrecision(p || 6)).toLocaleString('en-US', { maximumFractionDigits: 10 });\n  }\n  function plain(n, p) { return String(Number(n.toPrecision(p || 6))); }\n  function esc(s) {\n    return String(s).replace(\/[&<>\"']\/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n\n  function toMm(v, u) { return u === 'in' ? v * MM_PER_IN : v; }\n  function fromMm(mm, u) { return u === 'in' ? mm \/ MM_PER_IN : mm; }\n  function toNmm2(v, u) { return u === 'psi' ? v \/ PSI_PER_MPA : v; }\n  function fromNmm2(v, u) { return u === 'psi' ? v * PSI_PER_MPA : v; }\n\n  var LABEL = { ss: 'Shear strength', t: 'Material thickness', l: 'Cutting length', sf: 'Safety factor' };\n  var KEYS = ['ss', 't', 'l', 'sf'];\n  function setErr(key, msg) {\n    var el = $('sfc-' + key), er = $('sfc-' + key + '-err');\n    if (msg) {\n      el.classList.add('sfc-invalid'); el.setAttribute('aria-invalid', 'true');\n      er.textContent = msg; er.hidden = false;\n    } else {\n      el.classList.remove('sfc-invalid'); el.removeAttribute('aria-invalid');\n      er.textContent = ''; er.hidden = true;\n    }\n  }\n  function clearAllErrors() { KEYS.forEach(function (k) { setErr(k, null); }); }\n  function check(key) {\n    var p = parseNum($('sfc-' + key).value);\n    if (key === 'sf') {\n      if (p.empty) return null;\n      if (!p.ok) return 'Safety factor must be a valid number.';\n      if (p.n < 1) return 'Safety factor must be 1 or greater.';\n      return null;\n    }\n    if (p.empty) {\n      if (key === 'ss' &#038;&#038; $('sfc-mat').value === 'custom') return 'Shear strength is required for a custom material.';\n      return LABEL[key] + ' is required.';\n    }\n    if (!p.ok) return LABEL[key] + ' must be a valid number.';\n    if (p.n <= 0) return LABEL[key] + ' must be greater than zero.';\n    return null;\n  }\n\n  function applyMaterial(focusCustom) {\n    var key = $('sfc-mat').value, m = MATERIALS[key];\n    $('sfc-mat-help').textContent = m.note;\n    $('sfc-ss-req').hidden = key !== 'custom';\n    if (key === 'custom') $('sfc-ss').setAttribute('aria-required', 'true');\n    else $('sfc-ss').removeAttribute('aria-required');\n    setErr('ss', null);\n    if (m.ss === null) {\n      $('sfc-ss').value = '';\n      $('sfc-ss-help').textContent = 'Required for a custom material.';\n      if (focusCustom) $('sfc-ss').focus();\n    } else {\n      $('sfc-ss').value = plain(fromNmm2(m.ss, $('sfc-ss-unit').value), 5);\n      $('sfc-ss-help').textContent = 'Pre-filled from the selected material. You can edit it.';\n    }\n  }\n\n  function compute() {\n    clearAllErrors();\n    var errs = [];\n    KEYS.forEach(function (k) { var m = check(k); if (m) { setErr(k, m); errs.push(m); } });\n    if (errs.length) { showErrors(errs); return false; }\n    var u = { ss: $('sfc-ss-unit').value, t: $('sfc-t-unit').value, l: $('sfc-l-unit').value };\n    var ssIn = parseNum($('sfc-ss').value).n, tIn = parseNum($('sfc-t').value).n, lIn = parseNum($('sfc-l').value).n;\n    var sfP = parseNum($('sfc-sf').value), sf = sfP.ok ? sfP.n : null;\n    var ss = toNmm2(ssIn, u.ss), t = toMm(tIn, u.t), L = toMm(lIn, u.l);\n    var F_N = L * t * ss;   \/\/ F (N) = L (mm) \u00d7 t (mm) \u00d7 \u03c4 (N\/mm\u00b2)\n    if (!isFinite(F_N) || F_N <= 0) {\n      showErrors(['The result is outside the numeric range that can be represented. Check the magnitude of your inputs.']);\n      return false;\n    }\n    var F_kN = F_N \/ 1000, F_tf = F_kN \/ KN_PER_TF;\n    var adj_kN = sf !== null ? F_kN * sf : null;\n    render({ mat: $('sfc-mat').value, u: u, ssIn: ssIn, tIn: tIn, lIn: lIn, ss: ss, t: t, L: L, sf: sf,\n             F_N: F_N, F_kN: F_kN, F_tf: F_tf, adj_kN: adj_kN });\n    return true;\n  }\n\n  function showErrors(errs) {\n    var box = $('sfc-error');\n    box.innerHTML = '<strong>Please correct the following input' + (errs.length > 1 ? 's' : '') + ':<\/strong><ul>' +\n      errs.map(function (e) { return '<li>' + esc(e) + '<\/li>'; }).join('') + '<\/ul>';\n    box.hidden = false;\n    $('sfc-body').hidden = true;\n  }\n  function render(R) {\n    $('sfc-error').hidden = true;\n    $('sfc-body').hidden = false;\n    $('sfc-r-kn').textContent = fmt(R.F_kN);\n    $('sfc-r-n').textContent = '= ' + fmt(R.F_N) + ' N';\n    $('sfc-r-tf').textContent = fmt(R.F_tf);\n    var adj = $('sfc-adj');\n    if (R.adj_kN !== null) {\n      adj.hidden = false;\n      $('sfc-r-adj-kn').textContent = fmt(R.adj_kN);\n      $('sfc-r-adj-tf').textContent = '= ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf';\n      $('sfc-r-adj-note').textContent = 'Estimated shearing force \u00d7 safety factor ' + g(R.sf, 4) + '.';\n    } else {\n      adj.hidden = true;\n    }\n    var m = MATERIALS[R.mat];\n    $('sfc-s-mat').textContent = m.name;\n    var ssTxt = g(R.ss, 5) + ' N\/mm\u00b2';\n    if (R.u.ss === 'psi') ssTxt += ' (from ' + g(R.ssIn) + ' psi)';\n    else if (m.ss !== null && Math.abs(R.ss - m.ss) > 0.05) ssTxt += ' (edited from ' + m.ss + ' default)';\n    $('sfc-s-ss').textContent = ssTxt;\n    $('sfc-s-t').textContent = g(R.t) + ' mm' + (R.u.t === 'in' ? ' (from ' + g(R.tIn) + ' in)' : '');\n    $('sfc-s-l').textContent = g(R.L) + ' mm' + (R.u.l === 'in' ? ' (from ' + g(R.lIn) + ' in)' : '');\n    $('sfc-s-sf').textContent = R.sf !== null ? g(R.sf, 4) : 'Not applied';\n    var lines = [];\n    if (R.u.ss === 'psi') lines.push('Shear strength = ' + g(R.ssIn) + ' psi \u00f7 145.0377 = ' + g(R.ss, 5) + ' N\/mm\u00b2');\n    if (R.u.t === 'in') lines.push('Thickness = ' + g(R.tIn) + ' in \u00d7 25.4 = ' + g(R.t) + ' mm');\n    if (R.u.l === 'in') lines.push('Cutting length = ' + g(R.lIn) + ' in \u00d7 25.4 = ' + g(R.L) + ' mm');\n    lines.push('Force = ' + g(R.L) + ' mm \u00d7 ' + g(R.t) + ' mm \u00d7 ' + g(R.ss, 5) + ' N\/mm\u00b2 = ' + fmt(R.F_N) + ' N = ' + fmt(R.F_kN) + ' kN');\n    lines.push('Tons-force = ' + fmt(R.F_kN) + ' kN \u00f7 9.80665 = ' + fmt(R.F_tf) + ' tf');\n    if (R.adj_kN !== null) lines.push('Adjusted = ' + fmt(R.F_kN) + ' kN \u00d7 ' + g(R.sf, 4) + ' = ' + fmt(R.adj_kN) + ' kN = ' + fmt(R.adj_kN \/ KN_PER_TF) + ' tf');\n    $('sfc-d').innerHTML = lines.map(esc).join('<br>');\n    $('sfc-status').textContent = 'Calculated. Estimated shearing force ' + fmt(R.F_kN) + ' kilonewtons, ' + fmt(R.F_tf) + ' metric tons-force' +\n      (R.adj_kN !== null ? '. Adjusted force ' + fmt(R.adj_kN) + ' kilonewtons.' : '.');\n  }\n\n  function setUnit(id, val) { var s = $(id); s.value = val; s.setAttribute('data-prev', val); }\n  function hideResults() { $('sfc-results').hidden = true; $('sfc-error').hidden = true; }\n  function doReset(announce) {\n    $('sfc-mat').value = 'mild';\n    setUnit('sfc-ss-unit', 'mpa'); setUnit('sfc-t-unit', 'mm'); setUnit('sfc-l-unit', 'mm');\n    $('sfc-t').value = ''; $('sfc-l').value = ''; $('sfc-sf').value = DEFAULT_SF;\n    clearAllErrors();\n    applyMaterial(false);\n    hideResults();\n    $('sfc-status').textContent = announce ? 'Form reset to defaults.' : '';\n  }\n\n  root.querySelectorAll('select.sfc-unit').forEach(function (s) { s.setAttribute('data-prev', s.value); });\n  root.addEventListener('change', function (e) {\n    var el = e.target;\n    if (el.id === 'sfc-mat') { applyMaterial(true); return; }\n    if (el.classList.contains('sfc-unit')) {\n      var key = el.id.replace('sfc-', '').replace('-unit', '');\n      var input = $('sfc-' + key), prev = el.getAttribute('data-prev'), next = el.value;\n      var p = parseNum(input.value);\n      if (p.ok && prev && prev !== next) {\n        var v = key === 'ss' ? fromNmm2(toNmm2(p.n, prev), next) : fromMm(toMm(p.n, prev), next);\n        input.value = plain(v, 6);\n      }\n      el.setAttribute('data-prev', next);\n    }\n  });\n  root.addEventListener('input', function (e) {\n    var el = e.target;\n    if (!el.classList || !el.classList.contains('sfc-input')) return;\n    var key = el.id.replace('sfc-', '');\n    if (el.classList.contains('sfc-invalid') && !check(key)) setErr(key, null);\n  });\n  $('sfc-form').addEventListener('submit', function (e) {\n    e.preventDefault();\n    var res = $('sfc-results'), first = res.hidden;\n    res.hidden = false;\n    if (!compute()) {\n      $('sfc-status').textContent = 'Some inputs need attention.';\n      var bad = root.querySelector('.sfc-invalid');\n      if (bad) bad.focus();\n    } else if (first && res.scrollIntoView) {\n      res.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n    }\n  });\n\n  doReset(false);\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Shearing Force Calculator estimates the force required to cut sheet metal or plate based on material shear strength, thickness, and cutting length. Enter your&#8230;<\/p>","protected":false},"author":2,"featured_media":25058,"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_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8808],"tags":[8836,2169,8835,2396],"class_list":["post-25054","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-manufacturing-and-processes","tag-force-calculator","tag-metalworking","tag-shearing","tag-sheet-metal","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/11\/Shearing-Force-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/25054","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/comments?post=25054"}],"version-history":[{"count":2,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/25054\/revisions"}],"predecessor-version":[{"id":25057,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/25054\/revisions\/25057"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media\/25058"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media?parent=25054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/categories?post=25054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/tags?post=25054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}