{"id":25011,"date":"2026-10-29T08:35:53","date_gmt":"2026-10-29T08:35:53","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=25011"},"modified":"2026-10-29T08:35:57","modified_gmt":"2026-10-29T08:35:57","slug":"feed-rate-f-vf-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/es\/feed-rate-f-vf-calculator\/","title":{"rendered":"Feed Rate (f \/ Vf) Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The Feed Rate (f \/ Vf) Calculator helps CNC operators, machinists, and manufacturing engineers calculate feed rate, feed per tooth, feed per revolution, and spindle speed for various machining operations. Supporting both metric and imperial units, this tool simplifies machining calculations for milling, turning, and drilling applications. Use the Feed Rate (f \/ Vf) Calculator to optimize machining parameters, improve production efficiency, and achieve consistent processing results. Always verify calculated values against tool manufacturer recommendations and machine operating limits.<\/p>\n\n\n\n<iframe class=\"frc-frame skip-lazy no-lazyload\" data-no-lazy=\"1\" data-skip-lazy=\"1\" title=\"Feed Rate (f \/ Vf) Calculator\" scrolling=\"no\" style=\"display:block !important;width:100% !important;max-width:1000px !important;height:900px;border:0 !important;margin:0 auto !important;padding:0 !important;overflow:hidden;background:transparent;float:none !important\" srcdoc=\"&lt;!DOCTYPE html&gt;&#10;&lt;html lang=&quot;en&quot;&gt;&#10;&lt;head&gt;&#10;&lt;meta charset=&quot;UTF-8&quot;&gt;&#10;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;&#10;&lt;title&gt;Feed Rate (f \/ Vf) Calculator&lt;\/title&gt;&#10;&lt;style&gt;&#10;\/* =====================================================================&#10;   Feed Rate (f \/ Vf) Calculator \u2014 all selectors scoped under .frc-root&#10;   so the calculator never changes how the rest of a WordPress page looks.&#10;   ===================================================================== *\/&#10;.frc-root{&#10;  --frc-blue:#1e3a8a;--frc-blue-2:#1d4ed8;--frc-blue-soft:#e8eefb;--frc-blue-line:#c7d4f0;&#10;  --frc-bg:#f3f5f8;--frc-card:#ffffff;--frc-text:#1f2937;--frc-heading:#111827;--frc-muted:#5b6574;&#10;  --frc-border:#d6dce5;--frc-field:#fbfcfe;--frc-danger:#b42318;--frc-danger-bg:#fef3f2;&#10;  --frc-radius:12px;--frc-shadow:0 1px 2px rgba(16,24,40,.06),0 6px 16px rgba(16,24,40,.06);&#10;  font-family:system-ui,-apple-system,&quot;Segoe UI&quot;,Roboto,&quot;Helvetica Neue&quot;,Arial,&quot;Noto Sans&quot;,sans-serif;&#10;  font-size:16px;line-height:1.55;color:var(--frc-text);background:var(--frc-bg);&#10;  max-width:1000px;margin:0 auto;padding:28px 16px 36px;text-align:left;border-radius:16px;&#10;  -webkit-text-size-adjust:100%;&#10;}&#10;.frc-root *,.frc-root *::before,.frc-root *::after{box-sizing:border-box}&#10;.frc-root [hidden]{display:none !important}&#10;.frc-root h2,.frc-root h3{font-family:inherit;color:var(--frc-heading);line-height:1.25;margin:0 0 .5em;padding:0;letter-spacing:normal;text-transform:none;font-weight:700;border:0;background:none}&#10;.frc-root h2{font-size:clamp(1.2rem,2.2vw,1.45rem)}&#10;.frc-root h3{font-size:1rem}&#10;.frc-root p{margin:0 0 .85em;padding:0}&#10;.frc-root ul{margin:0;padding-left:1.2em}&#10;.frc-root li{margin:0 0 .3em}&#10;&#10;\/* ---------- layout ---------- *\/&#10;.frc-root .frc-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:22px}&#10;.frc-root .frc-card{background:var(--frc-card);border:1px solid var(--frc-border);border-radius:var(--frc-radius);box-shadow:var(--frc-shadow);padding:22px}&#10;.frc-root .frc-card-title{margin-bottom:14px}&#10;.frc-root .frc-card-title h2{margin:0}&#10;&#10;\/* ---------- mode switch ---------- *\/&#10;.frc-root .frc-modes{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;background:#e9edf4;padding:4px;border-radius:10px;margin:0 0 6px;border:0;min-width:0}&#10;.frc-root .frc-modes legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}&#10;.frc-root .frc-mode{position:relative;display:block;margin:0;cursor:pointer}&#10;.frc-root .frc-mode input{position:absolute;opacity:0;width:1px;height:1px;margin:0}&#10;.frc-root .frc-mode span{display:block;text-align:center;padding:9px 6px;border-radius:8px;font-size:.88rem;font-weight:600;color:var(--frc-muted);line-height:1.2;transition:background .15s,color .15s}&#10;.frc-root .frc-mode span small{display:block;font-weight:500;font-size:.74rem;opacity:.9;margin-top:3px}&#10;.frc-root .frc-mode:hover span{color:var(--frc-blue)}&#10;.frc-root .frc-mode input:checked + span{background:#fff;color:var(--frc-blue);box-shadow:0 1px 3px rgba(16,24,40,.12)}&#10;.frc-root .frc-mode input:focus-visible + span{outline:2px solid var(--frc-blue-2);outline-offset:1px}&#10;.frc-root .frc-mode-hint{font-size:.88rem;color:var(--frc-muted);margin:8px 2px 16px}&#10;&#10;\/* ---------- fields ---------- *\/&#10;.frc-root .frc-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 14px}&#10;.frc-root .frc-field{margin:0 0 14px;min-width:0}&#10;.frc-root .frc-field &gt; label{display:block;font-size:.86rem;font-weight:600;color:var(--frc-text);margin:0 0 5px;line-height:1.3}&#10;.frc-root .frc-inline{display:flex;gap:8px;align-items:stretch}&#10;.frc-root .frc-inline .frc-input{flex:1 1 auto;min-width:0}&#10;.frc-root .frc-inline .frc-unit{flex:0 0 auto;width:auto;min-width:118px;max-width:48%}&#10;.frc-root .frc-input,.frc-root .frc-select{&#10;  display:block;width:100%;height:42px;margin:0;padding:8px 12px;font:inherit;font-size:15px;line-height:1.3;color:var(--frc-text);&#10;  background-color:var(--frc-field);border:1px solid var(--frc-border);border-radius:8px;box-shadow:none;outline:none;&#10;  transition:border-color .15s,box-shadow .15s;max-width:none;min-height:0;text-transform:none;letter-spacing:normal}&#10;.frc-root .frc-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:32px;cursor:pointer;&#10;  background-image:url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#x27;http:\/\/www.w3.org\/2000\/svg&#x27; width=&#x27;12&#x27; height=&#x27;8&#x27; viewBox=&#x27;0 0 12 8&#x27;%3E%3Cpath d=&#x27;M1 1.5l5 5 5-5&#x27; fill=&#x27;none&#x27; stroke=&#x27;%231e3a8a&#x27; stroke-width=&#x27;1.8&#x27; stroke-linecap=&#x27;round&#x27; stroke-linejoin=&#x27;round&#x27;\/%3E%3C\/svg%3E&quot;);&#10;  background-repeat:no-repeat;background-position:right 11px center;background-size:12px 8px}&#10;.frc-root .frc-input:hover,.frc-root .frc-select:hover{border-color:#b6c0ce}&#10;.frc-root .frc-input:focus,.frc-root .frc-select:focus{border-color:var(--frc-blue-2);box-shadow:0 0 0 3px rgba(29,78,216,.18);background-color:#fff}&#10;.frc-root .frc-input.frc-invalid{border-color:var(--frc-danger);background-color:var(--frc-danger-bg)}&#10;.frc-root .frc-input.frc-invalid:focus{box-shadow:0 0 0 3px rgba(180,35,24,.15)}&#10;.frc-root .frc-err{color:var(--frc-danger);font-size:.82rem;margin:5px 0 0;line-height:1.35}&#10;.frc-root .frc-help{color:var(--frc-muted);font-size:.8rem;margin:5px 0 0;line-height:1.35}&#10;.frc-root .frc-suffix{position:relative}&#10;.frc-root .frc-suffix .frc-input{padding-right:52px}&#10;.frc-root .frc-suffix-u{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:.82rem;color:var(--frc-muted);pointer-events:none}&#10;&#10;\/* ---------- Calculate button: centred, hardened against theme button rules ---------- *\/&#10;.frc-root .frc-calc-wrap{display:block !important;width:100% !important;text-align:center !important;margin:6px 0 0 !important;padding:0 !important;float:none !important;clear:both}&#10;.frc-root .frc-btn{display:inline-flex !important;align-items:center;justify-content:center;float:none !important;width:auto !important;min-width:180px;height:42px;padding:0 22px;margin:0 auto !important;&#10;  position:static !important;font:inherit;font-size:.95rem;font-weight:650;line-height:1;border-radius:8px;border:1px solid var(--frc-blue);background:var(--frc-blue);color:#fff;cursor:pointer;&#10;  text-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;transition:background .15s,border-color .15s}&#10;.frc-root .frc-btn:hover{background:#172f73;border-color:#172f73;color:#fff}&#10;.frc-root .frc-btn:focus-visible{outline:2px solid var(--frc-blue-2);outline-offset:2px}&#10;&#10;\/* ---------- results ---------- *\/&#10;.frc-root .frc-alert{border:1px solid #fecdca;background:var(--frc-danger-bg);color:var(--frc-danger);border-radius:10px;padding:12px 14px;margin:0;font-size:.9rem}&#10;.frc-root .frc-alert ul{margin:6px 0 0;padding-left:1.2em}&#10;.frc-root .frc-pcard{border-radius:12px;padding:18px 18px 16px;background:linear-gradient(135deg,#1e3a8a 0%,#1d4ed8 100%);color:#fff}&#10;.frc-root .frc-pcard-label{display:block;font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;opacity:.92;margin-bottom:6px}&#10;.frc-root .frc-pcard-value{font-size:clamp(1.8rem,4vw,2.4rem);font-weight:800;line-height:1.15;word-break:break-word;font-variant-numeric:tabular-nums}&#10;.frc-root .frc-pcard-unit{font-size:.5em;font-weight:700;opacity:.92;margin-left:6px}&#10;.frc-root .frc-pcard-sub{font-size:.88rem;opacity:.92;margin-top:8px;font-variant-numeric:tabular-nums}&#10;.frc-root .frc-eq-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;margin-top:14px}&#10;.frc-root .frc-eq{border:1px solid #e3e8f0;border-radius:8px;padding:8px 10px;background:#fafbfd;min-width:0}&#10;.frc-root .frc-eq-v{display:block;font-weight:700;font-size:.95rem;word-break:break-word;font-variant-numeric:tabular-nums;color:var(--frc-heading)}&#10;.frc-root .frc-eq-u{display:block;font-size:.78rem;color:var(--frc-muted)}&#10;.frc-root .frc-formula{background:#0f1f45;color:#e6edff;border-radius:10px;padding:14px 16px;margin-top:14px}&#10;.frc-root .frc-formula-label{display:block;font-size:.76rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#a9bbe6;margin-bottom:6px}&#10;.frc-root .frc-formula-main{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:1rem;font-weight:700;margin-bottom:4px;word-break:break-word}&#10;.frc-root .frc-formula-sub{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.88rem;color:#c3d0f2;word-break:break-word;margin:0}&#10;.frc-root .frc-formula ul{margin:10px 0 0;padding-left:1.1em;font-size:.84rem;color:#c3d0f2}&#10;.frc-root .frc-note{font-size:.84rem;color:var(--frc-muted);background:#f6f8fb;border-left:3px solid var(--frc-blue-line);padding:8px 11px;border-radius:0 8px 8px 0;margin:14px 0 0}&#10;&#10;\/* ---------- responsive ---------- *\/&#10;@media (max-width:560px){&#10;  .frc-root{padding:20px 12px 28px;border-radius:0}&#10;  .frc-root .frc-card{padding:16px}&#10;  .frc-root .frc-modes{grid-template-columns:repeat(2,minmax(0,1fr))}&#10;  .frc-root .frc-row{grid-template-columns:minmax(0,1fr)}&#10;  .frc-root .frc-inline .frc-unit{min-width:104px}&#10;}&#10;@media (prefers-reduced-motion:reduce){&#10;  .frc-root *{transition:none !important}&#10;}&#10;html,body{margin:0;padding:0;background:transparent}&#10;&lt;\/style&gt;&#10;&lt;\/head&gt;&#10;&lt;body&gt;&#10;&#10;&lt;div class=&quot;frc-root&quot; id=&quot;frc-app&quot;&gt;&#10;  &lt;div class=&quot;frc-stack&quot;&gt;&#10;&#10;    &lt;!-- ================= INPUT PANEL ================= --&gt;&#10;    &lt;section class=&quot;frc-card&quot; aria-labelledby=&quot;frc-inputs-title&quot;&gt;&#10;      &lt;div class=&quot;frc-card-title&quot;&gt;&lt;h2 id=&quot;frc-inputs-title&quot;&gt;Calculation Inputs&lt;\/h2&gt;&lt;\/div&gt;&#10;&#10;      &lt;form id=&quot;frc-form&quot; novalidate autocomplete=&quot;off&quot;&gt;&#10;        &lt;fieldset class=&quot;frc-modes&quot;&gt;&#10;          &lt;legend&gt;Calculation mode&lt;\/legend&gt;&#10;          &lt;label class=&quot;frc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;frc-mode&quot; value=&quot;A&quot; checked&gt;&lt;span&gt;Feed Rate from fz&lt;small&gt;Vf = fz \u00d7 z \u00d7 n&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;          &lt;label class=&quot;frc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;frc-mode&quot; value=&quot;B&quot;&gt;&lt;span&gt;Feed Rate from f&lt;small&gt;Vf = f \u00d7 n&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;          &lt;label class=&quot;frc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;frc-mode&quot; value=&quot;C&quot;&gt;&lt;span&gt;Feed per Tooth&lt;small&gt;fz = Vf \/ (n \u00d7 z)&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;          &lt;label class=&quot;frc-mode&quot;&gt;&lt;input type=&quot;radio&quot; name=&quot;frc-mode&quot; value=&quot;D&quot;&gt;&lt;span&gt;Spindle Speed&lt;small&gt;n = Vf \/ (fz \u00d7 z)&lt;\/small&gt;&lt;\/span&gt;&lt;\/label&gt;&#10;        &lt;\/fieldset&gt;&#10;        &lt;p class=&quot;frc-mode-hint&quot; id=&quot;frc-mode-hint&quot;&gt;&lt;\/p&gt;&#10;&#10;        &lt;div class=&quot;frc-row&quot;&gt;&#10;          &lt;!-- Feed rate input (C, D) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-vf&quot;&gt;&#10;            &lt;label for=&quot;frc-vf&quot;&gt;Feed Rate (Vf)&lt;\/label&gt;&#10;            &lt;div class=&quot;frc-inline&quot;&gt;&#10;              &lt;input id=&quot;frc-vf&quot; class=&quot;frc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;frc-vf-err&quot;&gt;&#10;              &lt;select id=&quot;frc-vf-unit&quot; class=&quot;frc-select frc-unit&quot; data-frc-units=&quot;rate&quot; aria-label=&quot;Feed rate unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;p class=&quot;frc-err&quot; id=&quot;frc-vf-err&quot; hidden&gt;&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Feed parameter selector (D) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-param&quot;&gt;&#10;            &lt;label for=&quot;frc-param&quot;&gt;Feed Parameter&lt;\/label&gt;&#10;            &lt;select id=&quot;frc-param&quot; class=&quot;frc-select&quot;&gt;&#10;              &lt;option value=&quot;tooth&quot;&gt;Feed per tooth (fz) \u2014 milling&lt;\/option&gt;&#10;              &lt;option value=&quot;rev&quot;&gt;Feed per revolution (f) \u2014 turning \/ drilling&lt;\/option&gt;&#10;            &lt;\/select&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Feed per tooth (A, D-tooth) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-fz&quot;&gt;&#10;            &lt;label for=&quot;frc-fz&quot;&gt;Feed per Tooth (fz)&lt;\/label&gt;&#10;            &lt;div class=&quot;frc-inline&quot;&gt;&#10;              &lt;input id=&quot;frc-fz&quot; class=&quot;frc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;frc-fz-err&quot;&gt;&#10;              &lt;select id=&quot;frc-fz-unit&quot; class=&quot;frc-select frc-unit&quot; data-frc-units=&quot;tooth&quot; aria-label=&quot;Feed per tooth unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;p class=&quot;frc-err&quot; id=&quot;frc-fz-err&quot; hidden&gt;&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Feed per revolution (B, D-rev) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-f&quot;&gt;&#10;            &lt;label for=&quot;frc-f&quot;&gt;Feed per Revolution (f)&lt;\/label&gt;&#10;            &lt;div class=&quot;frc-inline&quot;&gt;&#10;              &lt;input id=&quot;frc-f&quot; class=&quot;frc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;frc-f-err&quot;&gt;&#10;              &lt;select id=&quot;frc-f-unit&quot; class=&quot;frc-select frc-unit&quot; data-frc-units=&quot;rev&quot; aria-label=&quot;Feed per revolution unit&quot;&gt;&lt;\/select&gt;&#10;            &lt;\/div&gt;&#10;            &lt;p class=&quot;frc-err&quot; id=&quot;frc-f-err&quot; hidden&gt;&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Number of teeth (A, C, D-tooth) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-z&quot;&gt;&#10;            &lt;label for=&quot;frc-z&quot;&gt;Number of Teeth (z)&lt;\/label&gt;&#10;            &lt;input id=&quot;frc-z&quot; class=&quot;frc-input&quot; type=&quot;text&quot; inputmode=&quot;numeric&quot; aria-describedby=&quot;frc-z-err frc-z-help&quot;&gt;&#10;            &lt;p class=&quot;frc-err&quot; id=&quot;frc-z-err&quot; hidden&gt;&lt;\/p&gt;&#10;            &lt;p class=&quot;frc-help&quot; id=&quot;frc-z-help&quot;&gt;Effective cutting teeth (flutes) on the tool.&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Spindle speed (A, B, C) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-n&quot;&gt;&#10;            &lt;label for=&quot;frc-n&quot;&gt;Spindle Speed (n)&lt;\/label&gt;&#10;            &lt;div class=&quot;frc-suffix&quot;&gt;&#10;              &lt;input id=&quot;frc-n&quot; class=&quot;frc-input&quot; type=&quot;text&quot; inputmode=&quot;decimal&quot; aria-describedby=&quot;frc-n-err&quot;&gt;&#10;              &lt;span class=&quot;frc-suffix-u&quot; aria-hidden=&quot;true&quot;&gt;RPM&lt;\/span&gt;&#10;            &lt;\/div&gt;&#10;            &lt;p class=&quot;frc-err&quot; id=&quot;frc-n-err&quot; hidden&gt;&lt;\/p&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Output feed rate unit (A, B) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-outvf&quot;&gt;&#10;            &lt;label for=&quot;frc-out-vf&quot;&gt;Output Feed Rate Unit&lt;\/label&gt;&#10;            &lt;select id=&quot;frc-out-vf&quot; class=&quot;frc-select&quot; data-frc-units=&quot;rate&quot;&gt;&lt;\/select&gt;&#10;          &lt;\/div&gt;&#10;&#10;          &lt;!-- Output feed per tooth unit (C) --&gt;&#10;          &lt;div class=&quot;frc-field&quot; id=&quot;frc-w-outfz&quot;&gt;&#10;            &lt;label for=&quot;frc-out-fz&quot;&gt;Output Feed per Tooth Unit&lt;\/label&gt;&#10;            &lt;select id=&quot;frc-out-fz&quot; class=&quot;frc-select&quot; data-frc-units=&quot;tooth&quot;&gt;&lt;\/select&gt;&#10;          &lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;frc-calc-wrap&quot;&gt;&#10;          &lt;button type=&quot;submit&quot; class=&quot;frc-btn&quot; id=&quot;frc-btn-calc&quot;&gt;Calculate&lt;\/button&gt;&#10;        &lt;\/div&gt;&#10;      &lt;\/form&gt;&#10;    &lt;\/section&gt;&#10;&#10;    &lt;!-- ================= RESULTS PANEL ================= --&gt;&#10;    &lt;section class=&quot;frc-card&quot; aria-labelledby=&quot;frc-results-title&quot; id=&quot;frc-results&quot; tabindex=&quot;-1&quot; hidden&gt;&#10;      &lt;div class=&quot;frc-card-title&quot;&gt;&lt;h2 id=&quot;frc-results-title&quot;&gt;Results&lt;\/h2&gt;&lt;\/div&gt;&#10;&#10;      &lt;div class=&quot;frc-alert&quot; id=&quot;frc-error&quot; role=&quot;alert&quot; hidden&gt;&lt;\/div&gt;&#10;&#10;      &lt;div id=&quot;frc-result-body&quot; aria-live=&quot;polite&quot;&gt;&#10;        &lt;div class=&quot;frc-pcard&quot;&gt;&#10;          &lt;span class=&quot;frc-pcard-label&quot; id=&quot;frc-r-label&quot;&gt;&lt;\/span&gt;&#10;          &lt;div class=&quot;frc-pcard-value&quot;&gt;&lt;span id=&quot;frc-r-value&quot;&gt;&lt;\/span&gt;&lt;span class=&quot;frc-pcard-unit&quot; id=&quot;frc-r-unit&quot;&gt;&lt;\/span&gt;&lt;\/div&gt;&#10;          &lt;div class=&quot;frc-pcard-sub&quot; id=&quot;frc-r-sub&quot;&gt;&lt;\/div&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;frc-eq-grid&quot; id=&quot;frc-r-equiv&quot;&gt;&lt;\/div&gt;&#10;&#10;        &lt;div class=&quot;frc-formula&quot;&gt;&#10;          &lt;span class=&quot;frc-formula-label&quot;&gt;Formula used&lt;\/span&gt;&#10;          &lt;p class=&quot;frc-formula-main&quot; id=&quot;frc-r-formula&quot;&gt;&lt;\/p&gt;&#10;          &lt;p class=&quot;frc-formula-sub&quot; id=&quot;frc-r-values&quot;&gt;&lt;\/p&gt;&#10;          &lt;ul id=&quot;frc-r-steps&quot;&gt;&lt;\/ul&gt;&#10;        &lt;\/div&gt;&#10;&#10;        &lt;p class=&quot;frc-note&quot; id=&quot;frc-r-note&quot;&gt;&lt;\/p&gt;&#10;      &lt;\/div&gt;&#10;    &lt;\/section&gt;&#10;&#10;  &lt;\/div&gt;&#10;&lt;\/div&gt;&#10;&#10;&lt;script&gt;&#10;\/* =====================================================================&#10;   Feed Rate (f \/ Vf) Calculator \u2014 Vanilla JavaScript (no globals)&#10;   Internal units: feed rate in mm\/min, feed per tooth in mm\/tooth,&#10;   feed per revolution in mm\/rev, spindle speed in RPM.&#10;   ===================================================================== *\/&#10;(function () {&#10;  &#x27;use strict&#x27;;&#10;&#10;  var root = document.getElementById(&#x27;frc-app&#x27;);&#10;  if (!root || root.getAttribute(&#x27;data-frc-ready&#x27;) === &#x27;1&#x27;) return;&#10;  root.setAttribute(&#x27;data-frc-ready&#x27;, &#x27;1&#x27;);&#10;&#10;  function $(id) { return document.getElementById(id); }&#10;&#10;  \/* ---------- 1. Units (f = factor to internal mm-based unit) ---------- *\/&#10;  var IN = 25.4;&#10;  var UNITS = {&#10;    rate: [&#10;      { k: &#x27;mmmin&#x27;, sym: &#x27;mm\/min&#x27;, name: &#x27;mm\/min&#x27;, f: 1, sys: &#x27;metric&#x27; },&#10;      { k: &#x27;cmmin&#x27;, sym: &#x27;cm\/min&#x27;, name: &#x27;cm\/min&#x27;, f: 10, sys: &#x27;metric&#x27; },&#10;      { k: &#x27;mmin&#x27;, sym: &#x27;m\/min&#x27;, name: &#x27;m\/min&#x27;, f: 1000, sys: &#x27;metric&#x27; },&#10;      { k: &#x27;inmin&#x27;, sym: &#x27;in\/min&#x27;, name: &#x27;in\/min&#x27;, f: IN, sys: &#x27;imperial&#x27; },&#10;      { k: &#x27;ftmin&#x27;, sym: &#x27;ft\/min&#x27;, name: &#x27;ft\/min&#x27;, f: 304.8, sys: &#x27;imperial&#x27; }&#10;    ],&#10;    tooth: [&#10;      { k: &#x27;mm&#x27;, sym: &#x27;mm\/tooth&#x27;, name: &#x27;mm\/tooth&#x27;, f: 1, sys: &#x27;metric&#x27; },&#10;      { k: &#x27;in&#x27;, sym: &#x27;in\/tooth&#x27;, name: &#x27;in\/tooth&#x27;, f: IN, sys: &#x27;imperial&#x27; }&#10;    ],&#10;    rev: [&#10;      { k: &#x27;mm&#x27;, sym: &#x27;mm\/rev&#x27;, name: &#x27;mm\/rev&#x27;, f: 1, sys: &#x27;metric&#x27; },&#10;      { k: &#x27;in&#x27;, sym: &#x27;in\/rev&#x27;, name: &#x27;in\/rev&#x27;, f: IN, sys: &#x27;imperial&#x27; }&#10;    ]&#10;  };&#10;  function unit(type, k) {&#10;    var l = UNITS[type];&#10;    for (var i = 0; i &lt; l.length; i++) if (l[i].k === k) return l[i];&#10;    return l[0];&#10;  }&#10;&#10;  \/* ---------- 2. Defaults &amp; mode info ---------- *\/&#10;  var DEFAULTS = {&#10;    vf: &#x27;600&#x27;, vfUnit: &#x27;mmmin&#x27;, param: &#x27;tooth&#x27;,&#10;    fz: &#x27;0.05&#x27;, fzUnit: &#x27;mm&#x27;, f: &#x27;0.2&#x27;, fUnit: &#x27;mm&#x27;,&#10;    z: &#x27;4&#x27;, n: &#x27;3000&#x27;, outVf: &#x27;mmmin&#x27;, outFz: &#x27;mm&#x27;&#10;  };&#10;  var MODES = {&#10;    A: { show: [&#x27;fz&#x27;, &#x27;z&#x27;, &#x27;n&#x27;, &#x27;outvf&#x27;],&#10;         hint: &#x27;Milling: enter feed per tooth, number of teeth and spindle speed to calculate the linear feed rate. All specified teeth are treated as effective cutting teeth.&#x27; },&#10;    B: { show: [&#x27;f&#x27;, &#x27;n&#x27;, &#x27;outvf&#x27;],&#10;         hint: &#x27;Turning, drilling and other feed-per-revolution operations: enter feed per revolution and spindle speed to calculate the linear feed rate.&#x27; },&#10;    C: { show: [&#x27;vf&#x27;, &#x27;n&#x27;, &#x27;z&#x27;, &#x27;outfz&#x27;],&#10;         hint: &#x27;Enter the feed rate, spindle speed and number of teeth to calculate the feed per tooth (chip load).&#x27; },&#10;    D: { show: [&#x27;vf&#x27;, &#x27;param&#x27;],&#10;         hint: &#x27;Enter the feed rate and the feed parameter to calculate the spindle speed in RPM.&#x27; }&#10;  };&#10;  var ALL = [&#x27;vf&#x27;, &#x27;param&#x27;, &#x27;fz&#x27;, &#x27;f&#x27;, &#x27;z&#x27;, &#x27;n&#x27;, &#x27;outvf&#x27;, &#x27;outfz&#x27;];&#10;  var mode = &#x27;A&#x27;;&#10;&#10;  \/* ---------- 3. Parsing &amp; formatting ---------- *\/&#10;  \/** Accepts &quot;1,5&quot; (decimal comma), &quot;1,000.5&quot;, and scientific notation. *\/&#10;  function parseNum(raw) {&#10;    var s = String(raw == null ? &#x27;&#x27; : raw).trim().replace(\/\\s+\/g, &#x27;&#x27;);&#10;    if (s === &#x27;&#x27;) return { empty: true, ok: false };&#10;    if (\/^[+-]?\\d{1,3}(,\\d{3})+(\\.\\d+)?$\/.test(s)) s = s.replace(\/,\/g, &#x27;&#x27;);&#10;    else if (\/^[+-]?\\d*,\\d+$\/.test(s)) s = s.replace(&#x27;,&#x27;, &#x27;.&#x27;);&#10;    if (!\/^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$\/i.test(s)) return { empty: false, ok: false };&#10;    var n = Number(s);&#10;    if (!isFinite(n)) return { empty: false, ok: false };&#10;    return { empty: false, ok: true, n: n };&#10;  }&#10;&#10;  \/** Fixed-decimal display; falls back to significant figures when the value would round to 0. *\/&#10;  function fx(n, d) {&#10;    if (typeof n !== &#x27;number&#x27; || !isFinite(n)) return &#x27;\u2014&#x27;;&#10;    if (n !== 0 &amp;&amp; Math.abs(n) &lt; 0.5 * Math.pow(10, -d)) {&#10;      return Number(n.toPrecision(3)).toString();&#10;    }&#10;    return n.toLocaleString(&#x27;en-US&#x27;, { minimumFractionDigits: d, maximumFractionDigits: d });&#10;  }&#10;  \/** Compact display of an input value (no forced decimals). *\/&#10;  function g(n) {&#10;    if (typeof n !== &#x27;number&#x27; || !isFinite(n)) return &#x27;\u2014&#x27;;&#10;    return Number(n.toPrecision(8)).toLocaleString(&#x27;en-US&#x27;, { maximumFractionDigits: 10 });&#10;  }&#10;  function esc(s) {&#10;    return String(s).replace(\/[&amp;&lt;&gt;&quot;&#x27;]\/g, function (c) {&#10;      return { &#x27;&amp;&#x27;: &#x27;&amp;amp;&#x27;, &#x27;&lt;&#x27;: &#x27;&amp;lt;&#x27;, &#x27;&gt;&#x27;: &#x27;&amp;gt;&#x27;, &#x27;&quot;&#x27;: &#x27;&amp;quot;&#x27;, &quot;&#x27;&quot;: &#x27;&amp;#39;&#x27; }[c];&#10;    });&#10;  }&#10;&#10;  \/* ---------- 4. Build selects ---------- *\/&#10;  Array.prototype.forEach.call(root.querySelectorAll(&#x27;select[data-frc-units]&#x27;), function (sel) {&#10;    sel.innerHTML = UNITS[sel.getAttribute(&#x27;data-frc-units&#x27;)].map(function (u) {&#10;      return &#x27;&lt;option value=&quot;&#x27; + u.k + &#x27;&quot;&gt;&#x27; + esc(u.name) + &#x27;&lt;\/option&gt;&#x27;;&#10;    }).join(&#x27;&#x27;);&#10;  });&#10;&#10;  \/* ---------- 5. Validation ---------- *\/&#10;  var FIELD_LABEL = { vf: &#x27;Feed rate (Vf)&#x27;, fz: &#x27;Feed per tooth (fz)&#x27;, f: &#x27;Feed per revolution (f)&#x27;, z: &#x27;Number of teeth (z)&#x27;, n: &#x27;Spindle speed (n)&#x27; };&#10;&#10;  function setErr(key, msg) {&#10;    var el = $(&#x27;frc-&#x27; + key), er = $(&#x27;frc-&#x27; + key + &#x27;-err&#x27;);&#10;    if (msg) {&#10;      el.classList.add(&#x27;frc-invalid&#x27;); el.setAttribute(&#x27;aria-invalid&#x27;, &#x27;true&#x27;);&#10;      er.textContent = msg; er.hidden = false;&#10;    } else {&#10;      el.classList.remove(&#x27;frc-invalid&#x27;); el.removeAttribute(&#x27;aria-invalid&#x27;);&#10;      er.textContent = &#x27;&#x27;; er.hidden = true;&#10;    }&#10;  }&#10;  function clearAllErrors() { [&#x27;vf&#x27;, &#x27;fz&#x27;, &#x27;f&#x27;, &#x27;z&#x27;, &#x27;n&#x27;].forEach(function (k) { setErr(k, null); }); }&#10;&#10;  \/** Returns an error message for a field, or null when valid. *\/&#10;  function check(key) {&#10;    var label = FIELD_LABEL[key];&#10;    var p = parseNum($(&#x27;frc-&#x27; + key).value);&#10;    if (p.empty) return label + &#x27; is required.&#x27;;&#10;    if (!p.ok) return label + &#x27; must be a valid number.&#x27;;&#10;    if (p.n &lt; 0) return label + &#x27; cannot be negative.&#x27;;&#10;    if (p.n === 0) return label + &#x27; must be greater than zero.&#x27;;&#10;    if (key === &#x27;z&#x27;) {&#10;      if (Math.floor(p.n) !== p.n) return &#x27;Number of teeth must be a whole number (e.g. 2, 3, 4).&#x27;;&#10;      if (p.n &gt; 1000) return &#x27;Number of teeth must be 1,000 or less.&#x27;;&#10;    }&#10;    return null;&#10;  }&#10;  function read(key, errs) {&#10;    var msg = check(key);&#10;    setErr(key, msg);&#10;    if (msg) { errs.push(msg); return null; }&#10;    return parseNum($(&#x27;frc-&#x27; + key).value).n;&#10;  }&#10;&#10;  \/** Which numeric fields the active mode requires. *\/&#10;  function requiredKeys() {&#10;    if (mode === &#x27;A&#x27;) return [&#x27;fz&#x27;, &#x27;z&#x27;, &#x27;n&#x27;];&#10;    if (mode === &#x27;B&#x27;) return [&#x27;f&#x27;, &#x27;n&#x27;];&#10;    if (mode === &#x27;C&#x27;) return [&#x27;vf&#x27;, &#x27;n&#x27;, &#x27;z&#x27;];&#10;    return $(&#x27;frc-param&#x27;).value === &#x27;tooth&#x27; ? [&#x27;vf&#x27;, &#x27;fz&#x27;, &#x27;z&#x27;] : [&#x27;vf&#x27;, &#x27;f&#x27;];&#10;  }&#10;&#10;  \/* ---------- 6. Calculation ---------- *\/&#10;  function otherRateUnit(u) { return u.sys === &#x27;metric&#x27; ? unit(&#x27;rate&#x27;, &#x27;inmin&#x27;) : unit(&#x27;rate&#x27;, &#x27;mmmin&#x27;); }&#10;&#10;  function compute() {&#10;    var errs = [], v = {};&#10;    clearAllErrors();&#10;    requiredKeys().forEach(function (k) { v[k] = read(k, errs); });&#10;    if (errs.length) { showErrors(errs); return false; }&#10;&#10;    var R = { equiv: [], steps: [], note: &#x27;&#x27; };&#10;    var vfU, fzU, fU, outU, vfMM, fzMM, fMM, res;&#10;&#10;    if (mode === &#x27;A&#x27;) {&#10;      fzU = unit(&#x27;tooth&#x27;, $(&#x27;frc-fz-unit&#x27;).value);&#10;      outU = unit(&#x27;rate&#x27;, $(&#x27;frc-out-vf&#x27;).value);&#10;      var vfNative = v.fz * v.z * v.n;                       \/\/ mm\/min or in\/min&#10;      vfMM = vfNative * fzU.f;                               \/\/ internal mm\/min&#10;      res = vfMM \/ outU.f;&#10;      var nativeSym = fzU.k === &#x27;mm&#x27; ? &#x27;mm\/min&#x27; : &#x27;in\/min&#x27;;&#10;      R.label = &#x27;Calculated Feed Rate (Vf)&#x27;;&#10;      R.value = fx(res, 2); R.unit = outU.sym;&#10;      R.formula = &#x27;Vf = fz \u00d7 z \u00d7 n&#x27;;&#10;      R.values = &#x27;Vf = &#x27; + g(v.fz) + &#x27; &#x27; + fzU.sym + &#x27; \u00d7 &#x27; + g(v.z) + &#x27; \u00d7 &#x27; + g(v.n) + &#x27; RPM = &#x27; + fx(vfNative, 2) + &#x27; &#x27; + nativeSym;&#10;      if (nativeSym !== outU.sym) R.steps.push(&#x27;Converted to output unit: &#x27; + fx(vfNative, 2) + &#x27; &#x27; + nativeSym + &#x27; = &#x27; + fx(res, 2) + &#x27; &#x27; + outU.sym);&#10;      R.rateMM = vfMM; R.rateUnit = outU;&#10;      R.note = &#x27;This formula assumes every specified tooth is an effective cutting tooth. Radial engagement, chip thinning, tool runout and machine rigidity may require adjustments to the actual feed.&#x27;;&#10;    } else if (mode === &#x27;B&#x27;) {&#10;      fU = unit(&#x27;rev&#x27;, $(&#x27;frc-f-unit&#x27;).value);&#10;      outU = unit(&#x27;rate&#x27;, $(&#x27;frc-out-vf&#x27;).value);&#10;      var vfNat = v.f * v.n;&#10;      vfMM = vfNat * fU.f;&#10;      res = vfMM \/ outU.f;&#10;      var natSym = fU.k === &#x27;mm&#x27; ? &#x27;mm\/min&#x27; : &#x27;in\/min&#x27;;&#10;      R.label = &#x27;Calculated Feed Rate (Vf)&#x27;;&#10;      R.value = fx(res, 2); R.unit = outU.sym;&#10;      R.formula = &#x27;Vf = f \u00d7 n&#x27;;&#10;      R.values = &#x27;Vf = &#x27; + g(v.f) + &#x27; &#x27; + fU.sym + &#x27; \u00d7 &#x27; + g(v.n) + &#x27; RPM = &#x27; + fx(vfNat, 2) + &#x27; &#x27; + natSym;&#10;      if (natSym !== outU.sym) R.steps.push(&#x27;Converted to output unit: &#x27; + fx(vfNat, 2) + &#x27; &#x27; + natSym + &#x27; = &#x27; + fx(res, 2) + &#x27; &#x27; + outU.sym);&#10;      R.rateMM = vfMM; R.rateUnit = outU;&#10;      R.note = &#x27;Feed per revolution is the distance the tool (or workpiece) advances in one spindle revolution, regardless of how many cutting edges the tool has.&#x27;;&#10;    } else if (mode === &#x27;C&#x27;) {&#10;      vfU = unit(&#x27;rate&#x27;, $(&#x27;frc-vf-unit&#x27;).value);&#10;      outU = unit(&#x27;tooth&#x27;, $(&#x27;frc-out-fz&#x27;).value);&#10;      vfMM = v.vf * vfU.f;&#10;      fzMM = vfMM \/ (v.n * v.z);&#10;      res = fzMM \/ outU.f;&#10;      \/\/ Work in the output system so the shown substitution is consistent&#10;      var vfInOut = vfMM \/ (outU.k === &#x27;mm&#x27; ? 1 : IN);&#10;      var vfOutSym = outU.k === &#x27;mm&#x27; ? &#x27;mm\/min&#x27; : &#x27;in\/min&#x27;;&#10;      R.label = &#x27;Calculated Feed per Tooth (fz)&#x27;;&#10;      R.value = fx(res, 4); R.unit = outU.sym;&#10;      R.formula = &#x27;fz = Vf \/ (n \u00d7 z)&#x27;;&#10;      if (vfU.sym !== vfOutSym) R.steps.push(&#x27;Feed rate converted: &#x27; + g(v.vf) + &#x27; &#x27; + vfU.sym + &#x27; = &#x27; + fx(vfInOut, 2) + &#x27; &#x27; + vfOutSym);&#10;      R.values = &#x27;fz = &#x27; + fx(vfInOut, 2) + &#x27; &#x27; + vfOutSym + &#x27; \/ (&#x27; + g(v.n) + &#x27; RPM \u00d7 &#x27; + g(v.z) + &#x27;) = &#x27; + fx(res, 4) + &#x27; &#x27; + outU.sym;&#10;      var other = outU.k === &#x27;mm&#x27; ? unit(&#x27;tooth&#x27;, &#x27;in&#x27;) : unit(&#x27;tooth&#x27;, &#x27;mm&#x27;);&#10;      R.sub = &#x27;\u2248 &#x27; + fx(fzMM \/ other.f, 4) + &#x27; &#x27; + other.sym;&#10;      R.note = &#x27;Feed per tooth (chip load) is the thickness of material each cutting edge removes per revolution. Compare the result with the tool manufacturer\u2019s recommended chip load.&#x27;;&#10;    } else {&#10;      vfU = unit(&#x27;rate&#x27;, $(&#x27;frc-vf-unit&#x27;).value);&#10;      vfMM = v.vf * vfU.f;&#10;      var rpm;&#10;      if ($(&#x27;frc-param&#x27;).value === &#x27;tooth&#x27;) {&#10;        fzU = unit(&#x27;tooth&#x27;, $(&#x27;frc-fz-unit&#x27;).value);&#10;        fzMM = v.fz * fzU.f;&#10;        rpm = vfMM \/ (fzMM * v.z);&#10;        var sysSymT = fzU.k === &#x27;mm&#x27; ? &#x27;mm\/min&#x27; : &#x27;in\/min&#x27;;&#10;        var vfSysT = vfMM \/ (fzU.k === &#x27;mm&#x27; ? 1 : IN);&#10;        R.formula = &#x27;n = Vf \/ (fz \u00d7 z)&#x27;;&#10;        if (vfU.sym !== sysSymT) R.steps.push(&#x27;Feed rate converted to match fz units: &#x27; + g(v.vf) + &#x27; &#x27; + vfU.sym + &#x27; = &#x27; + fx(vfSysT, 2) + &#x27; &#x27; + sysSymT);&#10;        R.values = &#x27;n = &#x27; + fx(vfSysT, 2) + &#x27; &#x27; + sysSymT + &#x27; \/ (&#x27; + g(v.fz) + &#x27; &#x27; + fzU.sym + &#x27; \u00d7 &#x27; + g(v.z) + &#x27;) = &#x27; + fx(rpm, 2) + &#x27; RPM&#x27;;&#10;        R.note = &#x27;Milling formula using feed per tooth. Check that the calculated speed also gives an appropriate cutting speed (Vc) for the tool and workpiece material.&#x27;;&#10;      } else {&#10;        fU = unit(&#x27;rev&#x27;, $(&#x27;frc-f-unit&#x27;).value);&#10;        fMM = v.f * fU.f;&#10;        rpm = vfMM \/ fMM;&#10;        var sysSymR = fU.k === &#x27;mm&#x27; ? &#x27;mm\/min&#x27; : &#x27;in\/min&#x27;;&#10;        var vfSysR = vfMM \/ (fU.k === &#x27;mm&#x27; ? 1 : IN);&#10;        R.formula = &#x27;n = Vf \/ f&#x27;;&#10;        if (vfU.sym !== sysSymR) R.steps.push(&#x27;Feed rate converted to match f units: &#x27; + g(v.vf) + &#x27; &#x27; + vfU.sym + &#x27; = &#x27; + fx(vfSysR, 2) + &#x27; &#x27; + sysSymR);&#10;        R.values = &#x27;n = &#x27; + fx(vfSysR, 2) + &#x27; &#x27; + sysSymR + &#x27; \/ &#x27; + g(v.f) + &#x27; &#x27; + fU.sym + &#x27; = &#x27; + fx(rpm, 2) + &#x27; RPM&#x27;;&#10;        R.note = &#x27;Turning \/ drilling formula using feed per revolution. Check that the calculated speed also gives an appropriate cutting speed (Vc) for the tool and workpiece material.&#x27;;&#10;      }&#10;      res = rpm;&#10;      R.label = &#x27;Calculated Spindle Speed (n)&#x27;;&#10;      R.value = isFinite(rpm) ? Math.round(rpm).toLocaleString(&#x27;en-US&#x27;) : &#x27;\u2014&#x27;;&#10;      R.unit = &#x27;RPM&#x27;;&#10;      R.sub = &#x27;Rounded to the nearest whole RPM (unrounded: &#x27; + fx(rpm, 2) + &#x27;)&#x27;;&#10;      if (isFinite(rpm) &amp;&amp; Math.round(rpm) === 0) R.sub = &#x27;Calculated speed is below 1 RPM (&#x27; + g(rpm) + &#x27; RPM) \u2014 check your inputs.&#x27;;&#10;    }&#10;&#10;    if (!isFinite(res)) {&#10;      showErrors([&#x27;The result is outside the numeric range that can be represented. Check the magnitude of your inputs.&#x27;]);&#10;      return false;&#10;    }&#10;&#10;    \/\/ Feed-rate modes: equivalent in the other unit system + all units&#10;    if (R.rateUnit) {&#10;      var o = otherRateUnit(R.rateUnit);&#10;      R.sub = &#x27;\u2248 &#x27; + fx(R.rateMM \/ o.f, 2) + &#x27; &#x27; + o.sym;&#10;      R.equiv = UNITS.rate.map(function (u) { return { v: fx(R.rateMM \/ u.f, 2), u: u.sym }; });&#10;    }&#10;&#10;    render(R);&#10;    return true;&#10;  }&#10;&#10;  \/* ---------- 7. Rendering ---------- *\/&#10;  function showErrors(errs) {&#10;    var box = $(&#x27;frc-error&#x27;);&#10;    box.innerHTML = &#x27;&lt;strong&gt;Please correct the following input&#x27; + (errs.length &gt; 1 ? &#x27;s&#x27; : &#x27;&#x27;) + &#x27;:&lt;\/strong&gt;&lt;ul&gt;&#x27; +&#10;      errs.map(function (e) { return &#x27;&lt;li&gt;&#x27; + esc(e) + &#x27;&lt;\/li&gt;&#x27;; }).join(&#x27;&#x27;) + &#x27;&lt;\/ul&gt;&#x27;;&#10;    box.hidden = false;&#10;    $(&#x27;frc-result-body&#x27;).hidden = true;&#10;  }&#10;  function render(R) {&#10;    $(&#x27;frc-error&#x27;).hidden = true;&#10;    $(&#x27;frc-result-body&#x27;).hidden = false;&#10;    $(&#x27;frc-r-label&#x27;).textContent = R.label;&#10;    $(&#x27;frc-r-value&#x27;).textContent = R.value;&#10;    $(&#x27;frc-r-unit&#x27;).textContent = R.unit;&#10;    $(&#x27;frc-r-sub&#x27;).textContent = R.sub || &#x27;&#x27;;&#10;    $(&#x27;frc-r-sub&#x27;).hidden = !R.sub;&#10;    var eq = $(&#x27;frc-r-equiv&#x27;);&#10;    eq.hidden = !R.equiv.length;&#10;    eq.innerHTML = R.equiv.map(function (e) {&#10;      return &#x27;&lt;div class=&quot;frc-eq&quot;&gt;&lt;span class=&quot;frc-eq-v&quot;&gt;&#x27; + esc(e.v) + &#x27;&lt;\/span&gt;&lt;span class=&quot;frc-eq-u&quot;&gt;&#x27; + esc(e.u) + &#x27;&lt;\/span&gt;&lt;\/div&gt;&#x27;;&#10;    }).join(&#x27;&#x27;);&#10;    $(&#x27;frc-r-formula&#x27;).textContent = R.formula;&#10;    $(&#x27;frc-r-values&#x27;).textContent = R.values;&#10;    var st = $(&#x27;frc-r-steps&#x27;);&#10;    st.hidden = !R.steps.length;&#10;    st.innerHTML = R.steps.map(function (s) { return &#x27;&lt;li&gt;&#x27; + esc(s) + &#x27;&lt;\/li&gt;&#x27;; }).join(&#x27;&#x27;);&#10;    $(&#x27;frc-r-note&#x27;).textContent = R.note;&#10;  }&#10;&#10;  \/* ---------- 8. Mode handling ---------- *\/&#10;  function applyMode(m) {&#10;    mode = m;&#10;    Array.prototype.forEach.call(root.querySelectorAll(&#x27;input[name=&quot;frc-mode&quot;]&#x27;), function (r) { r.checked = r.value === m; });&#10;    var show = MODES[m].show.slice();&#10;    if (m === &#x27;D&#x27;) show = show.concat($(&#x27;frc-param&#x27;).value === &#x27;tooth&#x27; ? [&#x27;fz&#x27;, &#x27;z&#x27;] : [&#x27;f&#x27;]);&#10;    ALL.forEach(function (k) { $(&#x27;frc-w-&#x27; + k).hidden = show.indexOf(k) &lt; 0; });&#10;    $(&#x27;frc-mode-hint&#x27;).textContent = MODES[m].hint;&#10;    clearAllErrors();&#10;    \/\/ Hide stale results from another mode until Calculate is clicked again&#10;    $(&#x27;frc-results&#x27;).hidden = true;&#10;  }&#10;&#10;  function resetDefaults() {&#10;    $(&#x27;frc-vf&#x27;).value = DEFAULTS.vf; $(&#x27;frc-vf-unit&#x27;).value = DEFAULTS.vfUnit;&#10;    $(&#x27;frc-param&#x27;).value = DEFAULTS.param;&#10;    $(&#x27;frc-fz&#x27;).value = DEFAULTS.fz; $(&#x27;frc-fz-unit&#x27;).value = DEFAULTS.fzUnit;&#10;    $(&#x27;frc-f&#x27;).value = DEFAULTS.f; $(&#x27;frc-f-unit&#x27;).value = DEFAULTS.fUnit;&#10;    $(&#x27;frc-z&#x27;).value = DEFAULTS.z; $(&#x27;frc-n&#x27;).value = DEFAULTS.n;&#10;    $(&#x27;frc-out-vf&#x27;).value = DEFAULTS.outVf; $(&#x27;frc-out-fz&#x27;).value = DEFAULTS.outFz;&#10;  }&#10;&#10;  \/* ---------- 9. Events ---------- *\/&#10;  root.addEventListener(&#x27;change&#x27;, function (e) {&#10;    var t = e.target;&#10;    if (t.name === &#x27;frc-mode&#x27;) { applyMode(t.value); return; }&#10;    if (t.id === &#x27;frc-param&#x27;) { applyMode(&#x27;D&#x27;); return; }&#10;    if (!$(&#x27;frc-results&#x27;).hidden &amp;&amp; t.tagName === &#x27;SELECT&#x27;) compute();&#10;  });&#10;&#10;  root.addEventListener(&#x27;input&#x27;, function (e) {&#10;    var t = e.target;&#10;    if (!t.classList || !t.classList.contains(&#x27;frc-input&#x27;)) return;&#10;    var key = t.id.replace(&#x27;frc-&#x27;, &#x27;&#x27;);&#10;    \/\/ Clear the inline error as soon as the field becomes valid&#10;    if (t.classList.contains(&#x27;frc-invalid&#x27;) &amp;&amp; !check(key)) setErr(key, null);&#10;    \/\/ After the first calculation, keep results in sync while inputs remain valid&#10;    if (!$(&#x27;frc-results&#x27;).hidden) {&#10;      var allOk = requiredKeys().every(function (k) { return !check(k); });&#10;      if (allOk) compute();&#10;    }&#10;  });&#10;&#10;  $(&#x27;frc-form&#x27;).addEventListener(&#x27;submit&#x27;, function (e) {&#10;    e.preventDefault();&#10;    var res = $(&#x27;frc-results&#x27;), first = res.hidden;&#10;    res.hidden = false;&#10;    var ok = compute();&#10;    if (!ok) {&#10;      var bad = root.querySelector(&#x27;.frc-invalid&#x27;);&#10;      if (bad) bad.focus();&#10;    } else if (first &amp;&amp; res.scrollIntoView) {&#10;      res.scrollIntoView({ behavior: &#x27;smooth&#x27;, block: &#x27;nearest&#x27; });&#10;    }&#10;  });&#10;&#10;  \/* ---------- 10. Init ---------- *\/&#10;  resetDefaults();&#10;  applyMode(&#x27;A&#x27;);&#10;})();&#10;&lt;\/script&gt;&#10;&lt;script&gt;&#10;(function () {&#10;  var f = null;&#10;  try { f = window.frameElement; } catch (e) { f = null; }&#10;  if (!f) return;&#10;  var root = document.getElementById(&#x27;frc-app&#x27;);&#10;  function fit() {&#10;    var h = Math.ceil((root || document.body).getBoundingClientRect().height);&#10;    if (h &gt; 0) f.style.setProperty(&#x27;height&#x27;, h + &#x27;px&#x27;, &#x27;important&#x27;);&#10;  }&#10;  fit();&#10;  if (window.ResizeObserver) new ResizeObserver(fit).observe(root || document.body);&#10;  window.addEventListener(&#x27;load&#x27;, fit);&#10;  window.addEventListener(&#x27;resize&#x27;, fit);&#10;  setTimeout(fit, 300);&#10;})();&#10;&lt;\/script&gt;&#10;&lt;\/body&gt;&#10;&lt;\/html&gt;&#10;\"><\/iframe>\n","protected":false},"excerpt":{"rendered":"<p>The Feed Rate (f \/ Vf) Calculator helps CNC operators, machinists, and manufacturing engineers calculate feed rate, feed per tooth, feed per revolution, and spindle&#8230;<\/p>","protected":false},"author":2,"featured_media":25012,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8808],"tags":[3800,8811,8467,8809],"class_list":["post-25011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-manufacturing-and-processes","tag-cnc-machining","tag-feed-per-tooth","tag-feed-rate","tag-spindle-speed","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/10\/Feed-Rate-f-Vf-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/25011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/comments?post=25011"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/25011\/revisions"}],"predecessor-version":[{"id":25013,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/25011\/revisions\/25013"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media\/25012"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media?parent=25011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/categories?post=25011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/tags?post=25011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}