const {S,Head,I,P,useWidth}=window.WFA;
const {UIButton,UIInput,UICard,UIAvatar,UIPill,UITabs,UIModal,UIDrawer,UIEmptyState,UIToggleGroup,UIKanban}=window.XCOPEDesignSystem_bf80f1;

const TK_DEF_STATES=[
  {id:"todo",label:"A fazer",tone:"neutral"},
  {id:"doing",label:"Em curso",tone:"info"},
  {id:"review",label:"Em revisão",tone:"warning"},
  {id:"done",label:"Concluído",tone:"success"},
];
const TK_PRIO={alta:{label:"Alta",tone:"danger"},media:{label:"Média",tone:"warning"},baixa:{label:"Baixa",tone:"info"}};
const TK_MONTH="Julho 2026";const TK_TODAY=24;
const tkFmt=d=>d.day+" "+["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"][d.m-1];
const TK_ROWS=[
  {id:700,g:"todo",t:"Rever candidaturas QA",d:"Triagem das 14 candidaturas recebidas esta semana",due:{m:7,day:28},mod:"Recrutamento",who:["Hugo Montenegro","Rui Pinto"],prio:"media",sub:[["Filtrar por experiência",true],["Entrevistas telefónicas",false],["Shortlist para o gestor",false]],act:[["Hugo Montenegro","criou a tarefa","22 jul"],["Rui Pinto","comentou: já tenho 6 pré-selecionados","23 jul"]]},
  {id:947,g:"todo",t:"Preparar onboarding Ana",d:"Kit de acolhimento, acessos e plano dos primeiros 30 dias",due:{m:8,day:1},mod:"Pessoas",who:["Hugo Montenegro"],prio:"alta",sub:[["Pedir acessos IT",true],["Preparar kit",false],["Agendar sessão de boas-vindas",false]],act:[["Hugo Montenegro","criou a tarefa","20 jul"]]},
  {id:722,g:"todo",t:"Atualizar organigrama",d:"",due:{m:8,day:5},mod:"Pessoas",who:["Carla Dias"],prio:"baixa",sub:[],act:[["Carla Dias","criou a tarefa","24 jul"]]},
  {id:413,g:"doing",t:"Aprovar folhas de ponto",d:"Junho, 62 colaboradores em três empresas do grupo",due:{m:7,day:26},mod:"Tempo",who:["Hugo Montenegro","Ana Reis"],prio:"alta",sub:[["Xcope AI",true],["Xcope Produto",false],["Xcope Internacional",false]],act:[["Ana Reis","validou o Xcope AI","24 jul"]]},
  {id:226,g:"doing",t:"Plano de férias Q3",d:"Consolidar pedidos e verificar cobertura por equipa",due:{m:7,day:30},mod:"Tempo",who:["Tomás Jervell"],prio:"media",sub:[["Recolher pedidos",true],["Verificar cobertura",false]],act:[["Tomás Jervell","criou a tarefa","18 jul"]]},
  {id:692,g:"review",t:"Contrato Ana Reis",d:"Aguarda validação jurídica antes de envio para assinatura",due:{m:7,day:27},mod:"Documentos",who:["Carla Dias"],prio:"alta",sub:[["Rever cláusulas",true],["Validação jurídica",false]],act:[["Carla Dias","enviou para revisão","23 jul"]]},
  {id:188,g:"review",t:"Inquérito de clima",d:"",due:{m:8,day:2},mod:"Pessoas",who:["Sofia Melo"],prio:"baixa",sub:[],act:[["Sofia Melo","criou a tarefa","21 jul"]]},
  {id:355,g:"done",t:"Revisão salarial Q2",d:"Concluída e comunicada às equipas",due:{m:7,day:18},mod:"Pessoas",who:["Hugo Montenegro"],prio:"media",sub:[["Simulações",true],["Comunicação",true]],act:[["Hugo Montenegro","concluiu a tarefa","18 jul"]]},
  {id:401,g:"done",t:"Formação de higiene e segurança",d:"",due:{m:7,day:14},mod:"Formação",who:["Rui Pinto"],prio:"media",sub:[],act:[["Rui Pinto","concluiu a tarefa","14 jul"]]},
];
// column rule: one fixed width for every metadata column, flexible only for name/description
const TK_GRID="minmax(180px,1fr) minmax(160px,1.6fr) repeat(4,120px) 34px";
const TK_GRID_SM="minmax(160px,1fr) repeat(4,108px) 34px";
const TK_DOTS=["M12 5h.01","M12 12h.01","M12 19h.01"];

function TkAvatars({who}){
  return <div style={{display:"flex"}}>{who.slice(0,3).map((n,i)=><span key={n} style={{marginLeft:i?-8:0,boxShadow:"0 0 0 2px var(--ui-surface)",borderRadius:"50%",display:"inline-flex"}}><UIAvatar name={n} size="xs"/></span>)}</div>;
}

function TkHeadRow({tier}){
  if(tier==="xs")return null;
  const sm=tier==="sm";
  const c={fontSize:"var(--ui-fs-xs)",fontWeight:600,letterSpacing:"0.06em",textTransform:"uppercase",color:"var(--ui-text-3)"};
  return <div style={{display:"grid",gridTemplateColumns:sm?TK_GRID_SM:TK_GRID,gap:12,alignItems:"center",padding:"8px 16px",borderBottom:"1px solid var(--ui-divider)"}}>
    <span style={c}>Tarefa</span>{!sm&&<span style={c}>Descrição</span>}<span style={c}>Prazo</span><span style={c}>Módulo</span><span style={c}>Equipa</span><span style={c}>Prioridade</span><span/>
  </div>;
}

function TkRow({r,onOpen,sel,onSel,tier,done}){
  const p=TK_PRIO[r.prio];const sm=tier==="sm";
  if(tier==="xs")return <div className="tk-row" style={{display:"flex",gap:12,alignItems:"flex-start",padding:"12px 16px",borderBottom:"1px solid var(--ui-divider)",cursor:"pointer",background:sel?"var(--ui-surface-2)":"transparent"}} onClick={()=>onOpen(r)}>
    <span title="Selecionar" onClick={e=>{e.stopPropagation();onSel(r);}} style={{width:16,height:16,marginTop:3,flexShrink:0,borderRadius:5,border:"1.5px solid "+(sel?"var(--ui-text)":"var(--ui-border-2)"),background:sel?"var(--ui-text)":"transparent",display:"grid",placeItems:"center"}}>{sel&&<I d={["m5 12 4.5 4.5L19 7"]} size={11} c="var(--ui-surface)"/>}</span>
    <div style={{flex:1,minWidth:0}}>
      <div style={{fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",textDecoration:done?"line-through":"none",opacity:done?0.6:1}}>{r.t}</div>
      <div className="row" style={{gap:8,marginTop:6,flexWrap:"wrap"}}>
        <UIPill tone={p.tone} dot>{p.label}</UIPill><UIPill>{r.mod}</UIPill>
        <span className="muted" style={{fontSize:"var(--ui-fs-xs)",fontVariantNumeric:"tabular-nums"}}>{tkFmt(r.due)}</span>
      </div>
    </div>
    <span className="ico-btn" title="Mais" style={{flexShrink:0}} onClick={e=>e.stopPropagation()}><I d={TK_DOTS} size={16}/></span>
  </div>;
  return <div className="tk-row" style={{display:"grid",gridTemplateColumns:sm?TK_GRID_SM:TK_GRID,gap:12,alignItems:"center",padding:"12px 16px",borderBottom:"1px solid var(--ui-divider)",cursor:"pointer",background:sel?"var(--ui-surface-2)":"transparent"}} onClick={()=>onOpen(r)}>
    <div className="row" style={{gap:10,minWidth:0}}>
      <span title="Selecionar" onClick={e=>{e.stopPropagation();onSel(r);}} style={{width:16,height:16,flexShrink:0,borderRadius:5,border:"1.5px solid "+(sel?"var(--ui-text)":"var(--ui-border-2)"),background:sel?"var(--ui-text)":"transparent",display:"flex",alignItems:"center",justifyContent:"center"}}>{sel&&<I d={["m5 12 4.5 4.5L19 7"]} size={11} c="var(--ui-surface)"/>}</span>
      <span style={{fontWeight:500,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",textDecoration:done?"line-through":"none",opacity:done?0.6:1}}>{r.t}</span>
    </div>
    {!sm&&<span className="muted" style={{fontSize:"var(--ui-fs-sm)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}}>{r.d||"—"}</span>}
    <span className="muted" style={{fontSize:"var(--ui-fs-sm)",fontVariantNumeric:"tabular-nums"}}>{tkFmt(r.due)}</span>
    <span><UIPill>{r.mod}</UIPill></span>
    <TkAvatars who={r.who}/>
    <span><UIPill tone={p.tone} dot>{p.label}</UIPill></span>
    <span className="ico-btn" title="Mais" onClick={e=>e.stopPropagation()}><I d={TK_DOTS} size={16}/></span>
  </div>;
}

function TkCard({r,onOpen,onDrag}){
  return <UICard elevation={0} draggable onDragStart={()=>onDrag(r)} style={{cursor:"grab",padding:14}} onClick={()=>onOpen(r)}>
    <div style={{fontWeight:500,marginBottom:r.d?4:8}}>{r.t}</div>
    {r.d&&<div className="muted" style={{fontSize:"var(--ui-fs-sm)",marginBottom:8,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"}}>{r.d}</div>}
    <div className="row" style={{gap:8,marginBottom:10,flexWrap:"wrap"}}><UIPill>{r.mod}</UIPill><UIPill tone={TK_PRIO[r.prio].tone} dot>{TK_PRIO[r.prio].label}</UIPill></div>
    <div className="row" style={{justifyContent:"space-between"}}>
      <TkAvatars who={r.who}/>
      <div className="row" style={{gap:10}}>
        {r.sub.length>0&&<span className="muted row" style={{gap:4,fontSize:"var(--ui-fs-xs)"}}><I d={["m5 12 4.5 4.5L19 7"]} size={12}/>{r.sub.filter(s=>s[1]).length}/{r.sub.length}</span>}
        <span className="muted" style={{fontSize:"var(--ui-fs-xs)",fontVariantNumeric:"tabular-nums"}}>{tkFmt(r.due)}</span>
      </div>
    </div>
  </UICard>;
}

// Detail drawer — right-hand panel, replaces the thin modal
function TkDetail({r,states,onClose,onMove,onSub,onToggle}){
  if(!r)return null;
  const st=states.find(s=>s.id===r.g)||states[0];
  const meta={fontSize:"var(--ui-fs-sm)"};
  return <UIDrawer open width={460} onClose={onClose}
    header={<span className="row" style={{gap:10}}><UIPill tone={st.tone} dot>{st.label}</UIPill><span className="muted" style={{fontSize:"var(--ui-fs-sm)",fontVariantNumeric:"tabular-nums"}}>#{r.id}</span></span>}
    footer={<React.Fragment><div className="spring"/><UIButton variant="ghost" onClick={onClose}>Fechar</UIButton><UIButton onClick={()=>onToggle(r)}>{r.g==="done"?"Reabrir":"Concluir"}</UIButton></React.Fragment>}>
      <div style={{display:"flex",flexDirection:"column",gap:20}}>
        <div>
          <div style={{fontSize:"var(--ui-fs-h2)",fontWeight:600,letterSpacing:"var(--ui-ls-h2)",lineHeight:1.25}}>{r.t}</div>
          <div className="muted" style={{marginTop:8,fontSize:"var(--ui-fs-body)",lineHeight:1.55}}>{r.d||"Sem descrição."}</div>
        </div>

        <div style={{display:"grid",gridTemplateColumns:"104px minmax(0,1fr)",gap:"12px 14px",alignItems:"center",...meta}}>
          <span className="muted">Prazo</span><span style={{fontVariantNumeric:"tabular-nums"}}>{tkFmt(r.due)}</span>
          <span className="muted">Módulo</span><span><UIPill>{r.mod}</UIPill></span>
          <span className="muted">Prioridade</span><span><UIPill tone={TK_PRIO[r.prio].tone} dot>{TK_PRIO[r.prio].label}</UIPill></span>
          <span className="muted">Responsáveis</span>
          <div className="row" style={{gap:8,flexWrap:"wrap"}}>{r.who.map(n=><span key={n} className="row" style={{gap:8,background:"var(--ui-surface-2)",borderRadius:999,padding:"3px 10px 3px 3px"}}><UIAvatar name={n} size="xs"/><span style={{fontSize:"var(--ui-fs-sm)"}}>{n}</span></span>)}</div>
        </div>

        <div>
          <div className="row" style={{marginBottom:8}}><span style={{fontWeight:600,fontSize:"var(--ui-fs-sm)"}}>Subtarefas</span><div className="spring"/><span className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>{r.sub.filter(s=>s[1]).length}/{r.sub.length}</span></div>
          {r.sub.length?<div style={{display:"flex",flexDirection:"column"}}>{r.sub.map(([label,ok],i)=>
            <div key={i} className="row" style={{gap:10,padding:"8px 0",borderBottom:"1px solid var(--ui-divider)",cursor:"pointer"}} onClick={()=>onSub(r,i)}>
              <span style={{width:16,height:16,flexShrink:0,borderRadius:5,border:"1.5px solid "+(ok?"var(--ui-success)":"var(--ui-border-2)"),background:ok?"var(--ui-success)":"transparent",display:"flex",alignItems:"center",justifyContent:"center"}}>{ok&&<I d={["m5 12 4.5 4.5L19 7"]} size={11} c="#fff"/>}</span>
              <span style={{fontSize:"var(--ui-fs-sm)",textDecoration:ok?"line-through":"none",opacity:ok?0.6:1}}>{label}</span>
            </div>)}</div>
            :<div className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>Sem subtarefas.</div>}
        </div>

        <div>
          <div style={{fontWeight:600,fontSize:"var(--ui-fs-sm)",marginBottom:10}}>Atividade</div>
          <div style={{display:"flex",flexDirection:"column",gap:12}}>{r.act.map(([who,what,when],i)=>
            <div key={i} className="row" style={{gap:10,alignItems:"flex-start"}}>
              <UIAvatar name={who} size="xs"/>
              <div style={{flex:1,minWidth:0,fontSize:"var(--ui-fs-sm)"}}><span style={{fontWeight:600}}>{who}</span> <span className="muted">{what}</span><div className="muted" style={{fontSize:"var(--ui-fs-xs)",marginTop:2}}>{when}</div></div>
            </div>)}</div>
          <div style={{marginTop:12}}><UIInput placeholder="Escrever um comentário…"/></div>
        </div>

        <div>
          <div className="muted" style={{fontSize:"var(--ui-fs-sm)",marginBottom:8}}>Mover para</div>
          <div className="row" style={{gap:8,flexWrap:"wrap"}}>{states.filter(s=>s.id!==r.g).map(s=><UIButton key={s.id} size="sm" variant="outline" onClick={()=>onMove(r,s.id)}>{s.label}</UIButton>)}</div>
        </div>
      </div>
  </UIDrawer>;
}

S.tasks=()=>{
  const [rows,setRows]=React.useState(TK_ROWS);
  const [states,setStates]=React.useState(TK_DEF_STATES);
  const [view,setView]=React.useState("lista");
  const [q,setQ]=React.useState("");
  const [prio,setPrio]=React.useState("all");
  const [openId,setOpenId]=React.useState(null);
  const [fold,setFold]=React.useState([]);
  const [nova,setNova]=React.useState(false);
  const [novoEstado,setNovoEstado]=React.useState(false);
  const [estadoNome,setEstadoNome]=React.useState("");
  const [drag,setDrag]=React.useState(null);
  const [sel,setSel]=React.useState([]);
  const [over,setOver]=React.useState(null);
  const wrap=React.useRef(null);const ww=useWidth(wrap);
  const tier=!ww?"lg":ww<700?"xs":ww<880?"sm":"lg";

  const match=r=>(q===""||(r.t+" "+r.d+" "+r.mod).toLowerCase().includes(q.toLowerCase()))&&(prio==="all"||r.prio===prio);
  const list=rows.filter(match);
  const byG=id=>list.filter(r=>r.g===id);
  const open=rows.find(r=>r.id===openId)||null;
  const toggle=r=>setRows(rs=>rs.map(x=>x.id===r.id?{...x,g:x.g==="done"?"todo":"done"}:x));
  const move=(r,g)=>setRows(rs=>rs.map(x=>x.id===r.id?{...x,g}:x));
  const subToggle=(r,i)=>setRows(rs=>rs.map(x=>x.id===r.id?{...x,sub:x.sub.map((s,j)=>j===i?[s[0],!s[1]]:s)}:x));
  const addState=()=>{const n=estadoNome.trim();if(!n)return;setStates(s=>[...s,{id:"st"+Date.now(),label:n,tone:"neutral"}]);setEstadoNome("");setNovoEstado(false);};
  const pick=r=>setSel(s=>s.includes(r.id)?s.filter(x=>x!==r.id):[...s,r.id]);
  const bulk=g=>{setRows(rs=>rs.map(x=>sel.includes(x.id)?{...x,g}:x));setSel([]);};

  const filters=<div className="row" style={{gap:8,flexWrap:"wrap"}}>
    <div style={{width:200}}><UIInput leading={<I d={P.search} size={15}/>} placeholder="Pesquisar tarefas…" value={q} onChange={e=>setQ(e.target.value)}/></div>
    <UIToggleGroup spacing={0} value={prio} onChange={v=>setPrio(v||"all")} items={[["all","Todas"],["alta","Alta"],["media","Média"],["baixa","Baixa"]].map(([value,label])=>({value,label}))}/>
  </div>;

  // month grid: same language as Calendário (no second calendar idiom)
  const cells=Array.from({length:35},(_,i)=>i-2);
  const tasksOn=day=>list.filter(r=>r.due.m===7&&r.due.day===day);
  const later=list.filter(r=>r.due.m>7);

  return <React.Fragment>
  <Head title="Tarefas" desc={list.length+" tarefas · "+list.filter(r=>r.g!=="done").length+" por concluir"} actions={<UIButton icon={<I d={P.plus} size={16}/>} onClick={()=>setNova(true)}>Nova tarefa</UIButton>}/>
  <UICard style={{padding:0,overflow:"hidden",flex:1,display:"flex",flexDirection:"column"}}>
    <div ref={wrap} style={{flex:1,minHeight:0,display:"flex",flexDirection:"column"}}>
    <div className="row" style={{padding:"12px 16px",borderBottom:"1px solid var(--ui-divider)",gap:16,flexWrap:"wrap"}}>
      <UITabs items={[{value:"lista",label:"Lista"},{value:"quadro",label:"Quadro"},{value:"timeline",label:"Timeline"}]} value={view} onChange={setView}/>
      <div className="spring"/>
      {sel.length>0
        ? <div className="row" style={{gap:8,flexWrap:"wrap"}}>
            <span className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>{sel.length} selecionada{sel.length>1?"s":""}</span>
            {states.map(s=><UIButton key={s.id} size="sm" variant="outline" onClick={()=>bulk(s.id)}>{s.label}</UIButton>)}
            <UIButton size="sm" variant="ghost" onClick={()=>setSel([])}>Limpar</UIButton>
          </div>
        : filters}
    </div>

    {view==="lista"&&<div style={{flex:1,overflow:"auto"}}>
      {states.map(g=>{const items=byG(g.id);const shut=fold.includes(g.id);
        return <div key={g.id}>
          <div className="row" style={{gap:10,padding:"12px 16px",background:"var(--ui-surface-2)",borderBottom:"1px solid var(--ui-divider)",cursor:"pointer"}} onClick={()=>setFold(f=>shut?f.filter(x=>x!==g.id):[...f,g.id])}>
            <I d={[shut?"m9 18 6-6-6-6":"m6 9 6 6 6-6"]} size={14} c="var(--ui-text-3)"/>
            <UIPill tone={g.tone} dot>{g.label}</UIPill>
            <span className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>{items.length}</span>
          </div>
          {!shut&&(items.length?<React.Fragment><TkHeadRow tier={tier}/>{items.map(r=><TkRow key={r.id} r={r} tier={tier} done={r.g==="done"} sel={sel.includes(r.id)} onSel={pick} onOpen={x=>setOpenId(x.id)}/>)}</React.Fragment>
            :<div style={{borderBottom:"1px solid var(--ui-divider)"}}><UIEmptyState compact title="Sem tarefas neste estado" description="Arrasta uma tarefa para aqui ou cria uma nova." action={<UIButton size="sm" variant="outline" onClick={()=>setNova(true)}>Nova tarefa</UIButton>}/></div>)}
        </div>;})}
    </div>}

    {view==="quadro"&&<div style={{flex:1,minHeight:0,display:"flex"}}>
      <UIKanban
        columns={states.map(g=>({id:g.id,name:g.label,color:g.tone==="success"?"var(--ui-success)":g.tone==="warning"?"var(--ui-warning)":g.tone==="info"?"var(--ui-info)":undefined}))}
        items={list.map(r=>({...r,column:r.g}))}
        onItemsChange={next=>setRows(rs=>rs.map(x=>{const n=next.find(y=>y.id===x.id);return n?{...x,g:n.column}:x;}))}
        onItemClick={r=>setOpenId(r.id)}
        onAddItem={()=>setNova(true)}
        onAddColumn={()=>setNovoEstado(true)}
        style={{flex:1,minWidth:0}}
        renderCard={r=><React.Fragment>
          <div style={{fontWeight:500,fontSize:"var(--ui-fs-sm)",lineHeight:1.35,marginBottom:r.d?4:8}}>{r.t}</div>
          {r.d&&<div className="muted" style={{fontSize:"var(--ui-fs-sm)",marginBottom:8,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"}}>{r.d}</div>}
          <div className="row" style={{gap:6,marginBottom:10,flexWrap:"wrap"}}><UIPill>{r.mod}</UIPill><UIPill tone={TK_PRIO[r.prio].tone} dot>{TK_PRIO[r.prio].label}</UIPill></div>
          <div className="row" style={{justifyContent:"space-between",gap:8,flexWrap:"wrap"}}>
            <TkAvatars who={r.who}/>
            <div className="row" style={{gap:10}}>
              {r.sub.length>0&&<span className="muted row" style={{gap:4,fontSize:"var(--ui-fs-xs)"}}><I d={["m5 12 4.5 4.5L19 7"]} size={12}/>{r.sub.filter(s=>s[1]).length}/{r.sub.length}</span>}
              <span className="muted" style={{fontSize:"var(--ui-fs-xs)",fontVariantNumeric:"tabular-nums"}}>{tkFmt(r.due)}</span>
            </div>
          </div>
        </React.Fragment>}/>
      {novoEstado&&<div style={{width:220,flexShrink:0,padding:12,background:"var(--ui-surface-2)"}}>
        <UICard elevation={0} style={{padding:12}}>
          <UIInput autoFocus placeholder="Nome do estado" value={estadoNome} onChange={e=>setEstadoNome(e.target.value)} onKeyDown={e=>{if(e.key==="Enter")addState();if(e.key==="Escape")setNovoEstado(false);}}/>
          <div className="row" style={{gap:8,marginTop:10}}><UIButton size="sm" onClick={addState}>Criar</UIButton><UIButton size="sm" variant="ghost" onClick={()=>setNovoEstado(false)}>Cancelar</UIButton></div>
        </UICard>
      </div>}
    </div>}

    {view==="timeline"&&<div style={{flex:1,overflow:"auto",padding:16}}>
      <div className="row" style={{marginBottom:12}}><span style={{fontWeight:600}}>{TK_MONTH}</span><div className="spring"/><span className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>Prazos das tarefas</span></div>
      <div style={{display:"grid",gridTemplateColumns:"repeat(7,minmax(0,1fr))",gap:6}}>
        {["S","T","Q","Q","S","S","D"].map((d,i)=><div key={i} className="muted" style={{textAlign:"center",fontSize:"var(--ui-fs-sm)",fontWeight:600,padding:"4px 0"}}>{d}</div>)}
        {cells.map((d,i)=>{const valid=d>=1&&d<=31;const items=valid?tasksOn(d):[];
          return <div key={i} style={{minHeight:104,borderRadius:"var(--ui-r-sm)",border:"1px solid var(--ui-divider)",padding:8,background:valid?"var(--ui-surface)":"transparent",opacity:valid?1:0.35,display:"flex",flexDirection:"column",gap:4}}>
            {valid&&<React.Fragment>
              <span style={{fontWeight:d===TK_TODAY?700:500,fontSize:"var(--ui-fs-sm)",width:24,height:24,display:"flex",alignItems:"center",justifyContent:"center",borderRadius:999,background:d===TK_TODAY?"var(--ui-accent)":"transparent",color:d===TK_TODAY?"var(--ui-on-accent)":"var(--ui-text)",flexShrink:0}}>{d}</span>
              {items.slice(0,2).map(r=><div key={r.id} onClick={()=>setOpenId(r.id)} title={r.t} style={{cursor:"pointer",fontSize:"var(--ui-fs-xs)",fontWeight:500,padding:"4px 8px",borderRadius:6,background:"var(--ui-surface-2)",borderLeft:"3px solid var(--ui-"+TK_PRIO[r.prio].tone+")",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}}>{r.t}</div>)}
              {items.length>2&&<span className="muted" style={{fontSize:"var(--ui-fs-xs)"}}>+{items.length-2}</span>}
            </React.Fragment>}
          </div>;})}
      </div>
      {later.length>0&&<div style={{marginTop:18}}>
        <div className="muted" style={{fontSize:"var(--ui-fs-sm)",fontWeight:600,marginBottom:8}}>Depois de julho</div>
        <div style={{display:"flex",flexDirection:"column"}}>{later.map(r=>
          <div key={r.id} className="row" style={{gap:12,padding:"8px 0",borderBottom:"1px solid var(--ui-divider)",cursor:"pointer"}} onClick={()=>setOpenId(r.id)}>
            <span style={{width:3,height:22,borderRadius:2,background:"var(--ui-"+TK_PRIO[r.prio].tone+")",flexShrink:0}}/>
            <span style={{fontWeight:500,flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}>{r.t}</span>
            <UIPill>{r.mod}</UIPill>
            <span className="muted" style={{fontSize:"var(--ui-fs-sm)",fontVariantNumeric:"tabular-nums",minWidth:56,textAlign:"right"}}>{tkFmt(r.due)}</span>
          </div>)}</div>
      </div>}
    </div>}
    </div>
  </UICard>

  <TkDetail r={open} states={states}onClose={()=>setOpenId(null)} onMove={(r,g)=>move(r,g)} onSub={subToggle} onToggle={r=>{toggle(r);setOpenId(null);}}/>

  <UIModal open={nova} onClose={()=>setNova(false)} title="Nova tarefa" width={520}
    footer={<div className="row" style={{gap:8}}><div className="spring"/><UIButton variant="ghost" onClick={()=>setNova(false)}>Cancelar</UIButton><UIButton onClick={()=>setNova(false)}>Criar tarefa</UIButton></div>}>
    <div style={{display:"flex",flexDirection:"column",gap:12}}>
      <UIInput label="Título" placeholder="O que precisa de ser feito?"/>
      <UIInput label="Descrição" placeholder="Contexto, critérios de conclusão…"/>
      <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12}}>
        <UIInput label="Prazo" placeholder="dd/mm"/>
        <UIInput label="Módulo" placeholder="Pessoas"/>
      </div>
    </div>
  </UIModal>
  </React.Fragment>;
};
