/* global React, Card, Badge, Button, Avatar, Icon, ICONS, Field, BudgetEditorModal, TemplateEditorModal, sb */
const { useState, useRef, useEffect } = React;

// ─── Data ─────────────────────────────────────────────────────────────────────
const BUDGET_STATUS_TONES = { aprovado:'success', enviado:'brand', visualizado:'cyan', rascunho:'neutral', recusado:'danger' };

function rowToBudget(row) {
  const total = Number(row.total) || (row.items||[]).reduce((a,i) => a + (i.q||1)*(i.p||0), 0);
  const fmtDate = d => d ? d.slice(5).split('-').reverse().join('/') : '—';
  return {
    id:           row.id,
    num:          row.budget_num || '#' + (row.created_at || '').slice(-6).replace(/\D/g,''),
    client:       row.client_name || '',
    clientEmail:  row.client_email || '',
    title:        row.title || '',
    desc:         row.budget_desc || '',
    value:        total ? 'R$ ' + Number(total).toLocaleString('pt-BR') : '—',
    rawValue:     total,
    sent:         fmtDate(row.sent_at || row.created_at?.slice(0,10)),
    valid:        fmtDate(row.valid_until),
    status:       row.status || 'rascunho',
    tone:         BUDGET_STATUS_TONES[row.status] || 'neutral',
    format:       row.format || 'pdf',
    payMethod:    row.pay_method || 'PIX',
    payTerms:     row.pay_terms || '',
    deliveryDays: row.delivery_days || 30,
    items:        row.items || [],
    slideConfig:  row.slide_config || null,
    approvedBy:   row.approved_by || null,
    approvedAt:   row.approved_at || null,
  };
}

const FILTER_TABS = [
  { id:'todos',        label:'Todos',       match:()=>true },
  { id:'rascunho',     label:'Rascunho',    match:b=>b.status==='rascunho' },
  { id:'enviados',     label:'Enviados',    match:b=>b.status==='enviado' },
  { id:'visualizados', label:'Visualizados',match:b=>b.status==='visualizado' },
  { id:'aprovados',    label:'Aprovados',   match:b=>b.status==='aprovado' },
  { id:'recusados',    label:'Recusados',   match:b=>b.status==='recusado' },
];


const TEMPLATES_SEED = [
  { id:1, name:'Apresentação em Slides', type:'Apresentação em slides', isDefault:false },
  { id:2, name:'PDF Padrão',             type:'Apresentação em slides', isDefault:true  },
  { id:3, name:'Padrão Apresentação',    type:'Apresentação em slides', isDefault:true  },
  { id:4, name:'Padrão PDF',             type:'PDF direto',             isDefault:true  },
  { id:5, name:'Proposta Interativa',    type:'Apresentação em slides', isDefault:false },
];
const PALETTES = [
  { id:'sunset',   name:'Sunset Glow',   desc:'Vibrant and energetic',   c1:'#FF6A00', c2:'#FFB800' },
  { id:'ocean',    name:'Ocean Breeze',  desc:'Tech and professional',   c1:'#0EA5E9', c2:'#64748B' },
  { id:'purple',   name:'Purple Haze',   desc:'Modern and bold',         c1:'#7C3AED', c2:'#EC4899' },
  { id:'cyber',    name:'Cyber Night',   desc:'Impactful, futuristic',   c1:'#1D39C4', c2:'#7C3AED' },
  { id:'forest',   name:'Forest Dream', desc:'Natural and trustworthy', c1:'#16A34A', c2:'#0D9488' },
  { id:'rose',     name:'Rose Gold',     desc:'Elegant and premium',     c1:'#E11D48', c2:'#F97316' },
  { id:'electric', name:'Electric Blue', desc:'Innovative and dynamic',  c1:'#0EA5E9', c2:'#06B6D4' },
  { id:'fire',     name:'Fire & Ice',    desc:'Impactful and contrast',  c1:'#EF4444', c2:'#3B82F6' },
];
const DEFAULT_CONTRACT = `<h1>CONTRATO DE PRESTAÇÃO DE SERVIÇOS DE DESIGN</h1>
<p>Entre <strong>{{Nome do Prestador}}</strong> (CONTRATADA), CNPJ {{CNPJ do Prestador}}, e o CONTRATANTE identificado abaixo:</p>
<p><strong>Cliente:</strong> {{Nome do Cliente}}<br><strong>CPF/CNPJ:</strong> {{CPF/CNPJ do Cliente}}<br><strong>Endereço:</strong> {{Endereço do Cliente}}</p>
<h2>1. OBJETO</h2><p>Prestação de serviços de design referente ao projeto: <strong>{{Título do Projeto}}</strong>.</p>
<h2>2. VALOR E PAGAMENTO</h2><p>O valor total é de <strong>{{Valor Total}}</strong>. Condições: {{Condições de Pagamento}}.</p>
<h2>3. PRAZO</h2><p>Os serviços serão prestados conforme cronograma acordado entre as partes.</p>
<h2>4. PROPRIEDADE INTELECTUAL</h2><p>Após quitação integral, todos os direitos patrimoniais serão transferidos ao CONTRATANTE.</p>
<h2>5. FORO</h2><p>{{Cidade do Prestador}} — {{Estado do Prestador}}, {{Data do Contrato}}.</p>`;
const SHORTCODES = ['Nome do Prestador','CNPJ do Prestador','CPF/CNPJ do Prestador','Endereço do Prestador','Cidade do Prestador','Estado do Prestador','Nome do Cliente','CPF/CNPJ do Cliente','Endereço do Cliente','Título do Projeto','Valor Total','Condições de Pagamento','Data do Contrato','Número do Contrato'];

const INP = { width:'100%', padding:'9px 12px', borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', color:'var(--fg-primary)', fontFamily:'inherit', fontSize:13, outline:'none', boxSizing:'border-box' };
const BTN_GHOST = { padding:'7px 14px', borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', color:'var(--fg-secondary)', cursor:'pointer', fontSize:13, fontWeight:600, fontFamily:'inherit' };

// ─── Helpers ──────────────────────────────────────────────────────────────────
function Toggle({ value, onChange }) {
  return (
    <div onClick={()=>onChange(!value)} style={{ width:40, height:22, borderRadius:999, cursor:'pointer', transition:'background 200ms', background:value?'var(--primary)':'var(--bg-elevated)', border:`1px solid ${value?'var(--primary)':'var(--border-subtle)'}`, position:'relative', flexShrink:0 }}>
      <div style={{ position:'absolute', top:2, left:value?20:2, width:16, height:16, borderRadius:'50%', background:'#fff', transition:'left 200ms', boxShadow:'0 1px 3px rgba(0,0,0,0.3)' }}/>
    </div>
  );
}
function Accordion({ title, icon, children, defaultOpen=true }) {
  const [open, setOpen] = useState(defaultOpen);
  return (
    <div style={{ border:'1px solid var(--border-subtle)', borderRadius:12, overflow:'hidden' }}>
      <button onClick={()=>setOpen(v=>!v)} style={{ width:'100%', padding:'13px 18px', display:'flex', alignItems:'center', justifyContent:'space-between', background:'var(--bg-elevated)', border:'none', cursor:'pointer', fontFamily:'inherit' }}>
        <span style={{ display:'flex', alignItems:'center', gap:10, fontSize:14, fontWeight:700, color:'var(--fg-primary)' }}>{icon} {title}</span>
        <span style={{ color:'var(--fg-muted)', fontSize:11 }}>{open?'▲':'▼'}</span>
      </button>
      {open && <div style={{ padding:18, background:'var(--bg-surface)' }}>{children}</div>}
    </div>
  );
}

const FORMAT_LABEL = { pdf:'PDF', link:'Link', slides:'Slides' };
const FORMAT_TONE  = { pdf:'neutral', link:'brand', slides:'cyan' };

// ─── VisualizarModal ──────────────────────────────────────────────────────────
function VisualizarModal({ budget: b, onClose }) {
  const [nome, setNome] = useState('');
  const [cpf,  setCpf]  = useState('');
  const [email,setEmail]= useState('');
  const [hasSig, setHasSig] = useState(false);
  const canvasRef = useRef(null);
  const drawing = useRef(false);
  const total = b.items.reduce((a,i)=>a+i.q*i.p, 0);
  const fmt = n => 'R$ ' + n.toLocaleString('pt-BR', {minimumFractionDigits:2});
  const accentColor = '#FA541C';

  useEffect(() => {
    const canvas = canvasRef.current;
    if (!canvas) return;
    const rect = canvas.getBoundingClientRect();
    canvas.width  = rect.width  * (window.devicePixelRatio || 1);
    canvas.height = rect.height * (window.devicePixelRatio || 1);
    const ctx = canvas.getContext('2d');
    ctx.scale(window.devicePixelRatio || 1, window.devicePixelRatio || 1);
  }, []);

  function getPos(e) {
    const canvas = canvasRef.current;
    const rect = canvas.getBoundingClientRect();
    const src = e.touches ? e.touches[0] : e;
    const scaleX = canvas.width  / (rect.width  * (window.devicePixelRatio || 1));
    const scaleY = canvas.height / (rect.height * (window.devicePixelRatio || 1));
    return {
      x: (src.clientX - rect.left) / scaleX,
      y: (src.clientY - rect.top)  / scaleY,
    };
  }

  function startDraw(e) {
    e.preventDefault();
    const ctx = canvasRef.current.getContext('2d');
    const pos = getPos(e);
    ctx.beginPath();
    ctx.moveTo(pos.x, pos.y);
    drawing.current = true;
  }

  function draw(e) {
    if (!drawing.current) return;
    e.preventDefault();
    const ctx = canvasRef.current.getContext('2d');
    const pos = getPos(e);
    ctx.lineTo(pos.x, pos.y);
    ctx.strokeStyle = '#1a1a2e';
    ctx.lineWidth = 2;
    ctx.lineCap = 'round';
    ctx.lineJoin = 'round';
    ctx.stroke();
    if (!hasSig) setHasSig(true);
  }

  function endDraw() { drawing.current = false; }

  function clearCanvas() {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    setHasSig(false);
  }

  function aprovar() {
    if (!nome.trim() || !cpf.trim() || !hasSig) { window.__toast?.('Preencha nome, CPF e realize a assinatura para aprovar'); return; }
    window.__toast?.('Proposta aprovada com assinatura digital!', {tone:'success'});
    onClose();
  }

  const secCard = (children) => ({ padding:18, borderRadius:12, border:'1px solid rgba(255,255,255,0.07)', background:'var(--bg-elevated)', marginBottom:0 });

  return (
    <div onClick={onClose} style={{ position:'fixed', inset:0, background:'rgba(8,12,28,0.9)', backdropFilter:'blur(8px)', zIndex:200, overflow:'auto', padding:'32px 24px' }}>
      <div onClick={e=>e.stopPropagation()} style={{ maxWidth:800, margin:'0 auto', display:'flex', flexDirection:'column', gap:16 }}>
        {/* Close */}
        <div style={{ display:'flex', justifyContent:'flex-end' }}>
          <button onClick={onClose} style={{ background:'rgba(255,255,255,0.08)', border:'1px solid rgba(255,255,255,0.12)', color:'#fff', width:36, height:36, borderRadius:8, cursor:'pointer', fontSize:18 }}>×</button>
        </div>

        {/* Hero */}
        <div style={{ textAlign:'center', padding:'32px 24px 16px' }}>
          <div style={{ display:'inline-block', padding:'4px 14px', borderRadius:999, background:accentColor, color:'#fff', fontSize:11, fontWeight:700, letterSpacing:'0.06em', textTransform:'uppercase', marginBottom:16 }}>Proposta Comercial</div>
          <h1 style={{ margin:0, fontSize:28, fontWeight:800, color:'#fff', lineHeight:1.2 }}>{b.title}</h1>
          <div style={{ fontSize:13, color:'rgba(255,255,255,0.5)', marginTop:8, fontFamily:'var(--font-mono)' }}>{b.num}</div>
        </div>

        {/* Detalhes do projeto */}
        <div style={secCard()}>
          <div style={{ display:'flex', alignItems:'center', gap:8, marginBottom:10, fontSize:14, fontWeight:700, color:'#fff' }}><Icon d={ICONS.page} size={15}/> Detalhes do projeto</div>
          <p style={{ margin:0, fontSize:13, color:'rgba(255,255,255,0.7)', lineHeight:1.6 }}>{b.desc}</p>
        </div>

        {/* Serviços + Info + Condições */}
        <div style={{ display:'grid', gridTemplateColumns:'1fr 280px', gap:14 }}>
          <div style={secCard()}>
            <div style={{ display:'flex', alignItems:'center', gap:8, marginBottom:14, fontSize:14, fontWeight:700, color:'#fff' }}><Icon d={ICONS.check} size={15}/> Serviços Incluídos ({b.items.length})</div>
            {b.items.map((it,i) => (
              <div key={i} style={{ padding:'10px 12px', borderRadius:8, background:'rgba(255,255,255,0.05)', marginBottom:8, display:'flex', justifyContent:'space-between', alignItems:'flex-start' }}>
                <div>
                  <div style={{ fontSize:13, fontWeight:600, color:'#fff' }}>{it.d}</div>
                  <div style={{ fontSize:11, color:'rgba(255,255,255,0.45)', marginTop:2 }}>{it.q} x {fmt(it.p)}</div>
                </div>
                <div style={{ fontSize:13, fontWeight:700, color:'#fff' }}>{fmt(it.q*it.p)}</div>
              </div>
            ))}
            <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', paddingTop:12, marginTop:4, borderTop:'1px solid rgba(255,255,255,0.08)' }}>
              <span style={{ fontSize:14, fontWeight:700, color:'rgba(255,255,255,0.7)' }}>Total:</span>
              <span style={{ fontSize:20, fontWeight:800, color:accentColor, fontFamily:'var(--font-display)' }}>{fmt(total)}</span>
            </div>
          </div>
          <div style={{ display:'flex', flexDirection:'column', gap:14 }}>
            <div style={secCard()}>
              <div style={{ fontSize:14, fontWeight:700, color:'#fff', marginBottom:12, display:'flex', alignItems:'center', gap:8 }}><Icon d={ICONS.users} size={15}/> Informações do Cliente</div>
              <div style={{ fontSize:14, fontWeight:600, color:'#fff' }}>{b.client}</div>
              <div style={{ fontSize:12, color:'rgba(255,255,255,0.5)', marginTop:4 }}>{b.clientEmail}</div>
            </div>
            <div style={secCard()}>
              <div style={{ fontSize:14, fontWeight:700, color:'#fff', marginBottom:12, display:'flex', alignItems:'center', gap:8 }}><Icon d={ICONS.dollar} size={15}/> Condições</div>
              <div style={{ fontSize:11, color:'rgba(255,255,255,0.4)', marginBottom:2 }}>Forma:</div>
              <div style={{ fontSize:13, fontWeight:600, color:'#fff', marginBottom:8 }}>{b.payMethod}</div>
              <div style={{ fontSize:11, color:'rgba(255,255,255,0.4)', marginBottom:2 }}>Condições:</div>
              <div style={{ fontSize:13, fontWeight:600, color:'#fff', marginBottom:8 }}>{b.payTerms}</div>
              <div style={{ fontSize:11, color:'rgba(255,255,255,0.4)', marginBottom:2 }}>Prazo de Entrega:</div>
              <div style={{ fontSize:13, fontWeight:600, color:'#fff' }}>{b.deliveryDays} dias</div>
            </div>
          </div>
        </div>

        {/* Assinatura Digital */}
        <div style={secCard()}>
          <div style={{ fontSize:14, fontWeight:700, color:'#fff', marginBottom:16, display:'flex', alignItems:'center', gap:8 }}><Icon d={ICONS.pencil} size={15}/> Assinatura Digital</div>
          <div style={{ display:'flex', flexDirection:'column', gap:12 }}>
            <div>
              <div style={{ fontSize:12, color:'rgba(255,255,255,0.5)', marginBottom:6 }}>Nome Completo *</div>
              <input value={nome} onChange={e=>setNome(e.target.value)} placeholder="Digite seu nome completo" style={{ ...INP, background:'rgba(255,255,255,0.05)', border:'1px solid rgba(255,255,255,0.1)', color:'#fff' }}/>
            </div>
            <div>
              <div style={{ fontSize:12, color:'rgba(255,255,255,0.5)', marginBottom:6 }}>CPF *</div>
              <input value={cpf} onChange={e=>setCpf(e.target.value)} placeholder="000.000.000-00" style={{ ...INP, background:'rgba(255,255,255,0.05)', border:'1px solid rgba(255,255,255,0.1)', color:'#fff' }}/>
            </div>
            <div>
              <div style={{ fontSize:12, color:'rgba(255,255,255,0.5)', marginBottom:6 }}>Email (opcional)</div>
              <input value={email} onChange={e=>setEmail(e.target.value)} placeholder="seu@email.com" style={{ ...INP, background:'rgba(255,255,255,0.05)', border:'1px solid rgba(255,255,255,0.1)', color:'#fff' }}/>
            </div>
            <div>
              <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', marginBottom:6 }}>
                <div style={{ fontSize:12, color:'rgba(255,255,255,0.5)' }}>Assinatura * <span style={{ opacity:0.5 }}>(use o mouse, dedo ou caneta)</span></div>
                {hasSig && <button onClick={clearCanvas} style={{ background:'transparent', border:'none', color:'rgba(255,255,255,0.4)', cursor:'pointer', fontSize:12, fontFamily:'inherit', padding:0, display:'flex', alignItems:'center', gap:4 }}><Icon d={ICONS.trash} size={12}/> Limpar</button>}
              </div>
              <div style={{ borderRadius:10, overflow:'hidden', border: hasSig ? '2px solid ' + accentColor : '2px dashed rgba(255,255,255,0.15)', background:'#fff', position:'relative' }}>
                <canvas
                  ref={canvasRef}
                  style={{ display:'block', width:'100%', height:140, cursor:'crosshair', touchAction:'none' }}
                  onMouseDown={startDraw}
                  onMouseMove={draw}
                  onMouseUp={endDraw}
                  onMouseLeave={endDraw}
                  onTouchStart={startDraw}
                  onTouchMove={draw}
                  onTouchEnd={endDraw}
                />
                {!hasSig && (
                  <div style={{ position:'absolute', inset:0, display:'flex', alignItems:'center', justifyContent:'center', pointerEvents:'none', color:'rgba(0,0,0,0.2)', fontSize:14, fontStyle:'italic' }}>
                    Assine aqui
                  </div>
                )}
              </div>
            </div>
            <button onClick={aprovar} style={{ padding:'13px 0', borderRadius:10, background:`linear-gradient(135deg,${accentColor},#FA8C16)`, border:'none', color:'#fff', fontSize:14, fontWeight:700, cursor:'pointer', fontFamily:'inherit', marginTop:4, display:'flex', alignItems:'center', justifyContent:'center', gap:8 }}>
              ✓ Aprovar Proposta
            </button>
          </div>
        </div>

        {/* Footer */}
        <div style={{ textAlign:'center', padding:'8px 0 16px', fontSize:12, color:'rgba(255,255,255,0.3)' }}>
          Orçamento criado em {b.sent}/2026 · Válido até {b.valid}/2026
        </div>
      </div>
    </div>
  );
}

// ─── PDFPreviewModal ──────────────────────────────────────────────────────────
function PDFPreviewModal({ budget: b, onClose }) {
  const [showUnit,     setShowUnit]     = useState(true);
  const [showParc,     setShowParc]     = useState(true);
  const [parcText,     setParcText]     = useState(b.payTerms);
  const [introText,    setIntroText]    = useState('');
  const [techDetails,  setTechDetails]  = useState('');
  const [rodape,       setRodape]       = useState('');
  const total = b.items.reduce((a,i)=>a+i.q*i.p, 0);
  const fmt = n => 'R$ ' + n.toLocaleString('pt-BR', {minimumFractionDigits:2});
  const accentColor = '#FA541C';

  return (
    <div onClick={onClose} style={{ position:'fixed', inset:0, background:'rgba(8,12,28,0.72)', backdropFilter:'blur(6px)', zIndex:200, display:'flex', alignItems:'center', justifyContent:'center', padding:24 }}>
      <div onClick={e=>e.stopPropagation()} style={{ width:'min(980px,100%)', maxHeight:'90vh', display:'flex', flexDirection:'column', background:'var(--bg-surface)', border:'1px solid var(--border-strong)', borderRadius:18, boxShadow:'0 30px 80px rgba(0,0,0,0.55)', overflow:'hidden' }}>
        <div style={{ padding:'18px 24px', borderBottom:'1px solid var(--border-subtle)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <h2 style={{ margin:0, fontSize:17, fontWeight:700 }}>Pré-visualização PDF</h2>
          <div style={{ display:'flex', gap:10, alignItems:'center' }}>
            <Button onClick={()=>{ window.__toast?.('PDF gerado e baixado',{tone:'success'}); onClose(); }}>↓ Baixar PDF</Button>
            <button onClick={onClose} style={{ background:'transparent', border:'1px solid var(--border-subtle)', color:'var(--fg-secondary)', width:34, height:34, borderRadius:8, cursor:'pointer', fontSize:18 }}>×</button>
          </div>
        </div>

        <div style={{ flex:1, overflow:'auto', display:'grid', gridTemplateColumns:'300px 1fr' }}>
          {/* Options */}
          <div style={{ padding:20, borderRight:'1px solid var(--border-subtle)', display:'flex', flexDirection:'column', gap:14 }}>
            {[['Mostrar preço unitário',showUnit,setShowUnit],['Mostrar parcelamento',showParc,setShowParc]].map(([l,v,fn])=>(
              <div key={l} style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:12 }}>
                <span style={{ fontSize:13, fontWeight:600 }}>{l}</span>
                <Toggle value={v} onChange={fn}/>
              </div>
            ))}
            {showParc && (
              <div><div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Texto parcelamento</div>
                <textarea value={parcText} onChange={e=>setParcText(e.target.value)} rows={3} style={{...INP, resize:'vertical', minHeight:70}}/></div>
            )}
            <div><div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Texto introdutório</div>
              <textarea value={introText} onChange={e=>setIntroText(e.target.value)} rows={3} placeholder="Texto de apresentação…" style={{...INP, resize:'vertical', minHeight:70}}/></div>
            <div><div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Detalhes técnicos (um por linha, lista com ✓ no PDF)</div>
              <textarea value={techDetails} onChange={e=>setTechDetails(e.target.value)} rows={4} placeholder="Ex.: Melhoria de desempenho do site&#10;Suporte técnico incluso" style={{...INP, resize:'vertical', minHeight:90}}/></div>
            <div><div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Rodapé</div>
              <input value={rodape} onChange={e=>setRodape(e.target.value)} placeholder="Texto do rodapé…" style={INP}/></div>
          </div>

          {/* PDF preview */}
          <div style={{ padding:24, background:'var(--bg-elevated)', overflow:'auto', display:'flex', justifyContent:'center' }}>
            <div style={{ width:480, background:'#fff', borderRadius:8, boxShadow:'0 4px 24px rgba(0,0,0,0.25)', overflow:'hidden', color:'#1a1a2e', fontSize:13 }}>
              {/* PDF header */}
              <div style={{ background:accentColor, padding:'14px 20px', display:'flex', justifyContent:'space-between', alignItems:'center' }}>
                <span style={{ color:'#fff', fontWeight:700, fontSize:14 }}>Studio Criativo</span>
                <span style={{ width:20, height:20, background:'#FFB800', borderRadius:4, display:'inline-block' }}/>
              </div>
              <div style={{ padding:'20px 24px', borderBottom:'2px solid #f0f0f0' }}>
                <div style={{ fontSize:11, color:'#888', textTransform:'uppercase', letterSpacing:'0.06em', marginBottom:4 }}>Proposta de Orçamento</div>
                <div style={{ fontSize:17, fontWeight:700 }}>{b.title}</div>
                {introText && <p style={{ margin:'8px 0 0', fontSize:12, color:'#555', lineHeight:1.5 }}>{introText}</p>}
                <div style={{ fontSize:12, color:'#888', marginTop:6 }}>Cliente: {b.client}</div>
              </div>
              <div style={{ padding:'16px 24px' }}>
                <table style={{ width:'100%', borderCollapse:'collapse', fontSize:12 }}>
                  <thead>
                    <tr style={{ background:'#f7f7f7' }}>
                      <th style={{ padding:'8px 10px', textAlign:'left', fontWeight:700 }}>Itens</th>
                      <th style={{ padding:'8px 10px', textAlign:'left', fontWeight:700 }}>Serviços</th>
                      <th style={{ padding:'8px 10px', textAlign:'center', fontWeight:700 }}>Qtd</th>
                      <th style={{ padding:'8px 10px', textAlign:'right', fontWeight:700 }}>Preço</th>
                    </tr>
                  </thead>
                  <tbody>
                    {b.items.map((it,i) => (
                      <tr key={i} style={{ borderBottom:'1px solid #f0f0f0' }}>
                        <td style={{ padding:'8px 10px', color:'#888' }}>{String(i+1).padStart(2,'0')}</td>
                        <td style={{ padding:'8px 10px' }}>{it.d}</td>
                        <td style={{ padding:'8px 10px', textAlign:'center' }}>{it.q}</td>
                        <td style={{ padding:'8px 10px', textAlign:'right', fontWeight:600 }}>
                          {showUnit ? fmt(it.p) : '—'}
                        </td>
                      </tr>
                    ))}
                  </tbody>
                </table>
              </div>
              <div style={{ padding:'0 24px 16px', display:'grid', gridTemplateColumns:'1fr 1fr', gap:16 }}>
                <div>
                  <div style={{ fontSize:11, color:'#888', marginBottom:4 }}>Informações de pagamento:</div>
                  <div style={{ fontSize:12, color:'#555', lineHeight:1.5 }}>{showParc ? (parcText || b.payTerms) : b.payMethod}</div>
                  {techDetails && (
                    <div style={{ marginTop:10 }}>
                      {techDetails.split('\n').filter(Boolean).map((d,i) => <div key={i} style={{ fontSize:12, color:'#555' }}>✓ {d}</div>)}
                    </div>
                  )}
                </div>
                <div>
                  <div style={{ fontSize:11, color:'#888', marginBottom:4 }}>Total:</div>
                  <div style={{ fontSize:22, fontWeight:800, color:accentColor }}>{fmt(total)}</div>
                  <div style={{ fontSize:11, color:'#888', marginTop:8 }}>Prazo de entrega:</div>
                  <div style={{ fontSize:12, color:'#555', lineHeight:1.5 }}>Prazo estimado: {b.deliveryDays} dias úteis{'\n'}Válido até {b.valid}/2026</div>
                </div>
              </div>
              <div style={{ background:accentColor, padding:'10px 24px', display:'flex', justifyContent:'space-between', alignItems:'center' }}>
                <span style={{ fontSize:11, color:'rgba(255,255,255,0.8)' }}>{b.num} · Studio Criativo</span>
              </div>
              {rodape && <div style={{ padding:'8px 24px', fontSize:11, color:'#888', textAlign:'center' }}>{rodape}</div>}
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

// ─── SlidesEditorModal ────────────────────────────────────────────────────────
function SlidesEditorModal({ budget: b, onClose }) {
  const defaultSlides = ['Cover','Intro','Problem','Solution','Deliverables','Pricing','Timeline','Cta'];
  const saved = b.slideConfig || {};
  const [slides,    setSlides]    = useState(defaultSlides.map((s,i)=>({ id:i+1, name:s, visible:true })));
  const [activeSlide, setActiveSlide] = useState(0);
  const [cor1,      setCor1]      = useState(saved.cor1 || '#FF6A6A');
  const [cor2,      setCor2]      = useState(saved.cor2 || '#FA8C16');
  const [title,     setTitle]     = useState(saved.title || b.title);
  const [subtitle,  setSubtitle]  = useState(saved.subtitle || 'Sua empresa');
  const [showSign,  setShowSign]  = useState(false);
  const [saving,    setSaving]    = useState(false);

  function moveSlide(i, dir) {
    const ni = i + dir;
    if (ni < 0 || ni >= slides.length) return;
    const s = [...slides]; [s[i], s[ni]] = [s[ni], s[i]]; setSlides(s);
    setActiveSlide(ni);
  }
  function toggleVisible(i) { setSlides(s => s.map((sl,idx)=>idx===i?{...sl,visible:!sl.visible}:sl)); }

  const cur = slides[activeSlide];

  return (<>
    <div onClick={onClose} style={{ position:'fixed', inset:0, background:'rgba(8,12,28,0.72)', backdropFilter:'blur(6px)', zIndex:200, display:'flex', alignItems:'center', justifyContent:'center', padding:24 }}>
      <div onClick={e=>e.stopPropagation()} style={{ width:'min(960px,100%)', maxHeight:'88vh', display:'flex', flexDirection:'column', background:'var(--bg-surface)', border:'1px solid var(--border-strong)', borderRadius:18, boxShadow:'0 30px 80px rgba(0,0,0,0.55)', overflow:'hidden' }}>
        <div style={{ padding:'16px 22px', borderBottom:'1px solid var(--border-subtle)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <h2 style={{ margin:0, fontSize:17, fontWeight:700 }}>Editor de apresentação</h2>
          <button onClick={onClose} style={{ background:'transparent', border:'1px solid var(--border-subtle)', color:'var(--fg-secondary)', width:34, height:34, borderRadius:8, cursor:'pointer', fontSize:18 }}>×</button>
        </div>

        <div style={{ flex:1, overflow:'auto', display:'grid', gridTemplateColumns:'200px 1fr 240px' }}>
          {/* Slide list */}
          <div style={{ borderRight:'1px solid var(--border-subtle)', padding:14, overflow:'auto' }}>
            <div style={{ fontSize:11, fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)', marginBottom:10 }}>Slides</div>
            {slides.map((sl,i) => (
              <div key={sl.id} onClick={()=>setActiveSlide(i)} style={{ display:'flex', alignItems:'center', gap:6, padding:'8px 10px', borderRadius:8, marginBottom:4, cursor:'pointer', background:i===activeSlide?'var(--primary-soft)':'transparent' }}>
                <span style={{ fontSize:11, color:'var(--fg-muted)', minWidth:14 }}>{i+1}</span>
                <span style={{ flex:1, fontSize:13, fontWeight:600, color:i===activeSlide?'var(--geek-blue-200)':'var(--fg-secondary)' }}>{sl.name}</span>
                <button onClick={e=>{e.stopPropagation();toggleVisible(i);}} title={sl.visible?'Ocultar':'Mostrar'} style={{ background:'transparent', border:'none', cursor:'pointer', color:'var(--fg-muted)', fontSize:13, padding:2 }}>{sl.visible?'👁':'—'}</button>
                <button onClick={e=>{e.stopPropagation();moveSlide(i,-1);}} disabled={i===0} style={{ background:'transparent', border:'none', cursor:'pointer', color:'var(--fg-muted)', fontSize:11, padding:2 }}>▲</button>
                <button onClick={e=>{e.stopPropagation();moveSlide(i,1);}} disabled={i===slides.length-1} style={{ background:'transparent', border:'none', cursor:'pointer', color:'var(--fg-muted)', fontSize:11, padding:2 }}>▼</button>
              </div>
            ))}
          </div>

          {/* Slide preview */}
          <div style={{ padding:28, display:'flex', alignItems:'center', justifyContent:'center', background:'var(--bg-elevated)' }}>
            <div style={{ width:380, aspectRatio:'16/10', borderRadius:14, overflow:'hidden', background:`linear-gradient(135deg,#1a0a0a,#2d1515)`, display:'flex', flexDirection:'column', alignItems:'center', justifyContent:'center', padding:28, position:'relative', boxShadow:'0 12px 40px rgba(0,0,0,0.5)' }}>
              <div style={{ position:'absolute', inset:0, background:`radial-gradient(circle at 20% 30%, ${cor1}33, transparent 60%)` }}/>
              <div style={{ position:'absolute', bottom:0, right:0, width:120, height:120, background:cor2, opacity:0.15, borderRadius:'50%', transform:'translate(30%,30%)' }}/>
              <div style={{ position:'relative', display:'inline-block', padding:'3px 12px', borderRadius:999, border:`1px solid ${cor1}`, color:cor1, fontSize:9, fontWeight:700, letterSpacing:'0.08em', textTransform:'uppercase', marginBottom:14 }}>PROPOSTA COMERCIAL</div>
              {cur?.name === 'Cover' ? (<>
                <div style={{ position:'relative', fontSize:20, fontWeight:800, color:'#fff', textAlign:'center', lineHeight:1.2, background:`linear-gradient(135deg,${cor1},${cor2})`, WebkitBackgroundClip:'text', WebkitTextFillColor:'transparent' }}>{title}</div>
                <div style={{ position:'relative', fontSize:12, color:'rgba(255,255,255,0.5)', marginTop:10 }}>{subtitle}</div>
              </>) : cur?.name === 'Cta' ? (<>
                <div style={{ position:'relative', fontSize:13, fontWeight:700, color:'rgba(255,255,255,0.5)', letterSpacing:'0.05em', textTransform:'uppercase', marginBottom:6 }}>Pronto para começar?</div>
                <div style={{ position:'relative', fontSize:22, fontWeight:800, textAlign:'center', lineHeight:1.15, background:`linear-gradient(135deg,${cor1},${cor2})`, WebkitBackgroundClip:'text', WebkitTextFillColor:'transparent', marginBottom:8 }}>{b.value}</div>
                <div style={{ position:'relative', fontSize:10, color:'rgba(255,255,255,0.4)', marginBottom:16, textAlign:'center' }}>{b.client}</div>
                <button
                  onClick={e=>{ e.stopPropagation(); setShowSign(true); }}
                  style={{ position:'relative', padding:'9px 22px', borderRadius:999, background:`linear-gradient(135deg,${cor1},${cor2})`, border:'none', color:'#fff', fontSize:11, fontWeight:700, cursor:'pointer', fontFamily:'inherit', boxShadow:`0 4px 18px ${cor1}55` }}
                >
                  <Icon d={ICONS.pencil} size={11}/> Assinar Proposta
                </button>
                <div style={{ position:'relative', fontSize:8, color:'rgba(255,255,255,0.25)', marginTop:10, textAlign:'center' }}>Abre o formulário de assinatura digital</div>
              </>) : (
                <div style={{ position:'relative', fontSize:18, fontWeight:700, color:'rgba(255,255,255,0.6)', textAlign:'center' }}>{cur?.name}</div>
              )}
            </div>
          </div>

          {/* Controls */}
          <div style={{ padding:20, borderLeft:'1px solid var(--border-subtle)', display:'flex', flexDirection:'column', gap:14 }}>
            <div>
              <div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Cor primária</div>
              <input type="color" value={cor1} onChange={e=>setCor1(e.target.value)} style={{ width:'100%', height:36, borderRadius:8, border:'1px solid var(--border-subtle)', cursor:'pointer', padding:2, background:'var(--bg-elevated)' }}/>
            </div>
            <div>
              <div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Cor secundária</div>
              <input type="color" value={cor2} onChange={e=>setCor2(e.target.value)} style={{ width:'100%', height:36, borderRadius:8, border:'1px solid var(--border-subtle)', cursor:'pointer', padding:2, background:'var(--bg-elevated)' }}/>
            </div>
            <div><div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Título</div>
              <input value={title} onChange={e=>setTitle(e.target.value)} style={INP}/></div>
            <div><div style={{ fontSize:12, color:'var(--fg-muted)', marginBottom:6 }}>Subtítulo</div>
              <input value={subtitle} onChange={e=>setSubtitle(e.target.value)} style={INP}/></div>
            {cur?.name === 'Cta' && (
              <div style={{ padding:'12px 14px', borderRadius:10, background:'rgba(255,106,106,0.08)', border:'1px solid rgba(255,106,106,0.2)', fontSize:12, color:'var(--fg-secondary)', lineHeight:1.5 }}>
                <div style={{ fontWeight:700, color:'#FF6A6A', marginBottom:4 }}>Slide de assinatura</div>
                O botão "Assinar Proposta" abre o formulário de assinatura digital com campo de desenho. O cliente pode assinar pelo celular, mouse ou caneta.
              </div>
            )}
            <button onClick={async ()=>{
              setSaving(true);
              try {
                const config = { cor1, cor2, title, subtitle };
                const dbNum = b.num.startsWith('#') ? b.num : '#' + b.num;
                await sb.from('budgets').update({ slide_config: config }).eq('budget_num', dbNum);
                // update in-memory budget so public view reflects immediately
                b.slideConfig = config;
                window.__toast?.('Apresentação salva!', {tone:'success'});
                onClose();
              } catch(err) {
                window.__toast?.('Erro ao salvar: ' + err.message, {tone:'danger'});
              } finally { setSaving(false); }
            }} disabled={saving} style={{ marginTop:4, padding:'11px 0', borderRadius:10, background:`linear-gradient(135deg,${cor1},${cor2})`, border:'none', color:'#fff', fontSize:13, fontWeight:700, cursor:saving?'not-allowed':'pointer', fontFamily:'inherit', display:'flex', alignItems:'center', justifyContent:'center', gap:8, opacity:saving?0.7:1 }}><Icon d={ICONS.download} size={14}/> {saving ? 'Salvando…' : 'Salvar slides'}</button>
          </div>
        </div>
      </div>
    </div>
    {showSign && <VisualizarModal budget={b} onClose={()=>setShowSign(false)}/>}
  </>);
}

// ─── Budget Actions Menu ──────────────────────────────────────────────────────
const BUDGET_ACTIONS = [
  { id:'editar',     label:'Editar',               icon:'pencil' },
  { id:'aprovar',    label:'Aprovar Manualmente',   icon:'check' },
  { id:'detalhes',   label:'Ver Detalhes',          icon:'info' },
  { id:'visualizar', label:'Visualizar',            icon:'eye' },
  null,
  { id:'copiarLink', label:'Copiar Link',           icon:'link' },
  { id:'compartilhar',label:'Compartilhar',         icon:'share' },
  { id:'email',      label:'Enviar por Email',      icon:'mail' },
  { id:'pdfEmail',   label:'Enviar PDF por Email',  icon:'document' },
  { id:'duplicar',   label:'Duplicar',              icon:'copy' },
  null,
  { id:'arquivar',   label:'Arquivar',              icon:'folder' },
  { id:'excluir',    label:'Excluir',               icon:'trash', danger:true },
];

// ─── Configurar Contrato Modal ────────────────────────────────────────────────
function ConfigurarContratoModal({ onClose }) {
  const [tmpl, setTmpl] = useState(DEFAULT_CONTRACT);
  const taRef = useRef(null);
  function insert(sc) {
    const code = `{{${sc}}}`;
    const ta = taRef.current;
    if (!ta) { navigator.clipboard?.writeText(code); window.__toast?.('Shortcode copiado',{tone:'success'}); return; }
    const s = ta.selectionStart, e = ta.selectionEnd;
    setTmpl(tmpl.slice(0,s) + code + tmpl.slice(e));
    setTimeout(()=>{ ta.selectionStart = ta.selectionEnd = s + code.length; ta.focus(); }, 0);
  }
  return (
    <div onClick={onClose} style={{ position:'fixed', inset:0, background:'rgba(8,12,28,0.72)', backdropFilter:'blur(6px)', zIndex:200, display:'flex', alignItems:'center', justifyContent:'center', padding:24 }}>
      <div onClick={e=>e.stopPropagation()} style={{ width:'min(1100px,100%)', maxHeight:'90vh', display:'flex', flexDirection:'column', background:'var(--bg-surface)', border:'1px solid var(--border-strong)', borderRadius:18, boxShadow:'0 30px 80px rgba(0,0,0,0.55)', overflow:'hidden' }}>
        <div style={{ padding:'20px 28px', borderBottom:'1px solid var(--border-subtle)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <h2 style={{ margin:0, fontSize:18, fontWeight:700 }}>Configurar Modelo de Contrato</h2>
          <button onClick={onClose} style={{ background:'transparent', border:'1px solid var(--border-subtle)', color:'var(--fg-secondary)', width:34, height:34, borderRadius:8, cursor:'pointer', fontSize:18 }}>×</button>
        </div>
        <div style={{ flex:1, overflow:'auto', display:'grid', gridTemplateColumns:'1fr 300px' }}>
          <div style={{ padding:24, borderRight:'1px solid var(--border-subtle)', display:'flex', flexDirection:'column', gap:12 }}>
            <div style={{ fontSize:12, fontFamily:'var(--font-display)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)' }}>Conteúdo do Template</div>
            <textarea ref={taRef} value={tmpl} onChange={e=>setTmpl(e.target.value)} rows={18} style={{...INP, resize:'vertical', minHeight:320, fontFamily:'var(--font-mono)', fontSize:12, lineHeight:1.6}}/>
            <div style={{ fontSize:12, color:'var(--fg-muted)' }}>Dica: Clique nos shortcodes ao lado para inserir no cursor</div>
          </div>
          <div style={{ padding:24, overflow:'auto' }}>
            <div style={{ fontSize:12, fontFamily:'var(--font-display)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)', marginBottom:14 }}>Shortcodes Disponíveis</div>
            <div style={{ display:'flex', flexDirection:'column', gap:8 }}>
              {SHORTCODES.map(sc => (
                <div key={sc} onClick={()=>insert(sc)} style={{ padding:'10px 14px', borderRadius:8, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)', cursor:'pointer', transition:'border-color 140ms' }}
                  onMouseEnter={e=>e.currentTarget.style.borderColor='var(--primary)'} onMouseLeave={e=>e.currentTarget.style.borderColor='var(--border-subtle)'}>
                  <div style={{ fontSize:13, fontWeight:600 }}>{sc}</div>
                  <div style={{ fontSize:11, color:'var(--fg-muted)', fontFamily:'var(--font-mono)' }}>{`{{${sc}}}`}</div>
                </div>
              ))}
            </div>
          </div>
        </div>
        <div style={{ padding:'14px 28px', borderTop:'1px solid var(--border-subtle)', display:'flex', justifyContent:'space-between', background:'var(--bg-elevated)' }}>
          <button onClick={()=>{ setTmpl(DEFAULT_CONTRACT); window.__toast?.('Template restaurado'); }} style={{ display:'flex', alignItems:'center', gap:8, ...BTN_GHOST }}>↺ Restaurar Padrão</button>
          <div style={{ display:'flex', gap:10 }}>
            <Button variant="ghost" onClick={onClose}>Cancelar</Button>
            <Button onClick={()=>{ window.__toast?.('Template de contrato salvo',{tone:'success'}); onClose(); }}>Salvar Template</Button>
          </div>
        </div>
      </div>
    </div>
  );
}

// ─── Contratos Tab ────────────────────────────────────────────────────────────
function ContratosTab() {
  const [search,       setSearch]       = useState('');
  const [statusFilter, setStatusFilter] = useState('todos');
  const [showArchived, setShowArchived] = useState(false);
  const [configOpen,   setConfigOpen]   = useState(false);
  const [contratos]                     = useState([]);
  const filtered = contratos.filter(c => {
    if (search && !c.client.toLowerCase().includes(search.toLowerCase()) && !c.num.toLowerCase().includes(search.toLowerCase())) return false;
    if (statusFilter !== 'todos' && c.status !== statusFilter) return false;
    return true;
  });
  return (
    <div style={{ display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'flex', justifyContent:'space-between', alignItems:'flex-start' }}>
        <div><h2 style={{ margin:0, fontSize:22, fontWeight:700 }}>Contratos</h2><div style={{ fontSize:13, color:'var(--fg-muted)', marginTop:4 }}>Gerencie contratos gerados a partir de orçamentos aprovados</div></div>
        <Button variant="secondary" onClick={()=>setConfigOpen(true)}>⚙ Configurar Contrato</Button>
      </div>
      <div style={{ display:'flex', gap:10, alignItems:'center' }}>
        <div style={{ flex:1, position:'relative', display:'flex', alignItems:'center' }}>
          <svg width="14" height="14" viewBox="0 0 16 16" fill="none" style={{ position:'absolute', left:12, pointerEvents:'none', color:'var(--fg-muted)' }}><circle cx="6.5" cy="6.5" r="5" stroke="currentColor" strokeWidth="1.5"/><path d="M10.5 10.5L14 14" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"/></svg>
          <input value={search} onChange={e=>setSearch(e.target.value)} placeholder="Buscar por cliente ou número..." style={{...INP, paddingLeft:36}}/>
        </div>
        <select value={statusFilter} onChange={e=>setStatusFilter(e.target.value)} style={{...INP, width:'auto', cursor:'pointer'}}>
          {[['todos','Todos os status'],['rascunho','Rascunho'],['enviado','Enviado'],['assinado','Assinado'],['cancelado','Cancelado']].map(([v,l])=><option key={v} value={v}>{l}</option>)}
        </select>
        <button onClick={()=>setShowArchived(v=>!v)} style={{ ...BTN_GHOST, background:showArchived?'var(--primary-soft)':'var(--bg-elevated)', color:showArchived?'var(--geek-blue-200)':'var(--fg-secondary)', border:`1px solid ${showArchived?'var(--geek-blue-a40)':'var(--border-subtle)'}` }}>
          {showArchived?'Ocultar Arquivados':'Mostrar Arquivados'}
        </button>
      </div>
      <Card padding={0}>
        <div style={{ display:'grid', gridTemplateColumns:'160px 1fr 150px 160px 180px 60px', padding:'12px 22px', borderBottom:'1px solid var(--border-subtle)', fontSize:11, fontFamily:'var(--font-display)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)' }}>
          <span>Número</span><span>Cliente</span><span>Status</span><span>Data de Criação</span><span>Última Atualização</span><span>Ações</span>
        </div>
        {filtered.length===0 ? (
          <div style={{ padding:'40px 22px', textAlign:'center', color:'var(--fg-muted)', fontSize:13 }}>Nenhum contrato encontrado.</div>
        ) : filtered.map((c,i)=>(
          <div key={c.num} style={{ display:'grid', gridTemplateColumns:'160px 1fr 150px 160px 180px 60px', padding:'14px 22px', borderBottom:'1px solid var(--border-subtle)', fontSize:13, alignItems:'center', transition:'background 140ms' }}
            onMouseEnter={e=>e.currentTarget.style.background='var(--bg-elevated)'} onMouseLeave={e=>e.currentTarget.style.background='transparent'}>
            <span style={{ fontFamily:'var(--font-mono)', fontWeight:600 }}>{c.num}</span>
            <span style={{ display:'flex', alignItems:'center', gap:10 }}><Avatar name={c.client} size={28} idx={i}/><strong>{c.client}</strong></span>
            <Badge tone={c.tone}>{c.status.charAt(0).toUpperCase()+c.status.slice(1)}</Badge>
            <span style={{ color:'var(--fg-muted)', fontFamily:'var(--font-mono)' }}>{c.criado}</span>
            <span style={{ color:'var(--fg-muted)', fontFamily:'var(--font-mono)' }}>{c.atualizado}</span>
            <button onClick={()=>window.__toast?.(`Opções do contrato ${c.num}`)} style={{ width:32, height:32, borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', cursor:'pointer', color:'var(--fg-secondary)', fontSize:18, display:'flex', alignItems:'center', justifyContent:'center' }}>⋮</button>
          </div>
        ))}
      </Card>
      {configOpen && <ConfigurarContratoModal onClose={()=>setConfigOpen(false)}/>}
    </div>
  );
}

// ─── Personalização Tab ───────────────────────────────────────────────────────
// ─── NovoPortfolioModal ───────────────────────────────────────────────────────
function NovoPortfolioModal({ onClose, onCreate }) {
  const [title, setTitle] = useState('');
  const [cat,   setCat]   = useState('');
  const [link,  setLink]  = useState('');
  const [img,   setImg]   = useState(null);
  const fileRef = useRef(null);

  function handleFile(e) {
    const f = e.target.files?.[0];
    if (f) setImg(f.name);
  }

  function handleCreate() {
    if (!title.trim()) { window.__toast?.('Informe o título do projeto'); return; }
    const colors = ['#1D39C4','#36CFC9','#7C3AED','#FA541C','#22C55E','#FA8C16'];
    onCreate({ name:title, cat:cat||'Design', link, color: colors[Math.floor(Math.random()*colors.length)], img });
    onClose();
    window.__toast?.('Projeto adicionado ao portfólio', {tone:'success'});
  }

  return (
    <div onClick={onClose} style={{ position:'fixed', inset:0, background:'rgba(0,0,0,0.55)', backdropFilter:'blur(4px)', zIndex:300, display:'flex', alignItems:'center', justifyContent:'center', padding:24 }}>
      <div onClick={e=>e.stopPropagation()} style={{ width:'min(560px,100%)', background:'var(--bg-surface)', border:'1px solid var(--border-strong)', borderRadius:16, boxShadow:'0 24px 64px rgba(0,0,0,0.45)', overflow:'hidden' }}>
        {/* Header */}
        <div style={{ padding:'20px 24px 18px', borderBottom:'1px solid var(--border-subtle)', display:'flex', alignItems:'center', justifyContent:'space-between' }}>
          <h2 style={{ margin:0, fontSize:18, fontWeight:700 }}>Novo Item de Portfólio</h2>
          <button onClick={onClose} style={{ background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)', color:'var(--fg-secondary)', width:32, height:32, borderRadius:8, cursor:'pointer', display:'flex', alignItems:'center', justifyContent:'center' }}><Icon d={ICONS.x} size={16}/></button>
        </div>

        {/* Body */}
        <div style={{ padding:24, display:'flex', flexDirection:'column', gap:18 }}>
          {/* Image upload */}
          <div>
            <div style={{ fontSize:13, fontWeight:600, marginBottom:8 }}>Imagem <span style={{ color:'var(--accent-danger)' }}>*</span></div>
            <div
              onClick={()=>fileRef.current?.click()}
              style={{ border:`2px dashed ${img?'var(--primary)':'var(--border-subtle)'}`, borderRadius:12, padding:'32px 24px', textAlign:'center', cursor:'pointer', background: img?'var(--primary-soft)':'var(--bg-elevated)', transition:'all 160ms', display:'flex', flexDirection:'column', alignItems:'center', gap:12 }}
              onMouseEnter={e=>{ if(!img) e.currentTarget.style.borderColor='var(--border-strong)'; }} onMouseLeave={e=>{ if(!img) e.currentTarget.style.borderColor='var(--border-subtle)'; }}
            >
              <div style={{ color: img?'var(--primary)':'var(--fg-muted)' }}><Icon d={ICONS.image} size={36}/></div>
              {img ? (
                <div style={{ fontSize:13, fontWeight:600, color:'var(--primary)' }}>{img}</div>
              ) : (
                <button type="button" onClick={e=>{ e.stopPropagation(); fileRef.current?.click(); }} style={{ padding:'9px 20px', borderRadius:8, background:'var(--bg-surface)', border:'1px solid var(--border-strong)', color:'var(--fg-primary)', cursor:'pointer', fontSize:13, fontWeight:600, fontFamily:'inherit', display:'flex', alignItems:'center', gap:8 }}>
                  <Icon d={ICONS.upload} size={14}/> Enviar Imagem
                </button>
              )}
            </div>
            <input ref={fileRef} type="file" accept="image/*" onChange={handleFile} style={{ display:'none' }}/>
          </div>

          {/* Title */}
          <div>
            <div style={{ fontSize:13, fontWeight:600, marginBottom:8 }}>Título <span style={{ color:'var(--accent-danger)' }}>*</span></div>
            <input value={title} onChange={e=>setTitle(e.target.value)} placeholder="Ex: Site Institucional XYZ" style={INP}/>
          </div>

          {/* Categoria */}
          <div>
            <div style={{ fontSize:13, fontWeight:600, marginBottom:8 }}>Categoria <span style={{ color:'var(--fg-muted)', fontWeight:400 }}>(opcional)</span></div>
            <input value={cat} onChange={e=>setCat(e.target.value)} placeholder="Ex: Websites, Branding, etc." style={INP}/>
          </div>

          {/* Link */}
          <div>
            <div style={{ fontSize:13, fontWeight:600, marginBottom:8 }}>Link do Projeto <span style={{ color:'var(--fg-muted)', fontWeight:400 }}>(opcional)</span></div>
            <input value={link} onChange={e=>setLink(e.target.value)} placeholder="https://exemplo.com/projeto" style={INP}/>
          </div>
        </div>

        {/* Footer */}
        <div style={{ padding:'16px 24px', borderTop:'1px solid var(--border-subtle)', display:'grid', gridTemplateColumns:'1fr 1fr', gap:10 }}>
          <button onClick={onClose} style={{ padding:'12px 0', borderRadius:10, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)', color:'var(--fg-primary)', cursor:'pointer', fontSize:14, fontWeight:600, fontFamily:'inherit' }}>Cancelar</button>
          <button onClick={handleCreate} style={{ padding:'12px 0', borderRadius:10, background:'linear-gradient(135deg,#FF6A6A,#FA8C16)', border:'none', color:'#fff', cursor:'pointer', fontSize:14, fontWeight:700, fontFamily:'inherit' }}>Criar Item</button>
        </div>
      </div>
    </div>
  );
}

function PersonalizacaoTab() {
  const [cor1,setCor1]=useState('#FF6A00'); const [cor2,setCor2]=useState('#FFB800'); const [corDest,setCorDest]=useState('#FFFFFF');
  const [badge,setBadge]=useState('Proposta Comercial'); const [prefix,setPrefix]=useState(''); const [footer,setFooter]=useState('');
  const [btnLabel,setBtnLabel]=useState('Aprovar Proposta'); const [font,setFont]=useState('Inter');
  const [titleW,setTitleW]=useState('700'); const [bodyW,setBodyW]=useState('400');
  const [layout,setLayout]=useState('dividido');
  const [blocks,setBlocks]=useState({ infoCliente:false,servicos:true,pagamento:false,avaliacoes:false,portfolio:false,assinatura:false });
  const [portfolio,setPortfolio]=useState([{name:'Evento Marina...',cat:'Branding',color:'#1D39C4'},{name:'TechStart',cat:'Web Design',color:'#36CFC9'},{name:'Bloom Cosmét...',cat:'Identidade',color:'#7C3AED'}]);
  const [portfolioModal,setPortfolioModal]=useState(false);
  const lbl = { fontSize:12, fontFamily:'var(--font-display)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)', display:'block', marginBottom:8 };
  const PREV = [{ n:'Criação de Logotipo',d:'Design personalizado e exclusivo',p:'R$ 1.500,00' },{ n:'Manual de Marca',d:'Guia completo de aplicação',p:'R$ 800,00' },{ n:'Papelaria',d:'Cartão de visita, papel timbrado',p:'R$ 500,00' }];
  return (
    <div style={{ display:'grid', gridTemplateColumns:'1fr 380px', gap:24, alignItems:'start' }}>
      <div style={{ display:'flex', flexDirection:'column', gap:14 }}>
        <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center' }}>
          <div><h2 style={{ margin:0, fontSize:20, fontWeight:700 }}>Personalização de Propostas</h2><div style={{ fontSize:13, color:'var(--fg-muted)', marginTop:4 }}>Configure a identidade visual e conteúdo das suas propostas públicas</div></div>
          <div style={{ display:'flex', gap:8 }}>
            <button onClick={()=>{ setCor1('#FF6A00'); setCor2('#FFB800'); setBadge('Proposta Comercial'); setBtnLabel('Aprovar Proposta'); window.__toast?.('Padrão restaurado'); }} style={BTN_GHOST}>↺ Restaurar Padrão</button>
            <Button onClick={()=>window.__toast?.('Configurações salvas',{tone:'success'})}>Salvar Configurações</Button>
          </div>
        </div>
        <Accordion title="Logo e Cores" icon={<Icon d={ICONS.palette} size={15}/>}>
          <div style={{ display:'flex', flexDirection:'column', gap:16 }}>
            <div>
              <span style={lbl}>Logo (opcional)</span>
              <div style={{ border:'1px dashed var(--border-subtle)', borderRadius:10, padding:24, textAlign:'center', background:'var(--bg-elevated)', display:'flex', flexDirection:'column', alignItems:'center', gap:10 }}>
                <div style={{ width:48, height:48, borderRadius:10, background:'var(--bg-surface)', display:'flex', alignItems:'center', justifyContent:'center', color:'var(--fg-muted)' }}><Icon d={ICONS.image} size={24}/></div>
                <div style={{ fontSize:13, color:'var(--fg-muted)' }}>Nenhum logo enviado</div>
                <button onClick={()=>window.__toast?.('Upload de logo simulado',{tone:'success'})} style={{ ...BTN_GHOST, display:'flex', alignItems:'center', gap:6 }}>↑ Enviar Logo</button>
              </div>
            </div>
            <div>
              <span style={lbl}>Paletas Sugeridas</span>
              <div style={{ display:'grid', gridTemplateColumns:'repeat(4, 1fr)', gap:10 }}>
                {PALETTES.map(p=>(
                  <div key={p.id} onClick={()=>{ setCor1(p.c1); setCor2(p.c2); }} style={{ cursor:'pointer', borderRadius:10, overflow:'hidden', border:`2px solid ${cor1===p.c1?'var(--primary)':'transparent'}`, transition:'border-color 140ms' }}>
                    <div style={{ height:36, background:`linear-gradient(135deg,${p.c1},${p.c2})` }}/>
                    <div style={{ padding:'6px 8px', background:'var(--bg-elevated)' }}><div style={{ fontSize:11, fontWeight:700 }}>{p.name}</div><div style={{ fontSize:10, color:'var(--fg-muted)' }}>{p.desc}</div></div>
                  </div>
                ))}
              </div>
            </div>
            <div>
              <span style={lbl}>Personalizar Cores</span>
              <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:12 }}>
                {[['Cor Primária',cor1,setCor1],['Cor Secundária',cor2,setCor2],['Cor de Destaque',corDest,setCorDest]].map(([l,v,fn])=>(
                  <div key={l}><div style={{ fontSize:11, color:'var(--fg-muted)', marginBottom:6 }}>{l}</div>
                    <div style={{ display:'flex', alignItems:'center', gap:8 }}>
                      <input type="color" value={v} onChange={e=>fn(e.target.value)} style={{ width:36, height:34, borderRadius:6, border:'1px solid var(--border-subtle)', cursor:'pointer', padding:2, background:'var(--bg-elevated)' }}/>
                      <input value={v.toUpperCase()} onChange={e=>fn(e.target.value)} style={{...INP, fontFamily:'var(--font-mono)', fontSize:12}}/>
                    </div>
                  </div>
                ))}
              </div>
              <div style={{ marginTop:10, height:8, borderRadius:4, background:`linear-gradient(90deg,${cor1},${cor2})` }}/>
            </div>
          </div>
        </Accordion>
        <Accordion title="Textos Personalizados" icon={<Icon d={ICONS.page} size={15}/>}>
          <div style={{ display:'flex', flexDirection:'column', gap:12 }}>
            <div><span style={lbl}>Texto do Badge</span><input value={badge} onChange={e=>setBadge(e.target.value)} style={INP}/></div>
            <div><span style={lbl}>Prefixo do Título (opcional)</span><input value={prefix} onChange={e=>setPrefix(e.target.value)} placeholder="Ex: Proposta de" style={INP}/></div>
            <div><span style={lbl}>Texto do Rodapé (opcional)</span><textarea value={footer} onChange={e=>setFooter(e.target.value)} rows={2} style={{...INP, resize:'vertical', minHeight:60}}/></div>
            <div><span style={lbl}>Texto do Botão Principal</span><input value={btnLabel} onChange={e=>setBtnLabel(e.target.value)} style={INP}/></div>
            <div><span style={lbl}>Família da Fonte</span>
              <select value={font} onChange={e=>setFont(e.target.value)} style={INP}>
                {['Inter','Roboto','Poppins','Montserrat','Playfair Display','DM Sans'].map(f=><option key={f}>{f}</option>)}
              </select>
            </div>
            <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:10 }}>
              <div><span style={lbl}>Peso dos Títulos</span><select value={titleW} onChange={e=>setTitleW(e.target.value)} style={INP}>{[['400','Regular (400)'],['500','Medium (500)'],['600','Semi-bold (600)'],['700','Bold (700)'],['800','Extra-bold (800)']].map(([v,l])=><option key={v} value={v}>{l}</option>)}</select></div>
              <div><span style={lbl}>Peso do Corpo</span><select value={bodyW} onChange={e=>setBodyW(e.target.value)} style={INP}>{[['300','Light (300)'],['400','Regular (400)'],['500','Medium (500)']].map(([v,l])=><option key={v} value={v}>{l}</option>)}</select></div>
            </div>
          </div>
        </Accordion>
        <Accordion title="Blocos Opcionais" icon={<Icon d={ICONS.grid} size={15}/>}>
          <div style={{ display:'flex', flexDirection:'column', gap:14 }}>
            <div><span style={lbl}>Modo de Layout</span><select value={layout} onChange={e=>setLayout(e.target.value)} style={INP}><option value="dividido">Dividido (2 colunas)</option><option value="compacto">Compacto (1 coluna)</option></select></div>
            <span style={lbl}>Blocos Opcionais</span>
            {[['infoCliente','Mostrar Informações do Cliente','Exibir card com dados do cliente'],['servicos','Mostrar Serviços','Exibir lista de serviços incluídos'],['pagamento','Mostrar Condições de Pagamento','Exibir condições e formas de pagamento'],['avaliacoes','Mostrar Avaliações de Clientes','Exibir depoimentos e avaliações'],['portfolio','Mostrar Portfolio','Exibir projetos do portfolio'],['assinatura','Mostrar Assinatura Digital','Permitir assinatura e aprovação']].map(([k,l,d])=>(
              <div key={k} style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:12 }}>
                <div><div style={{ fontSize:13, fontWeight:600 }}>{l}</div><div style={{ fontSize:11, color:'var(--fg-muted)' }}>{d}</div></div>
                <Toggle value={blocks[k]} onChange={v=>setBlocks(b=>({...b,[k]:v}))}/>
              </div>
            ))}
          </div>
        </Accordion>
        <Accordion title="Avaliações de Clientes" icon={<Icon d={ICONS.star} size={15}/>} defaultOpen={false}>
          <div style={{ fontSize:13, color:'var(--fg-secondary)', padding:'8px 0' }}>Nenhuma avaliação cadastrada.</div>
          <Button variant="secondary" style={{ marginTop:12 }} onClick={()=>window.__toast?.('Solicitação enviada',{tone:'success'})}>Solicitar avaliação</Button>
        </Accordion>
        <Accordion title="Projetos do Portfolio" icon={<Icon d={ICONS.folder} size={15}/>} defaultOpen={false}>
          <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center', marginBottom:14 }}>
            <div style={{ fontSize:13, color:'var(--fg-secondary)' }}>Projetos exibidos nas propostas</div>
            <Button size="sm" icon="plus" onClick={()=>setPortfolioModal(true)}>Adicionar</Button>
          </div>
          <div style={{ display:'grid', gridTemplateColumns:'repeat(3, 1fr)', gap:10 }}>
            {portfolio.map((p,i)=>(
              <div key={i} style={{ borderRadius:10, overflow:'hidden', border:'1px solid var(--border-subtle)', cursor:'pointer' }} onMouseEnter={e=>e.currentTarget.style.borderColor='var(--primary)'} onMouseLeave={e=>e.currentTarget.style.borderColor='var(--border-subtle)'}>
                <div style={{ height:64, background:`linear-gradient(135deg,${p.color},${p.color}88)` }}/>
                <div style={{ padding:'8px 10px', background:'var(--bg-elevated)' }}><div style={{ fontSize:12, fontWeight:600 }}>{p.name}</div><div style={{ fontSize:10, color:'var(--fg-muted)' }}>{p.cat}</div></div>
              </div>
            ))}
          </div>
        </Accordion>
      </div>
      <div style={{ position:'sticky', top:24 }}>
        <div style={{ fontSize:12, fontFamily:'var(--font-display)', fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)', marginBottom:6 }}>Preview ao Vivo</div>
        <div style={{ fontSize:11, color:'var(--fg-muted)', marginBottom:14 }}>Visualize como sua proposta ficará para os clientes</div>
        <div style={{ border:`2px solid ${cor1}`, borderRadius:16, overflow:'hidden', boxShadow:`0 0 0 4px ${cor1}22` }}>
          <div style={{ background:`linear-gradient(135deg,${cor1},${cor2})`, padding:'20px 20px 16px', position:'relative', overflow:'hidden' }}>
            <div style={{ position:'absolute', inset:0, background:'radial-gradient(circle at 15% 25%, rgba(255,255,255,0.18), transparent 55%)' }}/>
            <div style={{ position:'relative', display:'inline-block', padding:'3px 10px', borderRadius:999, background:'rgba(0,0,0,0.25)', color:corDest, fontSize:10, fontWeight:700, letterSpacing:'0.06em', textTransform:'uppercase', marginBottom:10 }}>{badge}</div>
            <div style={{ position:'relative', fontSize:18, fontWeight:parseInt(titleW), color:'#fff', lineHeight:1.2 }}>{prefix && <span>{prefix} </span>}Desenvolvimento de Site Institucional</div>
            <div style={{ position:'relative', fontSize:12, color:'rgba(255,255,255,0.75)', marginTop:6, fontFamily:font }}>para Studio Criativo</div>
          </div>
          <div style={{ background:'var(--bg-surface)', padding:14, display:'flex', flexDirection:'column', gap:10 }}>

            {/* Info do cliente */}
            {blocks.infoCliente && (
              <div style={{ padding:'10px 12px', borderRadius:8, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)' }}>
                <div style={{ fontSize:11, fontWeight:700, color:cor1, marginBottom:6, display:'flex', alignItems:'center', gap:6 }}><Icon d={ICONS.users} size={13}/> Informações do Cliente</div>
                <div style={{ fontSize:12, fontWeight:600 }}>Studio Criativo</div>
                <div style={{ fontSize:11, color:'var(--fg-muted)', marginTop:2 }}>contato@studiocriativo.com.br</div>
              </div>
            )}

            {/* Serviços */}
            {blocks.servicos && (
              <div>
                <div style={{ fontSize:11, fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)', marginBottom:8, display:'flex', alignItems:'center', gap:6 }}>
                  <span style={{ width:14, height:14, borderRadius:3, background:cor1, display:'inline-flex', alignItems:'center', justifyContent:'center', fontSize:8, color:'#fff' }}>✓</span>
                  Serviços Incluídos
                </div>
                {PREV.map((it,i)=>(
                  <div key={i} style={{ padding:'8px 10px', borderRadius:7, background:'var(--bg-elevated)', marginBottom:6, display:'flex', justifyContent:'space-between', alignItems:'flex-start' }}>
                    <div><div style={{ fontSize:12, fontWeight:600, fontFamily:font, fontWeight:parseInt(titleW) }}>{it.n}</div><div style={{ fontSize:10, color:'var(--fg-muted)', marginTop:1 }}>{it.d}</div></div>
                    <div style={{ fontSize:12, fontWeight:700, color:cor1 }}>{it.p}</div>
                  </div>
                ))}
                <div style={{ display:'flex', justifyContent:'space-between', padding:'8px 0 0', borderTop:'1px solid var(--border-subtle)', fontSize:12, fontWeight:700 }}>
                  <span style={{ color:'var(--fg-muted)' }}>Total</span>
                  <span style={{ color:cor1 }}>R$ 2.800,00</span>
                </div>
              </div>
            )}

            {/* Condições de pagamento */}
            {blocks.pagamento && (
              <div style={{ padding:'10px 12px', borderRadius:8, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)' }}>
                <div style={{ fontSize:11, fontWeight:700, color:cor1, marginBottom:8, display:'flex', alignItems:'center', gap:6 }}><Icon d={ICONS.dollar} size={13}/> Condições de Pagamento</div>
                <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:8 }}>
                  <div><div style={{ fontSize:10, color:'var(--fg-muted)' }}>Forma</div><div style={{ fontSize:12, fontWeight:600 }}>PIX / Transferência</div></div>
                  <div><div style={{ fontSize:10, color:'var(--fg-muted)' }}>Prazo</div><div style={{ fontSize:12, fontWeight:600 }}>30 dias úteis</div></div>
                  <div style={{ gridColumn:'1/-1' }}><div style={{ fontSize:10, color:'var(--fg-muted)' }}>Condições</div><div style={{ fontSize:12, fontWeight:600 }}>50% entrada, 50% entrega</div></div>
                </div>
              </div>
            )}

            {/* Avaliações */}
            {blocks.avaliacoes && (
              <div style={{ padding:'10px 12px', borderRadius:8, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)' }}>
                <div style={{ fontSize:11, fontWeight:700, color:cor1, marginBottom:8, display:'flex', alignItems:'center', gap:6 }}><Icon d={ICONS.star} size={13}/> Avaliações de Clientes</div>
                {[['Ana Lima','Excelente trabalho! Superou todas as expectativas.','5'],['João Costa','Profissionalismo e criatividade únicos.','5']].map(([n,t,r],i)=>(
                  <div key={i} style={{ padding:'8px 10px', borderRadius:7, background:'var(--bg-surface)', marginBottom:i===0?6:0 }}>
                    <div style={{ display:'flex', justifyContent:'space-between', marginBottom:4 }}>
                      <span style={{ fontSize:11, fontWeight:700 }}>{n}</span>
                      <span style={{ fontSize:10, color:'#FA8C16' }}>{'★'.repeat(parseInt(r))}</span>
                    </div>
                    <div style={{ fontSize:11, color:'var(--fg-secondary)', fontStyle:'italic' }}>"{t}"</div>
                  </div>
                ))}
              </div>
            )}

            {/* Portfolio */}
            {blocks.portfolio && (
              <div>
                <div style={{ fontSize:11, fontWeight:700, color:cor1, marginBottom:8, display:'flex', alignItems:'center', gap:6 }}><Icon d={ICONS.folder} size={13}/> Portfolio</div>
                <div style={{ display:'grid', gridTemplateColumns:'repeat(3,1fr)', gap:6 }}>
                  {portfolio.map((p,i)=>(
                    <div key={i} style={{ borderRadius:8, overflow:'hidden', border:'1px solid var(--border-subtle)' }}>
                      <div style={{ height:40, background:`linear-gradient(135deg,${p.color},${p.color}88)` }}/>
                      <div style={{ padding:'5px 7px', background:'var(--bg-elevated)' }}>
                        <div style={{ fontSize:10, fontWeight:700, overflow:'hidden', textOverflow:'ellipsis', whiteSpace:'nowrap' }}>{p.name}</div>
                        <div style={{ fontSize:9, color:'var(--fg-muted)' }}>{p.cat}</div>
                      </div>
                    </div>
                  ))}
                </div>
              </div>
            )}

            {/* Assinatura Digital */}
            {blocks.assinatura && (
              <div style={{ padding:'10px 12px', borderRadius:8, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)' }}>
                <div style={{ fontSize:11, fontWeight:700, color:cor1, marginBottom:8, display:'flex', alignItems:'center', gap:6 }}><Icon d={ICONS.pencil} size={13}/> Assinatura Digital</div>
                <div style={{ height:48, borderRadius:6, border:'2px dashed rgba(0,0,0,0.15)', background:'#fff', display:'flex', alignItems:'center', justifyContent:'center' }}>
                  <span style={{ fontSize:10, color:'#bbb', fontStyle:'italic' }}>Assine aqui</span>
                </div>
                <button style={{ width:'100%', marginTop:8, padding:'8px 0', borderRadius:7, background:`linear-gradient(135deg,${cor1},${cor2})`, border:'none', color:'#fff', fontSize:11, fontWeight:700, cursor:'pointer', fontFamily:font }}>{btnLabel}</button>
              </div>
            )}

            {/* Botão principal (quando assinatura desativada) */}
            {!blocks.assinatura && (
              <div style={{ paddingTop: (blocks.servicos||blocks.infoCliente||blocks.pagamento||blocks.avaliacoes||blocks.portfolio) ? 4 : 0 }}>
                <button style={{ width:'100%', padding:'9px 0', borderRadius:8, background:`linear-gradient(135deg,${cor1},${cor2})`, border:'none', color:'#fff', fontSize:12, fontWeight:700, cursor:'pointer', fontFamily:font }}>{btnLabel}</button>
              </div>
            )}

            {/* Estado vazio */}
            {!blocks.infoCliente && !blocks.servicos && !blocks.pagamento && !blocks.avaliacoes && !blocks.portfolio && !blocks.assinatura && (
              <div style={{ textAlign:'center', padding:'24px 16px', color:'var(--fg-muted)', fontSize:12, lineHeight:1.6 }}>
                Nenhum bloco ativo.<br/>Ative opções em "Blocos Opcionais" para visualizar.
              </div>
            )}

            {footer && <div style={{ paddingTop:6, fontSize:10, color:'var(--fg-muted)', textAlign:'center', borderTop:'1px solid var(--border-subtle)' }}>{footer}</div>}
          </div>
        </div>
      </div>
      {portfolioModal && <NovoPortfolioModal onClose={()=>setPortfolioModal(false)} onCreate={item=>setPortfolio(p=>[...p,item])}/>}
    </div>
  );
}

// ─── Templates Tab ────────────────────────────────────────────────────────────
function TemplatesTab() {
  const [templates, setTemplates] = useState(TEMPLATES_SEED);
  function duplicar(tpl) { setTemplates(prev=>[...prev,{...tpl,id:Date.now(),name:`${tpl.name} (cópia)`,isDefault:false}]); window.__toast?.(`"${tpl.name}" duplicado`,{tone:'success'}); }
  function usarComoPadrao(id) { const tipo=templates.find(t=>t.id===id)?.type; setTemplates(prev=>prev.map(t=>({...t,isDefault:t.id===id?true:t.type===tipo?false:t.isDefault}))); window.__toast?.('Definido como padrão',{tone:'success'}); }
  function excluir(id) { setTemplates(prev=>prev.filter(t=>t.id!==id)); window.__toast?.('Template excluído'); }
  return (
    <div style={{ display:'flex', flexDirection:'column', gap:16 }}>
      <div style={{ fontSize:13, color:'var(--fg-secondary)', lineHeight:1.65, padding:'14px 18px', background:'var(--bg-elevated)', borderRadius:10, border:'1px solid var(--border-subtle)' }}>
        Templates de PDF e de apresentação por organização. Ao abrir esta aba, criamos os padrões se ainda não existirem. Use duplicar para variantes e defina um como padrão por tipo.
      </div>
      <Card padding={0}>
        {templates.map((tpl,i)=>(
          <div key={tpl.id} style={{ display:'flex', alignItems:'center', padding:'16px 22px', borderBottom:i<templates.length-1?'1px solid var(--border-subtle)':'none', transition:'background 140ms' }}
            onMouseEnter={e=>e.currentTarget.style.background='var(--bg-elevated)'} onMouseLeave={e=>e.currentTarget.style.background='transparent'}>
            <div style={{ flex:1 }}>
              <div style={{ fontSize:14, fontWeight:700, display:'flex', alignItems:'center', gap:10 }}>
                {tpl.name}
                {tpl.isDefault && <span style={{ fontSize:10, padding:'2px 8px', borderRadius:999, background:'var(--primary-soft)', color:'var(--geek-blue-200)', border:'1px solid var(--geek-blue-a40)', fontWeight:700 }}>Padrão</span>}
              </div>
              <div style={{ fontSize:12, color:'var(--fg-muted)', marginTop:3 }}>{tpl.type}{tpl.isDefault?' · Padrão':''}</div>
            </div>
            <div style={{ display:'flex', gap:8 }}>
              <button onClick={()=>duplicar(tpl)} style={BTN_GHOST}>Duplicar</button>
              <button onClick={()=>usarComoPadrao(tpl.id)} style={{ ...BTN_GHOST, color:tpl.isDefault?'var(--fg-muted)':'var(--fg-secondary)' }}>Usar como padrão</button>
              <button onClick={()=>excluir(tpl.id)} style={{ ...BTN_GHOST, color:'#FF6A6A', borderColor:'rgba(255,106,106,0.3)' }}>Excluir</button>
            </div>
          </div>
        ))}
        {templates.length===0 && <div style={{ padding:'36px 22px', textAlign:'center', color:'var(--fg-muted)', fontSize:13 }}>Nenhum template encontrado.</div>}
      </Card>
    </div>
  );
}

// ─── Budgets ──────────────────────────────────────────────────────────────────
function Budgets({ onNav, prefill, onUsedPrefill }) {
  const [activeTab,    setActiveTab]    = useState('orcamentos');
  const [activeFilter, setActiveFilter] = useState('todos');
  const [search,       setSearch]       = useState('');
  const [budgets,      setBudgets]      = useState([]);
  const [loading,      setLoading]      = useState(true);
  const [menuOpen,     setMenuOpen]     = useState(null);  // budget index
  const [modal,        setModal]        = useState(null);  // null | 'novo' | 'visualizar' | 'pdf' | 'slides'
  const [activeBudget, setActiveBudget] = useState(null);
  const [novoPrefill,  setNovoPrefill]  = useState(null);

  useEffect(() => {
    (async () => {
      const { data, error } = await sb.from('budgets').select('*').order('created_at', { ascending: false });
      if (error) { window.__toast?.(error.message, { tone:'danger' }); }
      setBudgets((data || []).map(rowToBudget));
      setLoading(false);
    })();
  }, []);

  useEffect(() => {
    if (prefill) {
      setActiveTab('orcamentos');
      setNovoPrefill(prefill);
      setModal('novo');
      onUsedPrefill?.();
    }
  }, [prefill]);

  function handleAction(actionId, budget) {
    setMenuOpen(null);
    if (actionId === 'visualizar') { setActiveBudget(budget); setModal('visualizar'); return; }
    if (actionId === 'detalhes') {
      setActiveBudget(budget);
      setModal(budget.format === 'slides' ? 'slides' : 'pdf');
      return;
    }
    if (actionId === 'pdfEmail') { setActiveBudget(budget); setModal('pdf'); return; }
    if (actionId === 'aprovar') {
      setBudgets(prev => prev.map(b => b.num===budget.num ? {...b, status:'aprovado', tone:'success'} : b));
      window.__toast?.(`Orçamento ${budget.num} aprovado`,{tone:'success'}); return;
    }
    if (actionId === 'duplicar') {
      const dup = {...budget, num:budget.num+'(2)', status:'rascunho', tone:'neutral'};
      setBudgets(prev => [dup, ...prev]);
      window.__toast?.('Orçamento duplicado',{tone:'success'}); return;
    }
    if (actionId === 'excluir') {
      setBudgets(prev => prev.filter(b=>b.num!==budget.num));
      window.__toast?.('Orçamento excluído'); return;
    }
    if (actionId === 'arquivar') {
      setBudgets(prev => prev.filter(b=>b.num!==budget.num));
      window.__toast?.(`Orçamento ${budget.num} arquivado`); return;
    }
    if (actionId === 'copiarLink') { navigator.clipboard?.writeText(`${window.location.origin}/o/${budget.num.replace(/^#/,'')}`); window.__toast?.('Link copiado',{tone:'success'}); return; }
    if (actionId === 'compartilhar') { window.__toast?.('Link de compartilhamento copiado',{tone:'success'}); return; }
    if (actionId === 'email') { window.__toast?.(`Orçamento enviado para ${budget.clientEmail}`,{tone:'success'}); return; }
    if (actionId === 'editar') {
      setNovoPrefill({ title:budget.title, client:budget.client, clientEmail:budget.clientEmail, desc:budget.desc, items:budget.items, payMethod:budget.payMethod, payTerms:budget.payTerms, format:budget.format });
      setModal('novo');
      return;
    }
  }

  const fmtTabLabel = (tab) => {
    const count = tab.id==='todos' ? budgets.length : budgets.filter(tab.match).length;
    return `${tab.label} · ${count}`;
  };

  const visibleBudgets = budgets
    .filter(FILTER_TABS.find(t=>t.id===activeFilter).match)
    .filter(b => !search || b.title.toLowerCase().includes(search.toLowerCase()) || b.client.toLowerCase().includes(search.toLowerCase()) || b.num.toLowerCase().includes(search.toLowerCase()));

  const kpiAberto     = budgets.filter(b => b.status==='enviado' || b.status==='visualizado');
  const kpiAprovados  = budgets.filter(b => b.status==='aprovado');
  const kpiRecusados  = budgets.filter(b => b.status==='recusado');
  const fmtK = n => n >= 1000 ? 'R$ ' + (n/1000).toLocaleString('pt-BR',{minimumFractionDigits:1,maximumFractionDigits:1}) + 'k' : n > 0 ? 'R$ ' + n.toLocaleString('pt-BR') : '—';
  const sumRaw = arr => arr.reduce((a,b)=>a+b.rawValue,0);
  const kpiConversao  = (kpiAprovados.length + kpiRecusados.length) > 0 ? Math.round(kpiAprovados.length / (kpiAprovados.length + kpiRecusados.length) * 100) : 0;
  const kpiTicket     = budgets.length > 0 ? Math.round(sumRaw(budgets) / budgets.length) : 0;
  const KPI_STATS = [
    { l:'Em aberto',          v: fmtK(sumRaw(kpiAberto)),   d: kpiAberto.length + (kpiAberto.length===1?' proposta':' propostas'),    t:'#FADB14' },
    { l:'Aprovados',          v: fmtK(sumRaw(kpiAprovados)), d: kpiAprovados.length + (kpiAprovados.length===1?' contrato':' contratos'), t:'#22C55E' },
    { l:'Taxa de conversão',  v: (kpiAprovados.length + kpiRecusados.length) > 0 ? kpiConversao + '%' : '—',                           d: kpiAprovados.length + ' de ' + (kpiAprovados.length + kpiRecusados.length) + ' respondidos', t:'#1D39C4' },
    { l:'Ticket médio',       v: fmtK(kpiTicket),            d: budgets.length + (budgets.length===1?' orçamento':' orçamentos'),       t:'#36CFC9' },
  ];

  const MAIN_TABS = [
    { id:'orcamentos',    label:'Orçamentos',    icon:'briefcase' },
    { id:'contratos',     label:'Contratos',     icon:'document' },
    { id:'personalizacao',label:'Personalização',icon:'palette' },
    { id:'templates',     label:'Templates',     icon:'grid' },
  ];

  return (
    <div style={{ padding:'24px 28px', display:'flex', flexDirection:'column', gap:18 }}>
      {/* Main tab nav */}
      <div style={{ display:'flex', gap:4, borderBottom:'1px solid var(--border-subtle)', marginBottom:2 }}>
        {MAIN_TABS.map(t => {
          const active = activeTab===t.id;
          return (
            <button key={t.id} onClick={()=>setActiveTab(t.id)} style={{ padding:'9px 18px', borderRadius:'8px 8px 0 0', fontSize:13, fontWeight:600, cursor:'pointer', fontFamily:'inherit', background:active?'var(--bg-surface)':'transparent', color:active?'var(--fg-primary)':'var(--fg-muted)', border:active?'1px solid var(--border-subtle)':'1px solid transparent', borderBottom:active?'1px solid var(--bg-surface)':'1px solid transparent', marginBottom:active?-1:0, display:'flex', alignItems:'center', gap:7, transition:'all 140ms' }}>
              <Icon d={ICONS[t.icon]} size={14}/> {t.label}
            </button>
          );
        })}
      </div>

      {/* Orçamentos tab */}
      {activeTab==='orcamentos' && (<>
        <div style={{ display:'grid', gridTemplateColumns:'repeat(4, 1fr)', gap:14 }}>
          {KPI_STATS.map(s=>(
            <Card key={s.l} padding={18}>
              <div style={{ fontFamily:'var(--font-display)',fontSize:11,fontWeight:700,letterSpacing:'0.06em',textTransform:'uppercase',color:'var(--fg-muted)' }}>{s.l}</div>
              <div style={{ fontFamily:'var(--font-display)',fontSize:26,fontWeight:700,marginTop:8,letterSpacing:'-0.02em',color:s.t }}>{s.v}</div>
              <div style={{ fontSize:12,color:'var(--fg-muted)',marginTop:4 }}>{s.d}</div>
            </Card>
          ))}
        </div>

        {/* Search + filter row */}
        <div style={{ display:'flex', gap:10, alignItems:'center', flexWrap:'wrap' }}>
          <div style={{ position:'relative', display:'flex', alignItems:'center', flex:1, minWidth:200 }}>
            <svg width="14" height="14" viewBox="0 0 16 16" fill="none" style={{ position:'absolute', left:12, pointerEvents:'none', color:'var(--fg-muted)' }}><circle cx="6.5" cy="6.5" r="5" stroke="currentColor" strokeWidth="1.5"/><path d="M10.5 10.5L14 14" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"/></svg>
            <input value={search} onChange={e=>setSearch(e.target.value)} placeholder="Buscar por cliente, título ou número..." style={{...INP, paddingLeft:36}}/>
          </div>
          {FILTER_TABS.map(tab => {
            const active = activeFilter===tab.id;
            return (
              <button key={tab.id} onClick={()=>setActiveFilter(tab.id)} style={{ display:'flex', alignItems:'center', gap:8, padding:'8px 14px', borderRadius:999, background:active?'var(--primary)':'var(--bg-surface)', color:active?'#fff':'var(--fg-secondary)', border:`1px solid ${active?'var(--primary)':'var(--border-subtle)'}`, fontFamily:'inherit', fontSize:13, fontWeight:600, cursor:'pointer', transition:'all 140ms', whiteSpace:'nowrap' }}>{fmtTabLabel(tab)}</button>
            );
          })}
          <Button icon="plus" onClick={()=>setModal('novo')}>Novo orçamento</Button>
        </div>

        {/* Budget card list */}
        {loading && <div style={{ padding:'48px 0', textAlign:'center', color:'var(--fg-muted)', fontSize:13 }}>Carregando orçamentos…</div>}
        {!loading && visibleBudgets.length===0 ? (
          <div style={{ padding:'48px 0', textAlign:'center', color:'var(--fg-muted)', fontSize:13 }}>Nenhum orçamento encontrado.</div>
        ) : (
          <div style={{ display:'flex', flexDirection:'column', gap:10 }}>
            {visibleBudgets.map((b,i) => (
              <div key={b.num} onClick={()=>handleAction('detalhes', b)} style={{ position:'relative', background:'var(--bg-surface)', border:'1px solid var(--border-subtle)', borderRadius:14, padding:'18px 22px', transition:'border-color 160ms, box-shadow 160ms', cursor:'pointer' }}
                onMouseEnter={e=>{ e.currentTarget.style.borderColor='var(--border-strong)'; e.currentTarget.style.boxShadow='var(--shadow-2)'; }} onMouseLeave={e=>{ e.currentTarget.style.borderColor='var(--border-subtle)'; e.currentTarget.style.boxShadow='none'; }}>

                {/* Top row: badges + menu */}
                <div style={{ display:'flex', alignItems:'center', gap:8, marginBottom:8 }}>
                  <Badge tone={b.tone}>{b.status.charAt(0).toUpperCase()+b.status.slice(1)}</Badge>
                  <span style={{ fontFamily:'var(--font-mono)', fontSize:12, color:'var(--fg-muted)', fontWeight:600 }}>{b.num}</span>
                  <span style={{ fontSize:11, padding:'2px 8px', borderRadius:999, fontWeight:700, textTransform:'uppercase', letterSpacing:'0.04em', background:'var(--bg-elevated)', color:'var(--fg-secondary)', border:'1px solid var(--border-subtle)' }}>{FORMAT_LABEL[b.format]||b.format}</span>
                  <div style={{ flex:1 }}/>
                  {/* ⋮ menu */}
                  <div style={{ position:'relative' }}>
                    <button onClick={e=>{ e.stopPropagation(); setMenuOpen(menuOpen===i?null:i); }} style={{ width:34, height:34, borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', cursor:'pointer', color:'var(--fg-secondary)', display:'flex', alignItems:'center', justifyContent:'center', transition:'border-color 140ms' }}
                      onMouseEnter={e=>e.currentTarget.style.borderColor='var(--border-strong)'} onMouseLeave={e=>e.currentTarget.style.borderColor='var(--border-subtle)'}><Icon d={ICONS.more} size={16}/></button>

                    {menuOpen===i && (<>
                      <div onClick={()=>setMenuOpen(null)} style={{ position:'fixed', inset:0, zIndex:9 }}/>
                      <div style={{ position:'absolute', right:0, top:'calc(100% + 4px)', zIndex:10, background:'var(--bg-surface)', border:'1px solid var(--border-strong)', borderRadius:12, boxShadow:'0 16px 48px rgba(0,0,0,0.45)', minWidth:220, padding:6, overflow:'hidden' }}>
                        {BUDGET_ACTIONS.map((a,ai) => a ? (
                          <button key={a.id} onClick={e=>{ e.stopPropagation(); handleAction(a.id, b); }} style={{ width:'100%', padding:'9px 14px', borderRadius:8, border:'none', background:'transparent', cursor:'pointer', fontFamily:'inherit', fontSize:13, fontWeight:500, display:'flex', alignItems:'center', gap:10, color:a.danger?'#FF6A6A':'var(--fg-primary)', textAlign:'left', transition:'background 120ms' }}
                            onMouseEnter={e=>e.currentTarget.style.background='var(--bg-elevated)'} onMouseLeave={e=>e.currentTarget.style.background='transparent'}>
                            <span style={{ minWidth:16, display:'flex', alignItems:'center', color:a.danger?'#FF6A6A':'var(--fg-muted)' }}><Icon d={ICONS[a.icon]} size={14}/></span>{a.label}
                          </button>
                        ) : <div key={ai} style={{ height:1, background:'var(--border-subtle)', margin:'4px 8px' }}/>)}
                      </div>
                    </>)}
                  </div>
                </div>

                {/* Title */}
                <div style={{ fontSize:16, fontWeight:700, color:'var(--fg-primary)', marginBottom:4 }}>{b.title}</div>
                <div style={{ fontSize:13, color:'var(--fg-secondary)', marginBottom:12 }}>Cliente: {b.client}</div>

                {/* Bottom row */}
                <div style={{ display:'flex', alignItems:'center', gap:16, fontSize:13 }}>
                  <div><span style={{ fontSize:11, color:'var(--fg-muted)' }}>Total: </span><span style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:15, color:'#22C55E' }}>{b.value}</span></div>
                  <div><span style={{ fontSize:11, color:'var(--fg-muted)' }}>Criado em: </span><span style={{ fontFamily:'var(--font-mono)', color:'var(--fg-secondary)' }}>{b.sent}/2026</span></div>
                  {b.valid && <div><span style={{ fontSize:11, color:'var(--fg-muted)' }}>Válido até: </span><span style={{ fontFamily:'var(--font-mono)', color:'var(--fg-secondary)' }}>{b.valid}/2026</span></div>}
                  <div style={{ flex:1 }}/>
                  {b.status === 'rascunho' && (
                    <button onClick={async e => {
                      e.stopPropagation();
                      try {
                        const dbNum = b.num.startsWith('#') ? b.num : '#' + b.num;
                        await sb.from('budgets').update({ status: 'enviado' }).eq('budget_num', dbNum);
                        setBudgets(prev => prev.map(x => x.num===b.num ? {...x, status:'enviado', tone:'brand'} : x));
                        navigator.clipboard?.writeText(`${window.location.origin}/o/${b.num.replace(/^#/,'')}`);
                        window.__toast?.('Proposta enviada · Link copiado', { tone:'success' });
                      } catch(err) {
                        window.__toast?.('Erro ao enviar: ' + err.message, { tone:'danger' });
                      }
                    }} style={{ display:'flex', alignItems:'center', gap:6, padding:'7px 16px', borderRadius:8, border:'none', background:'var(--primary)', color:'#fff', fontSize:12, fontWeight:700, cursor:'pointer', fontFamily:'inherit', transition:'opacity 140ms' }}
                      onMouseEnter={e=>e.currentTarget.style.opacity='0.85'} onMouseLeave={e=>e.currentTarget.style.opacity='1'}>
                      <Icon d={ICONS.share} size={13}/> Enviar
                    </button>
                  )}
                  {(b.status === 'enviado' || b.status === 'visualizado') && (
                    <button onClick={e => {
                      e.stopPropagation();
                      navigator.clipboard?.writeText(`${window.location.origin}/o/${b.num.replace(/^#/,'')}`);
                      window.__toast?.('Link copiado', { tone:'success' });
                    }} style={{ display:'flex', alignItems:'center', gap:6, padding:'7px 16px', borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', color:'var(--fg-secondary)', fontSize:12, fontWeight:600, cursor:'pointer', fontFamily:'inherit', transition:'border-color 140ms' }}
                      onMouseEnter={e=>e.currentTarget.style.borderColor='var(--border-strong)'} onMouseLeave={e=>e.currentTarget.style.borderColor='var(--border-subtle)'}>
                      <Icon d={ICONS.link} size={13}/> Copiar link
                    </button>
                  )}
                  {/* Botão WhatsApp */}
                  <button onClick={async e => {
                    e.stopPropagation();
                    if (!window.__zapiSend) { window.__toast?.('Módulo WhatsApp não carregado', { tone:'danger' }); return; }
                    const phoneRaw = b.clientPhone || b.clientEmail || '';
                    const link = `${window.location.origin}/o/${b.num.replace(/^#/,'')}`;
                    const msg = `Olá${b.client ? ' ' + b.client : ''}! Segue seu orçamento *${b.num}*${b.title ? ' – ' + b.title : ''}:\n\n🔗 ${link}`;
                    // Se não tiver telefone, pedir
                    let phone = phoneRaw.replace(/\D/g,'');
                    if (!phone || phone.length < 10) {
                      phone = prompt('Número WhatsApp do cliente (com DDD):', '');
                      if (!phone) return;
                    }
                    await window.__zapiSend(phone, msg);
                  }} title="Enviar via WhatsApp"
                    style={{ display:'flex', alignItems:'center', gap:6, padding:'7px 14px', borderRadius:8, border:'1px solid #25D36644', background:'#25D36618', color:'#25D366', fontSize:12, fontWeight:700, cursor:'pointer', fontFamily:'inherit', transition:'all 140ms' }}
                    onMouseEnter={e=>{ e.currentTarget.style.background='#25D366'; e.currentTarget.style.color='#fff'; }}
                    onMouseLeave={e=>{ e.currentTarget.style.background='#25D36618'; e.currentTarget.style.color='#25D366'; }}>
                    <svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a7.43 7.43 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347z"/><path d="M5.027 18.92l.18-.997A10 10 0 1 1 22 12a10 10 0 0 1-9.973 10 9.958 9.958 0 0 1-5.057-1.367L2 21.5l1.027-2.58z"/></svg>
                    WhatsApp
                  </button>
                </div>
              </div>
            ))}
          </div>
        )}

        {modal==='novo' && <BudgetEditorModal initialData={novoPrefill} onClose={()=>{ setModal(null); setNovoPrefill(null); }} onCreate={async (form)=>{
          const total = (form.items||[]).reduce((a,i)=>a+(i.q||1)*(i.p||0),0);
          const disc = Math.max(0,total-(form.discount||0));
          const nextNum = '#' + String(parseInt((budgets[0]?.num||'#0000').replace(/\D/g,''))+1).padStart(4,'0');
          const today = new Date().toISOString().slice(0,10);
          const vd = new Date(); vd.setDate(vd.getDate()+(+form.validity||14));
          try {
            const { data: { user } } = await sb.auth.getUser();
            const { data: row, error } = await sb.from('budgets').insert({
              user_id:      user.id,
              title:        form.title || 'Novo orçamento',
              client_name:  form.client || '',
              client_email: form.clientEmail || '',
              budget_desc:  form.desc || '',
              budget_num:   nextNum,
              status:       'rascunho',
              total:        disc,
              items:        form.items || [],
              format:       form.format || 'pdf',
              pay_method:   form.payMethod || 'PIX',
              pay_terms:    form.payTerms || '',
              delivery_days: 30,
              sent_at:      today,
              valid_until:  vd.toISOString().slice(0,10),
            }).select().single();
            if (error) { window.__toast?.(error.message, { tone:'danger' }); return; }
            setBudgets(prev => [rowToBudget(row), ...prev]);
            window.__toast?.(`Orçamento criado para ${form.client||'cliente'}`, { tone:'success' });
          } catch { window.__toast?.('Erro ao criar orçamento', { tone:'danger' }); }
          setModal(null);
        }}/>}
      </>)}

      {activeTab==='contratos'       && <ContratosTab/>}
      {activeTab==='personalizacao'  && <PersonalizacaoTab/>}
      {activeTab==='templates'       && <TemplatesTab/>}

      {modal==='visualizar' && activeBudget && <VisualizarModal budget={activeBudget} onClose={()=>setModal(null)}/>}
      {modal==='pdf'        && activeBudget && <PDFPreviewModal  budget={activeBudget} onClose={()=>setModal(null)}/>}
      {modal==='slides'     && activeBudget && <SlidesEditorModal budget={activeBudget} onClose={()=>setModal(null)}/>}
    </div>
  );
}
window.Budgets = Budgets;

// ─── Briefings ────────────────────────────────────────────────────────────────
const BRIEFINGS = [
  { title:'Astra · Reposicionamento de marca', client:'Astra Cosméticos', progress:100, status:'completo',     sLab:'Completo',     when:'Atualizado há 2 dias' },
  { title:'Site Café Norte',                   client:'Café Norte',       progress:80,  status:'em-andamento', sLab:'Em andamento', when:'Última edição: hoje' },
  { title:'Lançamento Norte Foods',            client:'Norte Foods',      progress:45,  status:'em-andamento', sLab:'Em andamento', when:'Aguardando cliente' },
  { title:'Identidade · Bistrô Lumière',       client:'Bistrô Lumière',   progress:20,  status:'pendente',     sLab:'Pendente',     when:'Enviado há 4 dias' },
  { title:'Catálogo Galeria Vértice',          client:'Galeria Vértice',  progress:0,   status:'rascunho',     sLab:'Rascunho',     when:'—' },
];
function Briefings({ onNav }) {
  const [tplModal, setTplModal] = useState(false);
  return (
    <div style={{ padding:'24px 28px', display:'flex', flexDirection:'column', gap:18 }}>
      <div style={{ display:'grid', gridTemplateColumns:'1fr 320px', gap:18 }}>
        <Card padding={0} style={{ overflow:'hidden' }}>
          <div style={{ padding:'18px 22px', display:'flex', alignItems:'center', justifyContent:'space-between', borderBottom:'1px solid var(--border-subtle)' }}>
            <div><h3 style={{ margin:0, fontSize:16, fontWeight:700 }}>Meus briefings</h3><div style={{ fontSize:12, color:'var(--fg-muted)', marginTop:2 }}>5 ativos · 2 aguardando cliente</div></div>
            <Button icon="plus" size="sm" onClick={()=>onNav?.('briefings')}>Novo briefing</Button>
          </div>
          {BRIEFINGS.map((b,i)=>(
            <div key={b.title} style={{ padding:'18px 22px', borderBottom:i<BRIEFINGS.length-1?'1px solid var(--border-subtle)':'none', display:'flex', flexDirection:'column', gap:10, cursor:'pointer' }}
              onMouseEnter={e=>e.currentTarget.style.background='var(--bg-elevated)'} onMouseLeave={e=>e.currentTarget.style.background='transparent'}>
              <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between' }}>
                <div><div style={{ fontSize:14, fontWeight:700 }}>{b.title}</div><div style={{ fontSize:12, color:'var(--fg-muted)', marginTop:2 }}>{b.client} · {b.when}</div></div>
                <Badge tone={b.status==='completo'?'success':b.status==='em-andamento'?'brand':b.status==='pendente'?'warning':'neutral'}>{b.sLab}</Badge>
              </div>
              <div style={{ display:'flex', alignItems:'center', gap:12 }}>
                <div style={{ flex:1, height:6, background:'var(--bg-elevated)', borderRadius:999, overflow:'hidden' }}>
                  <div style={{ width:b.progress+'%', height:'100%', background:b.progress===100?'#22C55E':'linear-gradient(90deg,#1D39C4,#36CFC9)' }}/>
                </div>
                <span style={{ fontFamily:'var(--font-mono)', fontSize:11, color:'var(--fg-muted)', minWidth:32, textAlign:'right' }}>{b.progress}%</span>
              </div>
            </div>
          ))}
        </Card>
        <Card padding={20}>
          <h3 style={{ margin:0, fontSize:16, fontWeight:700 }}>Templates</h3>
          <div style={{ marginTop:14, display:'flex', flexDirection:'column', gap:10 }}>
            {[{t:'Identidade visual',c:'#1D39C4',q:'12 perguntas'},{t:'Site institucional',c:'#36CFC9',q:'18 perguntas'},{t:'Embalagem',c:'#FA541C',q:'10 perguntas'},{t:'Social media',c:'#7C3AED',q:'8 perguntas'},{t:'Personalizado',c:'#FADB14',q:'do zero'}].map(t=>(
              <div key={t.t} style={{ padding:12, borderRadius:10, background:'var(--bg-elevated)', display:'flex', alignItems:'center', gap:10, cursor:'pointer' }}>
                <span style={{ width:8, height:36, borderRadius:4, background:t.c, flexShrink:0 }}/>
                <div style={{ flex:1 }}><div style={{ fontSize:13, fontWeight:600 }}>{t.t}</div><div style={{ fontSize:11, color:'var(--fg-muted)' }}>{t.q}</div></div>
                <Icon d={ICONS.arrowR} size={14} style={{ color:'var(--fg-muted)' }}/>
              </div>
            ))}
          </div>
          <Button variant="secondary" style={{ width:'100%', justifyContent:'center', marginTop:14 }} onClick={()=>setTplModal(true)}>Criar template</Button>
        </Card>
      </div>
      {tplModal && <TemplateEditorModal onClose={()=>setTplModal(false)} onCreate={(f)=>{ setTplModal(false); window.__toast?.(`Template "${f.name}" salvo`,{tone:'success'}); }}/>}
    </div>
  );
}
window.Briefings = Briefings;
