123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IN-S42ATA — 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;
    --amber: #FF8C00; --amber-dim: rgba(255,140,0,0.12); --amber-border: rgba(255,140,0,0.35);
  }
  * { 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(--amber); }
  .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(--amber-dim); color: var(--amber); }

  .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); }

  /* Key spec cards */
  .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(--amber-border); background: linear-gradient(180deg, rgba(255,140,0,0.06), var(--surface)); }
  .spec-card.highlight .sc-value { color: var(--amber); }

  /* Detail table */
  .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; }

  /* SVG charts */
  .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; }

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

  /* Environmental specs */
  .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 */
  .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 */
  .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; }

  /* Resistor calculator */
  .calc-card { background: var(--surface); border: 1px solid var(--amber-border); border-radius: 8px; padding: 20px; }
  .calc-card h3 { font-size: 14px; color: var(--amber); 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(--amber); }
  .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(--amber); }
  .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-s42ata/IN-S42ATA.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-s42ata/IN-S42ATA.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-S42ATA &mdash; <span class="val">Amber</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">Amber 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">605nm</div>
        <div class="sc-detail">610nm peak</div>
      </div>
      <div class="spec-card">
        <div class="sc-label">Luminous Intensity</div>
        <div class="sc-value">145mcd</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">Mouser</div>
        <div class="sc-value">$0.26</div>
        <div class="sc-detail">7,587 in stock</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>605nm</td></tr>
            <tr><td>Peak Wavelength</td><td>610nm</td></tr>
            <tr><td>Luminous Intensity</td><td>145 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>
              <!-- LED body -->
              <rect x="55" y="24" width="130" height="65" rx="2" fill="#1c2128" stroke="#30363d" stroke-width="1.5"/>
              <!-- Anode pad (left) -->
              <rect x="55" y="24" width="25" height="65" rx="1" fill="rgba(255,140,0,0.15)" stroke="#FF8C00" stroke-width="1"/>
              <!-- Cathode pad (right) with mark -->
              <rect x="160" y="24" width="25" height="65" rx="1" fill="rgba(255,140,0,0.15)" stroke="#FF8C00" stroke-width="1"/>
              <!-- Cathode mark (T-bar) -->
              <line x1="155" y1="28" x2="155" y2="85" stroke="#FF8C00" stroke-width="1.5" stroke-dasharray="3,2"/>
              <!-- Die representation -->
              <rect x="92" y="38" width="36" height="37" rx="1" fill="rgba(255,140,0,0.25)" stroke="rgba(255,140,0,0.5)" stroke-width="0.8"/>
              <!-- Bond wire -->
              <path d="M110,47 Q125,35 135,47" stroke="rgba(255,200,100,0.6)" stroke-width="0.6" fill="none"/>
              <!-- Cathode indicator -->
              <text x="168" y="18" fill="#FF8C00" font-size="9" text-anchor="middle">K (cathode)</text>
              <!-- Anode label -->
              <text x="68" y="18" fill="#8b949e" font-size="9" text-anchor="middle">A</text>

              <!-- Width dimension -->
              <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>

              <!-- Depth dimension -->
              <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>
              <!-- LED body side -->
              <rect x="315" y="40" width="130" height="38" rx="2" fill="#1c2128" stroke="#30363d" stroke-width="1.5"/>
              <!-- Lens (clear dome on top) -->
              <path d="M320,40 Q380,30 445,40" stroke="rgba(255,140,0,0.5)" stroke-width="1.5" fill="rgba(255,140,0,0.08)"/>
              <!-- Terminals -->
              <rect x="315" y="40" width="20" height="38" rx="1" fill="rgba(255,140,0,0.15)" stroke="#FF8C00" stroke-width="1"/>
              <rect x="425" y="40" width="20" height="38" rx="1" fill="rgba(255,140,0,0.15)" stroke="#FF8C00" stroke-width="1"/>
              <!-- Height dimension -->
              <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>

              <!-- Physical specs -->
              <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>

              <!-- Polarity note -->
              <rect x="55" y="158" width="390" height="28" rx="4" fill="rgba(255,140,0,0.06)" stroke="rgba(255,140,0,0.2)" stroke-width="0.5"/>
              <text x="250" y="176" fill="#FF8C00" 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 Spacing (center-to-center)</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, #FF8C00, #FF6600); box-shadow: 0 4px 24px rgba(255,140,0,0.3); 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)">Amber</span>
      </div>
      <div class="swatch-label" style="color:var(--amber)">605nm Dominant Wavelength</div>
      <div class="swatch-detail">Peak wavelength 610nm &middot; AlInGaP semiconductor &middot; CSS approximation: #FF8C00</div>
    </div>
  </div>

  <!-- Chart 1: 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"/>
        <!-- Grid -->
        <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"/>
        <!-- Vertical grid -->
        <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"/>

        <!-- Spectral curve (Gaussian-like, peak at 605nm) -->
        <!-- x scale: 500nm=60, 700nm=660, so 1nm = 3px -->
        <!-- y scale: 0%=220, 100%=20, so 1% = 2px -->
        <!-- Fill area under curve -->
        <path d="M60,220 L60,220 Q120,220 180,219 Q240,218 285,210 Q300,205 315,190 Q330,160 345,120 Q352,90 358,50 Q363,28 369,22 Q375,28 381,50 Q387,90 394,120 Q408,160 423,190 Q438,205 453,210 Q498,218 540,219 Q600,220 660,220 Z"
              fill="url(#amberGrad)" opacity="0.3"/>
        <defs>
          <linearGradient id="amberGrad" x1="0" y1="0" x2="0" y2="1">
            <stop offset="0%" stop-color="#FF8C00" stop-opacity="0.6"/>
            <stop offset="100%" stop-color="#FF8C00" stop-opacity="0.05"/>
          </linearGradient>
        </defs>
        <!-- Spectral curve line -->
        <path d="M60,220 Q120,220 180,219 Q240,218 285,210 Q300,205 315,190 Q330,160 345,120 Q352,90 358,50 Q363,28 369,22 Q375,28 381,50 Q387,90 394,120 Q408,160 423,190 Q438,205 453,210 Q498,218 540,219 Q600,220 660,220"
              stroke="#FF8C00" stroke-width="2.5" fill="none"/>

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

        <!-- FWHM indicator -->
        <line x1="345" y1="120" x2="394" y2="120" stroke="#FF8C00" stroke-width="1" stroke-dasharray="4,2" opacity="0.6"/>
        <text x="420" y="116" fill="#8b949e" font-size="9">FWHM ~20nm</text>

        <!-- Y axis labels -->
        <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>

        <!-- X axis labels -->
        <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">Amber emission centered at 605nm dominant wavelength (610nm peak). The narrow spectral width (~20nm FWHM) indicates a well-defined color output typical of AlInGaP LEDs.</div>
    </div>
  </div>

  <!-- Chart 2: 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"/>
        <!-- Grid -->
        <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"/>
        <!-- Vertical grid -->
        <line x1="231" y1="20" x2="231" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="403" y1="20" x2="403" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>
        <line x1="574" y1="20" x2="574" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>

        <!-- IV curve (exponential characteristic) -->
        <path d="M60,220 L231,220 Q300,219 345,218 Q380,216 403,210 Q425,198 440,180 Q455,155 470,120 Q485,85 500,55 Q515,30 530,20"
              stroke="#FF8C00" stroke-width="2.5" fill="none"/>

        <!-- Fill under curve -->
        <path d="M60,220 L231,220 Q300,219 345,218 Q380,216 403,210 Q425,198 440,180 Q455,155 470,120 Q485,85 500,55 Q515,30 530,20 L530,220 Z"
              fill="url(#amberGrad)" opacity="0.15"/>

        <!-- Operating point marker: 2.1V, 20mA -->
        <circle cx="440" cy="140" r="5" fill="#FF8C00" opacity="0.9"/>
        <line x1="440" y1="140" x2="440" y2="220" stroke="#FF8C00" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.5"/>
        <line x1="60" y1="140" x2="440" y2="140" stroke="#FF8C00" stroke-width="0.5" stroke-dasharray="3,3" opacity="0.5"/>
        <rect x="445" y="126" width="100" height="28" rx="4" fill="rgba(255,140,0,0.12)"/>
        <text x="495" y="140" fill="#FF8C00" font-size="10" text-anchor="middle">Typ: 2.1V, 20mA</text>
        <text x="495" y="150" fill="#8b949e" font-size="8" text-anchor="middle">Operating point</text>

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

        <!-- Max If line -->
        <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>

        <!-- Y axis labels -->
        <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>

        <!-- X axis labels -->
        <text x="60" y="255" fill="#484f58" font-size="9" text-anchor="middle">0</text>
        <text x="231" y="255" fill="#484f58" font-size="9" text-anchor="middle">1.0</text>
        <text x="403" y="255" fill="#484f58" font-size="9" text-anchor="middle">2.0</text>
        <text x="574" y="255" fill="#484f58" font-size="9" text-anchor="middle">3.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 amber 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>

  <!-- Chart 3: 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"/>
        <!-- Grid -->
        <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"/>
        <!-- Vertical grid -->
        <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"/>

        <!-- Derating curve: linear from ~30mA at 25C to ~5mA at 80C -->
        <!-- x scale: 0C=60, 100C=660, so 1C = 6px -->
        <!-- y scale: 0mA=220, 30mA=20, so 1mA ~= 6.67px -->
        <!-- 25C -> x=210, 30mA -> y=20 -->
        <!-- 80C -> x=540, 5mA -> y=187 -->
        <path d="M210,20 L540,187" stroke="#FF8C00" stroke-width="2.5" fill="none"/>
        <!-- Extend flat at left -->
        <path d="M60,20 L210,20" stroke="#FF8C00" stroke-width="2.5" fill="none"/>
        <!-- Extend to zero at right (extrapolate to ~84C) -->
        <path d="M540,187 L565,220" stroke="#FF8C00" stroke-width="2.5" fill="none" stroke-dasharray="4,3"/>

        <!-- Fill under curve -->
        <path d="M60,20 L210,20 L540,187 L565,220 L60,220 Z" fill="url(#amberGrad)" opacity="0.12"/>

        <!-- 25C marker -->
        <circle cx="210" cy="20" r="4" fill="#FF8C00" opacity="0.9"/>
        <text x="210" y="40" fill="#FF8C00" font-size="10" text-anchor="middle">30mA @ 25&deg;C</text>

        <!-- 80C marker -->
        <circle cx="540" cy="187" r="4" fill="#FF8C00" opacity="0.9"/>
        <text x="540" y="178" fill="#FF8C00" font-size="10" text-anchor="middle">5mA @ 80&deg;C</text>

        <!-- Safe region label -->
        <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>

        <!-- Y axis labels -->
        <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>

        <!-- X axis labels -->
        <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>

  <!-- Chart 4: Relative 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"/>
        <!-- Grid -->
        <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"/>
        <!-- Vertical grid -->
        <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"/>

        <!-- Brightness vs current curve (sublinear / sqrt-like) -->
        <!-- x: 0mA=60, 50mA=660 => 12px/mA -->
        <!-- y: 0=220, 2.0=20 => 100px per 1.0 -->
        <!-- Points: 0mA=0, 5mA=0.4, 10mA=0.65, 15mA=0.85, 20mA=1.0, 25mA=1.12, 30mA=1.25, 40mA=1.55, 50mA=1.8 -->
        <path d="M60,220 Q120,168 180,155 Q240,135 300,120 Q360,106 420,95 Q480,78 540,64 Q600,52 660,40"
              stroke="#FF8C00" stroke-width="2.5" fill="none"/>

        <!-- Linear reference line (dashed) -->
        <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>

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

        <!-- Y axis labels -->
        <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>

        <!-- X axis labels -->
        <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 ~55% more light, not 100%. This means diminishing returns at higher drive currents &mdash; optimize for efficiency at or below 20mA.</div>
    </div>
  </div>

  <!-- Chart 5: 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"/>
        <!-- Grid -->
        <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"/>
        <!-- Vertical grid -->
        <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"/>

        <!-- Temperature range: -30C to +70C mapped to x: 60..660 => 6px/C -->
        <!-- Brightness range: 0..2.0 mapped to y: 220..20 => 100px per 1.0 -->
        <!-- Points: -30C=1.5, -10C=1.3, 0C=1.2, 10C=1.1, 25C=1.0, 40C=0.88, 50C=0.8, 60C=0.75, 70C=0.7 -->
        <!-- -30C: x=60, y=70 | 25C: x=390, y=120 | 70C: x=660, y=150 -->
        <path d="M60,70 L180,95 L240,105 L300,112 L390,120 L480,134 L540,142 L600,148 L660,150"
              stroke="#FF8C00" stroke-width="2.5" fill="none"/>

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

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

        <!-- Y axis labels -->
        <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>

        <!-- X axis labels -->
        <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 ~30% reduction in luminous intensity. Conversely, the LED is ~50% 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 &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">24.0 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">42.0 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%">
          <!-- Supply -->
          <text x="20" y="38" fill="#e6edf3" font-size="11" font-family="JetBrains Mono,monospace" id="calc-svg-vsupply">3.3V</text>
          <!-- Line from supply -->
          <line x1="50" y1="35" x2="90" y2="35" stroke="#e6edf3" stroke-width="1.5"/>
          <!-- Resistor symbol -->
          <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&Omega;</text>
          <!-- Line to LED -->
          <line x1="160" y1="35" x2="210" y2="35" stroke="#e6edf3" stroke-width="1.5"/>
          <!-- LED symbol (triangle + bar) -->
          <polygon points="210,22 210,48 240,35" fill="none" stroke="#FF8C00" stroke-width="2"/>
          <line x1="240" y1="22" x2="240" y2="48" stroke="#FF8C00" stroke-width="2"/>
          <!-- Light arrows -->
          <line x1="230" y1="18" x2="238" y2="10" stroke="#FF8C00" stroke-width="1"/>
          <line x1="235" y1="22" x2="243" y2="14" stroke="#FF8C00" stroke-width="1"/>
          <polygon points="238,10 234,13 237,14" fill="#FF8C00"/>
          <polygon points="243,14 239,17 242,18" fill="#FF8C00"/>
          <text x="225" y="65" fill="#FF8C00" font-size="10" text-anchor="middle" font-family="JetBrains Mono,monospace">LED</text>
          <!-- Line to ground -->
          <line x1="240" y1="35" x2="300" y2="35" stroke="#e6edf3" stroke-width="1.5"/>
          <!-- Ground symbol -->
          <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>
          <!-- Current arrow -->
          <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; ESD precautions required</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 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-S42ATA-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-S42ATA-fpview.html" style="width:100%;height:340px;border:none;display:block" allow="fullscreen"></iframe>
      </div>
    </div>
    <!-- 3D Model -->
    <div class="card" style="text-align:center;margin-bottom:12px">
      <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);margin-bottom:12px">3D Model (interactive)</div>
      <canvas id="viewer3d" width="600" height="300" style="width:100%;height:300px;border-radius:4px;cursor:grab"></canvas>
      <div style="font-size:10px;color:var(--text-dim);margin-top:6px">Click &amp; drag to rotate &middot; Scroll to zoom</div>
    </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-s42ata/IN-S42ATA.kicad_sym" download>KiCad Symbol (.kicad_sym)</a>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42ata/IN-S42ATA.kicad_mod" download>KiCad Footprint (.kicad_mod)</a>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42ata/IN-S42ATA.lbr" download>Fusion 360 (.lbr)</a>
      <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/in-s42ata/IN-S42ATA.step" download>3D Model (.step)</a>
    </div>
  </div>

  <!-- Pricing & Availability -->
  <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">$0.26</div>
        <div class="vc-detail">7,587 in stock</div>
        <a class="vc-link" href="https://www.mouser.com/ProductDetail/Inolux/IN-S42ATA?qs=qSfuJ%252Bfl%2Fd4ijVfKKelGRg%3D%3D" target="_blank">View on Mouser &rarr;</a>
      </div>
      <div class="vendor-card">
        <div class="vc-name digikey">DigiKey</div>
        <div class="vc-price">$0.26</div>
        <div class="vc-detail">20,960 in stock</div>
        <a class="vc-link" href="https://www.digikey.com/en/products/detail/inolux/IN-S42ATA/7604959" target="_blank">View 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">Not listed</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><button class="copy-btn" title="Copy link to clipboard" id="ds-copy-btn">&#x2398;</button>
<script>document.getElementById('ds-copy-btn').addEventListener('click',function(){var t=document.createElement('textarea');t.value='http://www.inolux-corp.com/datasheet/SMDLED/Mono%20Color%20Top%20View/IN-S42AT%20Series_V1.1.pdf';document.body.appendChild(t);t.select();document.execCommand('copy');document.body.removeChild(t);this.textContent='Copied!';var b=this;setTimeout(function(){b.innerHTML='⎘'},1500)})</script> <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-s42ata/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-S42ATA 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-S42ATA (0402 LED, amber) ====================
  const canvas = document.getElementById('viewer3d');
  if (canvas && window.THREE) {
    const scene = new THREE.Scene();

    const renderer = new THREE.WebGLRenderer({ 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%)';

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

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

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

    const S = 2.5; // Scale for tiny 0402

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

    // LED body: 1.0 x 0.5 x 0.45mm
    const bodyW = 1.0, bodyD = 0.5, bodyH = 0.30; // base part
    const lensH = 0.15; // lens on top
    const termW = 0.20;

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

    // Amber lens on top
    const 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);

    // Terminals
    function makeTerminal(xSign) {
      const group = new THREE.Group();
      const 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);
      const 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)); // anode
    scene.add(makeTerminal(1));  // cathode

    // Cathode mark (small line on top of body, cathode side)
    const 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);

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

    // Gold pads
    const 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);
    const 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);

    // Grid
    const gridMat2 = new THREE.LineBasicMaterial({ color: 0x0d3d0d, transparent: true, opacity: 0.3 });
    for (let i = -8; i <= 8; i++) {
      const 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));
      const 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));
    }

    // Camera orbit
    let isDragging = false, prevX = 0, prevY = 0;
    let theta = Math.PI/4, phi = Math.PI/5.5, radius = 5.0;
    const 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';
    });
  }

  // ==================== Chart 1: Spectral Distribution ====================
  // x: wavelength 500-700nm mapped to SVG 60-660 (3px/nm)
  // y: relative intensity 0-100% mapped to SVG 220-20
  var spectralData = [
    {sx:60,  sy:220, vx:500, vy:0},
    {sx:180, sy:219, vx:540, vy:0.5},
    {sx:240, sy:218, vx:560, vy:1},
    {sx:285, sy:210, vx:575, vy:5},
    {sx:300, sy:205, vx:580, vy:7.5},
    {sx:315, sy:190, vx:585, vy:15},
    {sx:330, sy:160, vx:590, vy:30},
    {sx:345, sy:120, vx:595, vy:50},
    {sx:352, sy:90,  vx:597, vy:65},
    {sx:358, sy:50,  vx:599, vy:85},
    {sx:363, sy:28,  vx:601, vy:96},
    {sx:369, sy:22,  vx:605, vy:100},
    {sx:375, sy:28,  vx:607, vy:96},
    {sx:381, sy:50,  vx:609, vy:85},
    {sx:387, sy:90,  vx:611, vy:65},
    {sx:394, sy:120, vx:613, vy:50},
    {sx:408, sy:160, vx:618, vy:30},
    {sx:423, sy:190, vx:623, vy:15},
    {sx:438, sy:205, vx:628, vy:7.5},
    {sx:453, sy:210, vx:633, vy:5},
    {sx:498, sy:218, vx:648, vy:1},
    {sx:540, sy:219, vx:660, vy:0.5},
    {sx:660, sy:220, vx:700, vy:0},
  ];

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

  // ==================== Chart 2: IV Curve ====================
  // x: Vf 0-3.5V mapped to SVG 60-660 (171.4px/V)
  // y: If 0-50mA mapped to SVG 220-20 (4px/mA)
  var ivData = [
    {sx:60,  sy:220, vx:0,    vy:0},
    {sx:231, sy:220, vx:1.0,  vy:0},
    {sx:300, sy:219, vx:1.4,  vy:0.25},
    {sx:345, sy:218, vx:1.65, vy:0.5},
    {sx:370, sy:216, vx:1.8,  vy:1},
    {sx:380, sy:214, vx:1.85, vy:1.5},
    {sx:390, sy:212, vx:1.9,  vy:2},
    {sx:403, sy:210, vx:2.0,  vy:2.5},
    {sx:410, sy:205, vx:2.04, vy:3.75},
    {sx:420, sy:198, vx:2.06, vy:5.5},
    {sx:430, sy:180, vx:2.08, vy:10},
    {sx:440, sy:140, vx:2.1,  vy:20},
    {sx:460, sy:120, vx:2.2,  vy:25},
    {sx:470, sy:100, vx:2.3,  vy:30},
    {sx:485, sy:80,  vx:2.4,  vy:35},
    {sx:500, sy:40,  vx:2.55, vy:45},
    {sx:510, sy:20,  vx:2.6,  vy:50},
  ];

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

  // ==================== Chart 3: Current Derating ====================
  // x: temp 0-100C mapped to SVG 60-660 (6px/C)
  // y: max If 0-30mA mapped to SVG 220-20 (6.67px/mA)
  var deratingData = [
    {sx:60,  sy:20,  vx:0,   vy:30},
    {sx:210, sy:20,  vx:25,  vy:30},
    {sx:270, sy:53,  vx:35,  vy:25.5},
    {sx:330, sy:87,  vx:45,  vy:20},
    {sx:390, sy:120, vx:55,  vy:15},
    {sx:450, sy:153, vx:65,  vy:10},
    {sx:540, sy:187, vx:80,  vy:5},
    {sx:565, sy:220, vx:84,  vy:0},
  ];

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

  // ==================== Chart 4: Brightness vs Current ====================
  // x: If 0-50mA mapped to SVG 60-660 (12px/mA)
  // y: relative 0-2.0 mapped to SVG 220-20 (100px per 1.0)
  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, '#FF8C00',
    function(x) { return 'If = ' + x.toFixed(0) + ' mA'; },
    function(y) { return 'Brightness: ' + y.toFixed(2) + 'x'; }
  );

  // ==================== Chart 5: Brightness vs Temperature ====================
  // x: temp -30 to +70C mapped to SVG 60-660 (6px/C)
  // y: relative 0-2.0 mapped to SVG 220-20 (100px per 1.0)
  var brightTempData = [
    {sx:60,  sy:70,  vx:-30, vy:1.50},
    {sx:180, sy:95,  vx:-10, vy:1.25},
    {sx:240, sy:105, vx:0,   vy:1.15},
    {sx:300, sy:112, vx:10,  vy:1.08},
    {sx:390, sy:120, vx:25,  vy:1.00},
    {sx:480, sy:134, vx:40,  vy:0.86},
    {sx:540, sy:142, vx:50,  vy:0.78},
    {sx:600, sy:148, vx:60,  vy:0.72},
    {sx:660, sy:150, vx:70,  vy:0.70},
  ];

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

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

  // E24 standard values (decade 10-100)
  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;
    // Find the decade
    var decade = 1;
    while (val >= 100) { val /= 10; decade *= 10; }
    while (val < 10) { val *= 10; decade /= 10; }
    // Find closest E24 value
    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Ω';
    if (r >= 1e3) return (r/1e3).toFixed(0) + ' kΩ';
    if (r >= 100) return r.toFixed(0) + ' Ω';
    if (r >= 10) return r.toFixed(1) + ' Ω';
    return r.toFixed(2) + ' Ω';
  }

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

    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;

    // Update display
    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' : '—';
    document.getElementById('calc-p-led').textContent = pLed > 0 ? (pLed * 1000).toFixed(1) + ' mW' : '—';

    // Update schematic SVG labels
    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) : '—';
    var svgIf = document.getElementById('calc-svg-if');
    if (svgIf) svgIf.textContent = iActual > 0 ? (iActual * 1000).toFixed(1) + 'mA' : '';

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

    // Warning if insufficient voltage
    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);

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