{"id":24629,"date":"2026-08-14T01:36:26","date_gmt":"2026-08-14T01:36:26","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24629"},"modified":"2026-08-14T02:01:40","modified_gmt":"2026-08-14T02:01:40","slug":"bearing-internal-clearance-selection-calculation-tool","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/pt\/bearing-internal-clearance-selection-calculation-tool\/","title":{"rendered":"Bearing Internal Clearance Selection &amp; Calculation Tool"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Bearing Internal Clearance Selection &amp; Calculation Tool<\/strong> is a practical engineering solution designed to help users select and calculate the appropriate internal clearance for rolling bearings under different operating conditions. By considering key parameters such as bearing type, initial clearance, shaft and housing fits, operating temperature, thermal expansion, and applied loads, users can evaluate the effective clearance after installation and during operation. The <strong>Bearing Internal Clearance Selection &amp; Calculation Tool<\/strong> helps engineers and designers prevent excessive preload or clearance, reduce friction and vibration, improve rotational accuracy, and extend bearing service life. It is suitable for motors, gearboxes, machine tool spindles, pumps, industrial machinery, and other rotating equipment. This tool provides a convenient way to support bearing clearance selection and improve the reliability and performance of mechanical systems.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>Bearing Internal Clearance Selection &#038; Calculation Tool<\/title>\n  <!-- WordPress-safe: NO Tailwind CDN. All CSS scoped to #bearing-clearance-calc only. -->\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.1\/dist\/chart.umd.min.js\"><\/script>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\n  <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Mono:wght@400;500;600&#038;family=IBM+Plex+Sans:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\" \/>\n  <style id=\"bearing-clearance-calc-styles\">\n\/* Bearing Clearance Calculator \u2014 ALL rules scoped under #bearing-clearance-calc only.\n   No Tailwind CDN. Does not alter WordPress theme styles outside this root. *\/\n#bearing-clearance-calc { \n  --bcc-text: #1e293b;\n  font-family: 'IBM Plex Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n  color: var(--bcc-text);\n  line-height: 1.5;\n  box-sizing: border-box;\n  isolation: isolate;\n  -webkit-text-size-adjust: 100%;\n  text-size-adjust: 100%;\n }\n#bearing-clearance-calc, #bearing-clearance-calc *, #bearing-clearance-calc *::before, #bearing-clearance-calc *::after { box-sizing: border-box; }\n#bearing-clearance-calc img, #bearing-clearance-calc svg, #bearing-clearance-calc video, #bearing-clearance-calc canvas { display: block; max-width: 100%; }\n#bearing-clearance-calc button, #bearing-clearance-calc input, #bearing-clearance-calc select, #bearing-clearance-calc textarea { font: inherit; color: inherit; margin: 0; }\n#bearing-clearance-calc button { cursor: pointer; background: transparent; border: none; padding: 0; }\n#bearing-clearance-calc table { border-collapse: collapse; border-spacing: 0; }\n#bearing-clearance-calc a { color: inherit; }\n#bearing-clearance-calc h1, #bearing-clearance-calc h2, #bearing-clearance-calc h3, #bearing-clearance-calc h4, #bearing-clearance-calc h5, #bearing-clearance-calc h6, #bearing-clearance-calc p { margin: 0; }\n#bearing-clearance-calc ul { margin: 0; padding: 0; }\n#bearing-clearance-calc sub, #bearing-clearance-calc sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n#bearing-clearance-calc sub { bottom: -0.25em; }\n#bearing-clearance-calc sup { top: -0.5em; }\n#bearing-clearance-calc .mono { font-family: 'IBM Plex Mono', ui-monospace, Menlo, Consolas, monospace; }\n#bearing-clearance-calc input[type=\"number\"]::-webkit-inner-spin-button { opacity: 0.45; }\n#bearing-clearance-calc .step-badge { background: linear-gradient(135deg, #0f172a 0%, #334155 100%); }\n#bearing-clearance-calc .metric-tile { background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); border: 1px solid #e2e8f0; }\n#bearing-clearance-calc .banner-ok { background: linear-gradient(90deg, #14532d, #166534); }\n#bearing-clearance-calc .banner-warn { background: linear-gradient(90deg, #854d0e, #a16207); }\n#bearing-clearance-calc .banner-risk { background: linear-gradient(90deg, #7f1d1d, #991b1b); }\n#bearing-clearance-calc .chart-wrap { position: relative; height: 220px; }\n#bearing-clearance-calc .sens-wrap { position: relative; height: 260px; }\n#bearing-clearance-calc .grid-bg { background-color: #f1f5f9; background-image:\n  linear-gradient(rgba(148, 163, 184, 0.12) 1px, transparent 1px),\n  linear-gradient(90deg, rgba(148, 163, 184, 0.12) 1px, transparent 1px);\n  background-size: 24px 24px; }\n#bearing-clearance-calc label .hint, #bearing-clearance-calc .hint { font-size: 0.75rem; line-height: 1rem; color: #64748b; font-weight: 400; }\n\n#bearing-clearance-calc .bcc-units-bar { display: flex !important; align-items: center !important; gap: 0.625rem !important; flex-shrink: 0 !important; }\n#bearing-clearance-calc .bcc-units-label { font-size: 10px !important; line-height: 1 !important; letter-spacing: 0.12em !important; text-transform: uppercase !important; font-weight: 600 !important; color: #7E8B9E !important; margin: 0 !important; padding: 0 !important; background: none !important; border: none !important; }\n#bearing-clearance-calc .bcc-unit-switch { display: inline-flex !important; align-items: center !important; gap: 2px !important; padding: 3px !important; border-radius: 8px !important; background: #0f172a !important; border: 1px solid #1e293b !important; box-shadow: none !important; }\n#bearing-clearance-calc .bcc-unit-switch .unit-btn { appearance: none !important; -webkit-appearance: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; margin: 0 !important; padding: 0.4rem 0.85rem !important; border: none !important; border-radius: 6px !important; background: transparent !important; color: #cbd5e1 !important; font-size: 0.875rem !important; font-weight: 500 !important; line-height: 1.25 !important; font-family: inherit !important; cursor: pointer !important; box-shadow: none !important; text-decoration: none !important; transition: background-color 0.15s ease, color 0.15s ease !important; }\n#bearing-clearance-calc .bcc-unit-switch .unit-btn:hover { color: #ffffff !important; background: transparent !important; }\n#bearing-clearance-calc .bcc-unit-switch .unit-btn.is-active { background: #0ea5e9 !important; color: #ffffff !important; font-weight: 600 !important; }\n#bearing-clearance-calc .bcc-unit-switch .unit-btn.is-active:hover { background: #0ea5e9 !important; color: #ffffff !important; }\n#bearing-clearance-calc #btnReset.bcc-reset-btn { appearance: none !important; -webkit-appearance: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; margin: 0 !important; padding: 0.4rem 0.85rem !important; border-radius: 6px !important; border: 1px solid #d1d5db !important; background: #ffffff !important; color: #0f172a !important; font-size: 0.875rem !important; font-weight: 500 !important; line-height: 1.25 !important; font-family: inherit !important; cursor: pointer !important; box-shadow: none !important; text-decoration: none !important; }\n#bearing-clearance-calc #btnReset.bcc-reset-btn:hover { background: #f8fafc !important; border-color: #94a3b8 !important; color: #0f172a !important; }\n#bearing-clearance-calc #btnCalculate.bcc-calc-btn { appearance: none !important; -webkit-appearance: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; min-width: 220px !important; width: auto !important; max-width: 100% !important; margin: 0 !important; padding: 0.85rem 2.75rem !important; border: none !important; border-radius: 10px !important; background: #0077c2 !important; color: #ffffff !important; font-size: 1rem !important; font-weight: 700 !important; line-height: 1.25 !important; font-family: inherit !important; letter-spacing: 0.01em !important; cursor: pointer !important; box-shadow: none !important; text-decoration: none !important; text-transform: none !important; transition: background-color 0.15s ease !important; }\n#bearing-clearance-calc #btnCalculate.bcc-calc-btn:hover { background: #0066a8 !important; color: #ffffff !important; }\n#bearing-clearance-calc #btnCalculate.bcc-calc-btn:active { background: #005a94 !important; color: #ffffff !important; }\n#bearing-clearance-calc .class-btn { appearance: none !important; -webkit-appearance: none !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; padding: 0.5rem 0.25rem !important; margin: 0 !important; font-size: 0.75rem !important; font-weight: 600 !important; font-family: inherit !important; border-radius: 0.5rem !important; border: 1px solid #cbd5e1 !important; background: #ffffff !important; color: #334155 !important; cursor: pointer !important; box-shadow: none !important; text-decoration: none !important; transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease !important; }\n#bearing-clearance-calc .class-btn:hover { border-color: #38bdf8 !important; }\n#bearing-clearance-calc .class-btn.is-active { background: #0284c7 !important; color: #ffffff !important; border-color: #0284c7 !important; box-shadow: 0 1px 2px rgba(0,0,0,0.08) !important; }\n#bearing-clearance-calc .class-btn.is-disabled { opacity: 0.4 !important; pointer-events: none !important; }\n@media (min-width: 640px) { #bearing-clearance-calc .class-btn { font-size: 0.875rem !important; } }\n\n#bearing-clearance-calc input[type=\"text\"], #bearing-clearance-calc input[type=\"number\"], #bearing-clearance-calc select, #bearing-clearance-calc textarea { appearance: none; -webkit-appearance: none; width: 100%; border: 1px solid #cbd5e1; border-radius: 0.5rem; padding: 0.5rem 0.75rem; font-size: 0.875rem; background: #ffffff; color: #0f172a; }\n#bearing-clearance-calc input[type=\"text\"]:focus, #bearing-clearance-calc input[type=\"number\"]:focus, #bearing-clearance-calc select:focus, #bearing-clearance-calc textarea:focus { outline: 2px solid #0ea5e9; outline-offset: 0; border-color: #0ea5e9; }\n#bearing-clearance-calc input[type=\"checkbox\"] { width: 1rem; height: 1rem; accent-color: #0284c7; }\n#bearing-clearance-calc input[type=\"range\"] { accent-color: #0284c7; width: 100%; }\n#bearing-clearance-calc input:disabled { background: #f8fafc; color: #64748b; cursor: not-allowed; }\n#bearing-clearance-calc .hidden { display: none !important; }\n#bearing-clearance-calc .block { display: block; }\n#bearing-clearance-calc .flex { display: flex; }\n#bearing-clearance-calc .inline-flex { display: inline-flex; }\n#bearing-clearance-calc .grid { display: grid; }\n#bearing-clearance-calc .flex-1 { flex: 1 1 0%; }\n#bearing-clearance-calc .flex-col { flex-direction: column; }\n#bearing-clearance-calc .items-center { align-items: center; }\n#bearing-clearance-calc .items-start { align-items: flex-start; }\n#bearing-clearance-calc .justify-between { justify-content: space-between; }\n#bearing-clearance-calc .justify-center { justify-content: center; }\n#bearing-clearance-calc .shrink-0 { flex-shrink: 0; }\n#bearing-clearance-calc .min-w-0 { min-width: 0; }\n#bearing-clearance-calc .w-full { width: 100%; }\n#bearing-clearance-calc .w-7 { width: 1.75rem; }\n#bearing-clearance-calc .h-7 { height: 1.75rem; }\n#bearing-clearance-calc .w-16 { width: 4rem; }\n#bearing-clearance-calc .max-w-\\[1000px\\] { max-width: 1000px; }\n#bearing-clearance-calc .mx-auto { margin-left: auto; margin-right: auto; }\n#bearing-clearance-calc .gap-1\\.5 { gap: 0.375rem; }\n#bearing-clearance-calc .gap-2 { gap: 0.5rem; }\n#bearing-clearance-calc .gap-3 { gap: 0.75rem; }\n#bearing-clearance-calc .gap-4 { gap: 1rem; }\n#bearing-clearance-calc .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }\n#bearing-clearance-calc .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n#bearing-clearance-calc .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }\n#bearing-clearance-calc .grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }\n#bearing-clearance-calc .col-span-2 { grid-column: span 2 \/ span 2; }\n#bearing-clearance-calc .p-3 { padding: 0.75rem; }\n#bearing-clearance-calc .p-4 { padding: 1rem; }\n#bearing-clearance-calc .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }\n#bearing-clearance-calc .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\n#bearing-clearance-calc .px-4 { padding-left: 1rem; padding-right: 1rem; }\n#bearing-clearance-calc .px-5 { padding-left: 1.25rem; padding-right: 1.25rem; }\n#bearing-clearance-calc .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\n#bearing-clearance-calc .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n#bearing-clearance-calc .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }\n#bearing-clearance-calc .py-4 { padding-top: 1rem; padding-bottom: 1rem; }\n#bearing-clearance-calc .py-6 { padding-top: 1.5rem; padding-bottom: 1.5rem; }\n#bearing-clearance-calc .pt-0 { padding-top: 0; }\n#bearing-clearance-calc .pt-5 { padding-top: 1.25rem; }\n#bearing-clearance-calc .pl-5 { padding-left: 1.25rem; }\n#bearing-clearance-calc .mb-1 { margin-bottom: 0.25rem; }\n#bearing-clearance-calc .mb-2 { margin-bottom: 0.5rem; }\n#bearing-clearance-calc .mb-3 { margin-bottom: 0.75rem; }\n#bearing-clearance-calc .mt-0\\.5 { margin-top: 0.125rem; }\n#bearing-clearance-calc .mt-1 { margin-top: 0.25rem; }\n#bearing-clearance-calc .mt-3 { margin-top: 0.75rem; }\n#bearing-clearance-calc .ml-2 { margin-left: 0.5rem; }\n#bearing-clearance-calc .overflow-hidden { overflow: hidden; }\n#bearing-clearance-calc .overflow-x-auto { overflow-x: auto; }\n#bearing-clearance-calc .rounded { border-radius: 0.25rem; }\n#bearing-clearance-calc .rounded-lg { border-radius: 0.5rem; }\n#bearing-clearance-calc .rounded-xl { border-radius: 0.75rem; }\n#bearing-clearance-calc .rounded-full { border-radius: 9999px; }\n#bearing-clearance-calc .border { border-width: 1px; border-style: solid; }\n#bearing-clearance-calc .border-b { border-bottom-width: 1px; border-bottom-style: solid; }\n#bearing-clearance-calc .border-t { border-top-width: 1px; border-top-style: solid; }\n#bearing-clearance-calc .border-slate-100 { border-color: #f1f5f9; }\n#bearing-clearance-calc .border-slate-200 { border-color: #e2e8f0; }\n#bearing-clearance-calc .border-slate-300 { border-color: #cbd5e1; }\n#bearing-clearance-calc .border-sky-200 { border-color: #bae6fd; }\n#bearing-clearance-calc .bg-white { background-color: #ffffff; }\n#bearing-clearance-calc .bg-slate-50 { background-color: #f8fafc; }\n#bearing-clearance-calc .bg-slate-50\\\/50 { background-color: rgba(248, 250, 252, 0.5); }\n#bearing-clearance-calc .bg-slate-900 { background-color: #0f172a; }\n#bearing-clearance-calc .shadow-sm { box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05); }\n#bearing-clearance-calc .shadow-md { box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1); }\n#bearing-clearance-calc .ring-1 { box-shadow: 0 0 0 1px var(--tw-ring-color, #bae6fd); }\n#bearing-clearance-calc .ring-sky-200 { --tw-ring-color: #bae6fd; }\n#bearing-clearance-calc .text-left { text-align: left; }\n#bearing-clearance-calc .text-right { text-align: right; }\n#bearing-clearance-calc .text-xs { font-size: 0.75rem; line-height: 1rem; }\n#bearing-clearance-calc .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n#bearing-clearance-calc .text-lg { font-size: 1.125rem; line-height: 1.75rem; }\n#bearing-clearance-calc .text-xl { font-size: 1.25rem; line-height: 1.75rem; }\n#bearing-clearance-calc .text-\\[10px\\] { font-size: 10px; line-height: 1rem; }\n#bearing-clearance-calc .text-\\[11px\\] { font-size: 11px; line-height: 1rem; }\n#bearing-clearance-calc .font-medium { font-weight: 500; }\n#bearing-clearance-calc .font-semibold { font-weight: 600; }\n#bearing-clearance-calc .font-bold { font-weight: 700; }\n#bearing-clearance-calc .uppercase { text-transform: uppercase; }\n#bearing-clearance-calc .tracking-wide { letter-spacing: 0.025em; }\n#bearing-clearance-calc .tracking-wider { letter-spacing: 0.05em; }\n#bearing-clearance-calc .tracking-\\[0\\.18em\\] { letter-spacing: 0.18em; }\n#bearing-clearance-calc .leading-relaxed { line-height: 1.625; }\n#bearing-clearance-calc .whitespace-nowrap { white-space: nowrap; }\n#bearing-clearance-calc .list-disc { list-style-type: disc; }\n#bearing-clearance-calc .opacity-80 { opacity: 0.8; }\n#bearing-clearance-calc .opacity-90 { opacity: 0.9; }\n#bearing-clearance-calc .text-white { color: #ffffff; }\n#bearing-clearance-calc .text-slate-200 { color: #e2e8f0; }\n#bearing-clearance-calc .text-slate-400 { color: #94a3b8; }\n#bearing-clearance-calc .text-slate-500 { color: #64748b; }\n#bearing-clearance-calc .text-slate-600 { color: #475569; }\n#bearing-clearance-calc .text-slate-700 { color: #334155; }\n#bearing-clearance-calc .text-slate-800 { color: #1e293b; }\n#bearing-clearance-calc .text-slate-900 { color: #0f172a; }\n#bearing-clearance-calc .text-sky-300 { color: #7dd3fc; }\n#bearing-clearance-calc .text-sky-600 { color: #0284c7; }\n#bearing-clearance-calc .text-sky-700 { color: #0369a1; }\n\n#bearing-clearance-calc .space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) { margin-top: 0.375rem; }\n#bearing-clearance-calc .space-y-3 > :not([hidden]) ~ :not([hidden]) { margin-top: 0.75rem; }\n#bearing-clearance-calc .space-y-4 > :not([hidden]) ~ :not([hidden]) { margin-top: 1rem; }\n#bearing-clearance-calc .space-y-5 > :not([hidden]) ~ :not([hidden]) { margin-top: 1.25rem; }\n#bearing-clearance-calc .space-y-6 > :not([hidden]) ~ :not([hidden]) { margin-top: 1.5rem; }\n#bearing-clearance-calc .divide-y > :not([hidden]) ~ :not([hidden]) { border-top-width: 1px; border-top-style: solid; border-color: #f1f5f9; }\n#bearing-clearance-calc .divide-slate-100 > :not([hidden]) ~ :not([hidden]) { border-color: #f1f5f9; }\n#bearing-clearance-calc .hover\\:bg-slate-50:hover { background-color: #f8fafc; }\n\n\n@media (min-width: 640px) {\n  #bearing-clearance-calc .sm\\:px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }\n  #bearing-clearance-calc .sm\\:text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n  #bearing-clearance-calc .sm\\:text-2xl { font-size: 1.5rem; line-height: 2rem; }\n  #bearing-clearance-calc .sm\\:flex-row { flex-direction: row; }\n  #bearing-clearance-calc .sm\\:items-center { align-items: center; }\n  #bearing-clearance-calc .sm\\:justify-between { justify-content: space-between; }\n  #bearing-clearance-calc .sm\\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }\n  #bearing-clearance-calc .sm\\:col-span-1 { grid-column: span 1 \/ span 1; }\n}\n@media (min-width: 768px) {\n  #bearing-clearance-calc .md\\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n@media (min-width: 1024px) {\n  #bearing-clearance-calc .lg\\:py-8 { padding-top: 2rem; padding-bottom: 2rem; }\n  #bearing-clearance-calc .lg\\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }\n}\n\n\n  <\/style>\n<\/head>\n<body>\n<div id=\"bearing-clearance-calc\" class=\"grid-bg text-slate-800\" data-bcc-root>\n  <main class=\"max-w-[1000px] mx-auto px-4 sm:px-6 py-6 lg:py-8 space-y-6\">\n    <!-- Inputs -->\n    <section>\n      <div class=\"bg-white rounded-xl shadow-sm border border-slate-200 overflow-hidden\">\n        <div class=\"px-4 py-3 border-b border-slate-100 bg-slate-50 flex items-start justify-between gap-3\">\n          <div class=\"min-w-0\">\n            <h2 class=\"font-semibold text-slate-900\">Input Parameters<\/h2>\n            <p class=\"text-xs text-slate-500 mt-0.5\">Bearing, clearance, fits, thermal conditions, and loads<\/p>\n          <\/div>\n          <div class=\"bcc-units-bar\">\n            <span class=\"bcc-units-label\">Units<\/span>\n            <div class=\"bcc-unit-switch\" role=\"group\" aria-label=\"Unit system\">\n              <button id=\"btnMetric\" type=\"button\" class=\"unit-btn is-active\" data-unit=\"metric\">Metric<\/button>\n              <button id=\"btnImperial\" type=\"button\" class=\"unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n            <\/div>\n            <button id=\"btnReset\" type=\"button\" title=\"Reset Demo\" class=\"bcc-reset-btn\">Reset<\/button>\n          <\/div>\n        <\/div>\n\n\n        <div class=\"p-4 space-y-5 divide-y divide-slate-100\">\n          <!-- Step 1 -->\n          <div class=\"space-y-3 pt-0\">\n            <div class=\"flex items-center gap-3\">\n              <span class=\"step-badge text-white text-xs font-bold w-7 h-7 rounded-full flex items-center justify-center shrink-0\">1<\/span>\n              <h3 class=\"font-semibold text-slate-900\">Bearing Selection<\/h3>\n            <\/div>\n            <div>\n              <label class=\"block text-sm font-medium text-slate-700 mb-1\">Bearing Type<\/label>\n              <select id=\"bearingType\" class=\"w-full rounded-lg border-slate-300 border px-3 py-2 text-sm focus:ring-2 focus:ring-sky-500 focus:border-sky-500\">\n                <option value=\"deep_groove\">Deep Groove Ball Bearing<\/option>\n                <option value=\"cylindrical\">Cylindrical Roller Bearing<\/option>\n                <option value=\"spherical\">Spherical Roller Bearing<\/option>\n                <option value=\"tapered\">Tapered Roller Bearing<\/option>\n              <\/select>\n            <\/div>\n            <div>\n              <label class=\"block text-sm font-medium text-slate-700 mb-1\">Designation <span class=\"hint\">(optional)<\/span><\/label>\n              <input id=\"designation\" type=\"text\" value=\"6310\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono focus:ring-2 focus:ring-sky-500\" \/>\n            <\/div>\n            <div class=\"grid grid-cols-3 gap-3\">\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">d <span id=\"lbl_d\" class=\"hint\">(mm)<\/span><\/label>\n                <input id=\"d\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">D <span id=\"lbl_D\" class=\"hint\">(mm)<\/span><\/label>\n                <input id=\"D\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">d<sub>m<\/sub> <span id=\"lbl_dm\" class=\"hint\">(mm)<\/span><\/label>\n                <input id=\"dm\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n            <\/div>\n            <p class=\"text-xs text-slate-500\">Pitch diameter d<sub>m<\/sub> \u2248 (d + D) \/ 2. Auto-updates when d or D changes (unless locked).<\/p>\n            <label class=\"inline-flex items-center gap-2 text-xs text-slate-600\">\n              <input id=\"lockDm\" type=\"checkbox\" class=\"rounded border-slate-300 text-sky-600 focus:ring-sky-500\" \/>\n              Lock d<sub>m<\/sub> (manual override)\n            <\/label>\n          <\/div>\n\n          <!-- Step 2 -->\n          <div class=\"space-y-3 pt-5\">\n            <div class=\"flex items-center gap-3\">\n              <span class=\"step-badge text-white text-xs font-bold w-7 h-7 rounded-full flex items-center justify-center shrink-0\">2<\/span>\n              <h3 class=\"font-semibold text-slate-900\">Initial Clearance<\/h3>\n            <\/div>\n            <div>\n              <label class=\"block text-sm font-medium text-slate-700 mb-1\">ISO Clearance Class<\/label>\n              <div class=\"grid grid-cols-5 gap-1.5\" id=\"classButtons\"><\/div>\n            <\/div>\n            <div id=\"classRangeInfo\" class=\"rounded-lg bg-slate-50 border border-slate-200 px-3 py-2 text-xs text-slate-600 mono\"><\/div>\n            <label class=\"inline-flex items-center gap-2 text-sm text-slate-700\">\n              <input id=\"useCustomDelta0\" type=\"checkbox\" class=\"rounded border-slate-300 text-sky-600\" \/>\n              Use custom initial radial clearance \u0394<sub>0<\/sub>\n            <\/label>\n            <div>\n              <label class=\"block text-sm font-medium text-slate-700 mb-1\">\u0394<sub>0<\/sub> <span id=\"lbl_delta0\" class=\"hint\">(\u03bcm)<\/span><\/label>\n              <input id=\"delta0\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" disabled \/>\n            <\/div>\n          <\/div>\n\n          <!-- Step 3 -->\n          <div class=\"space-y-3 pt-5\">\n            <div class=\"flex items-center gap-3\">\n              <span class=\"step-badge text-white text-xs font-bold w-7 h-7 rounded-full flex items-center justify-center shrink-0\">3<\/span>\n              <h3 class=\"font-semibold text-slate-900\">Fit &amp; Tolerances<\/h3>\n            <\/div>\n            <div class=\"grid grid-cols-2 gap-3\">\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">Shaft interference \u0394d<sub>i<\/sub> <span id=\"lbl_deltaDi\" class=\"hint\">(mm)<\/span><\/label>\n                <input id=\"deltaDi\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n                <p class=\"text-[11px] text-slate-500 mt-1\">e.g. k5 press fit<\/p>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">Housing interference \u0394D<sub>o<\/sub> <span id=\"lbl_deltaDo\" class=\"hint\">(mm)<\/span><\/label>\n                <input id=\"deltaDo\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n                <p class=\"text-[11px] text-slate-500 mt-1\">e.g. H7 (use + for tight)<\/p>\n              <\/div>\n            <\/div>\n            <p class=\"text-xs text-slate-500\">\u0394d<sub>i,eff<\/sub> \u2248 0.8 \u00d7 shaft interference \u00b7 \u0394D<sub>o,eff<\/sub> \u2248 0.7 \u00d7 housing interference (solid steel shaft \/ steel housing).<\/p>\n          <\/div>\n\n          <!-- Step 4 -->\n          <div class=\"space-y-3 pt-5\">\n            <div class=\"flex items-center gap-3\">\n              <span class=\"step-badge text-white text-xs font-bold w-7 h-7 rounded-full flex items-center justify-center shrink-0\">4<\/span>\n              <h3 class=\"font-semibold text-slate-900\">Thermal Conditions<\/h3>\n            <\/div>\n            <div class=\"grid grid-cols-3 gap-3\">\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">T<sub>s<\/sub> <span id=\"lbl_Ts\" class=\"hint\">(\u00b0C)<\/span><\/label>\n                <input id=\"Ts\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">T<sub>h<\/sub> <span id=\"lbl_Th\" class=\"hint\">(\u00b0C)<\/span><\/label>\n                <input id=\"Th\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">T<sub>a<\/sub> <span id=\"lbl_Ta\" class=\"hint\">(\u00b0C)<\/span><\/label>\n                <input id=\"Ta\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n            <\/div>\n            <div class=\"grid grid-cols-3 gap-3\">\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">\u03b1<sub>s<\/sub> <span id=\"lbl_as\" class=\"hint\">(\/\u00b0C)<\/span><\/label>\n                <input id=\"alphaS\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">\u03b1<sub>b<\/sub> <span id=\"lbl_ab\" class=\"hint\">(\/\u00b0C)<\/span><\/label>\n                <input id=\"alphaB\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">\u03b1<sub>h<\/sub> <span id=\"lbl_ah\" class=\"hint\">(\/\u00b0C)<\/span><\/label>\n                <input id=\"alphaH\" type=\"number\" step=\"any\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n            <\/div>\n            <p class=\"text-xs text-slate-500\">Default \u03b1<sub>b<\/sub> = 12\u00d710<sup>\u22126<\/sup> \/\u00b0C (100Cr6 \/ AISI 52100). \u0394t = \u03b1<sub>b<\/sub> \u00b7 d<sub>m<\/sub> \u00b7 (T<sub>s<\/sub> \u2212 T<sub>h<\/sub>).<\/p>\n          <\/div>\n\n          <!-- Step 5 -->\n          <div class=\"space-y-3 pt-5\">\n            <div class=\"flex items-center gap-3\">\n              <span class=\"step-badge text-white text-xs font-bold w-7 h-7 rounded-full flex items-center justify-center shrink-0\">5<\/span>\n              <h3 class=\"font-semibold text-slate-900\">Loads &amp; Speed<\/h3>\n            <\/div>\n            <div class=\"grid grid-cols-2 gap-3\">\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">Radial load F<sub>r<\/sub> <span id=\"lbl_Fr\" class=\"hint\">(N)<\/span><\/label>\n                <input id=\"Fr\" type=\"number\" step=\"any\" min=\"0\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n              <div>\n                <label class=\"block text-sm font-medium text-slate-700 mb-1\">Operating speed <span class=\"hint\">(rpm)<\/span><\/label>\n                <input id=\"rpm\" type=\"number\" step=\"any\" min=\"0\" class=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm mono\" \/>\n              <\/div>\n            <\/div>\n            <p class=\"text-xs text-slate-500\">Elastic recovery \u0394<sub>f<\/sub> estimated from Hertzian-type contact deformation (informative; secondary to fit &amp; thermal terms).<\/p>\n          <\/div>\n        <\/div>\n\n        <!-- Calculate button inside input block -->\n        <div class=\"px-4 py-4 border-t border-slate-100 bg-slate-50 flex justify-center\">\n          <button id=\"btnCalculate\" type=\"button\" class=\"bcc-calc-btn\">\n            Calculate\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <!-- Results (single block, below inputs) \u2014 shown after Calculate -->\n    <section id=\"resultsSection\" class=\"hidden\">\n      <div class=\"bg-white rounded-xl shadow-sm border border-slate-200 overflow-hidden\">\n        <div class=\"px-4 py-3 border-b border-slate-100 bg-slate-50 flex items-center justify-between gap-3\">\n          <div>\n            <h2 class=\"font-semibold text-slate-900\">Calculation Results<\/h2>\n            <p class=\"text-xs text-slate-500 mt-0.5\">Operating clearance analysis, charts, and recommendations<\/p>\n          <\/div>\n          <span id=\"unitBadge\" class=\"text-[10px] uppercase tracking-wider bg-white border border-slate-200 text-slate-600 px-2 py-1 rounded font-semibold shrink-0\">Metric \u00b7 mm \u00b7 \u00b0C \u00b7 N<\/span>\n        <\/div>\n\n        <div class=\"p-4 space-y-4\">\n          <!-- Status Banner -->\n          <div id=\"statusBanner\" class=\"banner-ok rounded-xl px-5 py-4 text-white shadow-md\">\n            <div class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2\">\n              <div>\n                <p class=\"text-xs uppercase tracking-[0.18em] opacity-80 font-semibold\">Status &amp; Recommendation<\/p>\n                <p id=\"statusTitle\" class=\"text-xl sm:text-2xl font-bold mt-0.5\">SUITABLE<\/p>\n                <p id=\"statusDetail\" class=\"text-sm opacity-90 mt-1\">Operating clearance within recommended band for this bearing size.<\/p>\n              <\/div>\n              <div class=\"text-right mono text-sm opacity-90\">\n                <div>Target: <span id=\"targetBand\">\u2014<\/span><\/div>\n                <div class=\"mt-1\">\u0394<sub>eff<\/sub> = <span id=\"bannerDeltaEff\" class=\"text-lg font-semibold\">\u2014<\/span><\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <!-- Metrics -->\n          <div class=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n            <div class=\"metric-tile rounded-xl p-3\">\n              <p class=\"text-[11px] uppercase tracking-wide text-slate-500 font-semibold\">\u0394<sub>0<\/sub> Initial<\/p>\n              <p id=\"m_delta0\" class=\"mono text-lg font-semibold text-slate-900 mt-1\">\u2014<\/p>\n            <\/div>\n            <div class=\"metric-tile rounded-xl p-3\">\n              <p class=\"text-[11px] uppercase tracking-wide text-slate-500 font-semibold\">\u0394<sub>fit<\/sub> Fits<\/p>\n              <p id=\"m_deltaFit\" class=\"mono text-lg font-semibold text-slate-900 mt-1\">\u2014<\/p>\n            <\/div>\n            <div class=\"metric-tile rounded-xl p-3\">\n              <p class=\"text-[11px] uppercase tracking-wide text-slate-500 font-semibold\">\u0394<sub>t<\/sub> Thermal<\/p>\n              <p id=\"m_deltaT\" class=\"mono text-lg font-semibold text-slate-900 mt-1\">\u2014<\/p>\n            <\/div>\n            <div class=\"metric-tile rounded-xl p-3\">\n              <p class=\"text-[11px] uppercase tracking-wide text-slate-500 font-semibold\">\u0394<sub>f<\/sub> Load<\/p>\n              <p id=\"m_deltaF\" class=\"mono text-lg font-semibold text-slate-900 mt-1\">\u2014<\/p>\n            <\/div>\n            <div class=\"metric-tile rounded-xl p-3 col-span-2 sm:col-span-1 border-sky-200 ring-1 ring-sky-200\">\n              <p class=\"text-[11px] uppercase tracking-wide text-sky-700 font-semibold\">\u0394<sub>eff<\/sub> Operating<\/p>\n              <p id=\"m_deltaEff\" class=\"mono text-lg font-bold text-sky-700 mt-1\">\u2014<\/p>\n            <\/div>\n          <\/div>\n\n          <!-- Equation strip -->\n          <div class=\"bg-slate-900 text-slate-200 rounded-xl px-4 py-3 mono text-xs sm:text-sm overflow-x-auto\">\n            \u0394<sub>eff<\/sub> = \u0394<sub>0<\/sub> \u2212 \u0394<sub>fit<\/sub> \u2212 \u0394<sub>t<\/sub> + \u0394<sub>f<\/sub>\n            <span id=\"eqExpanded\" class=\"text-sky-300 ml-2\">= \u2014<\/span>\n          <\/div>\n\n          <!-- Charts row -->\n          <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n            <div class=\"rounded-xl border border-slate-200 p-4 bg-slate-50\/50\">\n              <h3 class=\"font-semibold text-slate-900 text-sm mb-1\">Clearance Breakdown<\/h3>\n              <p class=\"text-xs text-slate-500 mb-3\">How \u0394<sub>0<\/sub> is reduced by fit and temperature (values in clearance unit).<\/p>\n              <div class=\"chart-wrap\">\n                <canvas id=\"breakdownChart\"><\/canvas>\n              <\/div>\n            <\/div>\n            <div class=\"rounded-xl border border-slate-200 p-4 bg-slate-50\/50\">\n              <h3 class=\"font-semibold text-slate-900 text-sm mb-1\">Sensitivity: \u0394<sub>eff<\/sub> vs \u0394T<\/h3>\n              <p class=\"text-xs text-slate-500 mb-2\">\u0394T = T<sub>s<\/sub> \u2212 T<sub>h<\/sub>. Drag slider to explore thermal effect.<\/p>\n              <div class=\"flex items-center gap-3 mb-3\">\n                <label class=\"text-xs font-medium text-slate-600 whitespace-nowrap\">\u0394T <span id=\"lbl_dTUnit\">(\u00b0C)<\/span><\/label>\n                <input id=\"dTSlider\" type=\"range\" min=\"-20\" max=\"80\" step=\"1\" value=\"20\" class=\"flex-1 accent-sky-600\" \/>\n                <span id=\"dTValue\" class=\"mono text-sm font-semibold w-16 text-right\">20<\/span>\n              <\/div>\n              <div class=\"sens-wrap\">\n                <canvas id=\"sensitivityChart\"><\/canvas>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <!-- Detail table -->\n          <div class=\"rounded-xl border border-slate-200 overflow-hidden\">\n            <div class=\"px-4 py-3 border-b border-slate-100 bg-slate-50\">\n              <h3 class=\"font-semibold text-slate-900 text-sm\">Calculation Detail<\/h3>\n            <\/div>\n            <div class=\"overflow-x-auto\">\n              <table class=\"w-full text-sm\">\n                <thead class=\"bg-slate-50 text-slate-600 text-left\">\n                  <tr>\n                    <th class=\"px-4 py-2 font-semibold\">Parameter<\/th>\n                    <th class=\"px-4 py-2 font-semibold\">Symbol<\/th>\n                    <th class=\"px-4 py-2 font-semibold\">Value<\/th>\n                    <th class=\"px-4 py-2 font-semibold\">Notes<\/th>\n                  <\/tr>\n                <\/thead>\n                <tbody id=\"detailTable\" class=\"divide-y divide-slate-100 mono text-xs sm:text-sm\"><\/tbody>\n              <\/table>\n            <\/div>\n          <\/div>\n\n          <!-- Guidance -->\n          <div class=\"rounded-xl border border-slate-200 p-4 bg-slate-50\/50\">\n            <h3 class=\"font-semibold text-slate-900 text-sm mb-2\">Selection Guidance<\/h3>\n            <ul id=\"guidanceList\" class=\"text-sm text-slate-600 space-y-1.5 list-disc pl-5\"><\/ul>\n            <p class=\"text-[11px] text-slate-400 mt-3 leading-relaxed\">Disclaimer: This tool implements commonly used engineering approximations for preliminary selection. Final clearance selection should follow manufacturer catalogs (SKF, NSK, FAG, etc.) and application-specific standards. Not a substitute for OEM engineering approval.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n  <\/main>\n  <\/div><!-- \/#bearing-clearance-calc -->\n\n  <script>\n  (function () {\n    'use strict';\n    const ROOT = document.getElementById('bearing-clearance-calc');\n    if (!ROOT || ROOT.dataset.bccReady === '1') return;\n    ROOT.dataset.bccReady = '1';\n    if (typeof Chart === 'undefined') {\n      console.warn('[bearing-clearance-calc] Chart.js is required.');\n      return;\n    }\n\n    \/* ========== Unit helpers (internal SI-ish metric base) ========== *\/\n    const MM_PER_IN = 25.4;\n    const N_PER_LBF = 4.4482216153;\n\n    const state = {\n      unit: 'metric', \/\/ metric | imperial\n      clearanceClass: 'C3',\n      syncing: false\n    };\n\n    \/\/ ISO radial clearance tables (\u03bcm) by bore d (mm) \u2014 Deep groove ball (approx. ISO 5753 \/ common catalog)\n    \/\/ Format: [dMin, dMax, C2min, C2max, CNmin, CNmax, C3min, C3max, C4min, C4max, C5min, C5max]\n    const CLEARANCE_TABLES = {\n      deep_groove: [\n        [2.5, 10, 0, 7, 2, 13, 8, 23, 14, 29, 20, 37],\n        [10, 18, 0, 9, 3, 18, 11, 25, 18, 33, 25, 45],\n        [18, 24, 0, 10, 5, 20, 13, 28, 20, 36, 28, 48],\n        [24, 30, 1, 11, 5, 20, 13, 28, 23, 41, 30, 53],\n        [30, 40, 1, 11, 6, 20, 15, 33, 28, 46, 40, 64],\n        [40, 50, 1, 11, 6, 23, 18, 36, 30, 51, 45, 73],\n        [50, 65, 1, 15, 8, 28, 23, 43, 38, 61, 55, 90],\n        [65, 80, 1, 15, 10, 30, 25, 51, 46, 71, 65, 105],\n        [80, 100, 1, 18, 12, 36, 30, 58, 53, 84, 75, 120],\n        [100, 120, 2, 20, 15, 41, 36, 66, 61, 97, 90, 140],\n        [120, 140, 2, 23, 18, 48, 41, 81, 71, 114, 105, 160],\n        [140, 160, 2, 25, 18, 53, 46, 91, 81, 130, 120, 180],\n        [160, 180, 2, 30, 20, 61, 53, 102, 91, 147, 135, 200],\n        [180, 200, 2, 30, 25, 71, 63, 117, 107, 163, 150, 230]\n      ],\n      cylindrical: [\n        [24, 30, 20, 35, 35, 50, 50, 65, 65, 85, 85, 105],\n        [30, 40, 25, 40, 40, 55, 55, 75, 75, 95, 95, 120],\n        [40, 50, 30, 45, 45, 60, 60, 80, 80, 100, 100, 125],\n        [50, 65, 40, 55, 50, 70, 70, 95, 95, 120, 120, 150],\n        [65, 80, 40, 60, 60, 80, 80, 110, 110, 140, 140, 180],\n        [80, 100, 50, 70, 70, 100, 100, 135, 135, 170, 170, 220],\n        [100, 120, 50, 80, 80, 120, 120, 160, 160, 200, 200, 260],\n        [120, 140, 60, 90, 100, 140, 140, 180, 180, 230, 230, 300],\n        [140, 160, 70, 110, 110, 160, 160, 210, 210, 270, 270, 350],\n        [160, 180, 80, 120, 120, 180, 180, 240, 240, 310, 310, 400]\n      ],\n      spherical: [\n        [24, 30, 15, 30, 30, 45, 45, 60, 60, 80, 80, 100],\n        [30, 40, 20, 35, 35, 50, 50, 70, 70, 90, 90, 115],\n        [40, 50, 25, 40, 40, 55, 55, 75, 75, 100, 100, 125],\n        [50, 65, 30, 50, 50, 70, 70, 95, 95, 125, 125, 160],\n        [65, 80, 40, 60, 60, 80, 80, 110, 110, 145, 145, 190],\n        [80, 100, 45, 70, 70, 100, 100, 135, 135, 180, 180, 230],\n        [100, 120, 50, 85, 85, 120, 120, 160, 160, 210, 210, 270],\n        [120, 140, 60, 100, 100, 140, 140, 190, 190, 250, 250, 320],\n        [140, 160, 70, 110, 110, 160, 160, 220, 220, 290, 290, 370],\n        [160, 180, 80, 130, 130, 180, 180, 250, 250, 330, 330, 420]\n      ],\n      tapered: [\n        [24, 30, 20, 35, 35, 50, 50, 65, 65, 85, 85, 105],\n        [30, 40, 25, 40, 40, 55, 55, 75, 75, 95, 95, 120],\n        [40, 50, 30, 45, 45, 60, 60, 80, 80, 100, 100, 125],\n        [50, 65, 35, 55, 50, 70, 70, 95, 95, 120, 120, 150],\n        [65, 80, 40, 60, 60, 80, 80, 110, 110, 140, 140, 180],\n        [80, 100, 50, 70, 70, 100, 100, 135, 135, 170, 170, 220],\n        [100, 120, 50, 80, 80, 120, 120, 160, 160, 200, 200, 260],\n        [120, 140, 60, 90, 100, 140, 140, 180, 180, 230, 230, 300],\n        [140, 160, 70, 110, 110, 160, 160, 210, 210, 270, 270, 350],\n        [160, 180, 80, 120, 120, 180, 180, 240, 240, 310, 310, 400]\n      ]\n    };\n\n    const CLASSES = ['C2', 'CN', 'C3', 'C4', 'C5'];\n\n    \/\/ Elastic deformation factor by type (empirical Hertzian-style, mm when Fr in N, dm in mm)\n    const KF = {\n      deep_groove: 2.7e-4,\n      cylindrical: 1.4e-4,\n      spherical: 1.8e-4,\n      tapered: 1.2e-4\n    };\n\n    \/* Demo defaults stored in metric base *\/\n    const DEMO = {\n      bearingType: 'deep_groove',\n      designation: '6310',\n      d: 50,\n      D: 110,\n      dm: 80,\n      clearanceClass: 'C3',\n      useCustom: false,\n      delta0_um: 33,\n      deltaDi: 0.015,\n      deltaDo: 0.005,\n      Ts: 70,\n      Th: 50,\n      Ta: 20,\n      alphaS: 12e-6,\n      alphaB: 12e-6,\n      alphaH: 12e-6,\n      Fr: 5000,\n      rpm: 3000\n    };\n\n    let breakdownChart = null;\n    let sensitivityChart = null;\n\n    function el(id) { return ROOT.querySelector('#' + id); }\n\n    function num(id) {\n      const v = parseFloat(el(id).value);\n      return Number.isFinite(v) ? v : 0;\n    }\n\n    \/* ---- Display unit conversion from metric base ---- *\/\n    function lenToDisplay(mm) {\n      return state.unit === 'metric' ? mm : mm \/ MM_PER_IN;\n    }\n    function lenFromDisplay(v) {\n      return state.unit === 'metric' ? v : v * MM_PER_IN;\n    }\n    function clearToDisplay_um(um) {\n      \/\/ clearance display: \u03bcm metric, or 0.0001 inch (0.1 mil) imperial \u2014 use \u03bcin\n      return state.unit === 'metric' ? um : um \/ 25.4; \/\/ \u03bcin\n    }\n    function clearFromDisplay(v) {\n      return state.unit === 'metric' ? v : v * 25.4; \/\/ to \u03bcm\n    }\n    function tempToDisplay(c) {\n      return state.unit === 'metric' ? c : c * 9 \/ 5 + 32;\n    }\n    function tempFromDisplay(v) {\n      return state.unit === 'metric' ? v : (v - 32) * 5 \/ 9;\n    }\n    function forceToDisplay(n) {\n      return state.unit === 'metric' ? n : n \/ N_PER_LBF;\n    }\n    function forceFromDisplay(v) {\n      return state.unit === 'metric' ? v : v * N_PER_LBF;\n    }\n    function alphaToDisplay(perC) {\n      return state.unit === 'metric' ? perC : perC * 5 \/ 9;\n    }\n    function alphaFromDisplay(v) {\n      return state.unit === 'metric' ? v : v * 9 \/ 5;\n    }\n\n    function clearUnit() { return state.unit === 'metric' ? '\u03bcm' : '\u03bcin'; }\n    function lenUnit() { return state.unit === 'metric' ? 'mm' : 'in'; }\n    function tempUnit() { return state.unit === 'metric' ? '\u00b0C' : '\u00b0F'; }\n    function forceUnit() { return state.unit === 'metric' ? 'N' : 'lbf'; }\n    function alphaUnit() { return state.unit === 'metric' ? '\/\u00b0C' : '\/\u00b0F'; }\n\n    function fmt(v, digits = 3) {\n      if (!Number.isFinite(v)) return '\u2014';\n      const a = Math.abs(v);\n      if (a !== 0 && (a < 1e-4 || a >= 1e5)) return v.toExponential(3);\n      return Number(v.toFixed(digits)).toString();\n    }\n\n    function fmtClear(um) {\n      const v = clearToDisplay_um(um);\n      return fmt(v, state.unit === 'metric' ? 2 : 1) + ' ' + clearUnit();\n    }\n\n    \/* ---- Clearance class lookup ---- *\/\n    function lookupClearanceRange(type, d_mm, cls) {\n      const table = CLEARANCE_TABLES[type] || CLEARANCE_TABLES.deep_groove;\n      let row = table[0];\n      for (const r of table) {\n        if (d_mm >= r[0] && d_mm < r[1]) { row = r; break; }\n        if (d_mm >= r[0]) row = r;\n      }\n      const idx = { C2: 2, CN: 4, C3: 6, C4: 8, C5: 10 }[cls] || 4;\n      const min = row[idx];\n      const max = row[idx + 1];\n      const mean = (min + max) \/ 2;\n      return { min, max, mean };\n    }\n\n    function buildClassButtons() {\n      const wrap = el('classButtons');\n      wrap.innerHTML = '';\n      CLASSES.forEach(c => {\n        const btn = document.createElement('button');\n        btn.type = 'button';\n        btn.dataset.class = c;\n        btn.textContent = c === 'CN' ? 'CN' : c;\n        btn.className = 'class-btn';\n        btn.addEventListener('click', () => {\n          if (el('useCustomDelta0').checked) return;\n          state.clearanceClass = c;\n          updateClassButtons();\n          applyClassMeanToDelta0();\n        });\n        wrap.appendChild(btn);\n      });\n      updateClassButtons();\n    }\n\n    function updateClassButtons() {\n      ROOT.querySelectorAll('.class-btn').forEach(btn => {\n        const active = btn.dataset.class === state.clearanceClass && !el('useCustomDelta0').checked;\n        btn.className = 'class-btn' + (active ? ' is-active' : '') + (el('useCustomDelta0').checked ? ' is-disabled' : '');\n      });\n    }\n\n    function applyClassMeanToDelta0() {\n      const d = getMetricInputs().d;\n      const type = el('bearingType').value;\n      const range = lookupClearanceRange(type, d, state.clearanceClass);\n      state.syncing = true;\n      el('delta0').value = fmt(clearToDisplay_um(range.mean), 2);\n      state.syncing = false;\n      updateClassRangeInfo(range);\n    }\n\n    function updateClassRangeInfo(range) {\n      const info = el('classRangeInfo');\n      if (el('useCustomDelta0').checked) {\n        info.textContent = 'Custom \u03940 mode \u2014 ISO class lookup disabled.';\n        return;\n      }\n      const u = clearUnit();\n      info.innerHTML = `${state.clearanceClass} range for current bore: <strong>${fmt(clearToDisplay_um(range.min), 1)} \u2013 ${fmt(clearToDisplay_um(range.max), 1)} ${u}<\/strong> \u00b7 mean \u0394<sub>0<\/sub> = <strong>${fmt(clearToDisplay_um(range.mean), 2)} ${u}<\/strong>`;\n    }\n\n    \/* ---- Read all inputs as metric base ---- *\/\n    function getMetricInputs() {\n      return {\n        type: el('bearingType').value,\n        designation: el('designation').value.trim(),\n        d: lenFromDisplay(num('d')),\n        D: lenFromDisplay(num('D')),\n        dm: lenFromDisplay(num('dm')),\n        delta0_um: clearFromDisplay(num('delta0')),\n        deltaDi: lenFromDisplay(num('deltaDi')),\n        deltaDo: lenFromDisplay(num('deltaDo')),\n        Ts: tempFromDisplay(num('Ts')),\n        Th: tempFromDisplay(num('Th')),\n        Ta: tempFromDisplay(num('Ta')),\n        alphaS: alphaFromDisplay(num('alphaS')),\n        alphaB: alphaFromDisplay(num('alphaB')),\n        alphaH: alphaFromDisplay(num('alphaH')),\n        Fr: forceFromDisplay(num('Fr')),\n        rpm: num('rpm')\n      };\n    }\n\n    \/* ---- Core engineering calculation (metric base) ---- *\/\n    function compute(inp, dT_override) {\n      const dDi_eff = 0.8 * Math.max(0, inp.deltaDi); \/\/ mm\n      const dDo_eff = 0.7 * Math.max(0, inp.deltaDo); \/\/ mm\n      const deltaFit_mm = dDi_eff + dDo_eff;\n      const deltaFit_um = deltaFit_mm * 1000;\n\n      const dT = dT_override !== undefined ? dT_override : (inp.Ts - inp.Th);\n      \/\/ \u0394t = \u03b1b \u00d7 dm \u00d7 \u0394T  \u2192 mm, then \u03bcm\n      const deltaT_mm = inp.alphaB * inp.dm * dT;\n      const deltaT_um = deltaT_mm * 1000;\n\n      \/\/ Elastic deformation \u0394f (mm \u2192 \u03bcm): \u03b4 \u2248 kf \u00d7 (Fr\u00b2 \/ dm)^(1\/3)\n      const kf = KF[inp.type] || KF.deep_groove;\n      let deltaF_mm = 0;\n      if (inp.Fr > 0 && inp.dm > 0) {\n        deltaF_mm = kf * Math.pow((inp.Fr * inp.Fr) \/ inp.dm, 1 \/ 3);\n      }\n      const deltaF_um = deltaF_mm * 1000;\n\n      const delta0_um = inp.delta0_um;\n      const deltaEff_um = delta0_um - deltaFit_um - deltaT_um + deltaF_um;\n\n      \/\/ Optimal band: 0.0002\u00d7dm \u2264 \u0394eff \u2264 0.0006\u00d7dm (dm in mm \u2192 clearance in mm \u2192 \u03bcm)\n      const minTarget_um = 0.0002 * inp.dm * 1000;\n      const maxTarget_um = 0.0006 * inp.dm * 1000;\n\n      let status = 'ok';\n      let title = 'SUITABLE';\n      let detail = 'Operating clearance within the recommended band for this bearing size.';\n\n      if (deltaEff_um < 0) {\n        status = 'risk';\n        title = 'RISK OF PRELOAD \/ OVERHEATING';\n        detail = 'Negative operating clearance (preload). High risk of binding, elevated friction, and thermal runaway.';\n      } else if (deltaEff_um < minTarget_um) {\n        status = 'warn';\n        title = 'RISK OF PRELOAD \/ OVERHEATING';\n        detail = 'Operating clearance below recommended minimum. Consider a larger clearance class (e.g. C3\u2192C4) or reduce interference \/ \u0394T.';\n      } else if (deltaEff_um > maxTarget_um) {\n        status = 'warn';\n        title = 'EXCESSIVE CLEARANCE \/ VIBRATION';\n        detail = 'Operating clearance above recommended maximum. May cause vibration, noise, and reduced load zone. Consider tighter class or fit review.';\n      }\n\n      return {\n        dDi_eff, dDo_eff,\n        deltaFit_um, deltaT_um, deltaF_um, delta0_um, deltaEff_um,\n        minTarget_um, maxTarget_um, dT, status, title, detail\n      };\n    }\n\n    function setBanner(status, title, detail) {\n      const banner = el('statusBanner');\n      banner.classList.remove('banner-ok', 'banner-warn', 'banner-risk');\n      if (status === 'ok') banner.classList.add('banner-ok');\n      else if (status === 'warn') banner.classList.add('banner-warn');\n      else banner.classList.add('banner-risk');\n      el('statusTitle').textContent = title;\n      el('statusDetail').textContent = detail;\n    }\n\n    function updateLabels() {\n      const L = lenUnit(), T = tempUnit(), F = forceUnit(), C = clearUnit(), A = alphaUnit();\n      el('lbl_d').textContent = `(${L})`;\n      el('lbl_D').textContent = `(${L})`;\n      el('lbl_dm').textContent = `(${L})`;\n      el('lbl_delta0').textContent = `(${C})`;\n      el('lbl_deltaDi').textContent = `(${L})`;\n      el('lbl_deltaDo').textContent = `(${L})`;\n      el('lbl_Ts').textContent = `(${T})`;\n      el('lbl_Th').textContent = `(${T})`;\n      el('lbl_Ta').textContent = `(${T})`;\n      el('lbl_as').textContent = `(${A})`;\n      el('lbl_ab').textContent = `(${A})`;\n      el('lbl_ah').textContent = `(${A})`;\n      el('lbl_Fr').textContent = `(${F})`;\n      el('lbl_dTUnit').textContent = `(${T === '\u00b0C' ? '\u00b0C' : '\u00b0F'})`;\n      el('unitBadge').textContent = state.unit === 'metric'\n        ? 'Metric \u00b7 mm \u00b7 \u00b0C \u00b7 N \u00b7 \u03bcm'\n        : 'Imperial \u00b7 in \u00b7 \u00b0F \u00b7 lbf \u00b7 \u03bcin';\n    }\n\n    function updateGuidance(inp, r) {\n      const list = el('guidanceList');\n      const items = [];\n      const des = inp.designation || 'bearing';\n      items.push(`Selected ${des} (${el('bearingType').selectedOptions[0].text}) with ${el('useCustomDelta0').checked ? 'custom' : state.clearanceClass} initial clearance.`);\n      items.push(`Fit reduction \u0394fit = 0.8\u00b7\u0394di + 0.7\u00b7\u0394Do = ${fmtClear(r.deltaFit_um)} (shaft ${fmtClear(r.dDi_eff * 1000)} + housing ${fmtClear(r.dDo_eff * 1000)}).`);\n      items.push(`Thermal reduction \u0394t = \u03b1b\u00b7dm\u00b7(Ts\u2212Th) = ${fmtClear(r.deltaT_um)} at \u0394T = ${fmt(tempDeltaDisplay(r.dT), 1)} ${state.unit === 'metric' ? '\u00b0C' : '\u00b0F'}.`);\n      if (r.deltaEff_um < r.minTarget_um) {\n        items.push('Recommendation: step up one clearance class, reduce shaft interference, or improve housing cooling to raise \u0394eff.');\n      } else if (r.deltaEff_um > r.maxTarget_um) {\n        items.push('Recommendation: consider CN\/C2 if vibration is critical, or verify that high clearance is intentional (thermal growth allowance).');\n      } else {\n        items.push('Recommendation: current clearance class is appropriate for the entered fit and thermal conditions.');\n      }\n      if (inp.rpm > 0 && inp.dm > 0) {\n        const nDm = inp.rpm * inp.dm;\n        if (nDm > 500000) items.push(`Speed factor n\u00b7dm \u2248 ${fmt(nDm, 0)} \u2014 high-speed regime; prefer larger operating clearance and low-friction grease.`);\n      }\n      list.innerHTML = items.map(t => `<li>${t}<\/li>`).join('');\n    }\n\n    function tempDeltaDisplay(dT_C) {\n      return state.unit === 'metric' ? dT_C : dT_C * 9 \/ 5;\n    }\n    function tempDeltaFromDisplay(v) {\n      return state.unit === 'metric' ? v : v * 5 \/ 9;\n    }\n\n    function fillDetailTable(inp, r) {\n      const rows = [\n        ['Bore diameter', 'd', `${fmt(lenToDisplay(inp.d), 4)} ${lenUnit()}`, inp.designation || '\u2014'],\n        ['Outside diameter', 'D', `${fmt(lenToDisplay(inp.D), 4)} ${lenUnit()}`, ''],\n        ['Pitch diameter', 'dm', `${fmt(lenToDisplay(inp.dm), 4)} ${lenUnit()}`, '(d+D)\/2'],\n        ['Initial clearance', '\u03940', fmtClear(r.delta0_um), el('useCustomDelta0').checked ? 'Custom' : state.clearanceClass],\n        ['Shaft interference', '\u0394di', `${fmt(lenToDisplay(inp.deltaDi), 4)} ${lenUnit()}`, 'press fit'],\n        ['Housing interference', '\u0394Do', `${fmt(lenToDisplay(inp.deltaDo), 4)} ${lenUnit()}`, ''],\n        ['Inner ring expansion', '0.8\u00b7\u0394di', fmtClear(r.dDi_eff * 1000), 'solid steel shaft'],\n        ['Outer ring contraction', '0.7\u00b7\u0394Do', fmtClear(r.dDo_eff * 1000), 'steel housing'],\n        ['Fit reduction', '\u0394fit', fmtClear(r.deltaFit_um), 'sum of fit effects'],\n        ['Shaft temperature', 'Ts', `${fmt(tempToDisplay(inp.Ts), 1)} ${tempUnit()}`, ''],\n        ['Housing temperature', 'Th', `${fmt(tempToDisplay(inp.Th), 1)} ${tempUnit()}`, ''],\n        ['Temperature difference', '\u0394T', `${fmt(tempDeltaDisplay(r.dT), 1)} ${state.unit === 'metric' ? '\u00b0C' : '\u00b0F'}`, 'Ts \u2212 Th'],\n        ['Bearing expansion coeff.', '\u03b1b', `${fmt(alphaToDisplay(inp.alphaB) * 1e6, 2)} \u00d710\u207b\u2076 ${alphaUnit()}`, '100Cr6 default'],\n        ['Thermal reduction', '\u0394t', fmtClear(r.deltaT_um), '\u03b1b\u00b7dm\u00b7\u0394T'],\n        ['Radial load', 'Fr', `${fmt(forceToDisplay(inp.Fr), 1)} ${forceUnit()}`, ''],\n        ['Elastic recovery', '\u0394f', fmtClear(r.deltaF_um), 'Hertzian estimate'],\n        ['Operating clearance', '\u0394eff', fmtClear(r.deltaEff_um), '\u03940 \u2212 \u0394fit \u2212 \u0394t + \u0394f'],\n        ['Target band min', '0.0002\u00b7dm', fmtClear(r.minTarget_um), 'optimal lower'],\n        ['Target band max', '0.0006\u00b7dm', fmtClear(r.maxTarget_um), 'optimal upper']\n      ];\n      el('detailTable').innerHTML = rows.map(([p, s, v, n]) =>\n        `<tr class=\"hover:bg-slate-50\">\n          <td class=\"px-4 py-2 text-slate-700\">${p}<\/td>\n          <td class=\"px-4 py-2 text-slate-500\">${s}<\/td>\n          <td class=\"px-4 py-2 font-medium text-slate-900\">${v}<\/td>\n          <td class=\"px-4 py-2 text-slate-400\">${n}<\/td>\n        <\/tr>`\n      ).join('');\n    }\n\n    function updateBreakdownChart(r) {\n      const remaining = Math.max(0, r.deltaEff_um);\n      const fit = Math.max(0, r.deltaFit_um);\n      const thermal = Math.max(0, r.deltaT_um);\n      const load = Math.max(0, r.deltaF_um);\n      \/\/ Stacked: show composition relative to \u03940 path\n      \/\/ Visual: Fit reduction | Thermal reduction | Remaining (or preload gap)\n      const labels = ['Clearance path'];\n      const toDisp = (um) => clearToDisplay_um(um);\n\n      const dataFit = [toDisp(fit)];\n      const dataTherm = [toDisp(thermal)];\n      const dataRem = [toDisp(Math.max(0, r.delta0_um - fit - thermal))];\n      \/\/ Load adds back \u2014 show as separate positive overlay concept via annotation in remaining\n\n      if (breakdownChart) {\n        breakdownChart.data.datasets[0].data = dataFit;\n        breakdownChart.data.datasets[1].data = dataTherm;\n        breakdownChart.data.datasets[2].data = dataRem;\n        breakdownChart.options.scales.x.title.text = clearUnit();\n        breakdownChart.update('none');\n        return;\n      }\n\n      const ctx = el('breakdownChart').getContext('2d');\n      breakdownChart = new Chart(ctx, {\n        type: 'bar',\n        data: {\n          labels,\n          datasets: [\n            { label: '\u0394fit (fit)', data: dataFit, backgroundColor: '#f59e0b', borderSkipped: false },\n            { label: '\u0394t (thermal)', data: dataTherm, backgroundColor: '#ef4444', borderSkipped: false },\n            { label: 'Residual before +\u0394f', data: dataRem, backgroundColor: '#22c55e', borderSkipped: false }\n          ]\n        },\n        options: {\n          indexAxis: 'y',\n          responsive: true,\n          maintainAspectRatio: false,\n          plugins: {\n            legend: { position: 'bottom', labels: { boxWidth: 12, font: { size: 11 } } },\n            tooltip: {\n              callbacks: {\n                label: (ctx) => `${ctx.dataset.label}: ${fmt(ctx.raw, 2)} ${clearUnit()}`\n              }\n            }\n          },\n          scales: {\n            x: {\n              stacked: true,\n              title: { display: true, text: clearUnit() },\n              grid: { color: '#e2e8f0' }\n            },\n            y: { stacked: true, grid: { display: false } }\n          }\n        }\n      });\n    }\n\n    function updateSensitivityChart(inp) {\n      const dTDisp = [];\n      const effDisp = [];\n      const minBand = [];\n      const maxBand = [];\n      const r0 = compute(inp);\n      const minT = state.unit === 'metric' ? -20 : -36;\n      const maxT = state.unit === 'metric' ? 80 : 144;\n      const step = state.unit === 'metric' ? 2 : 4;\n\n      for (let t = minT; t <= maxT; t += step) {\n        const dT_C = tempDeltaFromDisplay(t);\n        const rr = compute(inp, dT_C);\n        dTDisp.push(t);\n        effDisp.push(clearToDisplay_um(rr.deltaEff_um));\n        minBand.push(clearToDisplay_um(rr.minTarget_um));\n        maxBand.push(clearToDisplay_um(rr.maxTarget_um));\n      }\n\n      const currentDT = tempDeltaDisplay(el('dTSlider').dataset.locked === '1'\n        ? tempDeltaFromDisplay(num('dTSlider') || parseFloat(el('dTSlider').value))\n        : (inp.Ts - inp.Th));\n\n      \/\/ Sync slider range labels\n      el('dTSlider').min = minT;\n      el('dTSlider').max = maxT;\n\n      if (sensitivityChart) {\n        sensitivityChart.data.labels = dTDisp;\n        sensitivityChart.data.datasets[0].data = effDisp;\n        sensitivityChart.data.datasets[1].data = minBand;\n        sensitivityChart.data.datasets[2].data = maxBand;\n        sensitivityChart.options.scales.x.title.text = `\u0394T (${state.unit === 'metric' ? '\u00b0C' : '\u00b0F'})`;\n        sensitivityChart.options.scales.y.title.text = `\u0394eff (${clearUnit()})`;\n        sensitivityChart.update('none');\n        return;\n      }\n\n      const ctx = el('sensitivityChart').getContext('2d');\n      sensitivityChart = new Chart(ctx, {\n        type: 'line',\n        data: {\n          labels: dTDisp,\n          datasets: [\n            {\n              label: '\u0394eff',\n              data: effDisp,\n              borderColor: '#0284c7',\n              backgroundColor: 'rgba(14,165,233,0.12)',\n              fill: true,\n              tension: 0.2,\n              pointRadius: 0,\n              borderWidth: 2\n            },\n            {\n              label: 'Min target',\n              data: minBand,\n              borderColor: '#86efac',\n              borderDash: [6, 4],\n              pointRadius: 0,\n              borderWidth: 1.5,\n              fill: false\n            },\n            {\n              label: 'Max target',\n              data: maxBand,\n              borderColor: '#fcd34d',\n              borderDash: [6, 4],\n              pointRadius: 0,\n              borderWidth: 1.5,\n              fill: false\n            }\n          ]\n        },\n        options: {\n          responsive: true,\n          maintainAspectRatio: false,\n          interaction: { mode: 'index', intersect: false },\n          plugins: {\n            legend: { position: 'bottom', labels: { boxWidth: 12, font: { size: 11 } } },\n            tooltip: {\n              callbacks: {\n                label: (ctx) => `${ctx.dataset.label}: ${fmt(ctx.raw, 2)} ${clearUnit()}`\n              }\n            }\n          },\n          scales: {\n            x: {\n              title: { display: true, text: `\u0394T (${state.unit === 'metric' ? '\u00b0C' : '\u00b0F'})` },\n              grid: { color: '#e2e8f0' }\n            },\n            y: {\n              title: { display: true, text: `\u0394eff (${clearUnit()})` },\n              grid: { color: '#e2e8f0' }\n            }\n          }\n        }\n      });\n    }\n\n    function calculate() {\n      if (state.syncing) return;\n      const inp = getMetricInputs();\n      const type = inp.type;\n      const range = lookupClearanceRange(type, inp.d, state.clearanceClass);\n      updateClassRangeInfo(range);\n\n      \/\/ Slider: if user is dragging, use slider \u0394T; else sync from Ts-Th\n      let dT_override;\n      if (el('dTSlider').dataset.user === '1') {\n        dT_override = tempDeltaFromDisplay(parseFloat(el('dTSlider').value));\n      }\n\n      const r = compute(inp, dT_override);\n\n      \/\/ Metrics\n      el('m_delta0').textContent = fmtClear(r.delta0_um);\n      el('m_deltaFit').textContent = fmtClear(r.deltaFit_um);\n      el('m_deltaT').textContent = fmtClear(r.deltaT_um);\n      el('m_deltaF').textContent = fmtClear(r.deltaF_um);\n      el('m_deltaEff').textContent = fmtClear(r.deltaEff_um);\n      el('bannerDeltaEff').textContent = fmtClear(r.deltaEff_um);\n      el('targetBand').textContent = `${fmtClear(r.minTarget_um)} \u2026 ${fmtClear(r.maxTarget_um)}`;\n\n      el('eqExpanded').textContent =\n        `= ${fmt(clearToDisplay_um(r.delta0_um), 2)} \u2212 ${fmt(clearToDisplay_um(r.deltaFit_um), 2)} \u2212 ${fmt(clearToDisplay_um(r.deltaT_um), 2)} + ${fmt(clearToDisplay_um(r.deltaF_um), 2)} = ${fmt(clearToDisplay_um(r.deltaEff_um), 2)} ${clearUnit()}`;\n\n      setBanner(r.status, r.title, r.detail);\n      fillDetailTable(inp, r);\n      updateGuidance(inp, r);\n      updateBreakdownChart(r);\n      updateSensitivityChart(inp);\n\n      \/\/ Sync slider display unless user is actively exploring\n      if (el('dTSlider').dataset.user !== '1') {\n        const dTDisp = tempDeltaDisplay(inp.Ts - inp.Th);\n        el('dTSlider').value = Math.round(dTDisp);\n        el('dTValue').textContent = fmt(dTDisp, 0);\n      } else {\n        el('dTValue').textContent = el('dTSlider').value;\n      }\n    }\n\n    \/* ---- Unit switch: convert displayed field values ---- *\/\n    function readMetricSnapshot() {\n      return getMetricInputs();\n    }\n\n    function writeDisplayFromMetric(m, cls) {\n      state.syncing = true;\n      el('bearingType').value = m.type || el('bearingType').value;\n      el('designation').value = m.designation ?? el('designation').value;\n      el('d').value = fmt(lenToDisplay(m.d), 4);\n      el('D').value = fmt(lenToDisplay(m.D), 4);\n      el('dm').value = fmt(lenToDisplay(m.dm), 4);\n      el('delta0').value = fmt(clearToDisplay_um(m.delta0_um), 2);\n      el('deltaDi').value = fmt(lenToDisplay(m.deltaDi), 5);\n      el('deltaDo').value = fmt(lenToDisplay(m.deltaDo), 5);\n      el('Ts').value = fmt(tempToDisplay(m.Ts), 1);\n      el('Th').value = fmt(tempToDisplay(m.Th), 1);\n      el('Ta').value = fmt(tempToDisplay(m.Ta), 1);\n      el('alphaS').value = alphaToDisplay(m.alphaS);\n      el('alphaB').value = alphaToDisplay(m.alphaB);\n      el('alphaH').value = alphaToDisplay(m.alphaH);\n      el('Fr').value = fmt(forceToDisplay(m.Fr), 2);\n      el('rpm').value = m.rpm;\n      if (cls) state.clearanceClass = cls;\n      state.syncing = false;\n      updateLabels();\n      updateClassButtons();\n    }\n\n    function switchUnit(next) {\n      if (next === state.unit) return;\n      const snap = readMetricSnapshot();\n      const custom = el('useCustomDelta0').checked;\n      const cls = state.clearanceClass;\n      state.unit = next;\n      ROOT.querySelectorAll('.unit-btn').forEach(b => {\n        b.classList.toggle('is-active', b.dataset.unit === next);\n      });\n      el('dTSlider').dataset.user = '0';\n      writeDisplayFromMetric(snap, cls);\n      el('useCustomDelta0').checked = custom;\n      el('delta0').disabled = !custom;\n      updateClassButtons();\n      if (!el('resultsSection').classList.contains('hidden')) calculate();\n    }\n\n    function loadDemo() {\n      state.unit = 'metric';\n      state.clearanceClass = DEMO.clearanceClass;\n      el('useCustomDelta0').checked = false;\n      el('delta0').disabled = true;\n      el('lockDm').checked = false;\n      el('dTSlider').dataset.user = '0';\n      el('resultsSection').classList.add('hidden');\n      ROOT.querySelectorAll('.unit-btn').forEach(b => {\n        b.classList.toggle('is-active', b.dataset.unit === 'metric');\n      });\n      writeDisplayFromMetric({\n        type: DEMO.bearingType,\n        designation: DEMO.designation,\n        d: DEMO.d,\n        D: DEMO.D,\n        dm: DEMO.dm,\n        delta0_um: DEMO.delta0_um,\n        deltaDi: DEMO.deltaDi,\n        deltaDo: DEMO.deltaDo,\n        Ts: DEMO.Ts,\n        Th: DEMO.Th,\n        Ta: DEMO.Ta,\n        alphaS: DEMO.alphaS,\n        alphaB: DEMO.alphaB,\n        alphaH: DEMO.alphaH,\n        Fr: DEMO.Fr,\n        rpm: DEMO.rpm\n      }, DEMO.clearanceClass);\n      \/\/ Ensure class mean matches table for 6310\n      applyClassMeanToDelta0();\n    }\n\n    function autoDm() {\n      if (el('lockDm').checked) return;\n      const d = num('d');\n      const D = num('D');\n      if (Number.isFinite(d) && Number.isFinite(D)) {\n        state.syncing = true;\n        el('dm').value = fmt((d + D) \/ 2, 4);\n        state.syncing = false;\n      }\n    }\n\n    \/* ---- Event wiring ---- *\/\n    function bindEvents() {\n      const ids = ['bearingType', 'designation', 'd', 'D', 'dm', 'delta0', 'deltaDi', 'deltaDo',\n        'Ts', 'Th', 'Ta', 'alphaS', 'alphaB', 'alphaH', 'Fr', 'rpm'];\n      ids.forEach(id => {\n        el(id).addEventListener('input', () => {\n          if (id === 'd' || id === 'D') autoDm();\n          if (id === 'Ts' || id === 'Th') el('dTSlider').dataset.user = '0';\n          if ((id === 'd' || id === 'bearingType') && !el('useCustomDelta0').checked) {\n            applyClassMeanToDelta0();\n          }\n        });\n      });\n\n      el('lockDm').addEventListener('change', () => { if (!el('lockDm').checked) autoDm(); });\n\n      el('useCustomDelta0').addEventListener('change', () => {\n        const custom = el('useCustomDelta0').checked;\n        el('delta0').disabled = !custom;\n        updateClassButtons();\n        if (!custom) applyClassMeanToDelta0();\n      });\n\n      el('btnMetric').addEventListener('click', () => switchUnit('metric'));\n      el('btnImperial').addEventListener('click', () => switchUnit('imperial'));\n      el('btnReset').addEventListener('click', loadDemo);\n      el('btnCalculate').addEventListener('click', () => {\n        el('dTSlider').dataset.user = '0';\n        el('resultsSection').classList.remove('hidden');\n        calculate();\n        \/\/ Charts created while hidden can have zero size \u2014 resize after reveal\n        requestAnimationFrame(() => {\n          breakdownChart?.resize();\n          sensitivityChart?.resize();\n          el('resultsSection').scrollIntoView({ behavior: 'smooth', block: 'start' });\n        });\n      });\n\n      el('dTSlider').addEventListener('input', () => {\n        el('dTSlider').dataset.user = '1';\n        el('dTValue').textContent = el('dTSlider').value;\n        const inp = getMetricInputs();\n        const dT_C = tempDeltaFromDisplay(parseFloat(el('dTSlider').value));\n        state.syncing = true;\n        el('Ts').value = fmt(tempToDisplay(inp.Th + dT_C), 1);\n        state.syncing = false;\n        calculate();\n      });\n    }\n\n    \/\/ Init\n    buildClassButtons();\n    bindEvents();\n    loadDemo();\n  })();\n  <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Bearing Internal Clearance Selection &amp; Calculation Tool is a practical engineering solution designed to help users select and calculate the appropriate internal clearance for&#8230;<\/p>","protected":false},"author":2,"featured_media":24647,"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":[8520],"tags":[8578,8576,8579,8577],"class_list":["post-24629","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-bearing-clearance","tag-bearing-selection","tag-clearance-calculation","tag-internal-clearance","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Bearing-Internal-Clearance-Selection-Calculation-Tool.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/comments?post=24629"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24629\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media\/24647"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media?parent=24629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/categories?post=24629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/tags?post=24629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}