{"id":24666,"date":"2026-08-18T01:06:55","date_gmt":"2026-08-18T01:06:55","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24666"},"modified":"2026-08-18T01:20:32","modified_gmt":"2026-08-18T01:20:32","slug":"bearing-lubrication-method-selection-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/es\/bearing-lubrication-method-selection-calculator\/","title":{"rendered":"Bearing Lubrication Method Selection Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Bearing Lubrication Method Selection Calculator<\/strong> is an efficient engineering tool designed to help users choose the most suitable lubrication method for different bearing applications. By analyzing factors such as bearing type, operating speed, load conditions, temperature, and working environment, this calculator assists engineers in selecting the right lubrication solution, including grease or oil lubrication. The Bearing Lubrication Method Selection Calculator helps improve bearing performance, reduce friction and wear, extend service life, and ensure reliable operation of industrial machinery.<\/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  <meta name=\"description\" content=\"Select rolling-element bearing lubrication method from dn factor, viscosity ratio \u03ba, temperature and speed. Grease, oil bath, forced circulation and oil-air recommendations with relubrication interval.\" \/>\n  <title>Bearing Lubrication Method Selection Calculator | dn Factor \u00b7 \u03ba Ratio<\/title>\n  <style id=\"blms-calc-styles\">\n    \/*\n     * WordPress-safe: every rule is scoped under #blms-root.\n     * This stylesheet must not restyle theme header, footer, or content\n     * outside the calculator. No body\/html\/universal selectors.\n     *\/\n    #blms-root {\n      all: revert;\n      --blms-bg: transparent;\n      --blms-surface: #ffffff;\n      --blms-surface-2: #f1f5f9;\n      --blms-ink: #0f172a;\n      --blms-muted: #64748b;\n      --blms-line: #e2e8f0;\n      --blms-steel: #1e293b;\n      --blms-accent: #2563eb;\n      --blms-accent-soft: rgba(37, 99, 235, 0.12);\n      --blms-amber: #d97706;\n      --blms-amber-bright: #f59e0b;\n      --blms-amber-soft: rgba(217, 119, 6, 0.12);\n      --blms-teal: #0d9488;\n      --blms-teal-soft: rgba(13, 148, 136, 0.12);\n      --blms-ok: #16a34a;\n      --blms-ok-bg: #dcfce7;\n      --blms-warn: #eab308;\n      --blms-warn-ink: #a16207;\n      --blms-warn-bg: #fef9c3;\n      --blms-alert: #dc2626;\n      --blms-alert-bg: #fee2e2;\n      --blms-radius: 12px;\n      --blms-shadow: 0 1px 2px rgba(15, 23, 42, 0.05), 0 8px 24px rgba(15, 23, 42, 0.06);\n      --blms-mono: ui-monospace, \"Cascadia Mono\", \"Segoe UI Mono\", Consolas, monospace;\n      --blms-sans: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, Roboto, Helvetica, Arial, sans-serif;\n      --blms-serif-math: \"Cambria Math\", Cambria, \"Times New Roman\", serif;\n\n      box-sizing: border-box;\n      display: block;\n      isolation: isolate;\n      contain: layout style;\n      font-family: var(--blms-sans);\n      font-size: 15px;\n      font-weight: 400;\n      line-height: 1.5;\n      color: var(--blms-ink);\n      background: var(--blms-bg);\n      width: 1000px;\n      max-width: 100%;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n      text-align: left;\n      letter-spacing: normal;\n      text-transform: none;\n      float: none;\n      position: relative;\n      z-index: 1;\n    }\n\n    #blms-root *,\n    #blms-root *::before,\n    #blms-root *::after { box-sizing: border-box; }\n\n    #blms-root h1, #blms-root h2, #blms-root h3, #blms-root h4,\n    #blms-root p, #blms-root ul, #blms-root ol, #blms-root li,\n    #blms-root figure, #blms-root blockquote, #blms-root section,\n    #blms-root header, #blms-root footer, #blms-root div, #blms-root span,\n    #blms-root strong, #blms-root em, #blms-root i, #blms-root b {\n      margin: 0;\n      padding: 0;\n      border: none;\n      background: none;\n      box-shadow: none;\n      font-family: inherit;\n      font-size: inherit;\n      font-weight: inherit;\n      font-style: inherit;\n      line-height: inherit;\n      color: inherit;\n      letter-spacing: inherit;\n      text-transform: none;\n      text-decoration: none;\n      float: none;\n    }\n\n    #blms-root button, #blms-root input, #blms-root select, #blms-root textarea, #blms-root label {\n      font: inherit;\n      color: inherit;\n      margin: 0;\n      max-width: none;\n      min-width: 0;\n      float: none;\n    }\n\n    #blms-root button {\n      cursor: pointer;\n      background: transparent;\n      border: none;\n      padding: 0;\n      box-shadow: none;\n      text-decoration: none;\n      appearance: none;\n      -webkit-appearance: none;\n    }\n\n    #blms-root img, #blms-root svg, #blms-root video {\n      display: block;\n      max-width: 100%;\n      height: auto;\n    }\n    #blms-root canvas { display: block; max-width: 100%; }\n    #blms-root a { color: inherit; text-decoration: none; }\n    #blms-root table { border-collapse: collapse; border-spacing: 0; width: auto; }\n    #blms-root .blms-mono { font-family: var(--blms-mono); }\n    #blms-root .blms-sym { font-family: var(--blms-serif-math); font-style: italic; }\n    #blms-root sub, #blms-root sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\n    #blms-root sub { bottom: -0.2em; }\n    #blms-root sup { top: -0.45em; }\n\n    #blms-root .blms-stack {\n      display: flex;\n      flex-direction: column;\n      gap: 1.1rem;\n    }\n\n    #blms-root .blms-card {\n      background: var(--blms-surface);\n      border: 1px solid var(--blms-line);\n      border-radius: var(--blms-radius);\n      box-shadow: var(--blms-shadow);\n      overflow: hidden;\n    }\n\n    #blms-root .blms-card-head {\n      display: flex;\n      align-items: center;\n      gap: 0.55rem;\n      padding: 0.85rem 1.15rem;\n      background: var(--blms-surface-2);\n      border-bottom: 1px solid var(--blms-line);\n      font-size: 0.72rem;\n      font-weight: 700;\n      letter-spacing: 0.08em;\n      text-transform: uppercase;\n      color: var(--blms-steel);\n      min-width: 0;\n      max-width: 100%;\n      overflow-wrap: anywhere;\n      word-break: break-word;\n    }\n\n    #blms-root .blms-card-head svg { flex-shrink: 0; color: var(--blms-accent); }\n    #blms-root .blms-card-body { padding: 1.1rem 1.15rem 1.25rem; min-width: 0; }\n\n    #blms-root .blms-presets {\n      display: grid;\n      grid-template-columns: 1fr 1fr 1fr 1fr;\n      gap: 0.5rem;\n      margin-bottom: 1.15rem;\n    }\n\n    #blms-root .blms-preset {\n      appearance: none !important;\n      -webkit-appearance: none !important;\n      text-align: left !important;\n      padding: 0.65rem 0.7rem !important;\n      border: 1px solid var(--blms-line) !important;\n      border-radius: 8px !important;\n      background: var(--blms-surface-2) !important;\n      color: var(--blms-ink) !important;\n      box-shadow: none !important;\n      text-transform: none !important;\n      text-decoration: none !important;\n      line-height: 1.3 !important;\n      font-family: inherit !important;\n      cursor: pointer !important;\n      transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;\n    }\n\n    #blms-root .blms-preset:hover { border-color: var(--blms-accent) !important; }\n    #blms-root .blms-preset.is-active {\n      background: var(--blms-accent-soft) !important;\n      border-color: var(--blms-accent) !important;\n      box-shadow: 0 0 0 3px var(--blms-accent-soft) !important;\n    }\n\n    #blms-root .blms-preset strong {\n      display: block;\n      font-size: 0.78rem;\n      font-weight: 650;\n      color: var(--blms-ink);\n      line-height: 1.3;\n    }\n\n    #blms-root .blms-preset span {\n      display: block;\n      margin-top: 0.15rem;\n      font-size: 0.68rem;\n      color: var(--blms-muted);\n      font-family: var(--blms-mono);\n    }\n\n    #blms-root .blms-group { margin-bottom: 1.15rem; }\n    #blms-root .blms-group:last-child { margin-bottom: 0; }\n\n    #blms-root .blms-group-title {\n      font-size: 0.68rem;\n      font-weight: 700;\n      letter-spacing: 0.07em;\n      text-transform: uppercase;\n      color: var(--blms-amber);\n      margin-bottom: 0.7rem;\n      padding-bottom: 0.4rem;\n      border-bottom: 1px dashed var(--blms-line);\n      min-width: 0;\n      max-width: 100%;\n      overflow-wrap: anywhere;\n      word-break: break-word;\n    }\n\n    #blms-root .blms-fields {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.75rem 0.85rem;\n    }\n\n    #blms-root .blms-field { display: flex; flex-direction: column; gap: 0.32rem; min-width: 0; }\n    #blms-root .blms-field.blms-span-2 { grid-column: 1 \/ -1; }\n\n    #blms-root .blms-label {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      gap: 0.5rem;\n      font-size: 0.8rem;\n      font-weight: 500;\n    }\n\n    #blms-root .blms-unit {\n      color: var(--blms-muted);\n      font-size: 0.72rem;\n      font-weight: 400;\n      font-family: var(--blms-mono);\n      white-space: nowrap;\n    }\n\n    #blms-root .blms-input,\n    #blms-root .blms-select {\n      display: block !important;\n      width: 100% !important;\n      max-width: 100% !important;\n      height: auto !important;\n      min-height: 0 !important;\n      background: var(--blms-surface-2) !important;\n      border: 1px solid var(--blms-line) !important;\n      border-radius: 7px !important;\n      padding: 0.5rem 0.7rem !important;\n      font-size: 0.95rem !important;\n      font-family: inherit !important;\n      color: var(--blms-ink) !important;\n      line-height: 1.4 !important;\n      outline: none !important;\n      box-shadow: none !important;\n      transition: border-color 0.15s, box-shadow 0.15s;\n      -moz-appearance: textfield;\n      appearance: textfield;\n    }\n\n    #blms-root .blms-input::-webkit-outer-spin-button,\n    #blms-root .blms-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }\n\n    #blms-root .blms-input:focus,\n    #blms-root .blms-select:focus {\n      border-color: var(--blms-accent) !important;\n      box-shadow: 0 0 0 3px var(--blms-accent-soft) !important;\n      background: #fff !important;\n    }\n\n    #blms-root .blms-input.is-invalid {\n      border-color: var(--blms-alert) !important;\n      box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.12) !important;\n    }\n\n    #blms-root .blms-chips {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.35rem;\n      margin-top: 0.1rem;\n    }\n\n    #blms-root .blms-chip {\n      appearance: none !important;\n      -webkit-appearance: none !important;\n      font-size: 0.7rem !important;\n      font-weight: 600 !important;\n      font-family: inherit !important;\n      line-height: 1.25 !important;\n      padding: 0.26rem 0.5rem !important;\n      border-radius: 999px !important;\n      border: 1px solid var(--blms-line) !important;\n      background: #fff !important;\n      color: var(--blms-muted) !important;\n      box-shadow: none !important;\n      text-transform: none !important;\n      text-decoration: none !important;\n      cursor: pointer !important;\n      transition: background 0.15s, border-color 0.15s, color 0.15s;\n    }\n\n    #blms-root .blms-chip:hover,\n    #blms-root .blms-chip.is-active {\n      border-color: var(--blms-amber) !important;\n      color: var(--blms-amber) !important;\n      background: var(--blms-amber-soft) !important;\n    }\n\n    #blms-root .blms-hint {\n      font-size: 0.72rem;\n      color: var(--blms-muted);\n      margin-top: 0.12rem;\n    }\n\n    #blms-root .blms-toggle {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.4rem;\n    }\n\n    #blms-root .blms-toggle-btn {\n      appearance: none !important;\n      -webkit-appearance: none !important;\n      padding: 0.45rem 0.55rem !important;\n      border: 1px solid var(--blms-line) !important;\n      border-radius: 7px !important;\n      background: #fff !important;\n      color: var(--blms-muted) !important;\n      font-size: 0.75rem !important;\n      font-weight: 650 !important;\n      font-family: inherit !important;\n      line-height: 1.3 !important;\n      text-align: center !important;\n      cursor: pointer !important;\n      box-shadow: none !important;\n      text-transform: none !important;\n    }\n\n    #blms-root .blms-toggle-btn.is-active {\n      background: var(--blms-accent-soft) !important;\n      border-color: var(--blms-accent) !important;\n      color: var(--blms-accent) !important;\n    }\n\n    #blms-root .blms-dm {\n      margin-top: 0.55rem;\n      padding: 0.5rem 0.7rem;\n      background: var(--blms-accent-soft);\n      border-radius: 7px;\n      font-size: 0.8rem;\n      color: #1d4ed8;\n    }\n\n    #blms-root .blms-hero {\n      display: grid;\n      grid-template-columns: 1.2fr 0.8fr;\n      gap: 0.85rem;\n      margin-bottom: 1rem;\n    }\n\n    #blms-root .blms-reco {\n      padding: 0.95rem 1rem 1.05rem;\n      border-radius: 10px;\n      border: 1px solid var(--blms-line);\n      background: linear-gradient(180deg, #f8fafc, #eef2ff);\n      min-width: 0;\n    }\n\n    #blms-root .blms-kicker {\n      font-size: 0.65rem;\n      font-weight: 700;\n      letter-spacing: 0.08em;\n      text-transform: uppercase;\n      color: var(--blms-muted);\n    }\n\n    #blms-root .blms-reco-title {\n      margin-top: 0.2rem;\n      font-size: 1.12rem;\n      font-weight: 750;\n      letter-spacing: -0.02em;\n      line-height: 1.25;\n      color: var(--blms-steel);\n    }\n\n    #blms-root .blms-reco-note {\n      margin-top: 0.35rem;\n      font-size: 0.78rem;\n      color: var(--blms-muted);\n    }\n\n    #blms-root .blms-reco.is-ok { border-color: #86efac; background: linear-gradient(180deg, #f0fdf4, #dcfce7); }\n    #blms-root .blms-reco.is-ok .blms-reco-title { color: #166534; }\n    #blms-root .blms-reco.is-warn { border-color: #fcd34d; background: linear-gradient(180deg, #fffbeb, #fef3c7); }\n    #blms-root .blms-reco.is-warn .blms-reco-title { color: #92400e; }\n    #blms-root .blms-reco.is-alert { border-color: #fca5a5; background: linear-gradient(180deg, #fef2f2, #fee2e2); }\n    #blms-root .blms-reco.is-alert .blms-reco-title { color: #991b1b; }\n\n    #blms-root .blms-kappa-card {\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      gap: 0.3rem;\n      padding: 0.9rem 0.95rem;\n      border-radius: 10px;\n      border: 1px solid transparent;\n      min-width: 0;\n    }\n\n    #blms-root .blms-kappa-card.is-ok { background: var(--blms-ok-bg); border-color: #86efac; color: #166534; }\n    #blms-root .blms-kappa-card.is-warn { background: var(--blms-warn-bg); border-color: #fde047; color: #854d0e; }\n    #blms-root .blms-kappa-card.is-alert { background: var(--blms-alert-bg); border-color: #fca5a5; color: #991b1b; }\n\n    #blms-root .blms-kappa-value {\n      font-family: var(--blms-mono);\n      font-size: 1.85rem;\n      font-weight: 750;\n      letter-spacing: -0.04em;\n      line-height: 1.05;\n      font-variant-numeric: tabular-nums;\n    }\n\n    #blms-root .blms-kappa-card p { font-size: 0.74rem; opacity: 0.95; }\n\n    #blms-root .blms-metrics {\n      display: grid;\n      grid-template-columns: repeat(4, 1fr);\n      gap: 0.55rem;\n      margin-bottom: 1rem;\n    }\n\n    #blms-root .blms-metric {\n      padding: 0.65rem 0.7rem;\n      background: var(--blms-surface-2);\n      border: 1px solid var(--blms-line);\n      border-radius: 9px;\n      min-width: 0;\n    }\n\n    #blms-root .blms-metric .blms-lbl {\n      font-size: 0.62rem;\n      font-weight: 700;\n      letter-spacing: 0.06em;\n      text-transform: uppercase;\n      color: var(--blms-muted);\n    }\n\n    #blms-root .blms-metric .blms-val {\n      margin-top: 0.12rem;\n      font-family: var(--blms-mono);\n      font-size: 0.98rem;\n      font-weight: 650;\n      font-variant-numeric: tabular-nums;\n      word-break: break-all;\n    }\n\n    #blms-root .blms-metric .blms-sub {\n      font-size: 0.65rem;\n      color: var(--blms-muted);\n      margin-top: 0.08rem;\n    }\n\n    #blms-root .blms-gauge-block { margin-bottom: 1rem; }\n    #blms-root .blms-gauge-head {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      gap: 0.5rem;\n      margin-bottom: 0.4rem;\n      font-size: 0.72rem;\n      color: var(--blms-muted);\n      min-width: 0;\n    }\n\n    #blms-root .blms-gauge-head span {\n      min-width: 0;\n      overflow-wrap: anywhere;\n      word-break: break-word;\n    }\n\n    #blms-root .blms-gauge-head strong { color: var(--blms-ink); font-weight: 650; }\n\n    #blms-root .blms-gauge-track {\n      position: relative;\n      height: 14px;\n      border-radius: 999px;\n      background: linear-gradient(90deg,\n        #16a34a 0%, #16a34a 25%,\n        #eab308 25%, #eab308 41.67%,\n        #d97706 41.67%, #d97706 66.67%,\n        #2563eb 66.67%, #2563eb 100%);\n      box-shadow: inset 0 1px 2px rgba(15, 23, 42, 0.15);\n    }\n\n    #blms-root .blms-gauge-marker {\n      position: absolute;\n      top: -5px;\n      width: 4px;\n      height: 24px;\n      margin-left: -2px;\n      background: var(--blms-ink);\n      border-radius: 2px;\n      box-shadow: 0 0 0 2px #fff;\n      transition: left 0.25s ease;\n    }\n\n    #blms-root .blms-gauge-ticks {\n      display: flex;\n      justify-content: space-between;\n      margin-top: 0.32rem;\n      font-size: 0.62rem;\n      color: var(--blms-muted);\n      font-family: var(--blms-mono);\n    }\n\n    #blms-root .blms-kappa-track {\n      position: relative;\n      height: 10px;\n      border-radius: 999px;\n      background: linear-gradient(90deg,\n        #dc2626 0%, #dc2626 16.67%,\n        #16a34a 16.67%, #16a34a 66.67%,\n        #eab308 66.67%, #eab308 100%);\n      box-shadow: inset 0 1px 2px rgba(15, 23, 42, 0.12);\n      margin-top: 0.55rem;\n    }\n\n    #blms-root .blms-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n\n    #blms-root .blms-table {\n      width: 100%;\n      min-width: 560px;\n      font-size: 0.8rem;\n    }\n\n    #blms-root .blms-table th {\n      text-align: left;\n      font-size: 0.65rem;\n      font-weight: 700;\n      letter-spacing: 0.06em;\n      text-transform: uppercase;\n      color: var(--blms-muted);\n      padding: 0.45rem 0.55rem;\n      border-bottom: 1px solid var(--blms-line);\n      background: var(--blms-surface-2);\n    }\n\n    #blms-root .blms-table td {\n      padding: 0.62rem 0.55rem;\n      border-bottom: 1px solid var(--blms-line);\n      vertical-align: top;\n      color: var(--blms-ink);\n    }\n\n    #blms-root .blms-table tr.is-pick td { background: rgba(37, 99, 235, 0.06); }\n    #blms-root .blms-table .blms-mname { font-weight: 650; }\n\n    #blms-root .blms-badge {\n      display: inline-block;\n      font-size: 0.65rem;\n      font-weight: 700;\n      letter-spacing: 0.02em;\n      padding: 0.18rem 0.45rem;\n      border-radius: 999px;\n      white-space: nowrap;\n    }\n\n    #blms-root .blms-badge.rec { background: var(--blms-ok-bg); color: #166534; }\n    #blms-root .blms-badge.acc { background: var(--blms-warn-bg); color: #854d0e; }\n    #blms-root .blms-badge.nr { background: var(--blms-surface-2); color: var(--blms-muted); }\n    #blms-root .blms-badge.no { background: var(--blms-alert-bg); color: #991b1b; }\n\n    #blms-root .blms-split {\n      display: grid;\n      grid-template-columns: 1.05fr 0.95fr;\n      gap: 1.1rem;\n      align-items: start;\n    }\n\n    #blms-root .blms-split > .blms-group { min-width: 0; }\n\n    #blms-root .blms-tf-value {\n      display: flex;\n      align-items: baseline;\n      gap: 0.35rem;\n      margin: 0.2rem 0 0.35rem;\n    }\n\n    #blms-root .blms-tf-value .blms-num {\n      font-family: var(--blms-mono);\n      font-size: 2.1rem;\n      font-weight: 750;\n      letter-spacing: -0.04em;\n      line-height: 1.05;\n      color: var(--blms-steel);\n    }\n\n    #blms-root .blms-tf-unit { font-size: 0.9rem; color: var(--blms-muted); font-weight: 600; }\n\n    #blms-root .blms-tf-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.5rem;\n      margin-top: 0.7rem;\n    }\n\n    #blms-root .blms-tf-item {\n      padding: 0.55rem 0.65rem;\n      background: var(--blms-surface-2);\n      border-radius: 8px;\n      border: 1px solid var(--blms-line);\n    }\n\n    #blms-root .blms-tf-item .blms-lbl { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--blms-muted); }\n    #blms-root .blms-tf-item .blms-val { font-family: var(--blms-mono); font-weight: 650; margin-top: 0.1rem; }\n\n    #blms-root .blms-chart-wrap {\n      position: relative;\n      height: 280px;\n      max-width: 100%;\n    }\n\n    #blms-root .blms-notes {\n      font-size: 0.75rem;\n      color: var(--blms-muted);\n    }\n\n    #blms-root .blms-notes ul {\n      margin: 0.35rem 0 0 1.1rem;\n      padding: 0;\n    }\n\n    #blms-root .blms-notes li { margin: 0.2rem 0; }\n\n    #blms-root .blms-error {\n      padding: 0.85rem 1rem;\n      background: var(--blms-alert-bg);\n      border: 1px solid #fca5a5;\n      border-radius: 10px;\n      color: #991b1b;\n      font-size: 0.85rem;\n    }\n\n    #blms-root .blms-calc-wrap {\n      display: flex;\n      justify-content: center;\n      margin-top: 0.25rem;\n      padding-top: 1.1rem;\n      border-top: 1px solid var(--blms-line);\n    }\n\n    #blms-root #blmsBtnCalculate.blms-calc-btn {\n      appearance: none !important;\n      -webkit-appearance: none !important;\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      min-width: 220px !important;\n      width: auto !important;\n      max-width: 100% !important;\n      margin: 0 !important;\n      padding: 0.8rem 2.5rem !important;\n      font-size: 1.05rem !important;\n      font-weight: 700 !important;\n      font-family: inherit !important;\n      line-height: 1.25 !important;\n      letter-spacing: 0.02em !important;\n      color: #fff !important;\n      background: var(--blms-accent) !important;\n      border: none !important;\n      border-radius: 8px !important;\n      cursor: pointer !important;\n      box-shadow: 0 1px 2px rgba(37, 99, 235, 0.25) !important;\n      text-decoration: none !important;\n      text-transform: none !important;\n      transition: background 0.15s, transform 0.1s;\n    }\n\n    #blms-root #blmsBtnCalculate.blms-calc-btn:hover { background: #1d4ed8 !important; color: #fff !important; }\n    #blms-root #blmsBtnCalculate.blms-calc-btn:active { transform: scale(0.98); }\n\n    #blms-root .blms-hidden { display: none !important; }\n    #blms-root #resultsCard.blms-visible { display: block !important; }\n\n    #blms-root .chartjs-size-monitor,\n    #blms-root .chartjs-size-monitor-expand,\n    #blms-root .chartjs-size-monitor-shrink {\n      position: absolute;\n      direction: ltr;\n      left: 0;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      overflow: hidden;\n      pointer-events: none;\n      visibility: hidden;\n      z-index: -1;\n    }\n\n    @media (max-width: 840px) {\n      #blms-root .blms-hero,\n      #blms-root .blms-split { grid-template-columns: 1fr; }\n      #blms-root .blms-metrics { grid-template-columns: 1fr 1fr; }\n      #blms-root .blms-presets { grid-template-columns: 1fr 1fr; }\n    }\n\n    @media (max-width: 520px) {\n      #blms-root .blms-fields { grid-template-columns: 1fr; }\n      #blms-root .blms-field.blms-span-2 { grid-column: auto; }\n      #blms-root .blms-presets { grid-template-columns: 1fr; }\n      #blms-root .blms-metrics { grid-template-columns: 1fr 1fr; }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div id=\"blms-root\">\n    <div class=\"blms-stack\">\n      <section class=\"blms-card\">\n        <div class=\"blms-card-head\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 20V10M6 20V4M18 20v-6\"\/><\/svg>\n          Operating Inputs\n        <\/div>\n          <div class=\"blms-card-body\">\n            <div class=\"blms-presets\" id=\"presetRow\"><\/div>\n\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Bearing Dimensions<\/div>\n              <div class=\"blms-fields\">\n                <div class=\"blms-field\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpD\">Inner diameter <span class=\"blms-sym\">d<\/span><\/label>\n                    <span class=\"blms-unit\">mm<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpD\" type=\"number\" min=\"1\" step=\"0.1\" value=\"40\" \/>\n                <\/div>\n                <div class=\"blms-field\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpDout\">Outer diameter <span class=\"blms-sym\">D<\/span><\/label>\n                    <span class=\"blms-unit\">mm<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpDout\" type=\"number\" min=\"2\" step=\"0.1\" value=\"90\" \/>\n                <\/div>\n                <div class=\"blms-field blms-span-2\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpType\">Bearing type<\/label>\n                  <\/div>\n                  <select class=\"blms-select\" id=\"inpType\">\n                    <option value=\"dgb\" selected>Deep Groove Ball<\/option>\n                    <option value=\"acb\">Angular Contact Ball<\/option>\n                    <option value=\"crb\">Cylindrical Roller<\/option>\n                    <option value=\"srb\">Spherical Roller<\/option>\n                    <option value=\"trb\">Tapered Roller<\/option>\n                  <\/select>\n                  <div class=\"blms-dm\" id=\"dmReadout\">Mean diameter d<sub>m<\/sub> = (d + D) \/ 2 = 65.0 mm<\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Operating Conditions<\/div>\n              <div class=\"blms-fields\">\n                <div class=\"blms-field\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpN\">Rotational speed <span class=\"blms-sym\">n<\/span><\/label>\n                    <span class=\"blms-unit\">RPM<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpN\" type=\"number\" min=\"1\" step=\"1\" value=\"1500\" \/>\n                <\/div>\n                <div class=\"blms-field\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpT\">Operating temperature <span class=\"blms-sym\">T<\/span><\/label>\n                    <span class=\"blms-unit\">\u00b0C<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpT\" type=\"number\" min=\"-20\" max=\"250\" step=\"1\" value=\"70\" \/>\n                <\/div>\n                <div class=\"blms-field blms-span-2\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpPC\">Load ratio <span class=\"blms-sym\">P \/ C<\/span><\/label>\n                    <span class=\"blms-unit\">\u2014<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpPC\" type=\"number\" min=\"0.01\" max=\"0.5\" step=\"0.01\" value=\"0.10\" \/>\n                  <p class=\"blms-hint\">Equivalent load over dynamic capacity. Used for grease re-lubrication interval and heavy-load oil preference.<\/p>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Lubricant Properties<\/div>\n              <div class=\"blms-fields\">\n                <div class=\"blms-field blms-span-2\">\n                  <div class=\"blms-label\"><span>Viscosity input mode<\/span><\/div>\n                  <div class=\"blms-toggle\" id=\"viscMode\">\n                    <button type=\"button\" class=\"blms-toggle-btn is-active\" data-mode=\"nu40\">From \u03bd<sub>40<\/sub> + temperature<\/button>\n                    <button type=\"button\" class=\"blms-toggle-btn\" data-mode=\"direct\">Direct operating \u03bd<\/button>\n                  <\/div>\n                <\/div>\n                <div class=\"blms-field\" id=\"fieldNu40\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpNu40\">Kinematic viscosity <span class=\"blms-sym\">\u03bd<sub>40<\/sub><\/span><\/label>\n                    <span class=\"blms-unit\">cSt<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpNu40\" type=\"number\" min=\"2\" step=\"1\" value=\"100\" \/>\n                  <div class=\"blms-chips\" id=\"isoChips\"><\/div>\n                <\/div>\n                <div class=\"blms-field\" id=\"fieldBase\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpBase\">Base oil \/ VI model<\/label>\n                  <\/div>\n                  <select class=\"blms-select\" id=\"inpBase\">\n                    <option value=\"95\" selected>Mineral (VI \u2248 95)<\/option>\n                    <option value=\"140\">PAO \/ Ester synthetic (VI \u2248 140)<\/option>\n                  <\/select>\n                <\/div>\n                <div class=\"blms-field blms-span-2 blms-hidden\" id=\"fieldNuOp\">\n                  <div class=\"blms-label\">\n                    <label for=\"inpNuOp\">Operating viscosity <span class=\"blms-sym\">\u03bd<\/span><\/label>\n                    <span class=\"blms-unit\">cSt at T<\/span>\n                  <\/div>\n                  <input class=\"blms-input\" id=\"inpNuOp\" type=\"number\" min=\"0.5\" step=\"0.1\" value=\"12\" \/>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-calc-wrap\">\n              <button type=\"button\" class=\"blms-calc-btn\" id=\"blmsBtnCalculate\" onclick=\"if(window.blmsCalculate){window.blmsCalculate();return false;}\">Calculate<\/button>\n            <\/div>\n          <\/div>\n      <\/section>\n\n      <section class=\"blms-card blms-hidden\" id=\"resultsCard\">\n        <div class=\"blms-card-head\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 11l3 3L22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\n          Calculation Results\n        <\/div>\n        <div class=\"blms-card-body\">\n          <div id=\"errorBox\" class=\"blms-error blms-hidden\"><\/div>\n          <div id=\"resultBlock\">\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Primary recommendation<\/div>\n              <div class=\"blms-hero\">\n                <div class=\"blms-reco\" id=\"recoBanner\">\n                  <div class=\"blms-kicker\">Selected lubrication method<\/div>\n                  <div class=\"blms-reco-title\" id=\"recoTitle\">\u2014<\/div>\n                  <p class=\"blms-reco-note\" id=\"recoNote\"><\/p>\n                <\/div>\n                <div class=\"blms-kappa-card\" id=\"kappaCard\">\n                  <div class=\"blms-kicker\">Viscosity ratio \u03ba = \u03bd \/ \u03bd<sub>1<\/sub><\/div>\n                  <div class=\"blms-kappa-value\" id=\"kappaValue\">\u2014<\/div>\n                  <p id=\"kappaNote\"><\/p>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Key metrics<\/div>\n              <div class=\"blms-metrics\">\n                <div class=\"blms-metric\">\n                  <div class=\"blms-lbl\">Mean diameter d<sub>m<\/sub><\/div>\n                  <div class=\"blms-val\" id=\"outDm\">\u2014<\/div>\n                  <div class=\"blms-sub\">mm<\/div>\n                <\/div>\n                <div class=\"blms-metric\">\n                  <div class=\"blms-lbl\">Speed factor d<sub>n<\/sub><\/div>\n                  <div class=\"blms-val\" id=\"outDn\">\u2014<\/div>\n                  <div class=\"blms-sub\">mm \u00b7 RPM<\/div>\n                <\/div>\n                <div class=\"blms-metric\">\n                  <div class=\"blms-lbl\">Required \u03bd<sub>1<\/sub><\/div>\n                  <div class=\"blms-val\" id=\"outNu1\">\u2014<\/div>\n                  <div class=\"blms-sub\">cSt at operating T<\/div>\n                <\/div>\n                <div class=\"blms-metric\">\n                  <div class=\"blms-lbl\">Operating \u03bd<\/div>\n                  <div class=\"blms-val\" id=\"outNu\">\u2014<\/div>\n                  <div class=\"blms-sub\" id=\"outNuSub\">cSt<\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"blms-gauge-block\">\n                <div class=\"blms-gauge-head\">\n                  <span><strong>d<sub>n<\/sub> lubrication map<\/strong> (type-adjusted)<\/span>\n                  <span id=\"dnZoneLabel\">\u2014<\/span>\n                <\/div>\n                <div class=\"blms-gauge-track\" id=\"dnTrack\">\n                  <div class=\"blms-gauge-marker\" id=\"dnMarker\"><\/div>\n                <\/div>\n                <div class=\"blms-gauge-ticks\">\n                  <span>0<\/span>\n                  <span>300k grease<\/span>\n                  <span>500k<\/span>\n                  <span>800k oil-air<\/span>\n                  <span>1.2M<\/span>\n                <\/div>\n              <\/div>\n\n              <div class=\"blms-gauge-block\">\n                <div class=\"blms-gauge-head\">\n                  <span><strong>\u03ba film regime<\/strong><\/span>\n                  <span>boundary &lt; 1 \u00b7 EHL 1\u20134 \u00b7 high drag &gt; 4<\/span>\n                <\/div>\n                <div class=\"blms-kappa-track\">\n                  <div class=\"blms-gauge-marker\" id=\"kappaMarker\"><\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Lubrication evaluation matrix<\/div>\n              <div class=\"blms-table-wrap\">\n                <table class=\"blms-table\" id=\"matrixTable\">\n                  <thead>\n                    <tr>\n                      <th>Method<\/th>\n                      <th>Suitability<\/th>\n                      <th>Notes for this duty<\/th>\n                    <\/tr>\n                  <\/thead>\n                  <tbody id=\"matrixBody\">\n                    <tr id=\"blms-row-grease\">\n                      <td class=\"blms-mname\">Grease Lubrication<\/td>\n                      <td><span class=\"blms-badge nr\" id=\"blms-badge-grease\">&#8211;<\/span><\/td>\n                      <td id=\"blms-note-grease\"><\/td>\n                    <\/tr>\n                    <tr id=\"blms-row-oilBath\">\n                      <td class=\"blms-mname\">Oil Bath \/ Splash<\/td>\n                      <td><span class=\"blms-badge nr\" id=\"blms-badge-oilBath\">&#8211;<\/span><\/td>\n                      <td id=\"blms-note-oilBath\"><\/td>\n                    <\/tr>\n                    <tr id=\"blms-row-forcedOil\">\n                      <td class=\"blms-mname\">Forced Oil Circulation<\/td>\n                      <td><span class=\"blms-badge nr\" id=\"blms-badge-forcedOil\">&#8211;<\/span><\/td>\n                      <td id=\"blms-note-forcedOil\"><\/td>\n                    <\/tr>\n                    <tr id=\"blms-row-oilAir\">\n                      <td class=\"blms-mname\">Oil-Air \/ Oil-Mist<\/td>\n                      <td><span class=\"blms-badge nr\" id=\"blms-badge-oilAir\">&#8211;<\/span><\/td>\n                      <td id=\"blms-note-oilAir\"><\/td>\n                    <\/tr>\n                  <\/tbody>\n                <\/table>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-split\">\n              <div class=\"blms-group\">\n                <div class=\"blms-group-title\">Grease re-lubrication interval t<sub>f<\/sub><\/div>\n                <div class=\"blms-kicker\">SKF-style estimator \u00b7 operating hours<\/div>\n                <div class=\"blms-tf-value\">\n                  <span class=\"blms-num\" id=\"tfHours\">\u2014<\/span>\n                  <span class=\"blms-tf-unit\">h<\/span>\n                <\/div>\n                <p class=\"blms-hint\" id=\"tfNote\"><\/p>\n                <div class=\"blms-tf-grid\">\n                  <div class=\"blms-tf-item\">\n                    <div class=\"blms-lbl\">8 h \/ day<\/div>\n                    <div class=\"blms-val\" id=\"tfShift\">\u2014<\/div>\n                  <\/div>\n                  <div class=\"blms-tf-item\">\n                    <div class=\"blms-lbl\">24 h \/ day<\/div>\n                    <div class=\"blms-val\" id=\"tfCont\">\u2014<\/div>\n                  <\/div>\n                  <div class=\"blms-tf-item\">\n                    <div class=\"blms-lbl\">Temp. factor<\/div>\n                    <div class=\"blms-val\" id=\"tfTempF\">\u2014<\/div>\n                  <\/div>\n                  <div class=\"blms-tf-item\">\n                    <div class=\"blms-lbl\">Load factor<\/div>\n                    <div class=\"blms-val\" id=\"tfLoadF\">\u2014<\/div>\n                  <\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"blms-group\">\n                <div class=\"blms-group-title\">Method comparison<\/div>\n                <div class=\"blms-chart-wrap\">\n                  <canvas id=\"blmsChart\"><\/canvas>\n                <\/div>\n                <p class=\"blms-hint\" style=\"margin-top:0.55rem;\">Radar axes are \u201chigher is more favorable.\u201d The recommended method is highlighted.<\/p>\n              <\/div>\n            <\/div>\n\n            <div class=\"blms-group\">\n              <div class=\"blms-group-title\">Method, formulas &amp; limits<\/div>\n              <div class=\"blms-notes\">\n                <ul>\n                  <li><span class=\"blms-sym\">d<sub>m<\/sub> = (d + D) \/ 2<\/span> mm. Speed factor <span class=\"blms-sym\">d<sub>n<\/sub> = n \u00b7 d<sub>m<\/sub><\/span> mm\u00b7RPM. Roller types use a reduced speed scale versus deep-groove ball bearings.<\/li>\n                  <li>Required viscosity <span class=\"blms-sym\">\u03bd<sub>1<\/sub> = 45 000 \u00b7 n<sup>\u22120.83<\/sup> \u00b7 d<sub>m<\/sub><sup>\u22120.5<\/sup><\/span> cSt (SKF-style). Viscosity ratio <span class=\"blms-sym\">\u03ba = \u03bd \/ \u03bd<sub>1<\/sub><\/span>.<\/li>\n                  <li>Operating viscosity from <span class=\"blms-sym\">\u03bd<sub>40<\/sub><\/span> uses the Ubbelohde\u2013Walther equation with <span class=\"blms-sym\">\u03bd<sub>100<\/sub><\/span> estimated from viscosity index (mineral VI 95 or synthetic VI 140).<\/li>\n                  <li>Selection map: <span class=\"blms-sym\">d<sub>n<\/sub><\/span> &lt; 300 000 grease; 300 000\u2013500 000 high-speed grease or oil bath; 500 000\u2013800 000 forced oil circulation; &gt; 800 000 oil-air \/ oil-mist. High temperature or heavy load can shift the recommendation toward oil.<\/li>\n                  <li>Grease interval <span class=\"blms-sym\">t<sub>f<\/sub><\/span> \u2248 <span class=\"blms-sym\">K \u00b7 (1.4\u00d710<sup>6<\/sup> \/(n \u221ad<sub>m<\/sub>) \u2212 4 d<sub>m<\/sub>)<\/span> hours, then temperature (halved every 15 \u00b0C above 70 \u00b0C) and load (C\/P) factors. Cap 40 000 h. Not a substitute for OEM greasing charts.<\/li>\n                  <li>Screening tool only. Confirm limiting speed, grease speed factor, oil flow, heat exchanger duty and sealing with the bearing manufacturer catalog.<\/li>\n                <\/ul>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/section>\n    <\/div>\n  <\/div>\n\n  <script type=\"text\/javascript\">\n(function () {\n  \"use strict\";\n\n  function gt(a, b) { return Math.max(a, b) === a && a !== b; }\n  function gte(a, b) { return Math.max(a, b) === a; }\n  function lt(a, b) { return Math.min(a, b) === a && a !== b; }\n  function lte(a, b) { return Math.min(a, b) === a; }\n\n  var blmsReady = false;\n  var chartJsWaiters = null;\n  var viscMode = \"nu40\";\n  var activePreset = \"motor\";\n  var chart = null;\n  var el = {};\n  var root = null;\n\n  var TYPES = {\n    dgb: { label: \"Deep Groove Ball\", K: 1.0, dnScale: 1.00, family: \"ball\" },\n    acb: { label: \"Angular Contact Ball\", K: 1.0, dnScale: 0.95, family: \"ball\" },\n    crb: { label: \"Cylindrical Roller\", K: 0.5, dnScale: 0.70, family: \"roller\" },\n    srb: { label: \"Spherical Roller\", K: 0.2, dnScale: 0.55, family: \"roller\" },\n    trb: { label: \"Tapered Roller\", K: 0.2, dnScale: 0.60, family: \"roller\" }\n  };\n\n  var METHODS = [\n    { key: \"grease\", name: \"Grease Lubrication\" },\n    { key: \"oilBath\", name: \"Oil Bath \/ Splash\" },\n    { key: \"forcedOil\", name: \"Forced Oil Circulation\" },\n    { key: \"oilAir\", name: \"Oil-Air \/ Oil-Mist\" }\n  ];\n\n  var CHART_SCORES = {\n    grease: [2, 2, 5, 5, 4],\n    oilBath: [3, 3, 4, 3, 3],\n    forcedOil: [5, 4, 2, 2, 3],\n    oilAir: [4, 5, 2, 3, 2]\n  };\n\n  var CHART_COLORS = {\n    grease: { border: \"#d97706\", fill: \"rgba(217,119,6,0.18)\" },\n    oilBath: { border: \"#2563eb\", fill: \"rgba(37,99,235,0.14)\" },\n    forcedOil: { border: \"#0d9488\", fill: \"rgba(13,148,136,0.16)\" },\n    oilAir: { border: \"#1e293b\", fill: \"rgba(30,41,59,0.12)\" }\n  };\n\n  var PRESETS = [\n    { id: \"motor\", name: \"Electric Motor\", detail: \"6308 \/ 1500 RPM \/ grease\", values: { d: 40, D: 90, n: 1500, T: 70, nu40: 100, type: \"dgb\", pc: 0.08, base: \"95\", mode: \"nu40\" } },\n    { id: \"spindle\", name: \"CNC Spindle\", detail: \"7010 \/ 15000 RPM \/ oil-air\", values: { d: 50, D: 80, n: 15000, T: 45, nu40: 10, type: \"acb\", pc: 0.06, base: \"140\", mode: \"nu40\" } },\n    { id: \"gearbox\", name: \"Heavy Gearbox Shaft\", detail: \"22316 \/ 750 RPM \/ oil bath\", values: { d: 80, D: 170, n: 750, T: 85, nu40: 220, type: \"srb\", pc: 0.18, base: \"95\", mode: \"nu40\" } },\n    { id: \"idler\", name: \"Conveyor Idler\", detail: \"6308 \/ 280 RPM \/ grease\", values: { d: 40, D: 90, n: 280, T: 35, nu40: 150, type: \"dgb\", pc: 0.05, base: \"95\", mode: \"nu40\" } }\n  ];\n\n  var ISO_VG = [10, 22, 32, 46, 68, 100, 150, 220, 320];\n\n  function num(input) {\n    if (!input) return NaN;\n    var v = parseFloat(input.value);\n    return isFinite(v) ? v : NaN;\n  }\n\n  function fmt(n, digits) {\n    if (!isFinite(n)) return \"-\";\n    return n.toLocaleString(\"en-US\", { maximumFractionDigits: digits, minimumFractionDigits: digits });\n  }\n\n  function fmtInt(n) {\n    if (!isFinite(n)) return \"-\";\n    return Math.round(n).toLocaleString(\"en-US\");\n  }\n\n  function waltherZ(nu) {\n    return Math.log10(Math.log10(nu + 0.7));\n  }\n\n  function estimateNu100(nu40, vi) {\n    var a95 = -0.407, b95 = 0.732, a150 = -0.265, b150 = 0.785;\n    var t = (vi - 95) \/ 55;\n    var a = a95 + t * (a150 - a95);\n    var b = b95 + t * (b150 - b95);\n    return Math.pow(10, a + b * Math.log10(nu40));\n  }\n\n  function viscosityAtTemp(nu40, T, vi) {\n    var nu100 = estimateNu100(nu40, vi);\n    var T1 = 40 + 273.15;\n    var T2 = 100 + 273.15;\n    var Tt = T + 273.15;\n    var z1 = waltherZ(nu40);\n    var z2 = waltherZ(nu100);\n    var B = (z1 - z2) \/ (Math.log10(T1) - Math.log10(T2));\n    var A = z1 - B * Math.log10(T1);\n    var zt = A + B * Math.log10(Tt);\n    var nu = Math.pow(10, Math.pow(10, zt)) - 0.7;\n    return Math.max(0.4, nu);\n  }\n\n  function loadFactor(pc) {\n    var cp = 1 \/ Math.max(pc, 0.01);\n    if (lt(cp, 2)) return 0.10;\n    if (lt(cp, 5)) return 0.20;\n    if (lt(cp, 8)) return 0.40;\n    if (lt(cp, 15)) return 0.70;\n    return 1.00;\n  }\n\n  function greaseInterval(n, dm, typeKey, T, pc) {\n    var K = TYPES[typeKey].K;\n    var tf = K * (1400000 \/ (n * Math.sqrt(dm)) - 4 * dm);\n    if (!isFinite(tf) || lt(tf, 50)) {\n      tf = K * 1000000 \/ (n * Math.sqrt(dm));\n    }\n    var bT = Math.min(4, Math.max(0.05, Math.pow(2, (70 - T) \/ 15)));\n    var bL = loadFactor(pc);\n    tf *= bT * bL;\n    tf = Math.max(1, Math.min(40000, tf));\n    return { tf: tf, bT: bT, bL: bL };\n  }\n\n  function kappaStatus(k) {\n    if (lt(k, 1)) {\n      return { cls: \"is-alert\", title: k.toFixed(2), note: \"Insufficient film (boundary \/ mixed). Increase viscosity or add EP additives; verify load and surface roughness.\" };\n    }\n    if (lte(k, 4)) {\n      return { cls: \"is-ok\", title: k.toFixed(2), note: \"Optimal elasto-hydrodynamic lubrication (EHL). Film thickness is in the preferred range.\" };\n    }\n    return { cls: \"is-warn\", title: k.toFixed(2), note: \"High viscous friction. Excess drag and self-heating risk - consider a lower viscosity grade.\" };\n  }\n\n  function classifyMethod(key, dnAdj, T, pc, typeKey) {\n    var roller = TYPES[typeKey].family === \"roller\";\n    var hot = gt(T, 100);\n    var veryHot = gt(T, 120);\n    var heavy = gte(pc, 0.15);\n    var gearboxLike = roller && (heavy || gte(T, 80));\n\n    if (key === \"grease\") {\n      if (gt(dnAdj, 650000) || veryHot) return { badge: \"no\", label: \"Not Recommended\" };\n      if (lt(dnAdj, 300000) && !hot && !(gearboxLike && gt(dnAdj, 180000))) {\n        return { badge: \"rec\", label: \"Recommended\" };\n      }\n      if (lt(dnAdj, 500000) && lte(T, 110)) {\n        return { badge: \"acc\", label: \"Acceptable\" };\n      }\n      return { badge: \"nr\", label: \"Not Recommended\" };\n    }\n\n    if (key === \"oilBath\") {\n      if (gt(dnAdj, 700000)) return { badge: \"no\", label: \"Not Recommended\" };\n      if ((gte(dnAdj, 250000) && lte(dnAdj, 520000)) || gearboxLike) {\n        if (lt(dnAdj, 500000) || gearboxLike) return { badge: \"rec\", label: \"Recommended\" };\n        return { badge: \"acc\", label: \"Acceptable\" };\n      }\n      if (lt(dnAdj, 300000)) return { badge: \"acc\", label: \"Acceptable\" };\n      if (lte(dnAdj, 650000)) return { badge: \"acc\", label: \"Acceptable\" };\n      return { badge: \"nr\", label: \"Not Recommended\" };\n    }\n\n    if (key === \"forcedOil\") {\n      if (lt(dnAdj, 180000) && lt(T, 90) && !heavy) return { badge: \"nr\", label: \"Not Recommended\" };\n      if (gte(dnAdj, 500000) && lte(dnAdj, 850000)) return { badge: \"rec\", label: \"Recommended\" };\n      if (hot && gte(dnAdj, 200000)) return { badge: \"acc\", label: \"Acceptable\" };\n      if (gt(dnAdj, 350000)) return { badge: \"acc\", label: \"Acceptable\" };\n      return { badge: \"nr\", label: \"Not Recommended\" };\n    }\n\n    if (gt(dnAdj, 800000)) return { badge: \"rec\", label: \"Recommended\" };\n    if (gte(dnAdj, 500000) && TYPES[typeKey].family === \"ball\") return { badge: \"acc\", label: \"Acceptable\" };\n    if (lt(dnAdj, 350000)) return { badge: \"no\", label: \"Not Recommended\" };\n    return { badge: \"nr\", label: \"Not Recommended\" };\n  }\n\n  function methodNotes(key, dnAdj) {\n    if (key === \"grease\") {\n      if (lt(dnAdj, 300000)) return \"Simple seals, low cost, minimal maintenance. Standard mineral or lithium-complex synthetic grease.\";\n      if (lt(dnAdj, 500000)) return \"Use high-speed grease only (low-bleed, ester\/PAO). Monitor temperature and relubrication.\";\n      return \"Speed or temperature exceeds typical grease capability; churning heat becomes dominant.\";\n    }\n    if (key === \"oilBath\") {\n      return \"Sump level through the rolling-element center. Needs level monitoring; limited heat rejection without circulation.\";\n    }\n    if (key === \"forcedOil\") {\n      return \"Oil jet \/ circulation with pump and heat exchanger to remove frictional heat. Preferred for sustained high dn.\";\n    }\n    return \"Precision metering for ultra-high-speed spindles with minimal drag. Requires clean, dry air and mist collection.\";\n  }\n\n  function pickPrimary(dnAdj, T, pc, typeKey, k) {\n    var roller = TYPES[typeKey].family === \"roller\";\n    var heavy = gte(pc, 0.15);\n    var key, title, extra, tone = \"ok\";\n\n    if (lt(dnAdj, 300000)) {\n      if (gt(T, 120)) {\n        key = \"oilBath\";\n        title = \"Oil Bath \/ Splash (temperature-driven)\";\n        extra = \"Housing temperature exceeds typical grease limits. Oil bath or circulation is preferred for heat removal.\";\n        tone = \"warn\";\n      } else if (roller && heavy && gte(T, 80)) {\n        key = \"oilBath\";\n        title = \"Oil Bath \/ Splash Lubrication\";\n        extra = \"Spherical\/tapered\/cylindrical roller bearings under heavy load commonly share a gearbox oil sump even at modest dn.\";\n      } else if (gt(T, 95)) {\n        key = \"grease\";\n        title = \"Grease Lubrication - High-Temperature Synthetic\";\n        extra = \"Standard mineral grease life collapses above about 90-100 C. Use a high-temperature synthetic grease and shorten tf.\";\n        tone = \"warn\";\n      } else {\n        key = \"grease\";\n        title = \"Grease Lubrication (Standard Mineral \/ Synthetic)\";\n        extra = \"Simple seal, low cost, minimal maintenance. Suitable for this speed factor.\";\n      }\n    } else if (lt(dnAdj, 500000)) {\n      if (gt(T, 95) || (roller && heavy)) {\n        key = \"oilBath\";\n        title = \"Oil Bath \/ Splash Lubrication\";\n        extra = \"Requires sumped oil with level monitoring. High-speed grease is a secondary option if temperature is controlled.\";\n      } else {\n        key = \"grease\";\n        title = \"High-Speed Grease or Oil Bath \/ Splash\";\n        extra = \"Requires high-speed grease (low viscous torque) or a monitored oil bath. Watch temperature rise.\";\n        tone = \"warn\";\n      }\n    } else if (lt(dnAdj, 800000)) {\n      key = \"forcedOil\";\n      title = \"Forced Oil Circulation (Oil Jet \/ Circulation)\";\n      extra = \"Requires an oil pump and heat exchanger to dissipate frictional heat. Grease is not appropriate at this dn.\";\n    } else {\n      key = \"oilAir\";\n      title = \"Oil-Air \/ Oil-Mist Lubrication\";\n      extra = \"Precision metering for ultra-high-speed spindles with minimal drag force. Keep air dry and collect mist.\";\n    }\n\n    if (lt(k, 1)) tone = \"alert\";\n    else if (gt(k, 4) && tone === \"ok\") tone = \"warn\";\n\n    return { key: key, title: title, extra: extra, tone: tone };\n  }\n\n  function hoursToCalendar(hours, hoursPerDay) {\n    var days = hours \/ hoursPerDay;\n    if (gte(days, 365)) return (days \/ 365).toFixed(1) + \" yr\";\n    if (gte(days, 30)) return (days \/ 30.4).toFixed(1) + \" mo\";\n    return days.toFixed(0) + \" days\";\n  }\n\n  function setInvalid(node, bad) {\n    if (!node) return;\n    if (node.classList) node.classList.toggle(\"is-invalid\", !!bad);\n  }\n\n  function showResultsCard() {\n    if (!el.resultsCard) return;\n    el.resultsCard.classList.remove(\"blms-hidden\");\n    el.resultsCard.classList.add(\"blms-visible\");\n    el.resultsCard.style.setProperty(\"display\", \"block\", \"important\");\n  }\n\n  function syncViscMode() {\n    var from40 = viscMode === \"nu40\";\n    if (el.fieldNu40) el.fieldNu40.classList.toggle(\"blms-hidden\", !from40);\n    if (el.fieldBase) el.fieldBase.classList.toggle(\"blms-hidden\", !from40);\n    if (el.fieldNuOp) el.fieldNuOp.classList.toggle(\"blms-hidden\", from40);\n    var btns = root.querySelectorAll(\"#viscMode .blms-toggle-btn\");\n    var i;\n    for (i = 0; i !== btns.length; i++) {\n      btns[i].classList.toggle(\"is-active\", btns[i].getAttribute(\"data-mode\") === viscMode);\n    }\n  }\n\n  function highlightPresets() {\n    var btns = root.querySelectorAll(\".blms-preset\");\n    var i;\n    for (i = 0; i !== btns.length; i++) {\n      btns[i].classList.toggle(\"is-active\", btns[i].getAttribute(\"data-id\") === activePreset);\n    }\n  }\n\n  function highlightIso() {\n    var v = num(el.nu40);\n    var btns = root.querySelectorAll(\"#isoChips .blms-chip\");\n    var i;\n    for (i = 0; i !== btns.length; i++) {\n      btns[i].classList.toggle(\"is-active\", Number(btns[i].getAttribute(\"data-vg\")) === v);\n    }\n  }\n\n  function clearPresetIfEdited() {\n    activePreset = null;\n    highlightPresets();\n  }\n\n  function updateDm() {\n    var d = num(el.d);\n    var D = num(el.Dout);\n    if (!el.dmReadout) return;\n    if (gt(d, 0) && gt(D, d)) {\n      el.dmReadout.textContent = \"Mean diameter dm = (d + D) \/ 2 = \" + fmt((d + D) \/ 2, 1) + \" mm\";\n    } else {\n      el.dmReadout.textContent = \"Mean diameter dm = (d + D) \/ 2\";\n    }\n  }\n\n  function applyPreset(p) {\n    activePreset = p.id;\n    viscMode = p.values.mode;\n    el.d.value = p.values.d;\n    el.Dout.value = p.values.D;\n    el.n.value = p.values.n;\n    el.T.value = p.values.T;\n    el.nu40.value = p.values.nu40;\n    el.type.value = p.values.type;\n    el.pc.value = p.values.pc;\n    el.base.value = p.values.base;\n    syncViscMode();\n    highlightPresets();\n    highlightIso();\n    updateDm();\n  }\n\n  function scopeChartJsCssWeLoaded() {\n    var nodes = document.querySelectorAll(\"style\");\n    var i, node, t;\n    for (i = 0; i !== nodes.length; i++) {\n      node = nodes[i];\n      if (node.id === \"blms-calc-styles\") continue;\n      if (node.getAttribute(\"data-blms-chart-scoped\")) continue;\n      t = node.textContent || \"\";\n      if (t.indexOf(\"chartjs-size-monitor\") === -1) continue;\n      node.textContent = t.split(\".chartjs-\").join(\" #blms-root .chartjs-\");\n      node.setAttribute(\"data-blms-chart-scoped\", \"1\");\n    }\n  }\n\n  function loadChartJs(done) {\n    if (typeof window.Chart === \"function\") {\n      done();\n      return;\n    }\n    if (chartJsWaiters) {\n      chartJsWaiters.push(done);\n      return;\n    }\n    chartJsWaiters = [done];\n    var s = document.createElement(\"script\");\n    s.src = \"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.1\/dist\/chart.umd.min.js\";\n    s.async = true;\n    s.setAttribute(\"data-blms-chartjs\", \"1\");\n    s.onload = function () {\n      scopeChartJsCssWeLoaded();\n      var fns = chartJsWaiters || [];\n      chartJsWaiters = null;\n      var i;\n      for (i = 0; i !== fns.length; i++) {\n        try { fns[i](); } catch (err) {}\n      }\n    };\n    s.onerror = function () {\n      var fns = chartJsWaiters || [];\n      chartJsWaiters = null;\n      var i;\n      for (i = 0; i !== fns.length; i++) {\n        try { fns[i](); } catch (err) {}\n      }\n    };\n    (document.head || document.body || root).appendChild(s);\n  }\n\n  function ensureChart() {\n    var canvas = root.querySelector(\"#blmsChart\");\n    if (!canvas || typeof window.Chart === \"undefined\") return null;\n    if (chart) return chart;\n    var ctx = canvas.getContext(\"2d\");\n    var datasets = [];\n    var i, m, c;\n    for (i = 0; i !== METHODS.length; i++) {\n      m = METHODS[i];\n      c = CHART_COLORS[m.key];\n      datasets.push({\n        label: m.name,\n        data: CHART_SCORES[m.key],\n        borderColor: c.border,\n        backgroundColor: c.fill,\n        borderWidth: 2,\n        pointRadius: 3,\n        pointBackgroundColor: c.border\n      });\n    }\n    chart = new window.Chart(ctx, {\n      type: \"radar\",\n      data: {\n        labels: [\"Heat Dissipation\", \"Speed Capability\", \"Low Maintenance Cost\", \"Seal Simplicity\", \"Low Environmental Impact\"],\n        datasets: datasets\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            position: \"bottom\",\n            labels: { boxWidth: 10, font: { size: 10 }, color: \"#334155\" }\n          }\n        },\n        scales: {\n          r: {\n            min: 0,\n            max: 5,\n            ticks: { stepSize: 1, font: { size: 9 }, color: \"#94a3b8\", backdropColor: \"transparent\" },\n            pointLabels: { font: { size: 10, weight: \"600\" }, color: \"#334155\" },\n            grid: { color: \"#e2e8f0\" },\n            angleLines: { color: \"#e2e8f0\" }\n          }\n        }\n      }\n    });\n    return chart;\n  }\n\n  function updateChart(primaryKey) {\n    loadChartJs(function () {\n      var c = ensureChart();\n      if (!c) return;\n      var i, key, pick;\n      for (i = 0; i !== c.data.datasets.length; i++) {\n        key = METHODS[i].key;\n        pick = key === primaryKey;\n        c.data.datasets[i].borderWidth = pick ? 3 : 1.5;\n        c.data.datasets[i].hidden = false;\n        c.data.datasets[i].order = pick ? 0 : 1;\n      }\n      c.update();\n      if (typeof requestAnimationFrame === \"function\") {\n        requestAnimationFrame(function () { c.resize(); });\n      }\n    });\n  }\n\n  function setMatrixRow(key, cls, note, pick) {\n    var tr = root.querySelector(\"#blms-row-\" + key);\n    var badge = root.querySelector(\"#blms-badge-\" + key);\n    var noteEl = root.querySelector(\"#blms-note-\" + key);\n    if (!tr || !badge || !noteEl) return;\n    tr.className = pick ? \"is-pick\" : \"\";\n    badge.className = \"blms-badge \" + cls.badge;\n    badge.textContent = cls.label;\n    noteEl.textContent = note;\n  }\n\n  function calculate() {\n    if (!el.resultsCard || !el.d) return;\n\n    var d = num(el.d);\n    var D = num(el.Dout);\n    var n = num(el.n);\n    var T = num(el.T);\n    var pc = num(el.pc);\n    var typeKey = el.type.value;\n    var vi = parseFloat(el.base.value) || 95;\n\n    showResultsCard();\n\n    var bad = false;\n    setInvalid(el.d, !gt(d, 0));\n    setInvalid(el.Dout, !gt(D, d));\n    setInvalid(el.n, !gt(n, 0));\n    setInvalid(el.T, !(gte(T, -20) && lte(T, 250)));\n    setInvalid(el.pc, !(gt(pc, 0) && lte(pc, 0.5)));\n    if (!gt(d, 0) || !gt(D, d) || !gt(n, 0) || !gte(T, -20) || !lte(T, 250) || !gt(pc, 0) || !lte(pc, 0.5)) bad = true;\n\n    var nuOp;\n    if (viscMode === \"nu40\") {\n      var nu40 = num(el.nu40);\n      setInvalid(el.nu40, !gt(nu40, 1));\n      if (!gt(nu40, 1)) bad = true;\n      else nuOp = viscosityAtTemp(nu40, T, vi);\n    } else {\n      nuOp = num(el.nuOp);\n      setInvalid(el.nuOp, !gt(nuOp, 0.4));\n      if (!gt(nuOp, 0.4)) bad = true;\n    }\n\n    if (bad) {\n      el.errorBox.textContent = \"Check inputs: outer diameter must exceed inner diameter, and speed, temperature, load ratio and viscosity must be positive and in range.\";\n      el.errorBox.classList.remove(\"blms-hidden\");\n      el.resultBlock.classList.add(\"blms-hidden\");\n      return;\n    }\n\n    el.errorBox.classList.add(\"blms-hidden\");\n    el.resultBlock.classList.remove(\"blms-hidden\");\n    el.resultBlock.style.setProperty(\"display\", \"block\", \"important\");\n    updateDm();\n\n    var dm = (d + D) \/ 2;\n    var dn = n * dm;\n    var nu1 = 45000 * Math.pow(n, -0.83) * Math.pow(dm, -0.5);\n    var kappa = nuOp \/ nu1;\n    var dnAdj = dn \/ TYPES[typeKey].dnScale;\n\n    el.outDm.textContent = fmt(dm, 1);\n    el.outDn.textContent = fmtInt(dn);\n    el.outNu1.textContent = fmt(nu1, 2);\n    el.outNu.textContent = fmt(nuOp, 2);\n    el.outNuSub.textContent = viscMode === \"nu40\"\n      ? \"cSt at \" + fmt(T, 0) + \" C (from nu40)\"\n      : \"cSt (direct)\";\n\n    var ks = kappaStatus(kappa);\n    el.kappaCard.className = \"blms-kappa-card \" + ks.cls;\n    el.kappaValue.textContent = ks.title;\n    el.kappaNote.textContent = ks.note;\n\n    var primary = pickPrimary(dnAdj, T, pc, typeKey, kappa);\n    el.recoBanner.className = \"blms-reco is-\" + primary.tone;\n    el.recoTitle.textContent = primary.title;\n    el.recoNote.textContent = primary.extra;\n\n    var dnPct = Math.max(0, Math.min(100, (dnAdj \/ 1200000) * 100));\n    el.dnMarker.style.left = dnPct + \"%\";\n    if (lt(dnAdj, 300000)) el.dnZoneLabel.textContent = \"Grease zone\";\n    else if (lt(dnAdj, 500000)) el.dnZoneLabel.textContent = \"High-speed grease \/ oil bath\";\n    else if (lt(dnAdj, 800000)) el.dnZoneLabel.textContent = \"Forced oil circulation\";\n    else el.dnZoneLabel.textContent = \"Oil-air \/ oil-mist\";\n\n    var kPct = Math.max(0, Math.min(100, (kappa \/ 6) * 100));\n    el.kappaMarker.style.left = kPct + \"%\";\n\n    var i, m, cls, rowPick, badge;\n    for (i = 0; i !== METHODS.length; i++) {\n      m = METHODS[i];\n      cls = classifyMethod(m.key, dnAdj, T, pc, typeKey);\n      rowPick = m.key === primary.key;\n      badge = rowPick && cls.badge !== \"rec\" ? { badge: \"rec\", label: \"Recommended\" } : cls;\n      setMatrixRow(m.key, badge, methodNotes(m.key, dnAdj), rowPick);\n    }\n\n    var gre = greaseInterval(n, dm, typeKey, T, pc);\n    el.tfHours.textContent = fmtInt(gre.tf);\n    el.tfTempF.textContent = gre.bT.toFixed(2);\n    el.tfLoadF.textContent = gre.bL.toFixed(2);\n    el.tfShift.textContent = hoursToCalendar(gre.tf, 8);\n    el.tfCont.textContent = hoursToCalendar(gre.tf, 24);\n\n    if (primary.key === \"grease\") {\n      el.tfNote.textContent = gte(gre.tf, 30000)\n        ? \"Interval is long - sealed-for-life grease may be practical if contamination is controlled.\"\n        : \"Relubricate at or before tf. Increase frequency for vibration, water, or dust.\";\n    } else {\n      el.tfNote.textContent = \"Grease is not the primary method here. Shown tf is the hypothetical grease interval - it is short at this speed\/load, which is why oil is preferred. Oil change typically 2000-8000 h with filtration.\";\n    }\n\n    updateChart(primary.key === \"grease\" ? \"grease\" : primary.key);\n    highlightIso();\n  }\n\n  function runCalculate() {\n    try {\n      calculate();\n    } catch (err) {}\n    return false;\n  }\n\n  function bindEl(id) {\n    return root.querySelector(\"#\" + id);\n  }\n\n  function initBlms() {\n    if (blmsReady) return true;\n    root = document.getElementById(\"blms-root\");\n    if (!root) return false;\n\n    el = {\n      d: bindEl(\"inpD\"),\n      Dout: bindEl(\"inpDout\"),\n      type: bindEl(\"inpType\"),\n      n: bindEl(\"inpN\"),\n      T: bindEl(\"inpT\"),\n      pc: bindEl(\"inpPC\"),\n      nu40: bindEl(\"inpNu40\"),\n      nuOp: bindEl(\"inpNuOp\"),\n      base: bindEl(\"inpBase\"),\n      dmReadout: bindEl(\"dmReadout\"),\n      fieldNu40: bindEl(\"fieldNu40\"),\n      fieldBase: bindEl(\"fieldBase\"),\n      fieldNuOp: bindEl(\"fieldNuOp\"),\n      errorBox: bindEl(\"errorBox\"),\n      resultBlock: bindEl(\"resultBlock\"),\n      resultsCard: bindEl(\"resultsCard\"),\n      btnCalculate: bindEl(\"blmsBtnCalculate\"),\n      recoBanner: bindEl(\"recoBanner\"),\n      recoTitle: bindEl(\"recoTitle\"),\n      recoNote: bindEl(\"recoNote\"),\n      kappaCard: bindEl(\"kappaCard\"),\n      kappaValue: bindEl(\"kappaValue\"),\n      kappaNote: bindEl(\"kappaNote\"),\n      outDm: bindEl(\"outDm\"),\n      outDn: bindEl(\"outDn\"),\n      outNu1: bindEl(\"outNu1\"),\n      outNu: bindEl(\"outNu\"),\n      outNuSub: bindEl(\"outNuSub\"),\n      dnMarker: bindEl(\"dnMarker\"),\n      dnZoneLabel: bindEl(\"dnZoneLabel\"),\n      kappaMarker: bindEl(\"kappaMarker\"),\n      tfHours: bindEl(\"tfHours\"),\n      tfNote: bindEl(\"tfNote\"),\n      tfShift: bindEl(\"tfShift\"),\n      tfCont: bindEl(\"tfCont\"),\n      tfTempF: bindEl(\"tfTempF\"),\n      tfLoadF: bindEl(\"tfLoadF\"),\n      presetRow: bindEl(\"presetRow\"),\n      isoChips: bindEl(\"isoChips\"),\n      viscMode: bindEl(\"viscMode\")\n    };\n\n    if (!el.d || !el.resultsCard || !el.btnCalculate) return false;\n\n    var i, p, btn, strong, span, vg;\n\n    if (el.presetRow && !el.presetRow.getAttribute(\"data-blms-built\")) {\n      for (i = 0; i !== PRESETS.length; i++) {\n        p = PRESETS[i];\n        btn = document.createElement(\"button\");\n        btn.type = \"button\";\n        btn.className = \"blms-preset\";\n        btn.setAttribute(\"data-id\", p.id);\n        strong = document.createElement(\"strong\");\n        strong.textContent = p.name;\n        span = document.createElement(\"span\");\n        span.textContent = p.detail;\n        btn.appendChild(strong);\n        btn.appendChild(span);\n        btn.addEventListener(\"click\", (function (preset) {\n          return function () { applyPreset(preset); };\n        })(p));\n        el.presetRow.appendChild(btn);\n      }\n      el.presetRow.setAttribute(\"data-blms-built\", \"1\");\n    }\n\n    if (el.isoChips && !el.isoChips.getAttribute(\"data-blms-built\")) {\n      for (i = 0; i !== ISO_VG.length; i++) {\n        vg = ISO_VG[i];\n        btn = document.createElement(\"button\");\n        btn.type = \"button\";\n        btn.className = \"blms-chip\";\n        btn.setAttribute(\"data-vg\", String(vg));\n        btn.textContent = \"VG \" + vg;\n        btn.addEventListener(\"click\", (function (grade) {\n          return function () {\n            el.nu40.value = String(grade);\n            viscMode = \"nu40\";\n            syncViscMode();\n            clearPresetIfEdited();\n            highlightIso();\n          };\n        })(vg));\n        el.isoChips.appendChild(btn);\n      }\n      el.isoChips.setAttribute(\"data-blms-built\", \"1\");\n    }\n\n    if (el.viscMode) {\n      el.viscMode.addEventListener(\"click\", function (ev) {\n        var target = ev.target;\n        while (target && target !== el.viscMode && !target.getAttribute(\"data-mode\")) {\n          target = target.parentNode;\n        }\n        if (!target || !target.getAttribute(\"data-mode\")) return;\n        viscMode = target.getAttribute(\"data-mode\");\n        syncViscMode();\n        clearPresetIfEdited();\n      });\n    }\n\n    var keys = [\"d\", \"Dout\", \"type\", \"n\", \"T\", \"pc\", \"nu40\", \"nuOp\", \"base\"];\n    for (i = 0; i !== keys.length; i++) {\n      (function (key) {\n        if (!el[key]) return;\n        el[key].addEventListener(\"input\", function () {\n          clearPresetIfEdited();\n          if (key === \"d\" || key === \"Dout\") updateDm();\n        });\n        el[key].addEventListener(\"change\", function () {\n          clearPresetIfEdited();\n          if (key === \"d\" || key === \"Dout\") updateDm();\n        });\n      })(keys[i]);\n    }\n\n    el.btnCalculate.addEventListener(\"click\", runCalculate);\n    window.blmsRunCalculate = runCalculate;\n\n    syncViscMode();\n    highlightPresets();\n    highlightIso();\n    updateDm();\n    loadChartJs(function () {});\n    blmsReady = true;\n    return true;\n  }\n\n  window.blmsCalculate = function () {\n    initBlms();\n    if (window.blmsRunCalculate) window.blmsRunCalculate();\n    return false;\n  };\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", function () { initBlms(); });\n  } else {\n    initBlms();\n  }\n})();\n\n  <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Bearing Lubrication Method Selection Calculator is an efficient engineering tool designed to help users choose the most suitable lubrication method for different bearing applications&#8230;.<\/p>","protected":false},"author":2,"featured_media":24667,"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":[8588,8586,8589,2234],"class_list":["post-24666","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-bearing-lubrication","tag-bearing-tools","tag-lubrication-method","tag-mechanical-design","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Bearing-Lubrication-Method-Selection-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24666","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=24666"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media\/24667"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media?parent=24666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/categories?post=24666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/tags?post=24666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}