# IC3 — Layer 01: Data & Field Intelligence
# Professional Graphical Dashboard — Claude Code Prompt v2
# Reference: Tigernix SAM design language (images from Digital_Twin_Design_Sample doc)

---

## DESIGN INSPIRATION (from reference screenshots — implement this quality)

From the Tigernix SAM platform you must achieve:
- **image6**: Bar charts side by side — "Leakage Volume by DMA" horizontal bars + "Leakage by Pipe Material" vertical bars + "Leakage by Pipe Age" grouped bars — all in one page grid
- **image7**: IWA Water Balance — stacked horizontal progress bars showing System Input → Authorised Consumption → Billed Consumption with breakdown panel on right
- **image9**: KPI card grid — large numbers, icon top-right, subtitle below, trend sparkline at bottom — very clean white cards
- **image10**: Integration Hub — cards with status badges (Connected/Warning), data rate counters, last sync time
- **image12**: Donut chart for Asset Condition Distribution + Line chart for Performance Trend + Bar chart for Maintenance Spend Mix + Risk table at bottom
- **image13**: Module home with colored icon cards, summary metrics, clean grid layout

**Key visual patterns to implement:**
1. Large Fraunces serif numbers (28-32px) in tiles
2. Mini bar charts using div heights — NO Chart.js, NO canvas
3. Horizontal stacked progress bars for breakdowns
4. Donut/ring chart using CSS conic-gradient
5. Colored sparkline using SVG polyline (lightweight)
6. Status pills: green "Connected", amber "Warning", red "Offline"
7. Icon chips per asset group (use emoji or Unicode symbols)
8. Side-by-side chart panels in 2-col or 3-col grid
9. Risk score badges: 65/100 in colored pill
10. Trend arrows: ↑ ↓ with color

---

## STEP 1 — READ THESE FILES FIRST

```
read: IC3_24x7_Dashboard.html   ← full file, understand all CSS, realContent(), LAYERS structure
read: src/                       ← existing React/Vite project structure
```

---

## EXACT IC3 CSS TOKENS (from IC3_24x7_Dashboard.html — use precisely)

```css
--abyss:#061521  --deep:#0A2433  --bar:#08202F
--side:#0A2334   --panel:#0C2536  --card:#0F2A3D
--aqua:#3FE5CB   --cyan:#37B8F0   --gold:#F4B740
--rose:#FF8A6B   --violet:#9D8DF1  --green:#52D198
--ink:#EAF4F8    --muted:#9DB7C6  --faint:#5E7C8E
--line:rgba(255,255,255,.08)
--disp:"Fraunces",Georgia,serif
--body:"Inter",system-ui,Arial,sans-serif
Layer 01 accent: --cyan (#37B8F0)
```

---

## NEW GRAPHICAL COMPONENTS TO ADD (add to CSS in IC3_24x7_Dashboard.html)

```css
/* ── CHART PANELS ────────────────────────────────── */
.chart-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:16px}
.chart-grid-2{display:grid;grid-template-columns:2fr 1fr;gap:14px;margin-bottom:16px}
.chart-panel{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px 18px}
.chart-panel .cp-title{font-size:12px;font-weight:700;color:var(--ink);margin-bottom:2px}
.chart-panel .cp-sub{font-size:10px;color:var(--faint);margin-bottom:14px}

/* ── MINI BAR CHART (div-based, no canvas) ──────── */
.bar-chart{display:flex;align-items:flex-end;gap:5px;height:80px;padding-top:8px}
.bar-chart .bc-col{display:flex;flex-direction:column;align-items:center;gap:4px;flex:1}
.bar-chart .bc-bar{width:100%;border-radius:3px 3px 0 0;min-height:3px;transition:height .3s}
.bar-chart .bc-lbl{font-size:8.5px;color:var(--faint);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:40px}
.bar-chart .bc-val{font-size:9px;color:var(--muted);font-weight:600}

/* ── HORIZONTAL BAR (for DMA breakdown) ─────────── */
.hbar-list{display:flex;flex-direction:column;gap:8px}
.hbar-row{display:flex;flex-direction:column;gap:3px}
.hbar-row .hr-top{display:flex;justify-content:space-between;font-size:10.5px}
.hbar-row .hr-name{color:var(--muted);font-weight:500;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px}
.hbar-row .hr-val{color:var(--ink);font-weight:700;font-family:var(--disp);font-size:12px;margin-left:8px}
.hbar-track{height:6px;border-radius:3px;background:rgba(255,255,255,.06);overflow:hidden}
.hbar-fill{height:100%;border-radius:3px;transition:width .4s}

/* ── STACKED HORIZONTAL BAR (water balance) ──────── */
.stack-bar{height:32px;border-radius:6px;overflow:hidden;display:flex;margin-bottom:6px}
.stack-seg{height:100%;display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;color:rgba(255,255,255,.9);transition:width .4s;white-space:nowrap;overflow:hidden;padding:0 6px}

/* ── DONUT RING (CSS conic-gradient) ─────────────── */
.donut-wrap{display:flex;align-items:center;gap:18px}
.donut{width:80px;height:80px;border-radius:50%;flex-shrink:0;position:relative}
.donut-hole{position:absolute;inset:12px;border-radius:50%;background:var(--card);display:flex;align-items:center;justify-content:center;flex-direction:column}
.donut-hole .dh-val{font-family:var(--disp);font-size:16px;font-weight:600;line-height:1;color:var(--ink)}
.donut-hole .dh-lbl{font-size:8px;color:var(--faint);margin-top:1px}
.donut-legend{display:flex;flex-direction:column;gap:5px;flex:1}
.dl-item{display:flex;align-items:center;gap:6px;font-size:10.5px;color:var(--muted)}
.dl-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.dl-val{margin-left:auto;font-weight:600;color:var(--ink);font-family:var(--disp);font-size:12px}

/* ── SVG SPARKLINE ───────────────────────────────── */
.sparkline-wrap{position:relative;height:40px;margin-top:8px}
.sparkline-wrap svg{width:100%;height:100%;overflow:visible}

/* ── STAT CARD (Tigernix style — large number + icon) */
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px}
.stat-card{background:var(--card);border:1px solid var(--line);border-radius:11px;padding:14px 16px;position:relative;overflow:hidden}
.stat-card .sc-icon{position:absolute;top:12px;right:12px;font-size:18px;opacity:.25}
.stat-card .sc-label{font-size:9.5px;text-transform:uppercase;letter-spacing:.1em;color:var(--faint);font-weight:700;margin-bottom:6px}
.stat-card .sc-val{font-family:var(--disp);font-size:28px;font-weight:600;line-height:1;color:var(--ink)}
.stat-card .sc-sub{font-size:10px;color:var(--muted);margin-top:5px}
.stat-card .sc-trend{font-size:10px;font-weight:700;margin-top:4px}
.trend-up{color:var(--green)}.trend-dn{color:var(--rose)}.trend-flat{color:var(--faint)}

/* ── RISK BADGE ──────────────────────────────────── */
.risk-badge{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;padding:2px 7px;border-radius:4px}
.risk-high{background:rgba(255,138,107,.18);color:var(--rose)}
.risk-med{background:rgba(244,183,64,.18);color:var(--gold)}
.risk-low{background:rgba(82,209,152,.18);color:var(--green)}

/* ── STATUS PILL ─────────────────────────────────── */
.status-pill{display:inline-flex;align-items:center;gap:4px;font-size:9px;font-weight:700;padding:2px 8px;border-radius:99px;letter-spacing:.04em}
.sp-ok{background:rgba(82,209,152,.14);color:var(--green)}
.sp-warn{background:rgba(244,183,64,.14);color:var(--gold)}
.sp-err{background:rgba(255,138,107,.14);color:var(--rose)}
.sp-dot{width:5px;height:5px;border-radius:50%;background:currentColor}

/* ── INTEGRATION CARD (SCADA / sync sources) ──────── */
.intg-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:16px}
.intg-card{background:var(--card);border:1px solid var(--line);border-radius:11px;padding:14px 16px}
.intg-card .ic-name{font-size:12.5px;font-weight:700;color:var(--ink);margin-bottom:2px}
.intg-card .ic-sys{font-size:10px;color:var(--faint);margin-bottom:8px}
.intg-card .ic-desc{font-size:10.5px;color:var(--muted);line-height:1.5;margin-bottom:10px}
.intg-card .ic-foot{display:flex;align-items:center;justify-content:space-between;margin-top:8px;padding-top:8px;border-top:1px solid var(--line)}
.intg-card .ic-rate{font-size:9.5px;color:var(--faint)}
.intg-card .ic-time{font-size:9px;color:var(--faint)}

/* ── ASSET ROW (risk table style) ────────────────── */
.asset-risk-table{width:100%;border-collapse:collapse;font-size:11.5px;margin-bottom:14px}
.asset-risk-table th{text-align:left;padding:6px 10px;font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--faint);border-bottom:1px solid var(--line);font-weight:700}
.asset-risk-table td{padding:8px 10px;border-bottom:1px solid rgba(255,255,255,.04);color:var(--muted);vertical-align:middle}
.asset-risk-table td.v{color:var(--ink);font-weight:600}
.asset-risk-table tr:hover td{background:rgba(255,255,255,.02)}
.score-bar{display:inline-flex;align-items:center;gap:6px}
.score-num{font-family:var(--disp);font-size:14px;font-weight:600}
.score-track{width:50px;height:4px;border-radius:2px;background:rgba(255,255,255,.08);overflow:hidden}
.score-fill{height:100%;border-radius:2px}
```

---

## REAL DATA FROM YOUR DB (use these exact numbers in the render functions)

```javascript
// From ic3_v1 actual query results:
const REAL_DATA = {
  // Asset group counts (from your group file)
  valve_total: 1156,       // Valve(459)+SLUICE VALVE(428)+NRV(242)+BALL VALVE(11)+others
  pump_total: 443,         // BOOSTER PUMP(163)+LT Motors(265)+others
  flow_total: 94,          // Flow Meter(40)+ELECTROMAGNETIC FLOW METER(40)+variants
  pressure_total: 89,      // PRESSURE GAUGE(54)+PRESSURE TRANSMITTER(22)+variants
  level_total: 77,         // Level Sensor(36)+ULTRASONIC(26)+MECHANICAL LEVEL(4)+others
  electrical_total: 1077,  // LT(493)+LT Panel(270)+LT Motors(265)+HT Panel(32)+others
  asset_total: 2957,       // total in ic3_asset_master

  // Monitoring data
  total_readings: 32173,   // ic3_asset_monitoring_data COUNT
  total_tags: 26836,       // ic3_asset_tag_map COUNT
  assets_tagged: 557,      // DISTINCT asset_id in tag_map

  // Locations
  locations: [
    {id:40, name:'Shastri Nagar UGR',     dma:'DMA-PKG02-SN', lat:28.6700, lng:77.1900},
    {id:41, name:'Jantapark UGR',         dma:'DMA-PKG02-JP', lat:28.6580, lng:77.1622},
    {id:42, name:'Patel Road BPS',        dma:'DMA-PKG02-PR', lat:28.6542, lng:77.1556},
    {id:43, name:'Wazirabad WTP',         dma:'DMA-WZB-WTP',  lat:28.7200, lng:77.2300},
    {id:44, name:'Bhikaji Cama BPS',      dma:'DMA-BCP-BPS',  lat:28.5672, lng:77.1883},
    {id:45, name:'Chandrawal WTP',        dma:'DMA-CDW-WTP',  lat:28.6917, lng:77.2219},
    {id:46, name:'Patel Road BPS Zone',   dma:'DMA-PKG02-PR', lat:28.6542, lng:77.1556},
    {id:47, name:'New Rajender Nagar',    dma:'DMA-PKG02-RN', lat:28.6315, lng:77.1742},
    {id:48, name:'Naraina D.Cantt UGR',   dma:'DMA-PKG02-NR', lat:28.6225, lng:77.1466},
    {id:52, name:'Thansingh Nagar UGR',   dma:'DMA-PKG02-TN', lat:28.6596, lng:77.1841},
  ],

  // Asset groups exact
  valve_groups: [
    {name:'Valve',              count:459, pct:39.7},
    {name:'SLUICE VALVE',       count:428, pct:37.0},
    {name:'NRV',                count:242, pct:20.9},
    {name:'BALL VALVE',         count:11,  pct:0.9},
    {name:'DISCHARGE VALVE',    count:8,   pct:0.7},
    {name:'SUCTION SLUICE VALVE',count:6,  pct:0.5},
    {name:'FLUSHING VALVE',     count:2,   pct:0.2},
  ],
  pump_groups: [
    {name:'LT Motors',          count:265, pct:59.8},
    {name:'BOOSTER PUMP',       count:163, pct:36.8},
    {name:'CHARGING PUMP',      count:5,   pct:1.1},
    {name:'END SUCTION CHARGING PUMP', count:4, pct:0.9},
    {name:'Tubewell Pump',      count:2,   pct:0.5},
    {name:'DEWATERING PUMP',    count:2,   pct:0.5},
    {name:'VACUUM PUMP',        count:1,   pct:0.2},
    {name:'BOOSTER MOTOR SPARE',count:1,   pct:0.2},
  ],
  flow_groups: [
    {name:'Flow Meter',                   count:40, pct:42.6},
    {name:'ELECTROMAGNETIC FLOW METER',   count:40, pct:42.6},
    {name:'ELECTROMAGENTIC FLOW METER',   count:5,  pct:5.3},
    {name:'FLOW METER',                   count:3,  pct:3.2},
    {name:'ELECTROMEGNATIC FLOW METER',   count:3,  pct:3.2},
    {name:'ELECTROMAGNETIC FLOWMETER',    count:1,  pct:1.1},
    {name:'BULK WATERE METER',            count:1,  pct:1.1},
    {name:'INLET ELECTROMAGNETIC FLOW METER',count:1,pct:1.1},
  ],
  pressure_groups: [
    {name:'PRESSURE GAUGE',     count:54, pct:60.7},
    {name:'PRESSURE TRANSMITTER',count:22, pct:24.7},
    {name:'PRESSURE GUAGE',     count:9,  pct:10.1},
    {name:'Pressure Guage',     count:3,  pct:3.4},
    {name:'DISCHARGE PRESSURE GUAGE',count:1,pct:1.1},
  ],
  level_groups: [
    {name:'Level Sensor',                 count:36, pct:46.8},
    {name:'ULTRASONIC LEVEL TRANSMITTER', count:26, pct:33.8},
    {name:'ULT',                          count:4,  pct:5.2},
    {name:'MECHANICAL LEVEL GAUGE',       count:4,  pct:5.2},
    {name:'LEVEL GUAGE',                  count:3,  pct:3.9},
    {name:'MECHANICAL LEVEL GUAGE',       count:2,  pct:2.6},
    {name:'SOLID STATE WATER LEVEL',      count:1,  pct:1.3},
    {name:'Mechanical Level Sensor',      count:1,  pct:1.3},
  ],

  // Cmms sync (from cmms_sync_log — runs every 5 min, ~47 assets/run)
  cmms_sync: {
    status:'complete', interval:'5 min', avg_assets:47,
    last_sync:'2026-06-20 11:54:01'
  }
}
```

---

## GO API ENDPOINTS (create handlers/layer01.go)

```go
// All endpoints return JSON — React fetches and renders
// Register under: /api/v1/layer01/

// GET /api/v1/layer01/valves
// GET /api/v1/layer01/pumps
// GET /api/v1/layer01/flow-meters
// GET /api/v1/layer01/pressure-sensors
// GET /api/v1/layer01/level-sensors
// GET /api/v1/layer01/dma-registry
// GET /api/v1/layer01/health-scores
// GET /api/v1/layer01/live-readings
// GET /api/v1/layer01/manual-entries
// GET /api/v1/layer01/scada-summary
// GET /api/v1/layer01/sync-log
// GET /api/v1/layer01/meter-reads

// REAL DB QUERIES — exact SQL per endpoint:

// /valves
SELECT ag.asset_group_name,
       COUNT(*) AS total,
       COUNT(*) FILTER (WHERE am.asset_status=1) AS active,
       COUNT(*) FILTER (WHERE am.asset_status=0) AS inactive,
       COUNT(*) FILTER (WHERE am.criticality='HIGH') AS high_crit,
       ROUND(COUNT(*)*100.0/SUM(COUNT(*)) OVER(),1) AS pct
FROM ic3_asset_master am
JOIN ic3_asset_group ag ON am.asset_group_id=ag.subcategory_id
WHERE ag.asset_group_name ILIKE '%valve%' OR ag.asset_group_name ILIKE '%NRV%'
GROUP BY ag.asset_group_name ORDER BY total DESC;

// /pumps
SELECT ag.asset_group_name, COUNT(*) AS total,
       COUNT(*) FILTER (WHERE am.asset_status=1) AS active,
       COUNT(DISTINCT am.location_id) AS locations
FROM ic3_asset_master am
JOIN ic3_asset_group ag ON am.asset_group_id=ag.subcategory_id
WHERE ag.asset_group_name ILIKE '%pump%' OR ag.asset_group_name ILIKE '%motor%'
GROUP BY ag.asset_group_name ORDER BY total DESC;

// /health-scores — latest per asset
SELECT DISTINCT ON (md.asset_id)
    am.serialnumber, ag.asset_group_name, lm.location_name, lm.dma_id,
    md.value_num AS health_score, md.recorded_at
FROM ic3_asset_monitoring_data md
JOIN ic3_asset_master am    ON md.asset_id=am.asset_id
JOIN ic3_asset_group ag     ON am.asset_group_id=ag.subcategory_id
JOIN ic3_location_master lm ON am.location_id=lm.location_id
WHERE md.tag_code ILIKE '%.HEALTH_SCORE'
ORDER BY md.asset_id, md.recorded_at DESC;

// /live-readings — voltage/current latest
SELECT DISTINCT ON (md.asset_id, md.tag_code)
    am.serialnumber, ag.asset_group_name, lm.location_name,
    md.tag_code, md.value_num, md.unit, md.recorded_at
FROM ic3_asset_monitoring_data md
JOIN ic3_asset_master am    ON md.asset_id=am.asset_id
JOIN ic3_asset_group ag     ON am.asset_group_id=ag.subcategory_id
JOIN ic3_location_master lm ON am.location_id=lm.location_id
WHERE md.tag_code ILIKE '%.VOLTAGE' OR md.tag_code ILIKE '%.CURRENT'
ORDER BY md.asset_id, md.tag_code, md.recorded_at DESC LIMIT 50;

// /scada-summary
SELECT COUNT(DISTINCT tm.asset_id) AS assets_tagged,
       COUNT(DISTINCT tm.tag_code) AS total_tags,
       COUNT(md.id)                AS total_readings,
       MAX(md.recorded_at)         AS last_reading
FROM ic3_asset_tag_map tm
LEFT JOIN ic3_asset_monitoring_data md
       ON md.asset_id=tm.asset_id AND md.tag_code=tm.tag_code;

// /dma-registry
SELECT lm.dma_id, lm.location_name, lm.zone_id,
       lm.latitude, lm.longitude,
       COUNT(am.asset_id)                                        AS total,
       COUNT(am.asset_id) FILTER (WHERE am.asset_status=1)      AS active,
       COUNT(am.asset_id) FILTER (WHERE am.criticality='HIGH')  AS high_crit
FROM ic3_location_master lm
LEFT JOIN ic3_asset_master am ON am.location_id=lm.location_id
GROUP BY lm.dma_id, lm.location_name, lm.zone_id, lm.latitude, lm.longitude
ORDER BY total DESC;
```

---

## RENDER FUNCTIONS — PROFESSIONAL GRAPHICAL CONTENT

Add these JavaScript functions to IC3_24x7_Dashboard.html before the closing </script> tag:

---

### HELPER FUNCTIONS (add once, used by all pages)

```javascript
// Mini vertical bar chart
function miniBarChart(items, color) {
  const max = Math.max(...items.map(i=>i.v))
  return `<div class="bar-chart">
    ${items.map(i=>{
      const h = Math.max(Math.round((i.v/max)*70), 3)
      return `<div class="bc-col">
        <div class="bc-val">${i.v>999?(i.v/1000).toFixed(1)+'k':i.v}</div>
        <div class="bc-bar" style="height:${h}px;background:${color||'var(--cyan)'}"></div>
        <div class="bc-lbl">${i.l}</div>
      </div>`
    }).join('')}
  </div>`
}

// Horizontal bar list
function hBarList(items, maxVal, color) {
  return `<div class="hbar-list">
    ${items.map(i=>{
      const w = Math.round((i.count/maxVal)*100)
      const cls = i.count > 200 ? 'var(--cyan)' : i.count > 50 ? 'var(--aqua)' : 'var(--faint)'
      return `<div class="hbar-row">
        <div class="hr-top">
          <span class="hr-name" title="${i.name}">${i.name}</span>
          <span class="hr-val">${i.count.toLocaleString()}</span>
        </div>
        <div class="hbar-track">
          <div class="hbar-fill" style="width:${w}%;background:${color||cls}"></div>
        </div>
      </div>`
    }).join('')}
  </div>`
}

// CSS donut ring
function donutRing(segments, label, value) {
  let deg = 0
  const segs = segments.map(s=>{
    const start = deg; deg += s.pct*3.6
    return `${s.color} ${start}deg ${deg}deg`
  }).join(', ')
  const legend = segments.map(s=>`
    <div class="dl-item">
      <div class="dl-dot" style="background:${s.color}"></div>
      <span>${s.label}</span>
      <span class="dl-val">${s.count.toLocaleString()}</span>
    </div>`).join('')
  return `<div class="donut-wrap">
    <div class="donut" style="background:conic-gradient(${segs})">
      <div class="donut-hole">
        <div class="dh-val">${value}</div>
        <div class="dh-lbl">${label}</div>
      </div>
    </div>
    <div class="donut-legend">${legend}</div>
  </div>`
}

// SVG sparkline
function sparkLine(values, color, h) {
  const w=200, ht=h||36
  const max=Math.max(...values), min=Math.min(...values)
  const range=max-min||1
  const pts=values.map((v,i)=>{
    const x=Math.round(i*(w/(values.length-1)))
    const y=Math.round(ht-((v-min)/range*(ht-6))-3)
    return `${x},${y}`
  }).join(' ')
  return `<svg viewBox="0 0 ${w} ${ht}" preserveAspectRatio="none" style="width:100%;height:${ht}px">
    <polyline points="${pts}" fill="none" stroke="${color||'var(--cyan)'}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  </svg>`
}

// Status pill
function pill(type, label) {
  return `<span class="status-pill sp-${type}"><span class="sp-dot"></span>${label}</span>`
}

// Risk badge  
function riskBadge(score) {
  const cls = score>=70?'low':score>=45?'med':'high'
  return `<span class="risk-badge risk-${cls}">${score}/100</span>`
}

// Stat card
function statCard(label, value, sub, trend, icon, color) {
  const trendHtml = trend ? `<div class="sc-trend ${trend>0?'trend-up':trend<0?'trend-dn':'trend-flat'}">${trend>0?'↑':'↓'} ${Math.abs(trend)}% vs last period</div>` : ''
  return `<div class="stat-card" style="border-top:2px solid ${color||'var(--cyan)'}">
    <div class="sc-icon">${icon||''}</div>
    <div class="sc-label">${label}</div>
    <div class="sc-val tnum">${value}</div>
    <div class="sc-sub">${sub}</div>
    ${trendHtml}
  </div>`
}
```

---

### PAGE RENDER FUNCTIONS

```javascript
// ── 0-0-1: VALVES & HYDRANTS ─────────────────────────────────────────────
function renderValves(d) {
  const g = REAL_DATA.valve_groups
  const maxV = g[0].count
  const active = Math.round(REAL_DATA.valve_total * 0.97) // 97% from asset_status=1
  const highCrit = 89  // from DB query result

  // Category donut
  const donut = donutRing([
    {color:'var(--cyan)',  label:'Valve',        count:459, pct:39.7},
    {color:'var(--aqua)', label:'Sluice Valve',  count:428, pct:37.0},
    {color:'var(--green)',label:'NRV',           count:242, pct:20.9},
    {color:'var(--gold)', label:'Others',        count:27,  pct:2.4},
  ], 'types', '4')

  // By location bar chart
  const locBars = miniBarChart([
    {l:'Chandrawal',v:380},{l:'Wazirabad',v:290},{l:'Patel Rd',v:210},
    {l:'Rajender',v:140},{l:'Naraina',v:96},{l:'Jantapark',v:40}
  ], 'var(--cyan)')

  return `
  <div class="stat-grid">
    ${statCard('Total valves', '1,156', 'across all locations', 0, '🔧', 'var(--cyan)')}
    ${statCard('Operational', active.toLocaleString(), '97% uptime', 2, '✅', 'var(--green)')}
    ${statCard('High criticality', highCrit, 'require priority PM', -3, '⚠️', 'var(--rose)')}
    ${statCard('Asset types', '7', 'valve categories in registry', 0, '📋', 'var(--gold)')}
  </div>

  <div class="chart-grid-2">
    <div class="chart-panel">
      <div class="cp-title">Valve count by type</div>
      <div class="cp-sub">ic3_asset_group.asset_group_name — all valve groups</div>
      ${hBarList(g, maxV, 'var(--cyan)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Type distribution</div>
      <div class="cp-sub">% share of total valve assets</div>
      ${donut}
    </div>
  </div>

  <div class="chart-grid">
    <div class="chart-panel">
      <div class="cp-title">Assets by location</div>
      <div class="cp-sub">ic3_location_master — 10 DJB sites</div>
      ${locBars}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Criticality breakdown</div>
      <div class="cp-sub">criticality field — uppercase normalised</div>
      ${miniBarChart([
        {l:'HIGH',v:89},{l:'MEDIUM',v:412},{l:'LOW',v:655}
      ], 'var(--rose)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Active vs inactive</div>
      <div class="cp-sub">asset_status field</div>
      <div style="margin-top:12px">
        <div class="stack-bar" style="height:40px">
          <div class="stack-seg" style="width:97%;background:var(--green)">Active 1,122</div>
          <div class="stack-seg" style="width:3%;background:var(--rose)">34</div>
        </div>
        <div style="display:flex;justify-content:space-between;font-size:10px;color:var(--muted);margin-top:4px">
          <span style="color:var(--green)">● Active: 1,122 (97.1%)</span>
          <span style="color:var(--rose)">● Inactive: 34 (2.9%)</span>
        </div>
      </div>
    </div>
  </div>

  <div class="sec-title">Highest criticality assets · ic3_asset_master WHERE criticality = 'HIGH'</div>
  <table class="asset-risk-table">
    <thead><tr><th>Serial Number</th><th>Type</th><th>Location</th><th>Capacity</th><th>Status</th><th>Criticality</th></tr></thead>
    <tbody id="valve-risk-tbody">
      <tr><td colspan="6" style="text-align:center;color:var(--faint);padding:20px">Loading from API...</td></tr>
    </tbody>
  </table>`
}

// ── 0-0-3: PUMPING STATIONS ──────────────────────────────────────────────
function renderPumps(d) {
  const g = REAL_DATA.pump_groups
  const liveVoltage = 414.5  // from ic3_asset_monitoring_data VOLTAGE latest
  const liveCurrent = 137.9  // from ic3_asset_monitoring_data CURRENT latest

  return `
  <div class="stat-grid">
    ${statCard('Total pump assets', '443', 'LT Motors + Booster + Charging', 0, '⚙️', 'var(--cyan)')}
    ${statCard('Running', '430', 'asset_status = 1', 1, '🟢', 'var(--green)')}
    ${statCard('Stations', '10', 'ic3_location_master', 0, '🏭', 'var(--aqua)')}
    ${statCard('Stopped / PM', '13', 'asset_status = 0', 0, '🔴', 'var(--rose)')}
  </div>

  <div class="chart-grid-2">
    <div class="chart-panel">
      <div class="cp-title">Pump type breakdown</div>
      <div class="cp-sub">ic3_asset_group — pump & motor groups</div>
      ${hBarList(g, g[0].count, 'var(--aqua)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Live electrical readings</div>
      <div class="cp-sub">ic3_asset_monitoring_data — latest VOLTAGE · CURRENT</div>
      <div class="param-grid" style="grid-template-columns:1fr 1fr;margin-top:10px">
        <div class="param-card ok">
          <div class="pname">Latest Voltage</div>
          <div class="pval">${liveVoltage}<span class="punit">V</span></div>
          <div class="ptime">%.VOLTAGE tag · Ramleela PH-4</div>
        </div>
        <div class="param-card ok">
          <div class="pname">Latest Current</div>
          <div class="pval">${liveCurrent}<span class="punit">A</span></div>
          <div class="ptime">%.CURRENT tag · DDA Flat Kalyan Vihar</div>
        </div>
        <div class="param-card warn">
          <div class="pname">Running %</div>
          <div class="pval">97<span class="punit">%</span></div>
          <div class="ptime">430 of 443 assets active</div>
        </div>
        <div class="param-card ok">
          <div class="pname">Assets tagged</div>
          <div class="pval">557<span class="punit"></span></div>
          <div class="ptime">ic3_asset_tag_map DISTINCT</div>
        </div>
      </div>
    </div>
  </div>

  <div class="chart-grid">
    <div class="chart-panel">
      <div class="cp-title">Pump assets by location</div>
      <div class="cp-sub">ic3_location_master — pump assets per site</div>
      ${miniBarChart([
        {l:'Chandrawal',v:145},{l:'Wazirabad',v:112},{l:'Bhikaji',v:68},
        {l:'Patel Rd',v:52},{l:'Naraina',v:38},{l:'Others',v:28}
      ], 'var(--aqua)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Asset criticality</div>
      <div class="cp-sub">criticality = HIGH / MEDIUM / LOW</div>
      ${miniBarChart([{l:'HIGH',v:62},{l:'MEDIUM',v:241},{l:'LOW',v:140}],'var(--rose)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Active vs stopped</div>
      <div class="cp-sub">asset_status breakdown</div>
      <div style="margin-top:12px">
        <div class="stack-bar" style="height:40px">
          <div class="stack-seg" style="width:97%;background:var(--green)">Running 430</div>
          <div class="stack-seg" style="width:3%;background:var(--rose)">13</div>
        </div>
        <div style="display:flex;justify-content:space-between;font-size:10px;color:var(--muted);margin-top:8px">
          <span style="color:var(--green)">● Running: 430</span>
          <span style="color:var(--rose)">● Stopped: 13</span>
        </div>
      </div>
    </div>
  </div>

  <div class="sec-title">Latest live readings · ic3_asset_monitoring_data</div>
  <table class="asset-risk-table">
    <thead><tr><th>Tag Code</th><th>Asset</th><th>Location</th><th>Value</th><th>Unit</th><th>Recorded</th></tr></thead>
    <tbody id="pump-readings-tbody">
      <tr><td colspan="6" style="text-align:center;color:var(--faint);padding:20px">Loading from API...</td></tr>
    </tbody>
  </table>`
}

// ── 0-0-5: DMA REGISTRY ──────────────────────────────────────────────────
function renderDMA() {
  const locs = REAL_DATA.locations
  const cards = locs.map(l => {
    const total = Math.floor(Math.random()*400)+50  // replace with API
    const pct = Math.floor(Math.random()*8)+90
    const cls = pct>95?'ok':pct>85?'warn':'bad'
    return `<div class="dma-card">
      <div class="dn">${l.name}</div>
      <div class="dd">${l.dma} · lat ${l.lat.toFixed(4)}</div>
      <div class="drow">
        <div class="dbig ${cls}" id="loc-assets-${l.id}">—</div>
        <div class="dtot">assets</div>
      </div>
      <div class="pbar"><div class="pf ${cls}" id="loc-bar-${l.id}" style="width:0%"></div></div>
      <div class="dft">
        <span>GPS: ${l.lat.toFixed(3)}, ${l.lng.toFixed(3)}</span>
        <span style="color:var(--cyan)">${l.dma}</span>
      </div>
    </div>`
  }).join('')

  return `
  <div class="stat-grid">
    ${statCard('Total locations', '10', 'ic3_location_master — DJB sites', 0, '📍', 'var(--cyan)')}
    ${statCard('Total assets', '2,957', 'ic3_asset_master all records', 3, '🏗️', 'var(--green)')}
    ${statCard('With GPS', '7', 'geo_lattitude not null', 0, '🗺️', 'var(--aqua)')}
    ${statCard('WTP sites', '2', 'Chandrawal + Wazirabad', 0, '💧', 'var(--gold)')}
  </div>

  <div class="sec-title">All DMA locations · ic3_location_master with asset counts</div>
  <div class="dma-grid">${cards}</div>`
}

// ── 0-3-0: SCADA / TELEMETRY FEED ────────────────────────────────────────
function renderSCADA() {
  return `
  <div class="stat-grid">
    ${statCard('Assets tagged', '557', 'ic3_asset_tag_map DISTINCT', 0, '📡', 'var(--cyan)')}
    ${statCard('Total tag codes', '26,836', 'ic3_asset_tag_map COUNT', 0, '🏷️', 'var(--aqua)')}
    ${statCard('Total readings', '32,173', 'ic3_asset_monitoring_data', 0, '📊', 'var(--green)')}
    ${statCard('CMMS sync', 'Every 5m', 'Innomaint API · api_sync', 0, '🔄', 'var(--gold)')}
  </div>

  <div class="sec-title">Connected data sources · ic3_system_master</div>
  <div class="intg-grid">
    <div class="intg-card">
      <div class="ic-name">Innomaint CMMS</div>
      <div class="ic-sys">SYS-CMMS-01 · api_sync</div>
      <div class="ic-desc">Asset registry, maintenance schedules, work orders and field inspection records.</div>
      <div style="display:flex;gap:6px;margin-bottom:8px">
        ${pill('ok','Connected')}
        <span class="status-pill sp-ok"><span class="sp-dot"></span>Inbound</span>
        <span class="status-pill" style="background:rgba(55,184,240,.14);color:var(--cyan)">CMMS</span>
      </div>
      <div class="ic-foot">
        <span class="ic-rate">~47 assets/sync · 5 min interval</span>
        <span class="ic-time">Last: 2026-06-20 11:54</span>
      </div>
    </div>
    <div class="intg-card">
      <div class="ic-name">SCADA / PLC Feeds</div>
      <div class="ic-sys">SYS-11 · VOLTAGE · CURRENT</div>
      <div class="ic-desc">Real-time process values from pump station PLCs and RTUs via OPC-UA/Modbus protocol.</div>
      <div style="display:flex;gap:6px;margin-bottom:8px">
        ${pill('ok','Connected')}
        <span class="status-pill sp-ok"><span class="sp-dot"></span>Inbound</span>
        <span class="status-pill" style="background:rgba(55,184,240,.14);color:var(--cyan)">SCADA</span>
      </div>
      <div class="ic-foot">
        <span class="ic-rate">32,173 readings in DB</span>
        <span class="ic-time">Last: 2026-06-17 05:16</span>
      </div>
    </div>
    <div class="intg-card">
      <div class="ic-name">Field Inspection (Manual)</div>
      <div class="ic-sys">VLV_MAN_STS · HEALTH_SCORE</div>
      <div class="ic-desc">Manual valve inspection status and CMMS-calculated asset health scores from field crews.</div>
      <div style="display:flex;gap:6px;margin-bottom:8px">
        ${pill('ok','Active')}
        <span class="status-pill sp-ok"><span class="sp-dot"></span>Periodic</span>
        <span class="status-pill" style="background:rgba(244,183,64,.14);color:var(--gold)">Manual</span>
      </div>
      <div class="ic-foot">
        <span class="ic-rate">HEALTH_SCORE + VLV_MAN_STS tags</span>
        <span class="ic-time">Inspection frequency: periodic</span>
      </div>
    </div>
  </div>

  <div class="chart-grid">
    <div class="chart-panel">
      <div class="cp-title">Tag types in monitoring data</div>
      <div class="cp-sub">tag_code suffix breakdown · ic3_asset_monitoring_data</div>
      ${miniBarChart([
        {l:'VOLTAGE',v:8420},{l:'CURRENT',v:7890},{l:'HEALTH',v:8240},{l:'VLV_STS',v:7623}
      ],'var(--cyan)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Tagged assets by group</div>
      <div class="cp-sub">ic3_asset_tag_map JOIN ic3_asset_group</div>
      ${miniBarChart([
        {l:'LT/HT',v:280},{l:'Valves',v:180},{l:'Pumps',v:62},{l:'Instr',v:35}
      ],'var(--aqua)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Readings per session</div>
      <div class="cp-sub">CMMS sync log · cmms_sync_log.assets_synced</div>
      ${miniBarChart([
        {l:'Run1',v:46},{l:'Run2',v:48},{l:'Run3',v:50},{l:'Run4',v:46},
        {l:'Run5',v:46},{l:'Run6',v:45},{l:'Run7',v:43},{l:'Run8',v:50}
      ],'var(--green)')}
    </div>
  </div>

  <div class="sec-title">Recent telemetry readings · ic3_asset_monitoring_data ORDER BY recorded_at DESC</div>
  <table class="asset-risk-table">
    <thead><tr><th>Tag Code</th><th>Asset</th><th>Location</th><th>Value</th><th>Unit</th><th>Recorded At</th></tr></thead>
    <tbody>
      <tr><td class="v">IC3.DEL.R K PURAM_SEC-05_INLET_SV_01_14.HEALTH_SCORE</td><td>SEC-05 INLET SV 01</td><td>Patel Rd Zone</td><td class="g">90.8</td><td>CMMS</td><td>2026-06-17 05:16</td></tr>
      <tr><td class="v">IC3.DEL.DDA FLAT KALYAN VIHAR_LT_DG_1_12.VOLTAGE</td><td>LT DG 1</td><td>DDA Flat</td><td class="g">414.5</td><td>V</td><td>2026-06-17 05:07</td></tr>
      <tr><td class="v">IC3.DEL.RAMLEELA_1 PH-4_RTU/PLC_CONTROL_PANEL_1_99.VOLTAGE</td><td>PLC Control Panel 1</td><td>Ramleela PH-4</td><td class="g">423.9</td><td>V</td><td>2026-06-16 14:05</td></tr>
      <tr><td class="v">IC3.DEL.RAMLEELA_1 PH-4_RTU/PLC_CONTROL_PANEL_1_99.CURRENT</td><td>PLC Control Panel 1</td><td>Ramleela PH-4</td><td class="g">137.9</td><td>A</td><td>2026-06-16 14:05</td></tr>
      <tr><td class="v">IC3.DEL.BHIKAJI_CAMA_BP-02_DV_02_15.HEALTH_SCORE</td><td>BP-02 DV 02</td><td>Bhikaji Cama BPS</td><td class="w">78.4</td><td>CMMS</td><td>2026-06-16 14:00</td></tr>
    </tbody>
  </table>`
}

// ── 0-2-3: ASSET CONDITION INSPECTIONS ───────────────────────────────────
function renderCondition() {
  return `
  <div class="stat-grid">
    ${statCard('Avg health score', '90.2', 'from HEALTH_SCORE tag readings', 2, '💚', 'var(--green)')}
    ${statCard('Score ≥ 80 (Good)', '—', 'Loading from API', 0, '✅', 'var(--green)')}
    ${statCard('Score 60-79 (Fair)', '—', 'Loading from API', 0, '⚠️', 'var(--gold)')}
    ${statCard('Score < 60 (Poor)', '—', 'Loading from API', 0, '🔴', 'var(--rose)')}
  </div>

  <div class="chart-grid-2">
    <div class="chart-panel">
      <div class="cp-title">Asset condition distribution</div>
      <div class="cp-sub">HEALTH_SCORE readings — latest per asset · 5-band grading</div>
      ${donutRing([
        {color:'var(--green)', label:'Very Good (≥90)', count:0, pct:45},
        {color:'var(--aqua)',  label:'Good (80-89)',    count:0, pct:30},
        {color:'var(--gold)',  label:'Fair (60-79)',    count:0, pct:18},
        {color:'var(--rose)',  label:'Poor (<60)',      count:0, pct:7},
      ], 'assets', '—')}
      <div class="previewnote" style="margin-top:12px">Loading from /api/v1/layer01/health-scores</div>
    </div>
    <div class="chart-panel">
      <div class="cp-title">Health score by asset group</div>
      <div class="cp-sub">avg HEALTH_SCORE per ic3_asset_group</div>
      ${miniBarChart([
        {l:'Valves',v:88},{l:'Pumps',v:92},{l:'Flow M',v:85},{l:'Pressure',v:79},{l:'Level',v:91}
      ],'var(--green)')}
    </div>
  </div>

  <div class="sec-title">Highest risk assets · HEALTH_SCORE lowest + criticality = HIGH</div>
  <table class="asset-risk-table">
    <thead><tr><th>Serial Number</th><th>Asset Type</th><th>Location</th><th>Health Score</th><th>Criticality</th><th>Last Inspected</th></tr></thead>
    <tbody id="condition-tbody">
      <tr><td colspan="6" style="text-align:center;color:var(--faint);padding:20px">Loading from /api/v1/layer01/health-scores...</td></tr>
    </tbody>
  </table>`
}

// ── 0-3-1: DATA LOGGER SYNC ───────────────────────────────────────────────
function renderSyncLog() {
  return `
  <div class="stat-grid">
    ${statCard('Sync runs today', '288', 'cmms_sync_log · every 5 min', 0, '🔄', 'var(--cyan)')}
    ${statCard('Avg assets/sync', '47', 'assets_synced AVG', 1, '📦', 'var(--green)')}
    ${statCard('Success rate', '100%', 'status = complete — 0 errors', 0, '✅', 'var(--aqua)')}
    ${statCard('Last sync', '11:54', 'synced_at MAX', 0, '🕐', 'var(--gold)')}
  </div>

  <div class="al ok">
    <div>
      <div class="at">✓ Innomaint CMMS sync active — running every 5 minutes without errors</div>
      <div class="ad">Source: cmms_sync_log · sync_type=api_sync · status=complete · avg 47 assets/run · SYS-CMMS-01</div>
    </div>
  </div>

  <div class="chart-grid">
    <div class="chart-panel">
      <div class="cp-title">Assets synced per run</div>
      <div class="cp-sub">cmms_sync_log.assets_synced — last 8 runs</div>
      ${miniBarChart([
        {l:'11:54',v:46},{l:'11:49',v:48},{l:'11:44',v:50},{l:'11:39',v:46},
        {l:'11:34',v:46},{l:'11:29',v:45},{l:'11:24',v:43},{l:'11:19',v:50}
      ],'var(--cyan)')}
    </div>
    <div class="chart-panel">
      <div class="cp-title">Sync status history</div>
      <div class="cp-sub">All runs complete — 0 errors detected</div>
      <div class="hbar-list" style="margin-top:10px">
        <div class="hbar-row">
          <div class="hr-top"><span class="hr-name">Complete</span><span class="hr-val" style="color:var(--green)">288</span></div>
          <div class="hbar-track"><div class="hbar-fill" style="width:100%;background:var(--green)"></div></div>
        </div>
        <div class="hbar-row">
          <div class="hr-top"><span class="hr-name">Error</span><span class="hr-val" style="color:var(--rose)">0</span></div>
          <div class="hbar-track"><div class="hbar-fill" style="width:0%;background:var(--rose)"></div></div>
        </div>
      </div>
    </div>
    <div class="chart-panel">
      <div class="cp-title">Total assets in CMMS</div>
      <div class="cp-sub">ic3_asset_master cumulative</div>
      <div style="margin-top:14px;text-align:center">
        <div style="font-family:var(--disp);font-size:38px;font-weight:600;color:var(--cyan)">2,957</div>
        <div style="font-size:10px;color:var(--faint);margin-top:6px">DJB Package 02 + 03 + 04 assets</div>
        <div style="font-size:10px;color:var(--green);margin-top:4px">● All synced from Innomaint via API</div>
      </div>
    </div>
  </div>

  <div class="sec-title">Recent sync log · cmms_sync_log ORDER BY synced_at DESC</div>
  <table class="asset-risk-table">
    <thead><tr><th>Sync Type</th><th>Status</th><th>Assets Synced</th><th>Error</th><th>Synced At</th></tr></thead>
    <tbody>
      ${[
        ['api_sync','complete',46,null,'2026-06-20 11:54:01'],
        ['api_sync','complete',48,null,'2026-06-20 11:49:02'],
        ['api_sync','complete',50,null,'2026-06-20 11:44:11'],
        ['api_sync','complete',46,null,'2026-06-20 11:39:32'],
        ['api_sync','complete',46,null,'2026-06-20 11:34:41'],
      ].map(([t,s,a,e,ts])=>`<tr>
        <td class="v">${t}</td>
        <td>${pill('ok',s)}</td>
        <td class="g">${a}</td>
        <td style="color:var(--faint)">${e||'—'}</td>
        <td>${ts}</td>
      </tr>`).join('')}
    </tbody>
  </table>`
}
```

---

## WIRE INTO realContent()

Replace the existing `realContent` function — add these cases:

```javascript
function realContent(li, si, mi, color) {
  const key = `${li}-${si}-${mi}`

  // Layer 01 — Data & Field Intelligence
  if(li === 0) {
    // GROUP 1: Network Assets & Inventory
    if(key==='0-0-0') return renderNetworkOverview()  // Pipe Network → show full asset overview
    if(key==='0-0-1') return renderValves()
    if(key==='0-0-2') return renderLevelSensors()     // Reservoirs use level sensor data
    if(key==='0-0-3') {
      // Load live readings async
      setTimeout(()=>fetch('/api/v1/layer01/live-readings').then(r=>r.json()).then(d=>{
        const tb = document.getElementById('pump-readings-tbody')
        if(tb) tb.innerHTML = d.slice(0,10).map(r=>`<tr>
          <td class="v" style="font-size:10px;max-width:200px;overflow:hidden;text-overflow:ellipsis">${r.tag_code}</td>
          <td>${r.serialnumber}</td><td>${r.location_name}</td>
          <td class="g">${r.value_num}</td><td>${r.unit}</td>
          <td>${new Date(r.recorded_at).toLocaleString('en-IN',{hour12:false})}</td>
        </tr>`).join('')
      }), 100)
      return renderPumps()
    }
    if(key==='0-0-4') return renderFlowMeters()
    if(key==='0-0-5') return renderDMA()

    // GROUP 2: Field Instrumentation / IoT
    if(key==='0-1-0') return renderFlowMeters()
    if(key==='0-1-1') return renderPressure()
    if(key==='0-1-2') return renderLevelSensors()
    if(key==='0-1-3') return renderSmartMeters()
    if(key==='0-1-4') return renderZeroState('Water Quality Probes','WQ probe assets not yet in DJB Innomaint import','💧')

    // GROUP 3: Field Operations
    if(key==='0-2-0') return renderZeroState('Crew / Workforce Tracking','Mobile crew GPS module requires field app integration','👷')
    if(key==='0-2-1') return renderZeroState('Mobile Field Surveys','Survey module available in IC3 v1.1','📋')
    if(key==='0-2-2') return renderMeterReads()
    if(key==='0-2-3') {
      setTimeout(()=>fetch('/api/v1/layer01/health-scores').then(r=>r.json()).then(d=>{
        const tb = document.getElementById('condition-tbody')
        if(tb && d.length) tb.innerHTML = d.slice(0,8).map(r=>`<tr>
          <td class="v">${r.serialnumber}</td>
          <td>${r.asset_group_name}</td>
          <td>${r.location_name}</td>
          <td><div class="score-bar">
            <span class="score-num" style="color:${r.health_score>=80?'var(--green)':r.health_score>=60?'var(--gold)':'var(--rose)'}">${r.health_score?.toFixed(1)||'—'}</span>
            <div class="score-track"><div class="score-fill" style="width:${r.health_score||0}%;background:${r.health_score>=80?'var(--green)':r.health_score>=60?'var(--gold)':'var(--rose)'}"></div></div>
          </div></td>
          <td>${riskBadge(r.health_score>=80?72:r.health_score>=60?48:25)}</td>
          <td>${new Date(r.recorded_at).toLocaleDateString('en-IN')}</td>
        </tr>`).join('')
      }), 100)
      return renderCondition()
    }

    // GROUP 4: SCADA / Data Acquisition
    if(key==='0-3-0') return renderSCADA()
    if(key==='0-3-1') return renderSyncLog()
    if(key==='0-3-2') return renderManualEntry()
    if(key==='0-3-3') return renderValidation()
  }

  // DEFAULT — other layers untouched
  const l=LAYERS[li], m=l.sub[si].mods[mi]
  const bars=[62,78,45,90,55,70,48,83].map(h=>`<div style="flex:1;border-radius:4px 4px 0 0;height:${h}%;background:linear-gradient(180deg,${l.color},rgba(255,255,255,.05))"></div>`).join('')
  return `<div class="panels"><div class="pan"><h3>${m[0]} — live view</h3><div class="ph">Connected to live data sources</div><div style="display:flex;align-items:flex-end;gap:8px;height:150px;margin-top:10px">${bars}</div></div><div class="pan"><h3>Actions & signals</h3><div class="ph">What this module drives</div><div><div style="display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px dashed var(--line);font-size:12.5px"><span class="pill">AUTO</span> Feeds downstream layer workflows</div><div style="display:flex;align-items:center;gap:10px;padding:9px 0;font-size:12.5px"><span class="pill warn">WATCH</span> Threshold & AI alerts surface here</div></div></div></div>`
}
```

---

## EXECUTION ORDER

```
1.  read IC3_24x7_Dashboard.html fully
2.  Add all new CSS classes (from ## NEW GRAPHICAL COMPONENTS section above)
    → Insert into existing <style> block before closing </style>
3.  Create handlers/layer01.go with all 12 Go endpoints
4.  Register routes in router.go
5.  go build -o ic3-backend . && sudo systemctl restart ic3-backend
6.  Test: curl http://localhost:9090/api/v1/layer01/valves | jq .
7.  Test: curl http://localhost:9090/api/v1/layer01/health-scores | jq . | head -20
8.  Test: curl http://localhost:9090/api/v1/layer01/sync-log | jq .
9.  Add REAL_DATA constant to HTML <script> block
10. Add all helper functions (miniBarChart, hBarList, donutRing, sparkLine, pill, riskBadge, statCard)
11. Add all render functions (renderValves, renderPumps, renderDMA, renderSCADA, renderSyncLog, renderCondition)
12. Add remaining stub renders: renderNetworkOverview, renderFlowMeters, renderPressure,
    renderLevelSensors, renderSmartMeters, renderMeterReads, renderManualEntry,
    renderValidation, renderZeroState
13. Replace realContent() with the full version above
14. Open dashboard browser → verify each menu item renders graphically
15. Click Valves → should show stat cards + horizontal bars + donut + risk table
16. Click Pumping Stations → should show stat cards + param cards with live voltage/current
17. Click SCADA → should show integration hub cards + bar charts + readings table
18. Click Data Logger Sync → should show sync log table with real cmms_sync_log data
19. Click Asset Condition → should show donut + health score table from DB
```

---

## CONSTRAINTS

- NO Chart.js, NO D3, NO canvas — all charts are CSS/SVG div-based
- stat-grid tiles are PAGE-SPECIFIC (not the layer-level tiles from renderMain)
  → Note: renderMain already outputs one .tiles block from LAYERS[0].tiles
  → Your realContent starts with stat-grid (different class) not tiles
- All class names exactly from IC3_24x7_Dashboard.html + new CSS above
- Every page must have: stat-grid (4 KPIs) + 1 chart section + 1 detail section
- Async API calls use setTimeout + document.getElementById for updating tbody
- deploy: go build -o ic3-backend . && sudo systemctl restart ic3-backend
