12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IN-S42ATR — Component Characterization</title>
<style>
  @font-face { font-family: 'Familjen Grotesk'; src: url('https://adom.inc/fonts/familjen-grotesk/familjen-grotesk-latin-700-normal.woff2') format('woff2'); font-weight: 700; }
  @font-face { font-family: 'Familjen Grotesk'; src: url('https://adom.inc/fonts/familjen-grotesk/familjen-grotesk-latin-500-normal.woff2') format('woff2'); font-weight: 500; }
  @font-face { font-family: 'Satoshi'; src: url('https://adom.inc/fonts/satoshi/satoshi-400-normal.woff2') format('woff2'); font-weight: 400; }
  @font-face { font-family: 'Satoshi'; src: url('https://adom.inc/fonts/satoshi/satoshi-500-normal.woff2') format('woff2'); font-weight: 500; }
  @font-face { font-family: 'JetBrains Mono'; src: url('https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx3cwhsk.woff2') format('woff2'); font-weight: 400; }

  :root {
    --bg: #0d1117; --surface: #161b22; --elevated: #1c2128; --border: #30363d; --border-muted: #21262d;
    --text: #e6edf3; --text-muted: #8b949e; --text-dim: #484f58;
    --accent: #00b8b0; --accent-bright: #00e6dc; --accent-dim: rgba(0,184,176,0.12); --accent-border: rgba(0,184,176,0.25);
    --green: #3fb950; --orange: #d29922; --red: #f85149; --purple: #8C6BF7; --blue: #58a6ff;
    --led-color: #DC143C; --led-color-dim: #DC143C1e; --led-color-border: #DC143C59;
  }
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body { font-family: 'Satoshi', sans-serif; background: var(--bg); color: var(--text); font-size: 13px; line-height: 1.6; overflow-y: auto; }
  h1,h2,h3 { font-family: 'Familjen Grotesk', sans-serif; font-weight: 700; }
  code { font-family: 'JetBrains Mono', monospace; font-size: 12px; }
  a { color: var(--accent); text-decoration: none; }
  a:hover { color: var(--accent-bright); text-decoration: underline; }

  .header { background: var(--surface); border-bottom: 1px solid var(--border-muted); padding: 20px 24px; }
  .header-top { display: flex; align-items: center; gap: 12px; margin-bottom: 4px; }
  .header .brand { color: var(--accent); font-family: 'Familjen Grotesk', sans-serif; font-size: 12px; font-weight: 600; }
  .header .vsep { width: 1px; height: 16px; background: var(--border); }
  .header .crumb { color: var(--text-dim); font-size: 12px; }
  .header h1 { font-size: 22px; margin-bottom: 2px; }
  .header h1 .val { color: var(--led-color); }
  .header .subtitle { color: var(--text-muted); font-size: 13px; }
  .header .tags { display: flex; gap: 6px; margin-top: 10px; flex-wrap: wrap; }
  .tag { display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px; border-radius: 12px; font-size: 11px; font-weight: 500; }
  .tag.pkg { background: rgba(0,184,176,0.12); color: var(--accent); }
  .tag.mfr { background: rgba(88,166,255,0.12); color: var(--blue); }
  .tag.series { background: rgba(140,107,247,0.12); color: var(--purple); }
  .tag.rohs { background: rgba(63,185,80,0.12); color: var(--green); }
  .tag.app { background: var(--led-color-dim); color: var(--led-color); }

  .container { max-width: 1100px; margin: 0 auto; padding: 24px; }
  .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
  .grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; }
  @media (max-width: 800px) { .grid-2, .grid-3 { grid-template-columns: 1fr; } }

  .section { margin-bottom: 28px; }
  .section-title { font-size: 14px; color: var(--text); margin-bottom: 12px; padding-bottom: 6px; border-bottom: 1px solid var(--border-muted); display: flex; align-items: center; gap: 8px; }
  .section-title .icon { color: var(--accent); font-size: 16px; }

  .card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 16px; }
  .card:hover { border-color: var(--accent-border); }

  .spec-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; }
  .spec-card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 12px 14px; text-align: center; }
  .spec-card .sc-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-dim); margin-bottom: 4px; }
  .spec-card .sc-value { font-size: 22px; font-weight: 700; font-family: 'Familjen Grotesk', sans-serif; }
  .spec-card .sc-detail { font-size: 11px; color: var(--text-muted); margin-top: 2px; }
  .spec-card.highlight { border-color: var(--led-color-border); background: linear-gradient(180deg, #DC143C0f, var(--surface)); }
  .spec-card.highlight .sc-value { color: var(--led-color); }

  .detail-table { width: 100%; border-collapse: collapse; }
  .detail-table tr { border-bottom: 1px solid var(--border-muted); }
  .detail-table tr:last-child { border-bottom: none; }
  .detail-table td { padding: 8px 0; }
  .detail-table td:first-child { color: var(--text-muted); font-size: 12px; width: 45%; }
  .detail-table td:last-child { font-family: 'JetBrains Mono', monospace; font-size: 13px; text-align: right; }

  .chart-wrap { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 16px; }
  .chart-wrap h3 { font-size: 13px; color: var(--text); margin-bottom: 12px; }
  .chart-wrap .chart-note { font-size: 11px; color: var(--text-dim); margin-top: 8px; }
  svg text { font-family: 'JetBrains Mono', monospace; }

  .pkg-drawing { display: flex; align-items: center; justify-content: center; padding: 20px; }

  .env-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  @media (max-width: 700px) { .env-grid { grid-template-columns: 1fr; } }
  .env-card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 12px 14px; }
  .env-card .env-name { font-size: 12px; font-weight: 600; margin-bottom: 4px; }
  .env-card .env-spec { font-size: 11px; color: var(--text-muted); }
  .env-card .env-detail { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--text); margin-top: 4px; }

  .vendor-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
  @media (max-width: 700px) { .vendor-cards { grid-template-columns: 1fr; } }
  .vendor-card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 14px; }
  .vendor-card .vc-name { font-size: 12px; font-weight: 600; margin-bottom: 6px; }
  .vendor-card .vc-name.mouser { color: var(--blue); }
  .vendor-card .vc-name.digikey { color: var(--red); }
  .vendor-card .vc-name.jlcpcb { color: var(--green); }
  .vendor-card .vc-price { font-size: 20px; font-weight: 700; font-family: 'Familjen Grotesk', sans-serif; }
  .vendor-card .vc-detail { font-size: 11px; color: var(--text-muted); margin-top: 4px; }
  .vendor-card .vc-link { display: inline-block; margin-top: 8px; font-size: 11px; color: var(--accent); }
  .vendor-card.recommended { border-color: var(--accent-border); }
  .vendor-card.recommended::before { content: 'RECOMMENDED'; display: block; font-size: 9px; letter-spacing: 1px; color: var(--accent); margin-bottom: 6px; font-weight: 600; }

  .copy-btn { background: none; border: 1px solid var(--border); color: var(--text-muted); border-radius: 4px; padding: 2px 6px; font-size: 13px; cursor: pointer; font-family: 'JetBrains Mono', monospace; vertical-align: middle; transition: border-color 0.15s, color 0.15s; }
  .copy-btn:hover { border-color: var(--accent); color: var(--accent); }

  .dl-btn { display: inline-block; margin-top: 10px; padding: 6px 14px; background: var(--accent-dim); border: 1px solid var(--accent-border); border-radius: 6px; color: var(--accent); font-size: 11px; font-weight: 500; font-family: 'Satoshi', sans-serif; text-decoration: none; transition: background 0.15s, border-color 0.15s; }
  .dl-btn:hover { background: rgba(0,184,176,0.2); border-color: var(--accent); text-decoration: none; color: var(--accent-bright); }

  .open-full-banner { display: flex; align-items: center; justify-content: center; padding: 12px 24px; background: linear-gradient(90deg, rgba(0,184,176,0.12), rgba(0,184,176,0.06)); border-bottom: 1px solid var(--accent-border); }
  .open-full-btn { display: inline-flex; align-items: center; gap: 8px; padding: 8px 20px; background: var(--accent); color: var(--bg); font-family: 'Familjen Grotesk', sans-serif; font-size: 13px; font-weight: 600; border-radius: 6px; text-decoration: none; transition: background 0.15s; cursor: pointer; border: none; }
  .open-full-btn:hover { background: var(--accent-bright); text-decoration: none; color: var(--bg); }

  .source { text-align: center; color: var(--text-dim); font-size: 11px; padding: 24px 0 12px; border-top: 1px solid var(--border-muted); margin-top: 20px; }

  .color-swatch { border-radius: 8px; padding: 20px; text-align: center; position: relative; overflow: hidden; }
  .color-swatch .swatch-block { width: 100%; height: 80px; border-radius: 6px; margin-bottom: 12px; position: relative; }
  .color-swatch .swatch-label { font-size: 14px; font-weight: 600; font-family: 'Familjen Grotesk', sans-serif; }
  .color-swatch .swatch-detail { font-size: 11px; color: var(--text-muted); margin-top: 4px; }

  .calc-card { background: var(--surface); border: 1px solid var(--led-color-border); border-radius: 8px; padding: 20px; }
  .calc-card h3 { font-size: 14px; color: var(--led-color); margin-bottom: 16px; font-family: 'Familjen Grotesk', sans-serif; }
  .calc-inputs { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; }
  .calc-field label { display: block; font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }
  .calc-field input { width: 100%; background: var(--bg); border: 1px solid var(--border); color: var(--text); border-radius: 6px; padding: 8px 12px; font-family: 'JetBrains Mono', monospace; font-size: 14px; outline: none; transition: border-color 0.15s; }
  .calc-field input:focus { border-color: var(--led-color); }
  .calc-field .unit { font-size: 11px; color: var(--text-dim); margin-top: 2px; }
  .calc-results { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .calc-result { background: var(--bg); border: 1px solid var(--border-muted); border-radius: 6px; padding: 10px 12px; }
  .calc-result .cr-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-dim); margin-bottom: 2px; }
  .calc-result .cr-value { font-size: 18px; font-weight: 700; font-family: 'Familjen Grotesk', sans-serif; color: var(--led-color); }
  .calc-result .cr-detail { font-size: 11px; color: var(--text-muted); margin-top: 2px; }
  .calc-schematic { margin-top: 16px; text-align: center; }
</style>
</head>
<body>

<div class="open-full-banner" id="fullPageBanner" style="display:none">
  <span style="color:var(--text-muted);font-size:12px;margin-right:8px">Full page:</span>
  <code style="color:var(--accent);font-size:11px;background:var(--elevated);padding:4px 8px;border-radius:4px;user-select:all">https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/IN-S42ATR.html</code>
  <button class="open-full-btn" id="copyFullUrl" style="margin-left:8px">Copy Link</button>
</div>
<script>
if(window.self!==window.top){document.getElementById('fullPageBanner').style.display='flex'}
document.getElementById('copyFullUrl').addEventListener('click',function(){var t=document.createElement('textarea');t.value='https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/IN-S42ATR.html';document.body.appendChild(t);t.select();document.execCommand('copy');document.body.removeChild(t);this.textContent='Copied!';var b=this;setTimeout(function(){b.textContent='Copy Link'},1500)});
</script>

<div class="header">
  <div class="header-top">
    <div class="brand">Adom</div>
    <div class="vsep"></div>
    <div class="crumb">Components &rsaquo; LEDs &rsaquo; 0402</div>
  </div>
  <h1>IN-S42ATR &mdash; <span class="val">Red</span></h1>
  <div class="subtitle">Inolux Corporation &middot; Top View SMD LED &middot; 0402 (1.0 &times; 0.5mm) &middot; AlInGaP</div>
  <div class="tags">
    <span class="tag pkg">0402</span>
    <span class="tag mfr">Inolux</span>
    <span class="tag series">IN-S42AT</span>
    <span class="tag rohs">RoHS</span>
    <span class="tag app">Red LED</span>
  </div>
</div>

<div class="container">

  <!-- Key Specs -->
  <div class="section">
    <div class="spec-cards">
      <div class="spec-card highlight">
        <div class="sc-label">Wavelength</div>
        <div class="sc-value">631nm</div>
        <div class="sc-detail">645nm peak</div>
      </div>
      <div class="spec-card">
        <div class="sc-label">Luminous Intensity</div>
        <div class="sc-value">90mcd</div>
        <div class="sc-detail">@ 20mA</div>
      </div>
      <div class="spec-card">
        <div class="sc-label">Forward Voltage</div>
        <div class="sc-value">2.1V</div>
        <div class="sc-detail">max 2.6V</div>
      </div>
      <div class="spec-card">
        <div class="sc-label">Forward Current</div>
        <div class="sc-value">25mA</div>
        <div class="sc-detail">20mA typical</div>
      </div>
      <div class="spec-card">
        <div class="sc-label">Viewing Angle</div>
        <div class="sc-value">130&deg;</div>
        <div class="sc-detail">2&theta;&frac12;</div>
      </div>
      <div class="spec-card">
        <div class="sc-label">Power Dissipation</div>
        <div class="sc-value">78mW</div>
        <div class="sc-detail">max rated</div>
      </div>
    </div>
  </div>

  <div class="grid-2">
    <!-- Left column -->
    <div>
      <!-- Electrical Characteristics -->
      <div class="section">
        <h2 class="section-title">Electrical Characteristics</h2>
        <div class="card">
          <table class="detail-table">
            <tr><td>Forward Voltage (typ)</td><td>2.1V @ 20mA</td></tr>
            <tr><td>Forward Voltage (max)</td><td>2.6V @ 20mA</td></tr>
            <tr><td>Reverse Voltage (max)</td><td>5V</td></tr>
            <tr><td>Forward Current (max)</td><td>25mA</td></tr>
            <tr><td>Peak Forward Current</td><td>100mA (1/10, 0.1ms)</td></tr>
            <tr><td>Power Dissipation</td><td>78mW</td></tr>
            <tr><td>Dominant Wavelength</td><td>631nm</td></tr>
            <tr><td>Peak Wavelength</td><td>645nm</td></tr>
            <tr><td>Luminous Intensity</td><td>90 mcd @ 20mA</td></tr>
            <tr><td>Viewing Angle (2&theta;&frac12;)</td><td>130&deg;</td></tr>
            <tr><td>Material</td><td>AlInGaP</td></tr>
            <tr><td>Lens Type</td><td>Clear</td></tr>
          </table>
        </div>
      </div>

      <!-- Operating Conditions -->
      <div class="section">
        <h2 class="section-title">Operating Conditions</h2>
        <div class="card">
          <table class="detail-table">
            <tr><td>Operating Temp</td><td>&minus;30&deg;C to +80&deg;C</td></tr>
            <tr><td>Storage Temp</td><td>&minus;40&deg;C to +85&deg;C</td></tr>
            <tr><td>ESD Sensitivity</td><td>AlInGaP &mdash; handle with care</td></tr>
            <tr><td>Polarity</td><td>Cathode marked on package</td></tr>
          </table>
          <div style="margin-top:10px;padding:8px 12px;background:rgba(248,81,73,0.08);border:1px solid rgba(248,81,73,0.2);border-radius:6px;font-size:11px;color:var(--red)">
            &#9888; ESD Sensitive Device &mdash; AlInGaP LEDs require proper ESD precautions during handling and assembly. Use grounded wrist straps and ESD-safe workstations.
          </div>
        </div>
      </div>
    </div>

    <!-- Right column -->
    <div>
      <!-- Package Drawing -->
      <div class="section">
        <h2 class="section-title">Package &amp; Dimensions</h2>
        <div class="card">
          <div class="pkg-drawing">
            <svg width="100%" height="200" viewBox="0 0 500 200">
              <!-- Top view -->
              <text x="120" y="14" fill="#8b949e" font-size="10" text-anchor="middle">Top View</text>
              <rect x="55" y="24" width="130" height="65" rx="2" fill="#1c2128" stroke="#30363d" stroke-width="1.5"/>
              <rect x="55" y="24" width="25" height="65" rx="1" fill="#DC143C26" stroke="#DC143C" stroke-width="1"/>
              <rect x="160" y="24" width="25" height="65" rx="1" fill="#DC143C26" stroke="#DC143C" stroke-width="1"/>
              <line x1="155" y1="28" x2="155" y2="85" stroke="#DC143C" stroke-width="1.5" stroke-dasharray="3,2"/>
              <rect x="92" y="38" width="36" height="37" rx="1" fill="#DC143C40" stroke="#DC143C80" stroke-width="0.8"/>
              <path d="M110,47 Q125,35 135,47" stroke="#DC143C99" stroke-width="0.6" fill="none"/>
              <text x="168" y="18" fill="#DC143C" font-size="9" text-anchor="middle">K (cathode)</text>
              <text x="68" y="18" fill="#8b949e" font-size="9" text-anchor="middle">A</text>

              <line x1="55" y1="102" x2="185" y2="102" stroke="#484f58" stroke-width="0.5"/>
              <line x1="55" y1="98" x2="55" y2="106" stroke="#484f58" stroke-width="0.5"/>
              <line x1="185" y1="98" x2="185" y2="106" stroke="#484f58" stroke-width="0.5"/>
              <text x="120" y="118" fill="#e6edf3" font-size="10" text-anchor="middle">1.0 &plusmn; 0.1</text>

              <line x1="195" y1="24" x2="195" y2="89" stroke="#484f58" stroke-width="0.5"/>
              <line x1="191" y1="24" x2="199" y2="24" stroke="#484f58" stroke-width="0.5"/>
              <line x1="191" y1="89" x2="199" y2="89" stroke="#484f58" stroke-width="0.5"/>
              <text x="215" y="60" fill="#e6edf3" font-size="10">0.5 &plusmn; 0.1</text>

              <!-- Side view -->
              <text x="380" y="14" fill="#8b949e" font-size="10" text-anchor="middle">Side View</text>
              <rect x="315" y="40" width="130" height="38" rx="2" fill="#1c2128" stroke="#30363d" stroke-width="1.5"/>
              <path d="M320,40 Q380,30 445,40" stroke="#DC143C80" stroke-width="1.5" fill="#DC143C14"/>
              <rect x="315" y="40" width="20" height="38" rx="1" fill="#DC143C26" stroke="#DC143C" stroke-width="1"/>
              <rect x="425" y="40" width="20" height="38" rx="1" fill="#DC143C26" stroke="#DC143C" stroke-width="1"/>
              <line x1="455" y1="30" x2="455" y2="78" stroke="#484f58" stroke-width="0.5"/>
              <line x1="451" y1="30" x2="459" y2="30" stroke="#484f58" stroke-width="0.5"/>
              <line x1="451" y1="78" x2="459" y2="78" stroke="#484f58" stroke-width="0.5"/>
              <text x="465" y="58" fill="#e6edf3" font-size="10">0.45 &plusmn; 0.1</text>

              <text x="120" y="145" fill="#8b949e" font-size="10" text-anchor="middle">0402 (1005 metric)</text>
              <text x="380" y="100" fill="#8b949e" font-size="10" text-anchor="middle">Clear lens &middot; AlInGaP</text>

              <rect x="55" y="158" width="390" height="28" rx="4" fill="#DC143C0f" stroke="#DC143C33" stroke-width="0.5"/>
              <text x="250" y="176" fill="#DC143C" font-size="10" text-anchor="middle">&#9888; Polarized &mdash; cathode mark on package indicates negative terminal</text>
            </svg>
          </div>
        </div>
      </div>

      <!-- Land Pattern -->
      <div class="section">
        <h2 class="section-title">Recommended Land Pattern</h2>
        <div class="card">
          <table class="detail-table">
            <tr><td>Pad Width</td><td>0.4 &plusmn; 0.1mm</td></tr>
            <tr><td>Pad Height</td><td>0.6 &plusmn; 0.1mm</td></tr>
            <tr><td>Pad Gap (edge-to-edge)</td><td>0.6 &plusmn; 0.1mm</td></tr>
            <tr><td>Polarity</td><td>Cathode marked on PCB</td></tr>
          </table>
        </div>
      </div>
    </div>
  </div>

  <!-- Color Swatch -->
  <div class="section">
    <h2 class="section-title">Emission Color</h2>
    <div class="card color-swatch">
      <div class="swatch-block" style="background: linear-gradient(135deg, #DC143C, #FF0000); box-shadow: 0 4px 24px #DC143C50; display:flex; align-items:center; justify-content:center;">
        <span style="font-size:28px;font-weight:700;font-family:'Familjen Grotesk',sans-serif;color:#fff;text-shadow:0 2px 8px rgba(0,0,0,0.5)">Red</span>
      </div>
      <div class="swatch-label" style="color:#DC143C">631nm Dominant Wavelength</div>
      <div class="swatch-detail">Peak wavelength 645nm &middot; AlInGaP semiconductor &middot; CSS approximation: #DC143C</div>
    </div>
  </div>

  <!-- Spectral Distribution -->
  <div class="section">
    <h2 class="section-title">Spectral Distribution</h2>
    <div class="chart-wrap">
      <h3>Emission Spectrum &mdash; Relative Intensity vs. Wavelength</h3>
      <svg id="spectral-chart" width="100%" height="280" viewBox="0 0 700 280">
        <rect x="60" y="20" width="600" height="200" fill="#0d1117" rx="4"/>
        <line x1="60" y1="220" x2="660" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="170" x2="660" y2="170" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="120" x2="660" y2="120" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="70" x2="660" y2="70" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="20" x2="660" y2="20" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="180" y1="20" x2="180" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="300" y1="20" x2="300" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="420" y1="20" x2="420" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="540" y1="20" x2="540" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>

        <path d="M60,220 L60,220 L369,219 L372,219 L375,218 L378,217 L381,216 L384,215 L387,213 L390,211 L393,208 L396,204 L399,199 L402,193 L405,186 L408,178 L411,169 L414,158 L417,146 L420,134 L423,120 L426,106 L429,92 L432,78 L435,64 L438,52 L441,41 L444,32 L447,25 L450,21 L453,20 L456,21 L459,25 L462,32 L465,41 L468,52 L471,64 L474,78 L477,92 L480,106 L483,120 L486,134 L489,146 L492,158 L495,169 L498,178 L501,186 L504,193 L507,199 L510,204 L513,208 L516,211 L519,213 L522,215 L525,216 L528,217 L531,218 L534,219 L537,219 L660,220 L660,220 Z" fill="url(#INS42ATRGrad)" opacity="0.3"/>
        <defs>
          <linearGradient id="INS42ATRGrad" x1="0" y1="0" x2="0" y2="1">
            <stop offset="0%" stop-color="#DC143C" stop-opacity="0.6"/>
            <stop offset="100%" stop-color="#DC143C" stop-opacity="0.05"/>
          </linearGradient>
        </defs>
        <path d="M60,220 L60,220 L369,219 L372,219 L375,218 L378,217 L381,216 L384,215 L387,213 L390,211 L393,208 L396,204 L399,199 L402,193 L405,186 L408,178 L411,169 L414,158 L417,146 L420,134 L423,120 L426,106 L429,92 L432,78 L435,64 L438,52 L441,41 L444,32 L447,25 L450,21 L453,20 L456,21 L459,25 L462,32 L465,41 L468,52 L471,64 L474,78 L477,92 L480,106 L483,120 L486,134 L489,146 L492,158 L495,169 L498,178 L501,186 L504,193 L507,199 L510,204 L513,208 L516,211 L519,213 L522,215 L525,216 L528,217 L531,218 L534,219 L537,219 L660,220 L660,220" stroke="#DC143C" stroke-width="2.5" fill="none"/>


        <!-- Peak annotation -->
        <circle cx="453" cy="22" r="4" fill="#DC143C" opacity="0.9"/>
        <line x1="453" y1="22" x2="453" y2="220" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.4"/>
        <text x="453" y="238" fill="#DC143C" font-size="10" text-anchor="middle">631nm</text>



        <text x="55" y="224" fill="#484f58" font-size="9" text-anchor="end">0%</text>
        <text x="55" y="174" fill="#484f58" font-size="9" text-anchor="end">25%</text>
        <text x="55" y="124" fill="#484f58" font-size="9" text-anchor="end">50%</text>
        <text x="55" y="74" fill="#484f58" font-size="9" text-anchor="end">75%</text>
        <text x="55" y="24" fill="#484f58" font-size="9" text-anchor="end">100%</text>
        <text x="12" y="124" fill="#484f58" font-size="9" text-anchor="middle" transform="rotate(-90,12,124)">Relative Intensity</text>

        <text x="60" y="255" fill="#484f58" font-size="9" text-anchor="middle">500</text>
        <text x="180" y="255" fill="#484f58" font-size="9" text-anchor="middle">540</text>
        <text x="300" y="255" fill="#484f58" font-size="9" text-anchor="middle">580</text>
        <text x="420" y="255" fill="#484f58" font-size="9" text-anchor="middle">620</text>
        <text x="540" y="255" fill="#484f58" font-size="9" text-anchor="middle">660</text>
        <text x="660" y="255" fill="#484f58" font-size="9" text-anchor="middle">700</text>
        <text x="360" y="272" fill="#484f58" font-size="9" text-anchor="middle">Wavelength (nm)</text>
      </svg>
      <div class="chart-note">Red emission centered at 631nm dominant wavelength (645nm peak). The narrow spectral width indicates a well-defined color output typical of AlInGaP LEDs.</div>
    </div>
  </div>

  <!-- IV Curve -->
  <div class="section">
    <h2 class="section-title">Forward Current vs. Forward Voltage</h2>
    <div class="chart-wrap">
      <h3>IV Characteristic &mdash; the essential curve for circuit design</h3>
      <svg id="iv-chart" width="100%" height="280" viewBox="0 0 700 280">
        <rect x="60" y="20" width="600" height="200" fill="#0d1117" rx="4"/>
        <line x1="60" y1="220" x2="660" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="170" x2="660" y2="170" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="120" x2="660" y2="120" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="70" x2="660" y2="70" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="20" x2="660" y2="20" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="180" y1="20" x2="180" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="300" y1="20" x2="300" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="420" y1="20" x2="420" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="540" y1="20" x2="540" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>


        <path d="M60,220 L168,220 L222,220 L254,219 L265,218 L276,216 L285,212 L294,200 L303,180 L312,140 L327,120 L342,100 L357,70 L372,20" stroke="#DC143C" stroke-width="2.5" fill="none"/>
        <path d="M60,220 L168,220 L222,220 L254,219 L265,218 L276,216 L285,212 L294,200 L303,180 L312,140 L327,120 L342,100 L357,70 L372,20 L372,220 L60,220 Z" fill="url(#INS42ATRGrad)" opacity="0.15"/>

        <!-- Operating point -->
        <circle cx="312" cy="140" r="5" fill="#DC143C" opacity="0.9"/>
        <line x1="312" y1="140" x2="312" y2="220" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.5"/>
        <line x1="60" y1="140" x2="312" y2="140" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.5"/>
        <rect x="317" y="126" width="108" height="28" rx="4" fill="#DC143C1e"/>
        <text x="371" y="139" fill="#DC143C" font-size="10" text-anchor="middle">Typ: 2.1V, 20mA</text>
        <text x="371" y="149" fill="#8b949e" font-size="8" text-anchor="middle">Operating point</text>

        <!-- Max Vf -->
        <line x1="372" y1="20" x2="372" y2="220" stroke="#f85149" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.5"/>
        <text x="372" y="248" fill="#f85149" font-size="9" text-anchor="middle">2.6V max</text>

        <!-- Max If -->
        <line x1="60" y1="120" x2="660" y2="120" stroke="#f85149" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.3"/>
        <text x="100" y="114" fill="#f85149" font-size="9">25mA max</text>

        <text x="55" y="224" fill="#484f58" font-size="9" text-anchor="end">0</text>
        <text x="55" y="174" fill="#484f58" font-size="9" text-anchor="end">12.5</text>
        <text x="55" y="124" fill="#484f58" font-size="9" text-anchor="end">25</text>
        <text x="55" y="74" fill="#484f58" font-size="9" text-anchor="end">37.5</text>
        <text x="55" y="24" fill="#484f58" font-size="9" text-anchor="end">50</text>
        <text x="12" y="124" fill="#484f58" font-size="9" text-anchor="middle" transform="rotate(-90,12,124)">Forward Current (mA)</text>

        <text x="60" y="255" fill="#484f58" font-size="9" text-anchor="middle">0.0</text>
        <text x="180" y="255" fill="#484f58" font-size="9" text-anchor="middle">1.0</text>
        <text x="300" y="255" fill="#484f58" font-size="9" text-anchor="middle">2.0</text>
        <text x="420" y="255" fill="#484f58" font-size="9" text-anchor="middle">3.0</text>
        <text x="540" y="255" fill="#484f58" font-size="9" text-anchor="middle">4.0</text>
        <text x="660" y="255" fill="#484f58" font-size="9" text-anchor="middle">5.0</text>

        <text x="360" y="272" fill="#484f58" font-size="9" text-anchor="middle">Forward Voltage (V)</text>
      </svg>
      <div class="chart-note">Characteristic exponential IV curve for an AlInGaP red LED. Near-zero current until threshold (~1.8V), then steep rise. Design point: 2.1V typical at 20mA. Never exceed 2.6V forward or 25mA continuous.</div>
    </div>
  </div>

  <!-- Current Derating -->
  <div class="section">
    <h2 class="section-title">Forward Current Derating</h2>
    <div class="chart-wrap">
      <h3>Maximum Forward Current vs. Ambient Temperature</h3>
      <svg id="derating-chart" width="100%" height="280" viewBox="0 0 700 280">
        <rect x="60" y="20" width="600" height="200" fill="#0d1117" rx="4"/>
        <line x1="60" y1="220" x2="660" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="170" x2="660" y2="170" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="120" x2="660" y2="120" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="70" x2="660" y2="70" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="180" y1="20" x2="180" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="300" y1="20" x2="300" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="420" y1="20" x2="420" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="540" y1="20" x2="540" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>

        <path d="M60,20 L210,20" stroke="#DC143C" stroke-width="2.5" fill="none"/>
        <path d="M210,20 L540,187" stroke="#DC143C" stroke-width="2.5" fill="none"/>
        <path d="M540,187 L606,220" stroke="#DC143C" stroke-width="2.5" fill="none" stroke-dasharray="4,3"/>
        <path d="M60,20 L210,20 L540,187 L606,220 L60,220 Z" fill="url(#INS42ATRGrad)" opacity="0.12"/>

        <circle cx="210" cy="20" r="4" fill="#DC143C" opacity="0.9"/>
        <text x="210" y="40" fill="#DC143C" font-size="10" text-anchor="middle">30mA @ 25&deg;C</text>
        <circle cx="540" cy="187" r="4" fill="#DC143C" opacity="0.9"/>
        <text x="540" y="178" fill="#DC143C" font-size="10" text-anchor="middle">5mA @ 80&deg;C</text>

        <rect x="200" y="100" width="110" height="20" rx="4" fill="rgba(63,185,80,0.12)"/>
        <text x="255" y="114" fill="#3fb950" font-size="10" text-anchor="middle">Safe operating</text>

        <text x="55" y="224" fill="#484f58" font-size="9" text-anchor="end">0</text>
        <text x="55" y="174" fill="#484f58" font-size="9" text-anchor="end">7.5</text>
        <text x="55" y="124" fill="#484f58" font-size="9" text-anchor="end">15</text>
        <text x="55" y="74" fill="#484f58" font-size="9" text-anchor="end">22.5</text>
        <text x="55" y="24" fill="#484f58" font-size="9" text-anchor="end">30</text>
        <text x="12" y="124" fill="#484f58" font-size="9" text-anchor="middle" transform="rotate(-90,12,124)">Max If (mA)</text>

        <text x="60" y="255" fill="#484f58" font-size="9" text-anchor="middle">0</text>
        <text x="210" y="255" fill="#484f58" font-size="9" text-anchor="middle">25</text>
        <text x="360" y="255" fill="#484f58" font-size="9" text-anchor="middle">50</text>
        <text x="540" y="255" fill="#484f58" font-size="9" text-anchor="middle">80</text>
        <text x="660" y="255" fill="#484f58" font-size="9" text-anchor="middle">100</text>
        <text x="360" y="272" fill="#484f58" font-size="9" text-anchor="middle">Ambient Temperature (&deg;C)</text>
      </svg>
      <div class="chart-note">Maximum allowable forward current decreases linearly with temperature. At 80&deg;C ambient, derate to only 5mA. Design margin is critical in enclosed or high-temperature applications.</div>
    </div>
  </div>

  <!-- Luminous Intensity vs Current -->
  <div class="section">
    <h2 class="section-title">Luminous Intensity vs. Forward Current</h2>
    <div class="chart-wrap">
      <h3>Relative Brightness (normalized at 20mA)</h3>
      <svg id="brightness-current-chart" width="100%" height="280" viewBox="0 0 700 280">
        <rect x="60" y="20" width="600" height="200" fill="#0d1117" rx="4"/>
        <line x1="60" y1="220" x2="660" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="170" x2="660" y2="170" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="120" x2="660" y2="120" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="70" x2="660" y2="70" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="180" y1="20" x2="180" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="300" y1="20" x2="300" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="420" y1="20" x2="420" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="540" y1="20" x2="540" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>

        <path d="M60,220 Q120,180 180,158 Q240,138 300,120 Q360,100 420,78 Q480,62 540,48 Q600,36 660,25"
              stroke="#DC143C" stroke-width="2.5" fill="none"/>

        <path d="M60,220 L660,20" stroke="#484f58" stroke-width="1" stroke-dasharray="5,4" opacity="0.4"/>
        <text x="600" y="50" fill="#484f58" font-size="9">Linear</text>

        <circle cx="300" cy="120" r="5" fill="#DC143C" opacity="0.9"/>
        <line x1="60" y1="120" x2="300" y2="120" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.4"/>
        <line x1="300" y1="120" x2="300" y2="220" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.4"/>
        <text x="310" y="114" fill="#DC143C" font-size="10">1.0 @ 20mA</text>

        <text x="55" y="224" fill="#484f58" font-size="9" text-anchor="end">0</text>
        <text x="55" y="174" fill="#484f58" font-size="9" text-anchor="end">0.5</text>
        <text x="55" y="124" fill="#484f58" font-size="9" text-anchor="end">1.0</text>
        <text x="55" y="74" fill="#484f58" font-size="9" text-anchor="end">1.5</text>
        <text x="55" y="24" fill="#484f58" font-size="9" text-anchor="end">2.0</text>
        <text x="12" y="124" fill="#484f58" font-size="9" text-anchor="middle" transform="rotate(-90,12,124)">Relative Brightness</text>

        <text x="60" y="255" fill="#484f58" font-size="9" text-anchor="middle">0</text>
        <text x="180" y="255" fill="#484f58" font-size="9" text-anchor="middle">10</text>
        <text x="300" y="255" fill="#484f58" font-size="9" text-anchor="middle">20</text>
        <text x="420" y="255" fill="#484f58" font-size="9" text-anchor="middle">30</text>
        <text x="540" y="255" fill="#484f58" font-size="9" text-anchor="middle">40</text>
        <text x="660" y="255" fill="#484f58" font-size="9" text-anchor="middle">50</text>
        <text x="360" y="272" fill="#484f58" font-size="9" text-anchor="middle">Forward Current (mA)</text>
      </svg>
      <div class="chart-note">Brightness increases sublinearly with current. Doubling the current from 20mA to 40mA yields only ~70% more light, not 100%. This means diminishing returns at higher drive currents &mdash; optimize for efficiency at or below 20mA.</div>
    </div>
  </div>

  <!-- Brightness vs Temperature -->
  <div class="section">
    <h2 class="section-title">Luminous Intensity vs. Temperature</h2>
    <div class="chart-wrap">
      <h3>Relative Brightness vs. Ambient Temperature (normalized at 25&deg;C)</h3>
      <svg id="brightness-temp-chart" width="100%" height="280" viewBox="0 0 700 280">
        <rect x="60" y="20" width="600" height="200" fill="#0d1117" rx="4"/>
        <line x1="60" y1="220" x2="660" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="1"/>
        <line x1="60" y1="170" x2="660" y2="170" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="120" x2="660" y2="120" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="60" y1="70" x2="660" y2="70" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="180" y1="20" x2="180" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="300" y1="20" x2="300" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="420" y1="20" x2="420" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="540" y1="20" x2="540" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>

        <path d="M60,85 L120,89 L180,96 L240,103 L300,110 L390,120 L450,126 L510,133 L570,140 L630,150 L660,160" stroke="#DC143C" stroke-width="2.5" fill="none"/>

        <circle cx="390" cy="120" r="5" fill="#DC143C" opacity="0.9"/>
        <line x1="60" y1="120" x2="390" y2="120" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.4"/>
        <line x1="390" y1="120" x2="390" y2="220" stroke="#DC143C" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.4"/>
        <text x="400" y="114" fill="#DC143C" font-size="10">1.0 @ 25&deg;C</text>

        <text x="100" y="62" fill="#58a6ff" font-size="9">Brighter when cold</text>
        <text x="570" y="165" fill="#f85149" font-size="9">Dimmer when hot</text>

        <text x="55" y="224" fill="#484f58" font-size="9" text-anchor="end">0</text>
        <text x="55" y="174" fill="#484f58" font-size="9" text-anchor="end">0.5</text>
        <text x="55" y="124" fill="#484f58" font-size="9" text-anchor="end">1.0</text>
        <text x="55" y="74" fill="#484f58" font-size="9" text-anchor="end">1.5</text>
        <text x="55" y="24" fill="#484f58" font-size="9" text-anchor="end">2.0</text>
        <text x="12" y="124" fill="#484f58" font-size="9" text-anchor="middle" transform="rotate(-90,12,124)">Relative Brightness</text>

        <text x="60" y="255" fill="#484f58" font-size="9" text-anchor="middle">-30</text>
        <text x="180" y="255" fill="#484f58" font-size="9" text-anchor="middle">-10</text>
        <text x="300" y="255" fill="#484f58" font-size="9" text-anchor="middle">10</text>
        <text x="390" y="255" fill="#484f58" font-size="9" text-anchor="middle">25</text>
        <text x="540" y="255" fill="#484f58" font-size="9" text-anchor="middle">50</text>
        <text x="660" y="255" fill="#484f58" font-size="9" text-anchor="middle">70</text>
        <text x="360" y="272" fill="#484f58" font-size="9" text-anchor="middle">Ambient Temperature (&deg;C)</text>
      </svg>
      <div class="chart-note">AlInGaP LEDs lose brightness at elevated temperatures. At 70&deg;C, expect ~40% reduction in luminous intensity. Conversely, the LED is ~35% brighter at -30&deg;C. Account for this in designs with wide temperature swings.</div>
    </div>
  </div>

  <!-- Resistor Calculator -->
  <div class="section">
    <h2 class="section-title">LED Resistor Calculator</h2>
    <div class="calc-card">
      <h3>&#9889; Series Resistor Selection</h3>
      <div class="calc-inputs">
        <div class="calc-field">
          <label>Supply Voltage</label>
          <input type="number" id="calc-vsupply" value="3.3" step="0.1" min="0">
          <div class="unit">Volts</div>
        </div>
        <div class="calc-field">
          <label>Desired Current</label>
          <input type="number" id="calc-iled" value="20" step="1" min="0">
          <div class="unit">Milliamps</div>
        </div>
      </div>
      <div class="calc-results">
        <div class="calc-result">
          <div class="cr-label">Calculated Resistor</div>
          <div class="cr-value" id="calc-r-exact">60.0 &Omega;</div>
          <div class="cr-detail" id="calc-r-formula">R = (3.3V - 2.1V) / 20mA</div>
        </div>
        <div class="calc-result">
          <div class="cr-label">Nearest E24 Value</div>
          <div class="cr-value" id="calc-r-e24">62.0 &Omega;</div>
          <div class="cr-detail" id="calc-r-actual">Actual If = 19.4mA</div>
        </div>
        <div class="calc-result">
          <div class="cr-label">Resistor Power</div>
          <div class="cr-value" id="calc-p-resistor">23.2 mW</div>
          <div class="cr-detail" id="calc-p-r-detail">P = (V<sub>supply</sub> - V<sub>f</sub>) &times; I<sub>f</sub></div>
        </div>
        <div class="calc-result">
          <div class="cr-label">LED Power</div>
          <div class="cr-value" id="calc-p-led">40.6 mW</div>
          <div class="cr-detail" id="calc-p-led-detail">P = V<sub>f</sub> &times; I<sub>f</sub> (max 78mW)</div>
        </div>
      </div>
      <div class="calc-schematic">
        <svg width="400" height="80" viewBox="0 0 400 80" style="max-width:100%">
          <text x="20" y="38" fill="#e6edf3" font-size="11" font-family="JetBrains Mono,monospace" id="calc-svg-vsupply">3.3V</text>
          <line x1="50" y1="35" x2="90" y2="35" stroke="#e6edf3" stroke-width="1.5"/>
          <path d="M90,35 L100,25 L110,45 L120,25 L130,45 L140,25 L150,45 L160,35" stroke="#00b8b0" stroke-width="2" fill="none"/>
          <text x="125" y="60" fill="#00b8b0" font-size="10" text-anchor="middle" font-family="JetBrains Mono,monospace" id="calc-svg-r">62.0Ω</text>
          <line x1="160" y1="35" x2="210" y2="35" stroke="#e6edf3" stroke-width="1.5"/>
          <polygon points="210,22 210,48 240,35" fill="none" stroke="#DC143C" stroke-width="2"/>
          <line x1="240" y1="22" x2="240" y2="48" stroke="#DC143C" stroke-width="2"/>
          <line x1="230" y1="18" x2="238" y2="10" stroke="#DC143C" stroke-width="1"/>
          <line x1="235" y1="22" x2="243" y2="14" stroke="#DC143C" stroke-width="1"/>
          <polygon points="238,10 234,13 237,14" fill="#DC143C"/>
          <polygon points="243,14 239,17 242,18" fill="#DC143C"/>
          <text x="225" y="65" fill="#DC143C" font-size="10" text-anchor="middle" font-family="JetBrains Mono,monospace">LED</text>
          <line x1="240" y1="35" x2="300" y2="35" stroke="#e6edf3" stroke-width="1.5"/>
          <line x1="300" y1="28" x2="300" y2="42" stroke="#e6edf3" stroke-width="1.5"/>
          <line x1="290" y1="42" x2="310" y2="42" stroke="#e6edf3" stroke-width="1.5"/>
          <line x1="294" y1="47" x2="306" y2="47" stroke="#e6edf3" stroke-width="1.2"/>
          <line x1="297" y1="52" x2="303" y2="52" stroke="#e6edf3" stroke-width="0.8"/>
          <text x="320" y="42" fill="#8b949e" font-size="10" font-family="JetBrains Mono,monospace">GND</text>
          <text x="180" y="26" fill="#8b949e" font-size="9" text-anchor="middle" font-family="JetBrains Mono,monospace" id="calc-svg-if">20mA</text>
          <line x1="168" y1="30" x2="192" y2="30" stroke="#8b949e" stroke-width="0.5"/>
          <polygon points="192,30 187,27 187,33" fill="#8b949e"/>
        </svg>
      </div>
    </div>
  </div>

  <!-- Environmental -->
  <div class="section">
    <h2 class="section-title">Environmental &amp; Handling</h2>
    <div class="env-grid">
      <div class="env-card">
        <div class="env-name">ESD Sensitivity</div>
        <div class="env-spec">AlInGaP &mdash; handle with care</div>
        <div class="env-detail">Use grounded wrist straps &amp; ESD-safe tools</div>
      </div>
      <div class="env-card">
        <div class="env-name">Operating Temperature</div>
        <div class="env-spec">Continuous operation range</div>
        <div class="env-detail">&minus;30&deg;C to +80&deg;C</div>
      </div>
      <div class="env-card">
        <div class="env-name">Storage Temperature</div>
        <div class="env-spec">Unbiased storage</div>
        <div class="env-detail">&minus;40&deg;C to +85&deg;C</div>
      </div>
      <div class="env-card">
        <div class="env-name">Moisture Sensitivity</div>
        <div class="env-spec">MSL noted in packaging</div>
        <div class="env-detail">Follow J-STD-020 bake requirements</div>
      </div>
    </div>
  </div>

  <!-- Symbol, Footprint & 3D -->  <!-- Symbol, Footprint & 3D View -->
  <div class="section">
    <h2 class="section-title">Symbol, Footprint &amp; 3D Model</h2>
    <div class="grid-2" style="margin-bottom:12px">
      <!-- Interactive SymView -->
      <div class="card" style="padding:0;overflow:hidden">
        <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">Schematic Symbol</div>
        <iframe src="IN-S42ATR-symview.html" style="width:100%;height:340px;border:none;display:block" allow="fullscreen"></iframe>
      </div>
      <!-- Interactive FpView -->
      <div class="card" style="padding:0;overflow:hidden">
        <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">Footprint (0402)</div>
        <iframe src="IN-S42ATR-fpview.html" style="width:100%;height:340px;border:none;display:block" allow="fullscreen"></iframe>
      </div>
    </div>
    <!-- 3D Model — interactive: Adom 3D viewer (Colby's) + Static/Pick-and-Place additions. Local build, embedded here as an interim while the homepage viewer is in progress. -->
    <div class="card" style="padding:0;overflow:hidden;margin-bottom:12px">
      <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">3D Model &mdash; Static &amp; Pick-and-Place (interactive)</div>
      <iframe src="IN-S42ATR-viewer.html" style="width:100%;height:560px;border:none;display:block" allow="fullscreen"></iframe>
    </div>
    <!-- Download / Export Bar -->
    <div class="card" style="display:flex;align-items:center;gap:10px;flex-wrap:wrap">
      <span style="font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.5px">Export:</span>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/IN-S42ATR.kicad_sym" download>KiCad Symbol (.kicad_sym)</a>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/IN-S42ATR.kicad_mod" download>KiCad Footprint (.kicad_mod)</a>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/IN-S42ATR.lbr" download>Fusion 360 (.lbr)</a>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/IN-S42ATR.step" download>3D Model (.step)</a>
    </div>
  </div>

  <!-- Pricing -->
  <div class="section">
    <h2 class="section-title">Pricing &amp; Availability</h2>
    <div class="vendor-cards">
      <div class="vendor-card recommended">
        <div class="vc-name mouser">Mouser Electronics</div>
        <div class="vc-price">&mdash;</div>
        <div class="vc-detail">Check availability</div>
        <a class="vc-link" href="https://www.mouser.com/Search/Refine?Keyword=IN-S42ATR" target="_blank">Search on Mouser &rarr;</a>
      </div>
      <div class="vendor-card">
        <div class="vc-name digikey">DigiKey</div>
        <div class="vc-price">&mdash;</div>
        <div class="vc-detail">Check availability</div>
        <a class="vc-link" href="https://www.digikey.com/en/products/result?keywords=IN-S42ATR" target="_blank">Search on DigiKey &rarr;</a>
      </div>
      <div class="vendor-card">
        <div class="vc-name jlcpcb">JLCPCB / LCSC</div>
        <div class="vc-price">&mdash;</div>
        <div class="vc-detail">Check availability</div>
      </div>
    </div>
  </div>

  <!-- Documents -->
  <div class="section">
    <h2 class="section-title">Documents</h2>
    <div class="card">
      <table class="detail-table">
        <tr><td>Datasheet</td><td><a href="http://www.inolux-corp.com/datasheet/SMDLED/Mono%20Color%20Top%20View/IN-S42AT%20Series_V1.1.pdf" target="_blank">IN-S42AT Series V1.1 (PDF) &rarr;</a></td></tr>
        <tr><td>Series</td><td>IN-S42AT</td></tr>
        <tr><td>Manufacturer</td><td>Inolux Corporation</td></tr>
      </table>
    </div>
  </div>

  <!-- Molecule -->
  <div class="section">
    <h2 class="section-title">Molecule &mdash; Single-Passive Board</h2>
    <div class="card" style="padding:0;overflow:hidden;border-radius:8px">
      <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">Interactive 3D Board Viewer</div>
      <iframe src="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42atr/tsci-viewer/molecule-viewer/index.html"
              style="width:100%;height:500px;border:none;border-radius:0 0 8px 8px;display:block"
              allow="fullscreen"></iframe>
    </div>
    <div style="font-size:11px;color:var(--text-dim);margin-top:8px;text-align:center">
      Orbit: click &amp; drag &middot; Zoom: scroll &middot; Inspect: click a component &middot; X-ray: toggle in toolbar
    </div>
  </div>

  <div class="source">
    IN-S42ATR characterization &middot; Data from Inolux IN-S42AT Series V1.1 datasheet + adom-parts-search &middot; 2026-06-03
  </div>

</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/pmrem/PMREMGenerator.js"></script>
<script>
(function() {
  // ==================== 3D Viewer — IN-S42ATR (0402 LED, red) ====================
  var canvas = document.getElementById('viewer3d');
  if (canvas && window.THREE) {
    var scene = new THREE.Scene();

    var renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: true, alpha: true, logarithmicDepthBuffer: true });
    renderer.setSize(canvas.width, canvas.height);
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
    renderer.outputEncoding = THREE.sRGBEncoding;
    renderer.toneMapping = THREE.ACESFilmicToneMapping;
    renderer.toneMappingExposure = 1.2;
    renderer.physicallyCorrectLights = true;

    canvas.style.background = 'linear-gradient(180deg, #5a6b7e 0%, #2a3340 100%)';

    var camera = new THREE.PerspectiveCamera(35, canvas.width / canvas.height, 0.01, 1000);

    var pmremGen = new THREE.PMREMGenerator(renderer);
    pmremGen.compileEquirectangularShader();
    var envScene = new THREE.Scene();
    envScene.background = new THREE.Color(0x3a4550);
    var envLight1 = new THREE.DirectionalLight(0xffffff, 2);
    envLight1.position.set(1, 3, 2);
    envScene.add(envLight1);
    var envLight2 = new THREE.DirectionalLight(0x8899bb, 1);
    envLight2.position.set(-2, 1, -1);
    envScene.add(envLight2);
    var envRT = pmremGen.fromScene(envScene, 0.04);
    scene.environment = envRT.texture;

    var hemi = new THREE.HemisphereLight(0xe6edf3, 0xb3a699, 0.5);
    scene.add(hemi);
    var keyLight = new THREE.DirectionalLight(0xffffff, 1.5);
    keyLight.position.set(2, 5, 3);
    scene.add(keyLight);
    var fillLight = new THREE.DirectionalLight(0x8899aa, 0.5);
    fillLight.position.set(-3, 2, -2);
    scene.add(fillLight);
    var rimLight = new THREE.DirectionalLight(0xff3333, 0.4);
    rimLight.position.set(0, -1, 3);
    scene.add(rimLight);

    var S = 2.5;

    var bodyMat = new THREE.MeshStandardMaterial({
      color: 0x2a2018, metalness: 0.0, roughness: 0.4
    });
    var lensMat = new THREE.MeshStandardMaterial({
      color: 0xDC143C, metalness: 0.0, roughness: 0.15,
      transparent: true, opacity: 0.55,
      emissive: 0xFF0000, emissiveIntensity: 0.3
    });
    var termMat = new THREE.MeshStandardMaterial({
      color: 0xc8ccd1, metalness: 1.0, roughness: 0.25,
      polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: -1
    });
    var padMat = new THREE.MeshStandardMaterial({ color: 0xc9a04c, metalness: 1.0, roughness: 0.22 });
    var pcbMat = new THREE.MeshStandardMaterial({ color: 0x0a2a0a, metalness: 0.0, roughness: 0.6 });
    var cathodeMat = new THREE.MeshStandardMaterial({ color: 0xDC143C, emissive: 0xFF0000, emissiveIntensity: 0.5, metalness: 0.0, roughness: 0.5 });

    var bodyW = 1.0, bodyD = 0.5, bodyH = 0.30;
    var lensH = 0.15;
    var termW = 0.20;

    var innerW = bodyW - termW * 2 + 0.02;
    var body = new THREE.Mesh(new THREE.BoxGeometry(innerW*S, bodyH*S, bodyD*S), bodyMat);
    body.position.y = bodyH*S/2;
    scene.add(body);

    var lens = new THREE.Mesh(new THREE.BoxGeometry(bodyW*0.85*S, lensH*S, bodyD*0.85*S), lensMat);
    lens.position.y = (bodyH + lensH/2)*S;
    scene.add(lens);

    function makeTerminal(xSign) {
      var group = new THREE.Group();
      var front = new THREE.Mesh(new THREE.BoxGeometry(termW*S, bodyH*S, bodyD*S*0.99), termMat);
      front.position.set(xSign*(bodyW/2 - termW/2)*S, bodyH*S/2, 0);
      group.add(front);
      var bot = new THREE.Mesh(new THREE.BoxGeometry((termW+0.03)*S, 0.04*S, bodyD*S*0.99), termMat);
      bot.position.set(xSign*(bodyW/2 - termW/2)*S, 0.02*S, 0);
      group.add(bot);
      return group;
    }
    scene.add(makeTerminal(-1));
    scene.add(makeTerminal(1));

    var cathMark = new THREE.Mesh(new THREE.BoxGeometry(0.02*S, 0.02*S, bodyD*0.7*S), cathodeMat);
    cathMark.position.set(0.25*S, (bodyH + lensH + 0.02)*S, 0);
    scene.add(cathMark);

    var pcb = new THREE.Mesh(new THREE.BoxGeometry(10*S, 0.08*S, 8*S), pcbMat);
    pcb.position.y = -0.04*S;
    scene.add(pcb);

    var pad1 = new THREE.Mesh(new THREE.BoxGeometry(0.4*S, 0.025*S, 0.6*S), padMat);
    pad1.position.set(-0.3*S, 0.005*S, 0);
    scene.add(pad1);
    var pad2 = new THREE.Mesh(new THREE.BoxGeometry(0.4*S, 0.025*S, 0.6*S), padMat);
    pad2.position.set(0.3*S, 0.005*S, 0);
    scene.add(pad2);

    var gridMat2 = new THREE.LineBasicMaterial({ color: 0x0d3d0d, transparent: true, opacity: 0.3 });
    for (var i = -8; i <= 8; i++) {
      var pts1 = [new THREE.Vector3(i*0.4*S, 0.045*S, -4*S), new THREE.Vector3(i*0.4*S, 0.045*S, 4*S)];
      scene.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts1), gridMat2));
      var pts2 = [new THREE.Vector3(-4*S, 0.045*S, i*0.4*S), new THREE.Vector3(4*S, 0.045*S, i*0.4*S)];
      scene.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts2), gridMat2));
    }

    var isDragging = false, prevX = 0, prevY = 0;
    var theta = Math.PI/4, phi = Math.PI/5.5, radius = 5.0;
    var target = new THREE.Vector3(0, 0.4, 0);

    function updateCamera() {
      camera.position.x = radius * Math.sin(theta) * Math.cos(phi);
      camera.position.y = radius * Math.sin(phi) + target.y;
      camera.position.z = radius * Math.cos(theta) * Math.cos(phi);
      camera.lookAt(target);
    }
    updateCamera();

    canvas.addEventListener('mousedown', function(e) { isDragging = true; prevX = e.clientX; prevY = e.clientY; canvas.style.cursor = 'grabbing'; });
    window.addEventListener('mouseup', function() { isDragging = false; canvas.style.cursor = 'grab'; });
    canvas.addEventListener('mousemove', function(e) {
      if (!isDragging) return;
      theta -= (e.clientX - prevX) * 0.008;
      phi = Math.max(0.05, Math.min(Math.PI/2.2, phi + (e.clientY - prevY) * 0.008));
      prevX = e.clientX; prevY = e.clientY;
      updateCamera();
    });
    canvas.addEventListener('wheel', function(e) {
      e.preventDefault();
      radius = Math.max(2, Math.min(12, radius + e.deltaY * 0.004));
      updateCamera();
    }, { passive: false });

    function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); }
    animate();
  }

  // ==================== Chart Tooltip System ====================
  function setupChartTooltip(svgId, dataPoints, color, formatX, formatY) {
    var svg = document.getElementById(svgId);
    if (!svg) return;

    var ns = 'http://www.w3.org/2000/svg';

    var dot = document.createElementNS(ns, 'circle');
    dot.setAttribute('r', '5');
    dot.setAttribute('fill', color);
    dot.setAttribute('stroke', '#0d1117');
    dot.setAttribute('stroke-width', '2');
    dot.style.display = 'none';
    dot.style.pointerEvents = 'none';
    svg.appendChild(dot);

    var tipGroup = document.createElementNS(ns, 'g');
    tipGroup.style.display = 'none';
    tipGroup.style.pointerEvents = 'none';

    var tipBg = document.createElementNS(ns, 'rect');
    tipBg.setAttribute('rx', '4');
    tipBg.setAttribute('fill', '#161b22');
    tipBg.setAttribute('stroke', '#30363d');
    tipBg.setAttribute('stroke-width', '1');

    var tipLine1 = document.createElementNS(ns, 'text');
    tipLine1.setAttribute('font-family', 'JetBrains Mono, monospace');
    tipLine1.setAttribute('font-size', '10');
    tipLine1.setAttribute('fill', '#e6edf3');

    var tipLine2 = document.createElementNS(ns, 'text');
    tipLine2.setAttribute('font-family', 'JetBrains Mono, monospace');
    tipLine2.setAttribute('font-size', '10');
    tipLine2.setAttribute('fill', color);

    tipGroup.appendChild(tipBg);
    tipGroup.appendChild(tipLine1);
    tipGroup.appendChild(tipLine2);
    svg.appendChild(tipGroup);

    var vLine = document.createElementNS(ns, 'line');
    vLine.setAttribute('stroke', color);
    vLine.setAttribute('stroke-width', '0.5');
    vLine.setAttribute('stroke-dasharray', '3,3');
    vLine.setAttribute('opacity', '0.5');
    vLine.style.display = 'none';
    vLine.style.pointerEvents = 'none';
    svg.appendChild(vLine);

    function lerp(pts, svgX) {
      if (svgX <= pts[0].sx) return pts[0];
      if (svgX >= pts[pts.length-1].sx) return pts[pts.length-1];
      for (var i = 0; i < pts.length - 1; i++) {
        if (svgX >= pts[i].sx && svgX <= pts[i+1].sx) {
          var t = (svgX - pts[i].sx) / (pts[i+1].sx - pts[i].sx);
          return {
            sx: svgX,
            sy: pts[i].sy + t * (pts[i+1].sy - pts[i].sy),
            vx: pts[i].vx + t * (pts[i+1].vx - pts[i].vx),
            vy: pts[i].vy + t * (pts[i+1].vy - pts[i].vy),
          };
        }
      }
      return pts[0];
    }

    svg.addEventListener('mousemove', function(e) {
      var pt = svg.createSVGPoint();
      pt.x = e.clientX;
      pt.y = e.clientY;
      var svgPt = pt.matrixTransform(svg.getScreenCTM().inverse());

      var minX = dataPoints[0].sx;
      var maxX = dataPoints[dataPoints.length-1].sx;
      if (svgPt.x < minX - 10 || svgPt.x > maxX + 10) {
        dot.style.display = 'none';
        tipGroup.style.display = 'none';
        vLine.style.display = 'none';
        return;
      }

      var p = lerp(dataPoints, svgPt.x);

      dot.setAttribute('cx', p.sx);
      dot.setAttribute('cy', p.sy);
      dot.style.display = '';

      vLine.setAttribute('x1', p.sx);
      vLine.setAttribute('y1', p.sy);
      vLine.setAttribute('x2', p.sx);
      vLine.setAttribute('y2', 220);
      vLine.style.display = '';

      var xLabel = formatX(p.vx);
      var yLabel = formatY(p.vy);
      tipLine1.textContent = xLabel;
      tipLine2.textContent = yLabel;

      var tipX = p.sx + 12;
      var tipY = p.sy - 28;
      var boxW = Math.max(xLabel.length, yLabel.length) * 7 + 16;
      var boxH = 32;

      var adjustedX = tipX + boxW > 660 ? p.sx - boxW - 12 : tipX;
      var adjustedY = tipY < 10 ? p.sy + 12 : tipY;

      tipBg.setAttribute('x', adjustedX);
      tipBg.setAttribute('y', adjustedY);
      tipBg.setAttribute('width', boxW);
      tipBg.setAttribute('height', boxH);

      tipLine1.setAttribute('x', adjustedX + 8);
      tipLine1.setAttribute('y', adjustedY + 13);
      tipLine2.setAttribute('x', adjustedX + 8);
      tipLine2.setAttribute('y', adjustedY + 26);

      tipGroup.style.display = '';
    });

    svg.addEventListener('mouseleave', function() {
      dot.style.display = 'none';
      tipGroup.style.display = 'none';
      vLine.style.display = 'none';
    });
  }

  // ==================== Spectral Chart ====================
  var spectralData = [
    {sx:60, sy:220, vx:500, vy:0.0},
    {sx:369, sy:219, vx:603, vy:0.4},
    {sx:372, sy:219, vx:604, vy:0.6},
    {sx:375, sy:218, vx:605, vy:0.9},
    {sx:378, sy:217, vx:606, vy:1.3},
    {sx:381, sy:216, vx:607, vy:1.8},
    {sx:384, sy:215, vx:608, vy:2.6},
    {sx:387, sy:213, vx:609, vy:3.5},
    {sx:390, sy:211, vx:610, vy:4.7},
    {sx:393, sy:208, vx:611, vy:6.2},
    {sx:396, sy:204, vx:612, vy:8.2},
    {sx:399, sy:199, vx:613, vy:10.6},
    {sx:402, sy:193, vx:614, vy:13.5},
    {sx:405, sy:186, vx:615, vy:17.0},
    {sx:408, sy:178, vx:616, vy:21.0},
    {sx:411, sy:169, vx:617, vy:25.7},
    {sx:414, sy:158, vx:618, vy:31.0},
    {sx:417, sy:146, vx:619, vy:36.9},
    {sx:420, sy:134, vx:620, vy:43.2},
    {sx:423, sy:120, vx:621, vy:50.0},
    {sx:426, sy:106, vx:622, vy:57.0},
    {sx:429, sy:92, vx:623, vy:64.2},
    {sx:432, sy:78, vx:624, vy:71.2},
    {sx:435, sy:64, vx:625, vy:77.9},
    {sx:438, sy:52, vx:626, vy:84.1},
    {sx:441, sy:41, vx:627, vy:89.5},
    {sx:444, sy:32, vx:628, vy:94.0},
    {sx:447, sy:25, vx:629, vy:97.3},
    {sx:450, sy:21, vx:630, vy:99.3},
    {sx:453, sy:20, vx:631, vy:100.0},
    {sx:456, sy:21, vx:632, vy:99.3},
    {sx:459, sy:25, vx:633, vy:97.3},
    {sx:462, sy:32, vx:634, vy:94.0},
    {sx:465, sy:41, vx:635, vy:89.5},
    {sx:468, sy:52, vx:636, vy:84.1},
    {sx:471, sy:64, vx:637, vy:77.9},
    {sx:474, sy:78, vx:638, vy:71.2},
    {sx:477, sy:92, vx:639, vy:64.2},
    {sx:480, sy:106, vx:640, vy:57.0},
    {sx:483, sy:120, vx:641, vy:50.0},
    {sx:486, sy:134, vx:642, vy:43.2},
    {sx:489, sy:146, vx:643, vy:36.9},
    {sx:492, sy:158, vx:644, vy:31.0},
    {sx:495, sy:169, vx:645, vy:25.7},
    {sx:498, sy:178, vx:646, vy:21.0},
    {sx:501, sy:186, vx:647, vy:17.0},
    {sx:504, sy:193, vx:648, vy:13.5},
    {sx:507, sy:199, vx:649, vy:10.6},
    {sx:510, sy:204, vx:650, vy:8.2},
    {sx:513, sy:208, vx:651, vy:6.2},
    {sx:516, sy:211, vx:652, vy:4.7},
    {sx:519, sy:213, vx:653, vy:3.5},
    {sx:522, sy:215, vx:654, vy:2.6},
    {sx:525, sy:216, vx:655, vy:1.8},
    {sx:528, sy:217, vx:656, vy:1.3},
    {sx:531, sy:218, vx:657, vy:0.9},
    {sx:534, sy:219, vx:658, vy:0.6},
    {sx:537, sy:219, vx:659, vy:0.4},
    {sx:660, sy:220, vx:700, vy:0.0},
  ];

  setupChartTooltip('spectral-chart', spectralData, '#DC143C',
    function(x) { return x.toFixed(0) + ' nm'; },
    function(y) { return 'Intensity: ' + y.toFixed(1) + '%'; }
  );

  // ==================== IV Chart ====================
  var ivData = [
    {sx:60, sy:220, vx:0.00, vy:0.0},
    {sx:168, sy:220, vx:0.90, vy:0.0},
    {sx:222, sy:220, vx:1.35, vy:0.1},
    {sx:254, sy:219, vx:1.62, vy:0.3},
    {sx:265, sy:218, vx:1.71, vy:0.5},
    {sx:276, sy:216, vx:1.80, vy:1.0},
    {sx:285, sy:212, vx:1.88, vy:2.0},
    {sx:294, sy:200, vx:1.95, vy:5.0},
    {sx:303, sy:180, vx:2.02, vy:10.0},
    {sx:312, sy:140, vx:2.10, vy:20.0},
    {sx:327, sy:120, vx:2.23, vy:25.0},
    {sx:342, sy:100, vx:2.35, vy:30.0},
    {sx:357, sy:70, vx:2.48, vy:37.5},
    {sx:372, sy:20, vx:2.60, vy:50.0},
  ];

  setupChartTooltip('iv-chart', ivData, '#DC143C',
    function(x) { return 'Vf = ' + x.toFixed(2) + ' V'; },
    function(y) { return 'If = ' + y.toFixed(1) + ' mA'; }
  );

  // ==================== Derating Chart ====================
  var deratingData = [
    {sx:60, sy:20, vx:0, vy:30.0},
    {sx:210, sy:20, vx:25, vy:30.0},
    {sx:240, sy:35, vx:30, vy:27.7},
    {sx:270, sy:50, vx:35, vy:25.5},
    {sx:300, sy:65, vx:40, vy:23.2},
    {sx:330, sy:81, vx:45, vy:20.9},
    {sx:360, sy:96, vx:50, vy:18.6},
    {sx:390, sy:111, vx:55, vy:16.4},
    {sx:420, sy:126, vx:60, vy:14.1},
    {sx:450, sy:141, vx:65, vy:11.8},
    {sx:480, sy:156, vx:70, vy:9.5},
    {sx:510, sy:172, vx:75, vy:7.3},
    {sx:540, sy:187, vx:80, vy:5.0},
    {sx:606, sy:220, vx:91, vy:0.0},
  ];

  setupChartTooltip('derating-chart', deratingData, '#DC143C',
    function(x) { return x.toFixed(0) + '\u00b0C'; },
    function(y) { return 'Max If = ' + y.toFixed(1) + ' mA'; }
  );

  // ==================== Brightness vs Current ====================
  var brightCurrentData = [
    {sx:60,  sy:220, vx:0,  vy:0},
    {sx:120, sy:168, vx:5,  vy:0.52},
    {sx:180, sy:148, vx:10, vy:0.72},
    {sx:240, sy:135, vx:15, vy:0.85},
    {sx:300, sy:120, vx:20, vy:1.0},
    {sx:360, sy:108, vx:25, vy:1.12},
    {sx:420, sy:95,  vx:30, vy:1.25},
    {sx:540, sy:69,  vx:40, vy:1.51},
    {sx:660, sy:40,  vx:50, vy:1.80},
  ];

  setupChartTooltip('brightness-current-chart', brightCurrentData, '#DC143C',
    function(x) { return 'If = ' + x.toFixed(0) + ' mA'; },
    function(y) { return 'Brightness: ' + y.toFixed(2) + 'x'; }
  );

  // ==================== Brightness vs Temperature ====================
  var brightTempData = [
    {sx:60, sy:70, vx:-30, vy:1.50},
    {sx:120, sy:79, vx:-20, vy:1.41},
    {sx:180, sy:88, vx:-10, vy:1.32},
    {sx:240, sy:97, vx:0, vy:1.23},
    {sx:300, sy:106, vx:10, vy:1.14},
    {sx:390, sy:120, vx:25, vy:1.00},
    {sx:450, sy:127, vx:35, vy:0.93},
    {sx:510, sy:133, vx:45, vy:0.87},
    {sx:570, sy:140, vx:55, vy:0.80},
    {sx:630, sy:147, vx:65, vy:0.73},
    {sx:660, sy:150, vx:70, vy:0.70},
  ];

  setupChartTooltip('brightness-temp-chart', brightTempData, '#DC143C',
    function(x) { return x.toFixed(0) + '\u00b0C'; },
    function(y) { return 'Brightness: ' + y.toFixed(2) + 'x'; }
  );

  // ==================== Resistor Calculator ====================
  var VF_TYP = 2.1;

  var E24 = [10,11,12,13,15,16,18,20,22,24,27,30,33,36,39,43,47,51,56,62,68,75,82,91];

  function nearestE24(val) {
    if (val <= 0) return 0;
    var decade = 1;
    while (val >= 100) { val /= 10; decade *= 10; }
    while (val < 10) { val *= 10; decade /= 10; }
    var best = E24[0], bestDist = Math.abs(val - E24[0]);
    for (var i = 1; i < E24.length; i++) {
      var d = Math.abs(val - E24[i]);
      if (d < bestDist) { bestDist = d; best = E24[i]; }
    }
    return best * decade;
  }

  function formatResistance(r) {
    if (r >= 1e6) return (r/1e6).toFixed(1) + ' M\u03a9';
    if (r >= 1e3) return (r/1e3).toFixed(0) + ' k\u03a9';
    if (r >= 100) return r.toFixed(0) + ' \u03a9';
    if (r >= 10) return r.toFixed(1) + ' \u03a9';
    return r.toFixed(2) + ' \u03a9';
  }

  function updateCalculator() {
    var vSupply = parseFloat(document.getElementById('calc-vsupply').value) || 0;
    var iLed = parseFloat(document.getElementById('calc-iled').value) || 0;
    var iLedA = iLed / 1000;

    var vDrop = vSupply - VF_TYP;
    var rExact = vDrop > 0 && iLedA > 0 ? vDrop / iLedA : 0;
    var rE24 = nearestE24(rExact);
    var iActual = rE24 > 0 ? vDrop / rE24 : 0;
    var pResistor = vDrop * iActual;
    var pLed = VF_TYP * iActual;

    document.getElementById('calc-r-exact').innerHTML = rExact > 0 ? formatResistance(rExact) : '&mdash;';
    document.getElementById('calc-r-formula').textContent = 'R = (' + vSupply.toFixed(1) + 'V - ' + VF_TYP + 'V) / ' + iLed.toFixed(0) + 'mA';
    document.getElementById('calc-r-e24').innerHTML = rE24 > 0 ? formatResistance(rE24) : '&mdash;';
    document.getElementById('calc-r-actual').textContent = iActual > 0 ? 'Actual If = ' + (iActual * 1000).toFixed(1) + 'mA' : '';
    document.getElementById('calc-p-resistor').textContent = pResistor > 0 ? (pResistor * 1000).toFixed(1) + ' mW' : '\u2014';
    document.getElementById('calc-p-led').textContent = pLed > 0 ? (pLed * 1000).toFixed(1) + ' mW' : '\u2014';

    var svgVs = document.getElementById('calc-svg-vsupply');
    if (svgVs) svgVs.textContent = vSupply.toFixed(1) + 'V';
    var svgR = document.getElementById('calc-svg-r');
    if (svgR) svgR.textContent = rE24 > 0 ? formatResistance(rE24) : '\u2014';
    var svgIf = document.getElementById('calc-svg-if');
    if (svgIf) svgIf.textContent = iActual > 0 ? (iActual * 1000).toFixed(1) + 'mA' : '';

    var pLedEl = document.getElementById('calc-p-led');
    if (pLed * 1000 > 78) {
      pLedEl.style.color = '#f85149';
    } else {
      pLedEl.style.color = '';
    }

    var rExactEl = document.getElementById('calc-r-exact');
    if (vDrop <= 0) {
      rExactEl.innerHTML = '<span style="color:#f85149">V<sub>supply</sub> too low</span>';
    }
  }

  document.getElementById('calc-vsupply').addEventListener('input', updateCalculator);
  document.getElementById('calc-iled').addEventListener('input', updateCalculator);

  updateCalculator();
})();
</script>
</div>
</body>
</html>