// listing-demo.jsx — interactive embed of the AI Listing Generator.

const { useState: useStateL } = React;

function ListingPill({ kind, children }) {
  const style = {
    done:    { bg: 'var(--bg-ok)',     fg: 'var(--fg-ok)' },
    running: { bg: 'var(--bg-warn)',   fg: 'var(--fg-warn)' },
    queued:  { bg: 'transparent',       fg: 'var(--ink-2)', border: '1px solid var(--rule-strong)' },
    failed:  { bg: 'var(--bg-danger)',  fg: 'var(--fg-danger)' },
  }[kind] || { bg: 'transparent', fg: 'var(--ink-2)' };
  return (
    <span style={{
      background: style.bg, color: style.fg, border: style.border || 'none',
      padding: '3px 10px', borderRadius: 999, fontSize: 11.5, fontWeight: 500,
      fontFamily: "'JetBrains Mono', monospace", letterSpacing: '.02em',
      whiteSpace: 'nowrap', display: 'inline-flex', alignItems: 'center', gap: 6,
    }}>
      {kind === 'running' && (
        <span style={{
          width: 6, height: 6, borderRadius: '50%', background: 'currentColor',
          animation: 'pulse 1.6s ease-in-out infinite',
        }}></span>
      )}
      {children}
    </span>
  );
}

// — Tab 0: Product archive (NEW default)
function ArchiveTab({ d }) {
  // Seasonality index: 12 months. May–Sep peak
  const season = [0.55, 0.6, 0.72, 0.9, 1.45, 1.78, 1.92, 1.85, 1.55, 1.0, 0.7, 0.58];
  const months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];

  const kwToneColor = {
    primary:     'var(--fg-danger)',
    secondary:   'var(--fg-warn)',
    opportunity: 'var(--fg-info)',
  };

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
      {/* HEADER — meta strip */}
      <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between',
                    flexWrap: 'wrap', gap: 12 }}>
        <div>
          <div style={{ fontSize: 18, fontWeight: 500, marginBottom: 4,
                        fontFamily: 'var(--font-display)', letterSpacing: '-0.01em' }}>{d.title}</div>
          <div style={{ fontSize: 12.5, color: 'var(--ink-2)', maxWidth: '64ch', lineHeight: 1.55 }}>{d.sub}</div>
        </div>
        <span style={{
          display: 'inline-flex', alignItems: 'center', gap: 6,
          background: 'var(--bg-ok)', color: 'var(--fg-ok)',
          padding: '4px 10px', borderRadius: 999, fontSize: 11.5,
          fontFamily: "'JetBrains Mono', monospace",
        }}>
          <span style={{ width: 6, height: 6, borderRadius: '50%', background: 'currentColor' }}></span>
          {d.importLabel}
        </span>
      </div>

      {/* META + sheets */}
      <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>
        {/* meta key-value */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 14 }}>
          {d.meta.map(([k, v], i) => (
            <div key={i} style={{
              display: 'grid', gridTemplateColumns: '110px 1fr', gap: 12,
              padding: '9px 0', borderTop: i ? '1px solid var(--rule)' : 'none',
              alignItems: 'baseline',
            }}>
              <span style={{ fontSize: 11, color: 'var(--ink-2)', letterSpacing: '.04em',
                              fontFamily: "'JetBrains Mono', monospace",
                              textTransform: 'uppercase' }}>{k}</span>
              <span style={{ fontSize: 13, color: 'var(--ink-1)',
                              fontFamily: i === 0 ? "'JetBrains Mono', monospace" : 'inherit',
                              fontWeight: i === 0 ? 600 : 400 }}>{v}</span>
            </div>
          ))}
        </div>

        {/* parsed sheets */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 14 }}>
          <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                        color: 'var(--ink-2)', letterSpacing: '.06em',
                        textTransform: 'uppercase', marginBottom: 10 }}>
            Parsed sheets · 11
          </div>
          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 5 }}>
            {d.sheets.map((s, i) => (
              <span key={i} style={{
                fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                padding: '3px 8px', background: 'var(--bg-soft)',
                color: 'var(--ink-2)', borderRadius: 4,
                border: '1px solid var(--rule)',
              }}>{s}</span>
            ))}
          </div>
        </div>
      </div>

      {/* KEYWORD ANALYSIS */}
      <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                    borderRadius: 4, overflow: 'hidden' }}>
        <div style={{ padding: '14px 16px', borderBottom: '1px solid var(--rule)' }}>
          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline',
                        flexWrap: 'wrap', gap: 8 }}>
            <div>
              <div style={{ fontSize: 14, fontWeight: 500 }}>{d.kwTitle}</div>
              <div style={{ fontSize: 12, color: 'var(--ink-2)', marginTop: 2,
                              maxWidth: '70ch', lineHeight: 1.5 }}>{d.kwSub}</div>
            </div>
            <div style={{ display: 'flex', gap: 12, fontSize: 11,
                          fontFamily: "'JetBrains Mono', monospace" }}>
              {Object.entries(d.kwLegend).map(([k, v]) => (
                <span key={k} style={{ display: 'inline-flex', alignItems: 'center', gap: 5,
                                        color: kwToneColor[k] }}>
                  <span style={{ width: 7, height: 7, borderRadius: '50%',
                                  background: 'currentColor' }}></span>{v}
                </span>
              ))}
            </div>
          </div>
        </div>
        <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
          <thead>
            <tr style={{ background: 'var(--bg-soft)', color: 'var(--ink-2)' }}>
              {d.kwHeaders.map((h, i) => (
                <th key={i} style={{
                  padding: '9px 14px', textAlign: i >= 1 && i <= 2 ? 'right' : 'left',
                  fontWeight: 500, fontSize: 11, letterSpacing: '.04em',
                  fontFamily: "'JetBrains Mono', monospace", textTransform: 'uppercase',
                  borderBottom: '1px solid var(--rule)',
                }}>{h}</th>
              ))}
            </tr>
          </thead>
          <tbody>
            {d.kwRows.map((r, i) => {
              const [kw, vol, rank, status] = r;
              const td = { padding: '10px 14px', borderTop: i ? '1px solid var(--rule)' : 'none',
                            fontVariantNumeric: 'tabular-nums' };
              return (
                <tr key={i}>
                  <td style={{ ...td, fontWeight: 500 }}>{kw}</td>
                  <td style={{ ...td, textAlign: 'right', color: 'var(--ink-2)',
                                fontFamily: "'JetBrains Mono', monospace", fontSize: 12.5 }}>{vol}</td>
                  <td style={{ ...td, textAlign: 'right', color: 'var(--ink-2)',
                                fontFamily: "'JetBrains Mono', monospace", fontSize: 12.5 }}>{rank}</td>
                  <td style={td}>
                    <span style={{
                      fontSize: 11, padding: '3px 9px', borderRadius: 999,
                      fontFamily: "'JetBrains Mono', monospace", letterSpacing: '.02em',
                      color: kwToneColor[status],
                      border: '1px solid currentColor',
                    }}>{d.kwLegend[status]}</span>
                  </td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </div>

      {/* KEYWORD CLASSIFICATION + ALLOCATION */}
      <KeywordClassification d={d} />
      <KeywordAllocation d={d} />

      {/* COMPETITORS + SEASONALITY side-by-side */}
      <div style={{ display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 12 }}>
        {/* competitor table */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, overflow: 'hidden' }}>
          <div style={{ padding: '14px 16px', borderBottom: '1px solid var(--rule)' }}>
            <div style={{ fontSize: 14, fontWeight: 500 }}>{d.compTitle}</div>
          </div>
          <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 12.5 }}>
            <thead>
              <tr style={{ background: 'var(--bg-soft)', color: 'var(--ink-2)' }}>
                {d.compHeaders.map((h, i) => (
                  <th key={i} style={{
                    padding: '8px 12px', textAlign: i >= 2 && i <= 4 ? 'right' : 'left',
                    fontWeight: 500, fontSize: 10.5, letterSpacing: '.04em',
                    fontFamily: "'JetBrains Mono', monospace", textTransform: 'uppercase',
                    borderBottom: '1px solid var(--rule)',
                  }}>{h}</th>
                ))}
              </tr>
            </thead>
            <tbody>
              {d.compRows.map((r, i) => {
                const td = { padding: '9px 12px', borderTop: i ? '1px solid var(--rule)' : 'none',
                              fontVariantNumeric: 'tabular-nums' };
                return (
                  <tr key={i}>
                    <td style={{ ...td, fontFamily: "'JetBrains Mono', monospace",
                                  fontSize: 11.5, color: 'var(--ink-2)' }}>{r[0]}</td>
                    <td style={{ ...td, fontWeight: 500 }}>{r[1]}</td>
                    <td style={{ ...td, textAlign: 'right' }}>{r[2]}</td>
                    <td style={{ ...td, textAlign: 'right' }}>{r[3]}</td>
                    <td style={{ ...td, textAlign: 'right', color: 'var(--accent)',
                                  fontFamily: "'JetBrains Mono', monospace" }}>{r[4]}</td>
                    <td style={{ ...td, color: 'var(--ink-2)', fontSize: 12 }}>{r[5]}</td>
                  </tr>
                );
              })}
            </tbody>
          </table>
        </div>

        {/* seasonality */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 16 }}>
          <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 4 }}>{d.seasonTitle}</div>
          <div style={{ fontSize: 11.5, color: 'var(--ink-2)', marginBottom: 14, lineHeight: 1.5 }}>{d.seasonSub}</div>
          {/* seasonality bar chart */}
          <svg viewBox="0 0 320 110" style={{ width: '100%', height: 'auto' }}>
            {/* baseline 1.0 */}
            <line x1="20" x2="316" y1="70" y2="70" stroke="var(--rule)" strokeWidth="0.6" strokeDasharray="2 3" />
            <text x="16" y="73" fontSize="8" textAnchor="end" fill="var(--ink-2)"
                  fontFamily="JetBrains Mono">1.0</text>
            {season.map((v, i) => {
              const barW = (316 - 20) / 12;
              const x = 20 + barW * i + barW * 0.15;
              const w = barW * 0.7;
              const fullH = 60; // 0 → 2.0
              const h = (v / 2.0) * fullH;
              const y = 70 - (v - 1.0) * (fullH / 2.0) * (v > 1 ? 1 : 0) - (v > 1 ? h - (1 - 0) * (fullH/2) : 0);
              // simpler: bar from baseline 70 up/down based on v
              const above = v > 1;
              const barY = above ? 70 - (v - 1) * 30 : 70;
              const barH = above ? (v - 1) * 30 : (1 - v) * 30;
              return (
                <g key={i}>
                  <rect x={x} y={barY} width={w} height={barH}
                        fill={above ? 'var(--accent)' : 'var(--ink-3)'} opacity={above ? 0.9 : 0.5}/>
                  <text x={x + w/2} y="92" fontSize="8" textAnchor="middle"
                        fill="var(--ink-2)" fontFamily="JetBrains Mono">{months[i]}</text>
                  {above && v >= 1.5 && (
                    <text x={x + w/2} y={barY - 3} fontSize="8" textAnchor="middle"
                          fill="var(--accent)" fontFamily="JetBrains Mono"
                          fontWeight="600">{v.toFixed(1)}×</text>
                  )}
                </g>
              );
            })}
          </svg>
        </div>
      </div>

      {/* VERSION HISTORY + NEGATIVES */}
      <div style={{ display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 12 }}>
        {/* version history */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 16 }}>
          <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 14 }}>{d.histTitle}</div>
          {d.histRows.map((r, i) => {
            const [v, date, note, status] = r;
            const active = status === 'active';
            return (
              <div key={i} style={{
                display: 'grid', gridTemplateColumns: '46px 90px 1fr auto', gap: 14,
                alignItems: 'center', padding: '11px 0',
                borderTop: i ? '1px solid var(--rule)' : 'none',
              }}>
                <span style={{
                  fontFamily: 'var(--font-display)', fontSize: 22, lineHeight: 1,
                  color: active ? 'var(--accent)' : 'var(--ink-3)',
                  fontWeight: 500,
                }}>{v}</span>
                <span style={{ fontSize: 12, color: 'var(--ink-2)',
                                fontFamily: "'JetBrains Mono', monospace" }}>{date}</span>
                <span style={{ fontSize: 12.5, color: 'var(--ink-1)', lineHeight: 1.5 }}>{note}</span>
                <span style={{
                  fontSize: 10.5, padding: '3px 9px', borderRadius: 999,
                  fontFamily: "'JetBrains Mono', monospace", letterSpacing: '.02em',
                  background: active ? 'var(--bg-ok)' : 'transparent',
                  color: active ? 'var(--fg-ok)' : 'var(--ink-2)',
                  border: active ? 'none' : '1px solid var(--rule-strong)',
                }}>{d.histStatus[status]}</span>
              </div>
            );
          })}
        </div>

        {/* negatives */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 16 }}>
          <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 4 }}>{d.negTitle}</div>
          <div style={{ fontSize: 11.5, color: 'var(--ink-2)', marginBottom: 14,
                        fontFamily: "'JetBrains Mono', monospace" }}>
            Auto-applied to ads · suppressed in title gen
          </div>
          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 5 }}>
            {d.negKeywords.map((k) => (
              <span key={k} style={{
                fontSize: 11, padding: '3px 8px',
                background: 'var(--bg-danger)', color: 'var(--fg-danger)',
                borderRadius: 4, fontFamily: "'JetBrains Mono', monospace",
                textDecoration: 'line-through', textDecorationColor: 'rgba(0,0,0,.25)',
              }}>{k}</span>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

// — Keyword classification block (semantic clustering)
function KeywordClassification({ d }) {
  const toneColors = {
    primary:  { bg: 'color-mix(in oklab, var(--fg-danger) 14%, transparent)', fg: 'var(--fg-danger)', dot: 'var(--fg-danger)' },
    feature:  { bg: 'color-mix(in oklab, var(--accent) 14%, transparent)',     fg: 'var(--accent)',     dot: 'var(--accent)' },
    scene:    { bg: 'color-mix(in oklab, var(--fg-info) 14%, transparent)',    fg: 'var(--fg-info)',    dot: 'var(--fg-info)' },
    audience: { bg: 'color-mix(in oklab, var(--fg-ok) 16%, transparent)',      fg: 'var(--fg-ok)',      dot: 'var(--fg-ok)' },
    longtail: { bg: 'color-mix(in oklab, var(--ink-2) 14%, transparent)',      fg: 'var(--ink-1)',      dot: 'var(--ink-2)' },
  };
  return (
    <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                  borderRadius: 4, overflow: 'hidden' }}>
      <div style={{ padding: '14px 16px', borderBottom: '1px solid var(--rule)' }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline',
                      flexWrap: 'wrap', gap: 8 }}>
          <div>
            <div style={{ fontSize: 14, fontWeight: 500 }}>{d.clsTitle}</div>
            <div style={{ fontSize: 12, color: 'var(--ink-2)', marginTop: 2,
                            maxWidth: '70ch', lineHeight: 1.5 }}>{d.clsSub}</div>
          </div>
          <button style={{
            background: 'transparent', border: '1px solid var(--rule-strong)',
            padding: '4px 10px', fontSize: 11, fontFamily: "'JetBrains Mono', monospace",
            color: 'var(--accent)', borderRadius: 999, cursor: 'pointer', whiteSpace: 'nowrap',
          }}>↻ Re-cluster</button>
        </div>
      </div>
      <div style={{
        display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',
      }}>
        {d.clsGroups.map((g, i) => {
          const tone = toneColors[g.tone];
          return (
            <div key={i} style={{
              padding: '14px 16px',
              borderRight: '1px solid var(--rule)',
              borderTop: '1px solid var(--rule)',
              minHeight: 144,
              display: 'flex', flexDirection: 'column', gap: 10,
            }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
                <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6,
                                fontSize: 12.5, fontWeight: 600, color: tone.fg }}>
                  <span style={{ width: 7, height: 7, borderRadius: '50%', background: tone.dot }}></span>
                  {g.label}
                </span>
                <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11,
                                color: 'var(--ink-2)', fontVariantNumeric: 'tabular-nums' }}>{g.count}</span>
              </div>
              <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
                {g.words.map((w, j) => (
                  <span key={j} style={{
                    fontSize: 11, padding: '3px 8px', borderRadius: 4,
                    background: tone.bg, color: tone.fg,
                    fontFamily: "'JetBrains Mono', monospace", lineHeight: 1.3,
                  }}>{w}</span>
                ))}
                {g.count > g.words.length && (
                  <span style={{
                    fontSize: 11, padding: '3px 8px', borderRadius: 4,
                    color: 'var(--ink-2)', fontFamily: "'JetBrains Mono', monospace",
                    border: '1px dashed var(--rule-strong)',
                  }}>+{g.count - g.words.length}</span>
                )}
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

// — Keyword allocation block (which field each keyword goes to)
function KeywordAllocation({ d }) {
  const tagColors = {
    feature:  { bg: 'color-mix(in oklab, var(--accent) 14%, transparent)',  fg: 'var(--accent)' },
    scene:    { bg: 'color-mix(in oklab, var(--fg-info) 14%, transparent)', fg: 'var(--fg-info)' },
    audience: { bg: 'color-mix(in oklab, var(--fg-ok) 16%, transparent)',   fg: 'var(--fg-ok)' },
  };

  return (
    <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                  borderRadius: 4, padding: 16 }}>
      <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline',
                    flexWrap: 'wrap', gap: 8 }}>
        <div>
          <div style={{ fontSize: 14, fontWeight: 500 }}>{d.allocTitle}</div>
          <div style={{ fontSize: 12, color: 'var(--ink-2)', marginTop: 2,
                          maxWidth: '70ch', lineHeight: 1.5 }}>{d.allocSub}</div>
        </div>
        <span style={{
          display: 'inline-flex', alignItems: 'center', gap: 6,
          background: 'var(--bg-soft)', color: 'var(--ink-2)',
          padding: '4px 10px', borderRadius: 999, fontSize: 11,
          fontFamily: "'JetBrains Mono', monospace",
        }}>AI placement</span>
      </div>

      <div style={{
        background: 'var(--bg-soft)', borderLeft: '3px solid var(--accent)',
        padding: '10px 12px', marginTop: 12, marginBottom: 14,
        fontSize: 12, color: 'var(--ink-2)', lineHeight: 1.55,
      }}>
        <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                        color: 'var(--accent)', letterSpacing: '.06em',
                        textTransform: 'uppercase', marginRight: 8 }}>Rationale</span>
        {d.allocRationale}
      </div>

      <div>
        {d.allocFields.map((f, i) => {
          const isCharCap = f.cap.includes('char');
          const charCapNum = isCharCap ? parseInt(f.cap) : null;
          const usagePct = isCharCap && f.used != null ? Math.round((f.used / charCapNum) * 100) : null;
          const isBullet = f.id.startsWith('bp');
          const tag = f.tag && tagColors[f.tag];
          return (
            <div key={f.id} style={{
              display: 'grid', gridTemplateColumns: '170px 1fr 90px',
              gap: 14, alignItems: 'center',
              padding: '11px 0', borderTop: i ? '1px solid var(--rule)' : 'none',
            }}>
              <div>
                <div style={{
                  fontSize: 12.5,
                  fontWeight: isBullet ? 400 : 600,
                  color: isBullet ? 'var(--ink-2)' : 'var(--ink-1)',
                }}>{f.label}</div>
                <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginTop: 3, flexWrap: 'wrap' }}>
                  <span style={{
                    fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                    color: 'var(--ink-3)', letterSpacing: '.04em',
                  }}>{f.cap}</span>
                  {tag && (
                    <span style={{
                      fontSize: 10, padding: '1.5px 6px', borderRadius: 3,
                      background: tag.bg, color: tag.fg,
                      fontFamily: "'JetBrains Mono', monospace", textTransform: 'uppercase',
                      letterSpacing: '.04em',
                    }}>{f.tag}</span>
                  )}
                </div>
              </div>

              <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
                {f.items.map((kw, j) => (
                  <span key={j} style={{
                    fontSize: 11, padding: '3px 8px', borderRadius: 4,
                    background: 'var(--bg-soft)', color: 'var(--ink-1)',
                    fontFamily: "'JetBrains Mono', monospace",
                    border: '1px solid var(--rule)',
                  }}>{kw}</span>
                ))}
              </div>

              <div style={{ textAlign: 'right' }}>
                {usagePct != null ? (
                  <div>
                    <div style={{ fontSize: 11, fontFamily: "'JetBrains Mono', monospace",
                                  color: 'var(--ink-2)', fontVariantNumeric: 'tabular-nums',
                                  marginBottom: 3 }}>
                      {f.used}/{charCapNum}
                    </div>
                    <div style={{ height: 4, background: 'var(--bg-soft)',
                                    borderRadius: 999, overflow: 'hidden' }}>
                      <div style={{
                        width: `${usagePct}%`, height: '100%',
                        background: usagePct > 95 ? 'var(--fg-warn)' : 'var(--accent)',
                      }}></div>
                    </div>
                  </div>
                ) : (
                  <span style={{
                    fontSize: 10.5, fontFamily: "'JetBrains Mono', monospace",
                    color: 'var(--ink-3)', letterSpacing: '.04em',
                  }}>{f.items.length} kw</span>
                )}
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

function UploadTab({ d }) {
  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 24 }}>
      {/* Left: drop zone + product preview */}
      <div>
        <div style={{ fontSize: 15, fontWeight: 500, marginBottom: 4 }}>{d.title}</div>
        <div style={{ fontSize: 13, color: 'var(--ink-2)', marginBottom: 18, lineHeight: 1.55 }}>{d.sub}</div>
        <div style={{
          border: '1.5px dashed var(--rule-strong)', borderRadius: 8,
          padding: 28, background: 'var(--card)', position: 'relative',
          minHeight: 280, display: 'flex', flexDirection: 'column',
          alignItems: 'center', justifyContent: 'center', gap: 12, overflow: 'hidden',
        }}>
          {/* faux product preview - portable neck fan */}
          <svg viewBox="0 0 200 130" style={{ width: '70%', maxWidth: 200, height: 'auto' }}>
            <defs>
              <linearGradient id="fanBody" x1="0" x2="0" y1="0" y2="1">
                <stop offset="0" stopColor="#a8d8c4"/>
                <stop offset="1" stopColor="#76b59c"/>
              </linearGradient>
              <linearGradient id="fanBand" x1="0" x2="1" y1="0" y2="0">
                <stop offset="0" stopColor="#86c2a8"/>
                <stop offset="0.5" stopColor="#a8d8c4"/>
                <stop offset="1" stopColor="#86c2a8"/>
              </linearGradient>
            </defs>
            {/* neck band — U shape */}
            <path d="M 40 70 Q 40 30, 100 30 Q 160 30, 160 70 L 160 105 Q 160 110, 155 110 L 145 110 Q 142 110, 142 105 L 142 75 Q 142 50, 100 50 Q 58 50, 58 75 L 58 105 Q 58 110, 55 110 L 45 110 Q 40 110, 40 105 Z"
                  fill="url(#fanBand)" stroke="#5a9a82" strokeWidth="0.6" />
            {/* left air outlet */}
            <rect x="42" y="75" width="14" height="32" fill="url(#fanBody)" stroke="#5a9a82" strokeWidth="0.5" rx="3" />
            {[0,1,2,3,4,5].map(i =>
              <line key={`l${i}`} x1="44" y1={78+i*5} x2="54" y2={78+i*5} stroke="#5a9a82" strokeWidth="0.6" opacity="0.5"/>
            )}
            {/* right air outlet */}
            <rect x="144" y="75" width="14" height="32" fill="url(#fanBody)" stroke="#5a9a82" strokeWidth="0.5" rx="3" />
            {[0,1,2,3,4,5].map(i =>
              <line key={`r${i}`} x1="146" y1={78+i*5} x2="156" y2={78+i*5} stroke="#5a9a82" strokeWidth="0.6" opacity="0.5"/>
            )}
            {/* control LEDs */}
            <circle cx="100" cy="40" r="2" fill="#5a9a82" />
            <circle cx="106" cy="40" r="2" fill="#5a9a82" opacity="0.4" />
            <circle cx="94"  cy="40" r="2" fill="#5a9a82" opacity="0.4" />
          </svg>
          <div style={{
            position: 'absolute', top: 12, left: 12,
            fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
            color: 'var(--ink-3)', letterSpacing: '.08em',
          }}>UPLOADED · NF-2401-MNT.jpg</div>
          <div style={{ fontSize: 13, color: 'var(--ink-2)', marginTop: 6 }}>{d.dropLabel}</div>
          <div style={{ fontSize: 11.5, color: 'var(--ink-3)', fontFamily: "'JetBrains Mono', monospace" }}>{d.dropHint}</div>
        </div>
        <div style={{
          marginTop: 14, padding: '12px 14px', background: 'var(--bg-info)',
          borderLeft: '3px solid var(--fg-info)', borderRadius: 4,
          fontSize: 12.5, lineHeight: 1.5, color: 'var(--fg-info)',
        }}>
          <strong>{d.templateTitle}</strong> <span style={{ fontFamily: "'JetBrains Mono', monospace" }}>{d.templateName}</span>
          <div style={{ fontSize: 11.5, opacity: 0.8, marginTop: 3 }}>{d.templateNote}</div>
        </div>
      </div>

      {/* Right: AI detected attributes */}
      <div style={{
        background: 'var(--card)', border: '1px solid var(--rule)', borderRadius: 4, padding: 18,
      }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline',
                      marginBottom: 14, borderBottom: '1px solid var(--rule)', paddingBottom: 10 }}>
          <span style={{ fontSize: 13, fontWeight: 600 }}>{d.detectedTitle}</span>
          <span style={{ fontSize: 11, color: 'var(--ink-3)',
                          fontFamily: "'JetBrains Mono', monospace", textTransform: 'uppercase',
                          letterSpacing: '.04em' }}>{d.confidence}</span>
        </div>
        {d.attrs.map((a, i) => {
          const [label, value, conf] = a;
          const cn = parseInt(conf);
          return (
            <div key={i} style={{
              display: 'grid', gridTemplateColumns: '1fr 1.4fr auto', gap: 10,
              alignItems: 'center', padding: '10px 0',
              borderTop: i ? '1px solid var(--rule)' : 'none',
            }}>
              <span style={{ fontSize: 12, color: 'var(--ink-2)' }}>{label}</span>
              <span style={{ fontSize: 13, fontWeight: 500, color: 'var(--ink-1)' }}>{value}</span>
              <span style={{
                fontSize: 11, fontFamily: "'JetBrains Mono', monospace",
                color: cn >= 95 ? 'var(--fg-ok)' : cn >= 90 ? 'var(--ink-2)' : 'var(--fg-warn)',
                fontVariantNumeric: 'tabular-nums',
              }}>{conf}</span>
            </div>
          );
        })}
      </div>
    </div>
  );
}

// — Tab 2: Generated listing
function GeneratedTab({ d }) {
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
      {/* Header */}
      <div style={{ display: 'flex', justifyContent: 'space-between',
                    alignItems: 'baseline', flexWrap: 'wrap', gap: 12 }}>
        <div>
          <div style={{ fontSize: 15, fontWeight: 500, marginBottom: 2 }}>{d.title}</div>
          <div style={{ fontSize: 12.5, color: 'var(--ink-2)', maxWidth: '60ch', lineHeight: 1.55 }}>{d.sub}</div>
        </div>
        <span style={{
          fontFamily: "'JetBrains Mono', monospace", fontSize: 11,
          padding: '5px 10px', background: 'var(--bg-soft)',
          color: 'var(--ink-2)', borderRadius: 4, letterSpacing: '.04em',
        }}>{d.productTag}</span>
      </div>

      {/* Title block */}
      <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                    borderRadius: 4, padding: 16 }}>
        <div style={{ display: 'flex', justifyContent: 'space-between',
                      alignItems: 'baseline', marginBottom: 8 }}>
          <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                          color: 'var(--ink-2)', letterSpacing: '.06em',
                          textTransform: 'uppercase' }}>{d.titleLabel}</span>
          <button style={{
            background: 'transparent', border: '1px solid var(--rule-strong)',
            padding: '3px 9px', fontSize: 11, fontFamily: "'JetBrains Mono', monospace",
            color: 'var(--accent)', borderRadius: 999, cursor: 'pointer',
          }}>↻ {d.regen}</button>
        </div>
        <div style={{ fontSize: 15, lineHeight: 1.5, color: 'var(--ink-1)' }}>{d.titleVal}</div>
        <div style={{ marginTop: 8, fontFamily: "'JetBrains Mono', monospace",
                      fontSize: 11, color: 'var(--ink-2)' }}>— {d.titleMeta}</div>
      </div>

      {/* Bullets + Keywords side-by-side */}
      <div style={{ display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 12 }}>
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 16 }}>
          <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                        color: 'var(--ink-2)', letterSpacing: '.06em',
                        textTransform: 'uppercase', marginBottom: 12 }}>{d.bulletsLabel}</div>
          {d.bullets.map(([head, body], i) => (
            <div key={i} style={{
              padding: '10px 0', borderTop: i ? '1px solid var(--rule)' : 'none',
              display: 'grid', gridTemplateColumns: '20px 1fr', gap: 10,
            }}>
              <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11,
                              color: 'var(--accent)', marginTop: 2 }}>0{i+1}</span>
              <div>
                <div style={{ fontWeight: 600, fontSize: 12.5,
                              letterSpacing: '.04em', color: 'var(--ink-1)',
                              marginBottom: 3 }}>{head}</div>
                <div style={{ fontSize: 12.5, color: 'var(--ink-2)', lineHeight: 1.5 }}>{body}</div>
              </div>
            </div>
          ))}
        </div>

        <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
          <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                        borderRadius: 4, padding: 16 }}>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                          color: 'var(--ink-2)', letterSpacing: '.06em',
                          textTransform: 'uppercase', marginBottom: 12 }}>{d.kwLabel}</div>
            <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>
              {d.keywords.map((k) => (
                <span key={k} style={{
                  fontSize: 11.5, padding: '4px 9px',
                  background: 'var(--bg-soft)', color: 'var(--ink-1)',
                  borderRadius: 999, fontFamily: "'JetBrains Mono', monospace",
                }}>{k}</span>
              ))}
            </div>
          </div>

          <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                        borderRadius: 4, padding: 16 }}>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                          color: 'var(--ink-2)', letterSpacing: '.06em',
                          textTransform: 'uppercase', marginBottom: 8 }}>{d.bpLabel}</div>
            <div style={{ fontSize: 11.5, color: 'var(--ink-2)', lineHeight: 1.6,
                          fontFamily: "'JetBrains Mono', monospace",
                          background: 'var(--bg-soft)', padding: 10, borderRadius: 4 }}>
              {d.searchTerms}
            </div>
          </div>
        </div>
      </div>

      {/* A+ blocks + image prompts */}
      <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 16 }}>
          <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                        color: 'var(--ink-2)', letterSpacing: '.06em',
                        textTransform: 'uppercase', marginBottom: 12 }}>{d.aPlusLabel}</div>
          {d.aPlusBlocks.map(([head, body], i) => (
            <div key={i} style={{
              display: 'grid', gridTemplateColumns: '24px 1fr', gap: 10,
              padding: '8px 0', borderTop: i ? '1px solid var(--rule)' : 'none',
            }}>
              <div style={{ width: 24, height: 24, background: 'var(--accent)',
                            color: 'var(--bg)', display: 'flex', alignItems: 'center',
                            justifyContent: 'center', fontFamily: "'JetBrains Mono', monospace",
                            fontSize: 11, fontWeight: 600 }}>{i+1}</div>
              <div>
                <div style={{ fontSize: 12.5, fontWeight: 500 }}>{head}</div>
                <div style={{ fontSize: 11.5, color: 'var(--ink-2)', marginTop: 2, lineHeight: 1.5 }}>{body}</div>
              </div>
            </div>
          ))}
        </div>

        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 16 }}>
          <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                        color: 'var(--ink-2)', letterSpacing: '.06em',
                        textTransform: 'uppercase', marginBottom: 12 }}>{d.imgPromptLabel}</div>
          {d.imgPrompts.map((p, i) => (
            <div key={i} style={{
              display: 'grid', gridTemplateColumns: '40px 1fr', gap: 10,
              padding: '8px 0', borderTop: i ? '1px solid var(--rule)' : 'none',
              alignItems: 'center',
            }}>
              <div style={{
                width: 40, height: 40, background: 'var(--bg-soft)',
                border: '1px solid var(--rule)', display: 'flex',
                alignItems: 'center', justifyContent: 'center',
                fontFamily: "'JetBrains Mono', monospace", fontSize: 10,
                color: 'var(--ink-2)',
              }}>{i === 0 ? 'MAIN' : `#${i+1}`}</div>
              <div style={{ fontSize: 11.5, color: 'var(--ink-2)', lineHeight: 1.45,
                            fontFamily: "'JetBrains Mono', monospace" }}>{p}</div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

// — Tab 3: Batch queue
function BatchTab({ d }) {
  const counts = d.rows.reduce((acc, r) => {
    acc[r[3]] = (acc[r[3]] || 0) + 1;
    return acc;
  }, {});
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
      <div>
        <div style={{ fontSize: 15, fontWeight: 500, marginBottom: 4 }}>{d.title}</div>
        <div style={{ fontSize: 12.5, color: 'var(--ink-2)', marginBottom: 14 }}>{d.sub}</div>

        {/* Overall progress bar */}
        <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                      borderRadius: 4, padding: 14 }}>
          <div style={{ display: 'flex', justifyContent: 'space-between',
                        alignItems: 'baseline', marginBottom: 10 }}>
            <span style={{ fontSize: 12.5, fontWeight: 500 }}>{d.progressTitle}</span>
            <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11.5,
                            color: 'var(--ink-2)' }}>{d.progressNote}</span>
          </div>
          <div style={{ display: 'flex', height: 10, borderRadius: 999, overflow: 'hidden',
                         background: 'var(--bg-soft)' }}>
            <div style={{ flex: counts.done || 0, background: 'var(--fg-ok)' }}></div>
            <div style={{ flex: counts.running || 0, background: 'var(--fg-warn)',
                           backgroundImage: 'repeating-linear-gradient(45deg, transparent, transparent 4px, rgba(255,255,255,.3) 4px, rgba(255,255,255,.3) 8px)',
                           animation: 'shift 1.5s linear infinite' }}></div>
            <div style={{ flex: counts.queued || 0, background: 'var(--bg-soft)' }}></div>
          </div>
        </div>
      </div>

      {/* Queue table */}
      <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                    borderRadius: 4, overflow: 'hidden' }}>
        <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
          <thead>
            <tr style={{ background: 'var(--ink-1)', color: 'var(--card)' }}>
              {d.cols.map((c, i) => (
                <th key={i} style={{
                  padding: '11px 14px', textAlign: i >= 4 ? 'right' : 'left',
                  fontWeight: 500, fontSize: 11.5, letterSpacing: '.02em',
                  fontFamily: "'JetBrains Mono', monospace", textTransform: 'uppercase',
                }}>{c}</th>
              ))}
            </tr>
          </thead>
          <tbody>
            {d.rows.map((r, i) => {
              const [sku, cat, color, status, time, cost] = r;
              const td = { padding: '11px 14px', borderTop: '1px solid var(--rule)',
                            fontVariantNumeric: 'tabular-nums' };
              return (
                <tr key={i}>
                  <td style={{ ...td, fontFamily: "'JetBrains Mono', monospace",
                                fontSize: 12.5, color: 'var(--ink-1)', fontWeight: 500 }}>{sku}</td>
                  <td style={{ ...td, color: 'var(--ink-2)' }}>{cat}</td>
                  <td style={{ ...td, color: 'var(--ink-2)' }}>{color}</td>
                  <td style={td}><ListingPill kind={status}>{d.statusLabels[status]}</ListingPill></td>
                  <td style={{ ...td, textAlign: 'right', color: 'var(--ink-2)' }}>{time}</td>
                  <td style={{ ...td, textAlign: 'right', color: status === 'done' ? 'var(--fg-ok)' : 'var(--ink-2)' }}>{cost}</td>
                </tr>
              );
            })}
          </tbody>
        </table>
        <div style={{ padding: '10px 14px', borderTop: '1px solid var(--rule)',
                      fontSize: 11, color: 'var(--ink-2)',
                      fontFamily: "'JetBrains Mono', monospace",
                      display: 'flex', justifyContent: 'space-between', flexWrap: 'wrap', gap: 8 }}>
          <span>Concurrency: 3 workers · Auto-retry on failure</span>
          <span style={{ color: 'var(--accent)' }}>→ 全部完成后打包 ZIP</span>
        </div>
      </div>
    </div>
  );
}

// — Tab 4: Cost tracking
function CostTab({ d }) {
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
      <div>
        <div style={{ fontSize: 15, fontWeight: 500, marginBottom: 4 }}>{d.title}</div>
        <div style={{ fontSize: 12.5, color: 'var(--ink-2)' }}>{d.sub}</div>
      </div>

      {/* KPIs */}
      <div style={{ display: 'grid',
                    gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',
                    gap: 10 }}>
        {d.kpis.map((k, i) => (
          <div key={i} style={{
            background: 'var(--card)', border: '1px solid var(--rule)',
            borderTop: '2px solid var(--accent)', borderRadius: 4, padding: '14px 16px',
          }}>
            <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10.5,
                          color: 'var(--ink-2)', letterSpacing: '.04em',
                          textTransform: 'uppercase', marginBottom: 6 }}>{k.label}</div>
            <div style={{ display: 'flex', alignItems: 'baseline', gap: 6 }}>
              <span style={{ fontSize: 28, fontWeight: 600, fontFamily: 'var(--font-display)',
                              lineHeight: 1, color: 'var(--ink-1)',
                              fontVariantNumeric: 'tabular-nums' }}>{k.value}</span>
              {k.unit && <span style={{ fontSize: 11.5, color: 'var(--ink-2)' }}>{k.unit}</span>}
            </div>
          </div>
        ))}
      </div>

      {/* Model distribution */}
      <div style={{ background: 'var(--card)', border: '1px solid var(--rule)',
                    borderRadius: 4, padding: 18 }}>
        <div style={{ fontSize: 13, fontWeight: 500, marginBottom: 14 }}>{d.modelTitle}</div>
        {d.models.map((m, i) => {
          const [name, spend, pct, role] = m;
          return (
            <div key={i} style={{
              display: 'grid', gridTemplateColumns: '1fr 1fr 90px 80px', gap: 14,
              alignItems: 'center', padding: '12px 0',
              borderTop: i ? '1px solid var(--rule)' : 'none',
            }}>
              <div>
                <div style={{ fontSize: 13, fontWeight: 500 }}>{name}</div>
                <div style={{ fontSize: 11, color: 'var(--ink-2)' }}>{role}</div>
              </div>
              <div style={{ height: 8, background: 'var(--bg-soft)', borderRadius: 999, overflow: 'hidden' }}>
                <div style={{ width: `${pct}%`, height: '100%', background: 'var(--accent)' }}></div>
              </div>
              <div style={{ textAlign: 'right', fontFamily: "'JetBrains Mono', monospace",
                              fontSize: 12, color: 'var(--ink-2)',
                              fontVariantNumeric: 'tabular-nums' }}>{pct}%</div>
              <div style={{ textAlign: 'right', fontFamily: 'var(--font-display)',
                              fontSize: 16, fontWeight: 500,
                              fontVariantNumeric: 'tabular-nums' }}>{spend}</div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

// — Main shell
function ListingDemo({ lang }) {
  const d = (window.I18N || I18N)[lang].listingDemo;
  const [tab, setTab] = useStateL(0); // default to "product archive" — the moat

  return (
    <div style={{
      background: 'var(--app-bg)', border: '1px solid var(--rule-strong)',
      borderRadius: 8, overflow: 'hidden',
      boxShadow: '0 1px 0 rgba(0,0,0,.04), 0 24px 60px -20px rgba(40,28,16,.15), 0 8px 24px -12px rgba(40,28,16,.08)',
    }}>
      {/* Window chrome */}
      <div style={{
        background: 'var(--chrome)', borderBottom: '1px solid var(--rule-strong)',
        padding: '10px 14px', display: 'flex', alignItems: 'center', gap: 10,
      }}>
        <div style={{ display: 'flex', gap: 6 }}>
          {['#FF5F57', '#FEBC2E', '#28C840'].map((c) => (
            <span key={c} style={{ width: 11, height: 11, borderRadius: '50%', background: c, opacity: 0.85 }}></span>
          ))}
        </div>
        <div style={{
          flex: 1, textAlign: 'center', fontSize: 11.5,
          color: 'var(--ink-2)', fontFamily: "'JetBrains Mono', monospace",
        }}>
          {d.url}
        </div>
        <span style={{ width: 11, height: 11 }}></span>
      </div>

      {/* Tabs */}
      <div style={{
        display: 'flex', background: 'var(--chrome)',
        borderBottom: '1px solid var(--rule)', padding: '0 14px',
        overflowX: 'auto',
      }}>
        {d.tabs.map((label, i) => (
          <button key={i} onClick={() => setTab(i)}
            style={{
              background: 'transparent', border: 'none',
              padding: '12px 16px', fontSize: 13,
              color: tab === i ? 'var(--ink-1)' : 'var(--ink-2)',
              fontWeight: tab === i ? 600 : 400,
              borderBottom: tab === i ? '2px solid var(--accent)' : '2px solid transparent',
              marginBottom: -1, cursor: 'pointer', whiteSpace: 'nowrap',
              fontFamily: 'inherit',
            }}>
            {label}
          </button>
        ))}
      </div>

      {/* Body */}
      <div style={{ padding: 22 }}>
        {tab === 0 && <ArchiveTab d={d.archive} />}
        {tab === 1 && <UploadTab d={d.upload} />}
        {tab === 2 && <GeneratedTab d={d.generated} />}
        {tab === 3 && <BatchTab d={d.batch} />}
        {tab === 4 && <CostTab d={d.cost} />}
      </div>
    </div>
  );
}

// Add CSS keyframe for the progress bar shimmer (once)
(function injectListingKeyframes() {
  if (document.getElementById('listing-keyframes')) return;
  const s = document.createElement('style');
  s.id = 'listing-keyframes';
  s.textContent = `
    @keyframes shift {
      0% { background-position: 0 0; }
      100% { background-position: 16px 0; }
    }
  `;
  document.head.appendChild(s);
})();

Object.assign(window, { ListingDemo });
