From fa21a6b767a61c1e2fdc2344eb6a6539e7b3a13c Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 14:02:10 +0000 Subject: [PATCH 1/6] fix: InlineTags input menor para caber no mobile sem cortar texto --- src/components/process/InlineTags.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/process/InlineTags.jsx b/src/components/process/InlineTags.jsx index 011cca6..3be6df8 100644 --- a/src/components/process/InlineTags.jsx +++ b/src/components/process/InlineTags.jsx @@ -26,7 +26,7 @@ export function InlineTags({ process, onUpdate }) { onKeyDown={e=>{ if(e.key==="Enter"){e.preventDefault();addTag();} }} onBlur={addTag} placeholder="+ tag" - style={{ padding:"3px 10px", borderRadius:6, border:"1px dashed var(--border-md)", background:"transparent", color:"var(--t2)", fontSize:12, fontFamily:"'JetBrains Mono',monospace", outline:"none", width:64, textAlign:"center" }} + style={{ padding:"3px 8px", borderRadius:6, border:"1px dashed var(--border-md)", background:"transparent", color:"var(--t2)", fontSize:11, fontFamily:"'JetBrains Mono',monospace", outline:"none", width:60, textAlign:"center", minWidth:0, boxSizing:"border-box" }} /> ); From 9a9bf8102665659361966f35c4c257b80486df4b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 3 Jun 2026 16:45:21 +0000 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20VagaTab=20=E2=80=94=20cards=20unifo?= =?UTF-8?q?rmes=20com=20accordion=20abre/fecha?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/tabs/VagaTab.jsx | 227 +++++++++++++++++--------------- 1 file changed, 118 insertions(+), 109 deletions(-) diff --git a/src/components/tabs/VagaTab.jsx b/src/components/tabs/VagaTab.jsx index 430adfb..c277d96 100644 --- a/src/components/tabs/VagaTab.jsx +++ b/src/components/tabs/VagaTab.jsx @@ -66,7 +66,38 @@ function DatePicker({ value, onChange, diff, urgent, soon }) { ); } +function Chevron({ open }) { + return ( + + + + ); +} + +function AccordionCard({ icon, title, badge, open, onToggle, children }) { + return ( +
+ + {open && ( +
+ {children} +
+ )} +
+ ); +} + export function VagaTab({ process, onUpdate, onDelete, isMobile }) { + const [open, setOpen] = useState({ next: true, vaga: true, notes: true }); const [editingField, setEditingField] = useState(null); const [drafts, setDrafts] = useState({}); const [meetingType, setMeetingType] = useState(() => { @@ -85,6 +116,8 @@ export function VagaTab({ process, onUpdate, onDelete, isMobile }) { const urgent = diff !== null && diff >= 0 && diff <= 2; const soon = diff !== null && diff >= 0 && diff <= 7 && !urgent; + const toggle = (key) => setOpen(prev => ({ ...prev, [key]: !prev[key] })); + const saveField = (field, value) => { setEditingField(null); setDrafts(prev => { const n = {...prev}; delete n[field]; return n; }); @@ -144,136 +177,112 @@ export function VagaTab({ process, onUpdate, onDelete, isMobile }) { const col2 = isMobile ? "1fr" : "1fr 1fr"; const col3 = isMobile ? "1fr 1fr" : "1fr 1fr 1fr"; - const sectionStyle = { - borderRadius:12, border:"1px solid var(--border)", background:"var(--bg-o)", - }; - const sectionHeader = { - padding:"10px 14px", borderBottom:"1px solid var(--border)", - display:"flex", alignItems:"center", gap:6, - }; - const sectionBody = { - padding: isMobile ? "12px 12px" : "14px 16px", - display:"flex", flexDirection:"column", gap:12, - }; + const nextBadge = urgent ? ( + URGENTE + ) : soon ? ( + EM BREVE + ) : process.nextStepDate ? ( + {fmtDate(process.nextStepDate)} + ) : null; return (
-
+
{/* ── Próxima etapa ─────────────────────────────────────── */} -
-
- - Próxima etapa - {urgent && URGENTE} - {soon && EM BREVE} + toggle("next")}> + onUpdate({...process,nextStepDate:val||null})} diff={diff} urgent={urgent} soon={soon} /> +
+
Tipo de etapa
+
+ {MEETING_TYPES.map(mt => { + const on = meetingType === mt.id; + return ( + + ); + })} +
+
+
+
Descrição / instrução
+ onUpdate({...process,nextStepNote:e.target.value})} + placeholder="Ex: Entrevista técnica com o time de plataforma" style={{ ...T.input }} /> +
+
+ + {/* ── Dados da vaga ─────────────────────────────────────── */} + toggle("vaga")}> +
+ + +
+
+ + +
+
Origem
+
+ {[{value:"inbound",label:"Inbound"},{value:"outbound",label:"Outbound"}].map(opt => ( + + ))} +
+
-
- onUpdate({...process,nextStepDate:val||null})} diff={diff} urgent={urgent} soon={soon} /> + {(process.origin||"inbound")==="inbound" && (
-
Tipo de etapa
+
Canal
- {MEETING_TYPES.map(mt => { - const on = meetingType === mt.id; + {CONTACT_CHANNELS.map(ch => { + const on = (process.channel||"")===ch.value; return ( - ); })}
-
-
Descrição / instrução
- onUpdate({...process,nextStepNote:e.target.value})} - placeholder="Ex: Entrevista técnica com o time de plataforma" style={{ ...T.input }} /> -
-
-
- - {/* ── Dados da vaga ─────────────────────────────────────── */} -
-
- - Dados da vaga -
-
+ )} +
- - -
-
- - -
-
Origem
-
- {[{value:"inbound",label:"Inbound"},{value:"outbound",label:"Outbound"}].map(opt => ( - - ))} -
-
+ +
- {(process.origin||"inbound")==="inbound" && ( -
-
Canal
-
- {CONTACT_CHANNELS.map(ch => { - const on = (process.channel||"")===ch.value; - return ( - - ); - })} -
-
+ + {process.jobUrl && /^https?:\/\//i.test(process.jobUrl) && ( + + Abrir vaga → + )} -
-
- - -
- - {process.jobUrl && /^https?:\/\//i.test(process.jobUrl) && ( - - Abrir vaga → - - )} -
-
-
Tags
- -
-
+
+
Tags
+ +
+ {/* ── Anotações ──────────────────────────────────────────── */} -
-
- - Anotações -
-
- {contextMsg && ( -
-
Contexto inicial
-
- {contextMsg.slice(0,200)}{contextMsg.length>200?"…":""} -
+ toggle("notes")}> + {contextMsg && ( +
+
Contexto inicial
+
+ {contextMsg.slice(0,200)}{contextMsg.length>200?"…":""}
- )} -