// kvalitet-screens.jsx — Kvalitet (ISO) workspace, del 1.
// Delte komponenter (ISO-tags, kildelenker, risikoscore-badge), workspace-skall
// med delt tilstand (avvik/oppgaver/risiko persisteres i localStorage),
// samt fanene Oversikt, Standardkrav og Miljø. Risiko/Avvik/Revisjoner/Oppgaver
// ligger i kvalitet-screens-2.jsx.

// ── Kobling til øvrige moduler i totalsystemet ──────────────────────────────
const KVAL_MODUL_MAP = {
  rutiner:    { screen: 'rutiner',    label: 'Rutiner' },
  protocols:  { screen: 'protocols',  label: 'Protokoller' },
  hr:         { screen: 'hr',         label: 'HR' },
  finance:    { screen: 'finance',    label: 'Økonomi' },
  arshjul:    { screen: 'arshjul',    label: 'Årshjul' },
  agreements: { screen: 'agreements', label: 'Avtaler' },
  projects:   { screen: 'projects',   label: 'Prosjekter' },
  intranett:  { screen: 'intranett',  label: 'Intranett' },
  kvalitet:   { screen: 'kvalitet',   label: 'Kvalitet (ISO)' },
};

// ── ISO-tag: standard (+ evt. klausul) ───────────────────────────────────────
function ISOTag({ std, klausul, mini }) {
  const s = ISO_STANDARDS[std];
  if (!s) return null;
  return (
    <span style={{
      display: 'inline-flex', alignItems: 'center', gap: 4,
      padding: mini ? '1px 7px' : '2px 9px', borderRadius: 99,
      background: s.bg, color: s.farge,
      fontSize: mini ? 9.5 : 10.5, fontWeight: 700, letterSpacing: 0.02, whiteSpace: 'nowrap',
    }}>
      <span style={{ width: 5, height: 5, borderRadius: '50%', background: s.farge }} />
      {s.kort}{klausul ? <span style={{ fontWeight: 600, opacity: 0.85 }}> · §{klausul}</span> : null}
    </span>
  );
}
// Liste av ISO-tags (std kan være array)
function ISOTags({ std, klausul, mini }) {
  const arr = Array.isArray(std) ? std : [std];
  return (
    <span style={{ display: 'inline-flex', gap: 4, flexWrap: 'wrap' }}>
      {arr.map((s, i) => <ISOTag key={s} std={s} klausul={i === 0 ? klausul : null} mini={mini} />)}
    </span>
  );
}

// ── Kilde-lenke til annen modul ──────────────────────────────────────────────
function KildeChip({ kilde, go }) {
  if (!kilde) return null;
  const m = KVAL_MODUL_MAP[kilde.modul] || KVAL_MODUL_MAP[kilde.type];
  return (
    <button
      onClick={(e) => { e.stopPropagation(); if (m && go) go({ screen: m.screen }); }}
      title={`Åpne i ${m ? m.label : kilde.modul}`}
      style={{
        display: 'inline-flex', alignItems: 'center', gap: 5, padding: '2px 9px 2px 7px',
        borderRadius: 99, border: '1px solid rgba(17,24,61,.14)', background: SK.pureWhite,
        cursor: 'pointer', fontSize: 11, color: SK.ink, fontFamily: 'inherit', fontWeight: 500,
      }}
    >
      <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke={SK.soft} strokeWidth="2.2" strokeLinecap="round"><path d="M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1"/><path d="M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1"/></svg>
      <span style={{ color: SK.soft }}>{m ? m.label : kilde.modul}</span>
      <span>· {kilde.label}</span>
    </button>
  );
}

// ── Risikoscore-badge ────────────────────────────────────────────────────────
function RisikoBadge({ s, k, showVal = true }) {
  const n = kvalRisikoNivaa(s, k);
  return (
    <span style={{
      display: 'inline-flex', alignItems: 'center', gap: 5, padding: '2px 9px', borderRadius: 6,
      background: n.bg, color: n.farge, fontSize: 11, fontWeight: 700,
    }}>
      {n.label}{showVal ? <span style={{ opacity: 0.7, fontWeight: 600 }}>{s}×{k}={s * k}</span> : null}
    </span>
  );
}

// ── Seksjonsoverskrift ───────────────────────────────────────────────────────
function KvalSectionLabel({ children, sub }) {
  return (
    <div style={{ marginBottom: 10 }}>
      <div style={{ fontSize: 11, fontWeight: 600, color: SK.soft, letterSpacing: 0.06, textTransform: 'uppercase' }}>{children}</div>
      {sub && <div style={{ fontSize: 12, color: SK.soft, marginTop: 3 }}>{sub}</div>}
    </div>
  );
}

// ═══════════════════════════════════════════════════════════════════════════
// WORKSPACE — delt tilstand + faner
// ═══════════════════════════════════════════════════════════════════════════
function KvalitetWorkspaceMock({ go, initialTab }) {
  const [tab, setTab] = React.useState(initialTab || 'oversikt');

  // Delt, redigerbar tilstand (persisteres pr. nettleser)
  const load = (key, fallback) => {
    try { const v = localStorage.getItem(key); return v ? JSON.parse(v) : fallback; }
    catch (e) { return fallback; }
  };
  const [avvik, setAvvik]   = React.useState(() => load('ok_kval_avvik', KVAL_AVVIK));
  const [oppg, setOppg]     = React.useState(() => load('ok_kval_oppg', KVAL_OPPGAVER));
  const [risiko, setRisiko] = React.useState(() => load('ok_kval_risiko', KVAL_RISIKO));
  React.useEffect(() => { try { localStorage.setItem('ok_kval_avvik', JSON.stringify(avvik)); } catch (e) {} }, [avvik]);
  React.useEffect(() => { try { localStorage.setItem('ok_kval_oppg', JSON.stringify(oppg)); } catch (e) {} }, [oppg]);
  React.useEffect(() => { try { localStorage.setItem('ok_kval_risiko', JSON.stringify(risiko)); } catch (e) {} }, [risiko]);

  const resetDemo = () => {
    setAvvik(KVAL_AVVIK); setOppg(KVAL_OPPGAVER); setRisiko(KVAL_RISIKO);
    try { ['ok_kval_avvik', 'ok_kval_oppg', 'ok_kval_risiko'].forEach(k => localStorage.removeItem(k)); } catch (e) {}
  };

  const aapneAvvik = avvik.filter(a => a.status !== 'lukket').length;
  const aapneOppg  = oppg.filter(o => o.status !== 'done').length;
  const forfalteOppg = oppg.filter(o => o.status !== 'done' && kvalDagerTil(o.frist) < 0).length;

  const tabs = [
    { id: 'oversikt',     label: 'Oversikt' },
    { id: 'risiko',       label: `Risiko (${risiko.length})` },
    { id: 'avvik',        label: `Avvik (${aapneAvvik})`, badge: aapneAvvik },
    { id: 'revisjoner',   label: 'Revisjoner' },
    { id: 'oppgaver',     label: `Oppgaver (${aapneOppg})`, badge: forfalteOppg || undefined },
    { id: 'standardkrav', label: 'Standardkrav' },
    { id: 'miljo',        label: 'Miljø · 14001' },
  ];

  const shared = { go, avvik, setAvvik, oppg, setOppg, risiko, setRisiko, setTab };

  return (
    <div className="ok-content__inner" style={{ maxWidth: 1320 }}>
      {/* Header */}
      <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', marginBottom: 18, gap: 24 }}>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8, flexWrap: 'wrap' }}>
            <ISOTag std="9001" />
            <ISOTag std="14001" />
            <span style={{ fontSize: 11.5, color: SK.soft, fontWeight: 500 }}>Sertifisert ledelsessystem · DNV</span>
          </div>
          <h1 style={{ margin: 0, fontSize: 28, fontWeight: 600, letterSpacing: -0.02 }}>Kvalitet (ISO)</h1>
          <div style={{ marginTop: 6, color: SK.soft, fontSize: 13, maxWidth: 820 }}>
            Felles ledelsessystem for kvalitet (ISO 9001:2015) og miljø (ISO 14001:2015). Risiko,
            avvik, revisjoner og forbedringstiltak henger sammen og er koblet til de øvrige modulene
            i totalsystemet — alt merket med hvilken standard og klausul kravet hører til.
          </div>
        </div>
        <div style={{ display: 'flex', gap: 8, flexShrink: 0 }}>
          <Button size="sm" variant="ghost" onClick={resetDemo}>Nullstill demo</Button>
          <Button size="sm" icon={I.download}>Eksporter</Button>
          <Button variant="primary" icon={I.plus} onClick={() => setTab('avvik')}>Meld avvik</Button>
        </div>
      </div>

      <Tabs tabs={tabs} value={tab} onChange={setTab} />

      {tab === 'oversikt'     && <KvalOversikt {...shared} />}
      {tab === 'risiko'       && <KvalRisiko {...shared} />}
      {tab === 'avvik'        && <KvalAvvik {...shared} />}
      {tab === 'revisjoner'   && <KvalRevisjoner {...shared} />}
      {tab === 'oppgaver'     && <KvalOppgaver {...shared} />}
      {tab === 'standardkrav' && <KvalStandardkrav {...shared} />}
      {tab === 'miljo'        && <KvalMiljo {...shared} />}
    </div>
  );
}

// ── Tab-overskrift med fane-badges i Tabs (vi gjenbruker Tabs uten badge-støtte,
//    så badge vises i selve label). ────────────────────────────────────────────

// ═══════════════════════════════════════════════════════════════════════════
// OVERSIKT
// ═══════════════════════════════════════════════════════════════════════════
function KvalOversikt({ go, avvik, oppg, risiko, setTab }) {
  const aapneAvvik = avvik.filter(a => a.status !== 'lukket');
  const kritiskeRisiko = risiko.filter(r => r.sann * r.kons >= 12);
  const aapneOppg = oppg.filter(o => o.status !== 'done');
  const forfalte = aapneOppg.filter(o => kvalDagerTil(o.frist) < 0);
  const lukketIfrist = avvik.filter(a => a.status === 'lukket').length;
  const dekning9001 = Math.round(KVAL_KRAV.filter(k => k.std === '9001').reduce((s, k) => s + k.dekning, 0) / 7);
  const dekning14001 = Math.round(KVAL_KRAV.filter(k => k.std === '14001').reduce((s, k) => s + k.dekning, 0) / 7);

  const nesteRev = [...KVAL_REVISJONER].filter(r => kvalDagerTil(r.dato) >= 0).sort((a, b) => new Date(a.dato) - new Date(b.dato));

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
      {/* KPI-strip */}
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 1fr)', gap: 14 }}>
        <Card padded><KPI label="Åpne avvik" value={aapneAvvik.length} sub={`${lukketIfrist} lukket i år`} accent={aapneAvvik.length > 4} /></Card>
        <Card padded><KPI label="Aktive risikoer" value={risiko.length} sub={`${kritiskeRisiko.length} høy/kritisk`} accent={kritiskeRisiko.length > 0} /></Card>
        <Card padded><KPI label="Åpne tiltak" value={aapneOppg.length} sub={`${forfalte.length} forfalt`} accent={forfalte.length > 0} /></Card>
        <Card padded><KPI label="Samsvar 9001" value={`${dekning9001} %`} sub="kap. 4–10" /></Card>
        <Card padded><KPI label="Samsvar 14001" value={`${dekning14001} %`} sub="kap. 4–10" /></Card>
      </div>

      {/* Sertifiseringsstatus */}
      <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 14 }}>
        {Object.values(ISO_STANDARDS).map(s => {
          const dager = kvalDagerTil(s.gyldigTil);
          return (
            <Card key={s.id} padded>
              <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 12 }}>
                <div>
                  <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                    <span style={{ width: 30, height: 30, borderRadius: 8, background: s.bg, color: s.farge, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                      {I.shield}
                    </span>
                    <div>
                      <div style={{ fontSize: 14.5, fontWeight: 600 }}>{s.navn}</div>
                      <div style={{ fontSize: 11.5, color: SK.soft }}>{s.tema} · {s.organ}</div>
                    </div>
                  </div>
                </div>
                <Pill status="track">Sertifisert</Pill>
              </div>
              <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10, marginTop: 14 }}>
                <div style={{ padding: '8px 10px', background: SK.iceBlueLight, borderRadius: 8 }}>
                  <div style={{ fontSize: 10, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase' }}>Gyldig til</div>
                  <div style={{ fontSize: 13, fontWeight: 600, marginTop: 2, color: dager < 200 ? SK.coral : SK.ink }}>{kvalFmtDato(s.gyldigTil)}</div>
                  <div style={{ fontSize: 10.5, color: SK.soft }}>{Math.round(dager / 30)} mnd igjen</div>
                </div>
                <div style={{ padding: '8px 10px', background: SK.iceBlueLight, borderRadius: 8 }}>
                  <div style={{ fontSize: 10, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase' }}>Neste revisjon</div>
                  <div style={{ fontSize: 13, fontWeight: 600, marginTop: 2 }}>{kvalFmtDato(s.nesteRevisjon)}</div>
                  <div style={{ fontSize: 10.5, color: SK.soft }}>{s.revisjonstype}</div>
                </div>
              </div>
            </Card>
          );
        })}
      </div>

      <div style={{ display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 14, alignItems: 'flex-start' }}>
        {/* Krever oppmerksomhet */}
        <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
          <Card title="Krever oppmerksomhet" padded={false}
            action={<Button size="sm" variant="ghost" onClick={() => setTab('avvik')}>Til avvik {I.chevron}</Button>}>
            <table className="ok-table">
              <tbody>
                {aapneAvvik.slice(0, 5).map(a => {
                  const st = KVAL_AVVIK_STATUS[a.status];
                  const dager = kvalDagerTil(a.frist);
                  return (
                    <TR key={a.id} onClick={() => setTab('avvik')}>
                      <td style={{ paddingLeft: 18 }}>
                        <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                          <span style={{ fontSize: 11, fontWeight: 700, color: SK.soft, fontVariantNumeric: 'tabular-nums' }}>{a.nr}</span>
                          <ISOTags std={a.std} klausul={a.klausul} mini />
                        </div>
                        <div style={{ fontWeight: 600, fontSize: 12.5, marginTop: 3 }}>{a.tittel}</div>
                      </td>
                      <td><span style={{ fontSize: 11, fontWeight: 600, color: st.farge }}>{st.label}</span></td>
                      <td style={{ textAlign: 'right', paddingRight: 18 }}>
                        <span style={{ fontSize: 11.5, fontWeight: 600, color: dager < 0 ? SK.coral : dager < 7 ? '#8e5a05' : SK.soft }}>
                          {dager < 0 ? `${Math.abs(dager)} d forfalt` : `${dager} d igjen`}
                        </span>
                      </td>
                    </TR>
                  );
                })}
              </tbody>
            </table>
          </Card>

          {/* Kvalitets- og miljømål */}
          <Card title="Kvalitets- & miljømål" action={<span style={{ fontSize: 11, color: SK.soft }}>§6.2</span>}>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
              {KVAL_MAAL.map(g => {
                const pct = g.enhet === '%' && g.maal.includes('−')
                  ? Math.min(100, Math.round(Math.abs(g.naa) / Math.abs(parseFloat(g.maal)) * 100))
                  : g.enhet === '/5' ? Math.round(g.naa / parseFloat(g.maal) * 100)
                  : Math.min(100, Math.round(g.naa / parseFloat(g.maal.replace(/[^\d,.]/g, '').replace(',', '.')) * 100));
                const ok = pct >= 95;
                return (
                  <div key={g.id}>
                    <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', gap: 10, marginBottom: 5 }}>
                      <div style={{ display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 }}>
                        <ISOTag std={g.std} mini />
                        <span style={{ fontSize: 12, fontWeight: 500, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{g.navn}</span>
                      </div>
                      <span style={{ fontSize: 11.5, fontWeight: 600, whiteSpace: 'nowrap' }}>
                        {g.naa}{g.enhet === '%' ? ' %' : g.enhet === '/5' ? ' / 5' : ''} <span style={{ color: SK.soft, fontWeight: 500 }}>/ {g.maal}</span>
                      </span>
                    </div>
                    <Progress value={pct} status={ok ? 'track' : pct >= 75 ? 'risk' : 'delay'} />
                  </div>
                );
              })}
            </div>
          </Card>
        </div>

        {/* Høyrekolonne */}
        <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
          <Card title="Høyeste risikoer" padded={false}
            action={<Button size="sm" variant="ghost" onClick={() => setTab('risiko')}>Matrise {I.chevron}</Button>}>
            <div style={{ display: 'flex', flexDirection: 'column' }}>
              {[...risiko].sort((a, b) => b.sann * b.kons - a.sann * a.kons).slice(0, 4).map((r, i) => (
                <div key={r.id} onClick={() => setTab('risiko')} style={{ padding: '11px 18px', borderTop: i ? '1px solid rgba(17,24,61,.06)' : 'none', cursor: 'pointer', display: 'flex', gap: 10, alignItems: 'center' }}>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ display: 'flex', gap: 6, alignItems: 'center', marginBottom: 2 }}>
                      <span style={{ fontSize: 10.5, fontWeight: 700, color: SK.soft }}>{r.nr}</span>
                      <ISOTags std={r.std} mini />
                    </div>
                    <div style={{ fontSize: 12.5, fontWeight: 500, lineHeight: 1.3 }}>{r.navn}</div>
                  </div>
                  <RisikoBadge s={r.sann} k={r.kons} showVal={false} />
                </div>
              ))}
            </div>
          </Card>

          <Card title="Kommende revisjoner" padded={false}
            action={<Button size="sm" variant="ghost" onClick={() => setTab('revisjoner')}>Alle {I.chevron}</Button>}>
            <div style={{ display: 'flex', flexDirection: 'column' }}>
              {nesteRev.slice(0, 4).map((r, i) => (
                <div key={r.id} onClick={() => setTab('revisjoner')} style={{ padding: '11px 18px', borderTop: i ? '1px solid rgba(17,24,61,.06)' : 'none', cursor: 'pointer', display: 'flex', gap: 10, alignItems: 'center' }}>
                  <div style={{ textAlign: 'center', flexShrink: 0, width: 40 }}>
                    <div style={{ fontSize: 16, fontWeight: 700, lineHeight: 1 }}>{new Date(r.dato).getDate()}</div>
                    <div style={{ fontSize: 9.5, color: SK.soft, textTransform: 'uppercase' }}>{['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'][new Date(r.dato).getMonth()]}</div>
                  </div>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontSize: 12.5, fontWeight: 500, lineHeight: 1.3 }}>{r.navn}</div>
                    <div style={{ marginTop: 3 }}><ISOTags std={r.std} mini /></div>
                  </div>
                </div>
              ))}
            </div>
          </Card>
        </div>
      </div>
    </div>
  );
}

// ═══════════════════════════════════════════════════════════════════════════
// STANDARDKRAV — samsvarsmatrise + kobling til moduler
// ═══════════════════════════════════════════════════════════════════════════
function KvalStandardkrav({ go }) {
  const [std, setStd] = React.useState('9001');
  const krav = KVAL_KRAV.filter(k => k.std === std);
  const s = ISO_STANDARDS[std];
  const statusTone = {
    oppfylt: { label: 'Oppfylt', bg: '#dbeed8', fg: '#1b6a2e' },
    delvis:  { label: 'Delvis',  bg: '#fdeac8', fg: '#8e5a05' },
    mangel:  { label: 'Mangel',  bg: '#f8d3d5', fg: '#8a1620' },
  };

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
      <Card padded>
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12, flexWrap: 'wrap' }}>
          <div style={{ maxWidth: 680 }}>
            <KvalSectionLabel sub="Hvert hovedkapittel i standarden er knyttet til dokumentasjon og hvilken modul i totalsystemet som dekker kravet. Klikk en rad for å åpne kilden.">
              Samsvarsmatrise — kap. 4–10
            </KvalSectionLabel>
          </div>
          <div style={{ display: 'flex', gap: 4 }}>
            {Object.values(ISO_STANDARDS).map(o => (
              <button key={o.id} onClick={() => setStd(o.id)} className="ok-btn ok-btn--sm" style={{
                background: std === o.id ? o.farge : 'transparent',
                color: std === o.id ? '#fff' : SK.ink,
                borderColor: std === o.id ? o.farge : 'rgba(17,24,61,.15)',
              }}>{o.navn}</button>
            ))}
          </div>
        </div>

        <table className="ok-table" style={{ marginTop: 6 }}>
          <thead>
            <tr>
              <th style={{ paddingLeft: 0, width: 50 }}>Kap.</th>
              <th>Krav</th>
              <th style={{ width: 150 }}>Dekning</th>
              <th>Status</th>
              <th>Dokumentasjon</th>
              <th>Ansvar</th>
              <th style={{ width: 130 }}>Dekkes i</th>
            </tr>
          </thead>
          <tbody>
            {krav.map(k => {
              const t = statusTone[k.status];
              const m = KVAL_MODUL_MAP[k.modul];
              const eier = TEAM[k.ansvarlig];
              return (
                <TR key={k.kap} onClick={() => m && go({ screen: m.screen })}>
                  <td style={{ fontWeight: 700, fontSize: 15, color: s.farge }}>{k.kap}</td>
                  <td><div style={{ fontWeight: 600, fontSize: 12.5 }}>{k.navn}</div></td>
                  <td>
                    <Progress value={k.dekning} status={k.dekning >= 90 ? 'track' : k.dekning >= 75 ? 'risk' : 'delay'} />
                    <div style={{ fontSize: 10.5, color: SK.soft, marginTop: 3 }}>{k.dekning} %</div>
                  </td>
                  <td><span style={{ display: 'inline-block', padding: '2px 9px', borderRadius: 99, fontSize: 10.5, fontWeight: 600, background: t.bg, color: t.fg }}>{t.label}</span></td>
                  <td style={{ fontSize: 11.5, color: SK.soft, maxWidth: 220 }}>{k.evidens}</td>
                  <td>{eier ? <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}><Avatar initials={eier.i} color={eier.c} size={20} /><span style={{ fontSize: 11.5 }}>{eier.n.split(' ')[0]}</span></div> : '—'}</td>
                  <td>{m ? <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, fontWeight: 600, color: s.farge }}>{m.label} {I.chevron}</span> : '—'}</td>
                </TR>
              );
            })}
          </tbody>
        </table>
      </Card>

      <Card padded style={{ background: s.bg, border: 'none' }}>
        <div style={{ display: 'flex', gap: 14, alignItems: 'flex-start' }}>
          <span style={{ width: 34, height: 34, borderRadius: 9, background: s.farge, color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>{I.shield}</span>
          <div style={{ flex: 1 }}>
            <div style={{ fontSize: 14, fontWeight: 600 }}>{s.navn} · {s.tema}</div>
            <div style={{ fontSize: 12.5, color: SK.ink, marginTop: 4, lineHeight: 1.5, opacity: 0.85 }}>
              Sertifikat <strong>{s.sertNr}</strong> utstedt av {s.organ}, gyldig til {kvalFmtDato(s.gyldigTil)}.
              Ledelsessystemet bygger på struktur i Annex SL (lik kapittelinndeling 4–10), slik at 9001 og
              14001 deler kontekst, lederskap, støtte og forbedring på tvers.
            </div>
          </div>
        </div>
      </Card>
    </div>
  );
}

// ═══════════════════════════════════════════════════════════════════════════
// MILJØ (ISO 14001) — aspektregister, lovverk, mål
// ═══════════════════════════════════════════════════════════════════════════
function KvalMiljo({ go }) {
  const betydelige = KVAL_MILJOASPEKT.filter(a => a.betydelig).length;
  const lovAvvik = KVAL_LOVKRAV.filter(l => l.status === 'avvik').length;
  const statusTone = {
    samsvar:  { label: 'Samsvar',  bg: '#dbeed8', fg: '#1b6a2e' },
    tiltak:   { label: 'Tiltak',   bg: '#fdeac8', fg: '#8e5a05' },
    avvik:    { label: 'Avvik',    bg: '#f8d3d5', fg: '#8a1620' },
    vurderes: { label: 'Vurderes', bg: '#e3edfb', fg: '#28589f' },
  };

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 14 }}>
        <Card padded><KPI label="Miljøaspekter" value={KVAL_MILJOASPEKT.length} sub={`${betydelige} betydelige`} /></Card>
        <Card padded><KPI label="Lovkrav" value={KVAL_LOVKRAV.length} sub="i register" /></Card>
        <Card padded><KPI label="Samsvarsavvik" value={lovAvvik} sub="krever tiltak" accent={lovAvvik > 0} /></Card>
        <Card padded><KPI label="Miljømål" value={KVAL_MAAL.filter(m => m.std === '14001').length} sub="aktive" /></Card>
      </div>

      <Card padded>
        <KvalSectionLabel sub="Identifiserte miljøaspekter med påvirkning, indikator og mål. Betydelige aspekter krever dokumentert styring iht. ISO 14001 §6.1.2.">
          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>Aspektregister <ISOTag std="14001" klausul="6.1.2" /></span>
        </KvalSectionLabel>
        <table className="ok-table">
          <thead>
            <tr>
              <th style={{ paddingLeft: 0 }}>Miljøaspekt</th>
              <th>Enhet</th>
              <th>Påvirkning</th>
              <th>Indikator</th>
              <th>Mål</th>
              <th>Status</th>
            </tr>
          </thead>
          <tbody>
            {KVAL_MILJOASPEKT.map(a => {
              const t = statusTone[a.status];
              return (
                <tr key={a.id} style={{ cursor: 'default' }}>
                  <td style={{ paddingLeft: 0 }}>
                    <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                      {a.betydelig && <span title="Betydelig miljøaspekt" style={{ width: 7, height: 7, borderRadius: '50%', background: SK.coral, flexShrink: 0 }} />}
                      <span style={{ fontWeight: 600, fontSize: 12.5 }}>{a.aspekt}</span>
                    </div>
                    {a.lovkrav !== '—' && <div style={{ fontSize: 10.5, color: SK.soft, marginTop: 2, marginLeft: a.betydelig ? 15 : 0 }}>Lovkrav: {a.lovkrav}</div>}
                  </td>
                  <td style={{ fontSize: 12 }}>{a.enhet}</td>
                  <td style={{ fontSize: 11.5, color: SK.soft }}>{a.paavirkning}</td>
                  <td style={{ fontSize: 11.5 }}>{a.indikator}</td>
                  <td style={{ fontSize: 12, fontWeight: 600 }}>{a.maal}</td>
                  <td><span style={{ display: 'inline-block', padding: '2px 9px', borderRadius: 99, fontSize: 10.5, fontWeight: 600, background: t.bg, color: t.fg }}>{t.label}</span></td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </Card>

      <Card padded>
        <KvalSectionLabel sub="Bindende krav organisasjonen må følge. Vurderes periodisk i samsvarsvurdering.">
          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>Lovverk & samsvarsforpliktelser <ISOTag std="14001" klausul="6.1.3" /></span>
        </KvalSectionLabel>
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))', gap: 10 }}>
          {KVAL_LOVKRAV.map(l => {
            const t = statusTone[l.status];
            const eier = TEAM[l.ansvarlig];
            return (
              <div key={l.id} style={{ padding: 12, border: '1px solid rgba(17,24,61,.1)', borderRadius: 10 }}>
                <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 8 }}>
                  <div style={{ fontSize: 13, fontWeight: 600 }}>{l.navn}</div>
                  <span style={{ display: 'inline-block', padding: '2px 8px', borderRadius: 99, fontSize: 10, fontWeight: 600, background: t.bg, color: t.fg, flexShrink: 0 }}>{t.label}</span>
                </div>
                <div style={{ fontSize: 11, color: SK.soft, marginTop: 3, fontVariantNumeric: 'tabular-nums' }}>{l.referanse}</div>
                <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginTop: 10 }}>
                  {eier && <Avatar initials={eier.i} color={eier.c} size={18} />}
                  <span style={{ fontSize: 11, color: SK.soft }}>Vurdert {kvalFmtDato(l.vurdert)}</span>
                </div>
              </div>
            );
          })}
        </div>
      </Card>
    </div>
  );
}

Object.assign(window, {
  KVAL_MODUL_MAP, ISOTag, ISOTags, KildeChip, RisikoBadge, KvalSectionLabel,
  KvalitetWorkspaceMock, KvalOversikt, KvalStandardkrav, KvalMiljo,
});
