setHover(true)} onMouseLeave={()=>{if(inserterAt!==idx)setHover(false)}}>
{(hover||inserterAt===idx)&&<>
setInserterAt(inserterAt===idx?null:idx)} style={{position:"relative",zIndex:2,width:20,height:20,borderRadius:"50%",border:`1.5px solid ${c.accentBtn}40`,backgroundColor:c.bgCard,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 1px 4px rgba(0,0,0,0.08)"}}> >}
{inserterAt===idx&&
insertBlock(idx,"text")}>Text
insertBlock(idx,"tasks")}>Task List
insertBlock(idx,"feed")}>Activity Feed
insertBlock(idx,"thread")}>@Elnor Thread
insertBlock(idx,"bar")}>Notice / Alert Bar
}
;
};
// ─── Drag Handle ───
const DragHandle=()=>
e.currentTarget.style.opacity=0.6} onMouseLeave={e=>e.currentTarget.style.opacity=0.25}>
;
// ─── Module Header Bar (for collapsed state) ───
const ModuleBar=({block,icon,count,extra})=>
toggleBlock(block.id)} style={{display:"flex",alignItems:"center",gap:6,padding:"6px 10px",borderRadius:R.sm,border:`1px solid ${c.borderLight}`,backgroundColor:c.bgPanelAlt,cursor:"pointer",position:"relative"}} onMouseEnter={e=>e.currentTarget.style.borderColor=c.accentBtn+"30"} onMouseLeave={e=>e.currentTarget.style.borderColor=c.borderLight}>
{icon}
{block.title}
{count!==undefined&&
{count} }
{extra}
{e.stopPropagation();flash(`Configure "${block.title}"…`)}} style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}}>
;
// ─── Render blocks ───
const renderBlock=(block,idx)=>{
// CONFIGURABLE BAR — generic block with Ask Elnor to configure/update
if(block.type==="bar") return
{block.icon==="mail"&&}
{block.icon==="bell"&&}
{block.icon==="zap"&&}
{block.icon==="calendar"&&}
{!block.icon&&}
{block.title}
{block.time&&{block.time} }
flash(`Opening chat with reference to block:${block.id} — Elnor can update this bar per your instructions`)} title="Ask Elnor about this block" style={{padding:"2px 7px",borderRadius:R.sm,border:`1px solid ${c.agentAv}40`,backgroundColor:c.agentAv+"10",cursor:"pointer",display:"flex",alignItems:"center",gap:3,fontSize:10,fontFamily:font.sans,color:c.agentAv,fontWeight:600}}>Elnor
dismissAlert(block.id)} title="Dismiss" style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}}>
;
// TEXT
if(block.type==="text") return
setBlocks(p=>p.map(b=>b.id===block.id?{...b,content:e.target.textContent}:b))}>{block.content||"Type here… @Elnor to ask, /slash for commands"}
;
// TASKS
if(block.type==="tasks"){
const active=block.tasks.filter(t=>!t.done);const done=block.tasks.filter(t=>t.done);
if(block.collapsed) return
} count={`${active.length} open`}/>
;
return
toggleBlock(block.id)} style={{display:"flex",alignItems:"center",gap:6,padding:"7px 10px",backgroundColor:c.bgPanelAlt,cursor:"pointer",borderBottom:`1px solid ${c.borderLight}`}}>
{block.title}
{active.length} open
{e.stopPropagation();flash(`Configure "${block.title}"…`)}} style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}}>
{active.map(task=>
setExpandedTask(expandedTask===task.id?null:task.id)}>
toggleTask(block.id,task.id)} onClick={e=>e.stopPropagation()} style={{width:15,height:15,accentColor:c.accentBtn,flexShrink:0}}/>
{task.text}
{task.due&&{task.due} }
{task.link&&{e.stopPropagation();flash(`Open "${task.link}"`)}}>Note }
{task.sub?.length>0&&{task.sub.filter(s=>s.done).length}/{task.sub.length} }
{expandedTask===task.id&&task.sub?.length>0&&
{task.sub.map(s=>
toggleSub(block.id,task.id,s.id)} style={{width:13,height:13,accentColor:c.accentBtn}}/>
{s.text}
)}
flash("@Elnor…")}>@Elnor
Subtask
flash(task.link?`Open "${task.link}"`:"Link note…")}>{task.link?"Open":"Link"}
}
)}
{/* Add task */}
{if(e.target.textContent==="Add task…")e.target.textContent=""}} onBlur={e=>{if(!e.target.textContent.trim())e.target.textContent="Add task…"}}>Add task…
{done.length>0&&
Done ({done.length})
{done.map(t=>
toggleTask(block.id,t.id)} style={{width:14,height:14,accentColor:c.accentBtn}}/>
{t.text}
)}
}
;
}
// FEED
if(block.type==="feed"){
const totalItems=block.sections.reduce((a,s)=>a+s.items.length,0);
if(block.collapsed) return
} count={`${totalItems} items`} extra={● live }/>
;
return
toggleBlock(block.id)} style={{display:"flex",alignItems:"center",gap:6,padding:"7px 10px",backgroundColor:c.bgPanelAlt,cursor:"pointer",borderBottom:`1px solid ${c.borderLight}`}}>
{block.title}
● auto-updating
{totalItems}
{e.stopPropagation();flash(`Configure "${block.title}"…`)}} style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}}>
{block.sections.map(sec=>
toggleFeedSection(sec.key)} style={{display:"flex",alignItems:"center",gap:5,padding:"3px 4px",cursor:"pointer"}}>
{feedIcons[sec.icon]||
}
{sec.label}
({sec.items.length})
{!collapsedFeeds.has(sec.key)&&sec.items.map((item,i)=>
▹
{item.accent&&}
{item.text}
{item.time}
)}
)}
;
}
// THREAD
if(block.type==="thread"){
if(block.collapsed) return
toggleBlock(block.id)} style={{display:"flex",alignItems:"center",gap:6,padding:"6px 10px",borderRadius:R.sm,border:`1px solid ${c.borderLight}`,backgroundColor:c.bgPanelAlt,cursor:"pointer",position:"relative"}} onMouseEnter={e=>e.currentTarget.style.borderColor=c.accentBtn+"30"} onMouseLeave={e=>e.currentTarget.style.borderColor=c.borderLight}>
Elnor · {block.messages.length} messages
{block.messages[block.messages.length-1]?.time}
;
return
toggleBlock(block.id)} style={{padding:"5px 12px",display:"flex",alignItems:"center",gap:6,cursor:"pointer",backgroundColor:c.accentBtn+"06",borderBottom:`1px solid ${c.accentBtn}15`}}>
Thread · {block.messages.length}
{block.contextQuote&&re: "{block.contextQuote}" }
{block.messages.map((msg,i)=>
{msg.author}
{msg.time}
{msg.author==="You"&&<>edit delete >}
{msg.body}
)}
{threadReplyId===block.id?
:
{setThreadReplyId(block.id);setThreadReplyText("")}} style={{display:"flex",alignItems:"center",gap:5,padding:"4px 8px",borderRadius:R.sm,border:`1px solid ${c.border}`,backgroundColor:c.bgCard,cursor:"text"}}>Reply… @Elnor
}
;
}
return null;
};
return (
{setOpenDrop(null);setInserterAt(null)}}>
{toast&&
setToast(null)}/>}
{/* SIDEBAR RAIL */}
Q
setBrowserOpen(!browserOpen)} title="Browser (⌘B)" style={{width:28,height:28,borderRadius:R.sm,border:"none",cursor:"pointer",backgroundColor:browserOpen?"#ffffff18":"transparent",color:browserOpen?"#fff":"#777",display:"flex",alignItems:"center",justifyContent:"center"}}>
setNoteListOpen(!noteListOpen)} title="Notes" style={{width:28,height:28,borderRadius:R.sm,border:"none",cursor:"pointer",backgroundColor:noteListOpen?"#ffffff18":"transparent",color:noteListOpen?"#fff":"#777",display:"flex",alignItems:"center",justifyContent:"center"}}>
setCommentsOpen(!commentsOpen)} title="Comments" style={{width:28,height:28,borderRadius:R.sm,border:"none",cursor:"pointer",backgroundColor:commentsOpen?"#ffffff18":"transparent",color:commentsOpen?"#fff":"#777",display:"flex",alignItems:"center",justifyContent:"center"}}>
{/* BROWSER placeholder */}
{browserOpen&&
Browser setBrowserOpen(false)} style={{border:"none",background:"none",cursor:"pointer",display:"flex",color:c.textTer}}>
Q_BROWSER_R13.jsx plugs in here260px · collapsible
}
{/* NOTES SIDEBAR placeholder */}
{noteListOpen&&!fullScreen&&
Notes setNoteListOpen(false)} style={{border:"none",background:"none",cursor:"pointer",display:"flex",color:c.textTer}}>
{/* Pinned Today */}
Today — Wed, Mar 18
just now · 5 tasks · live
{["Henderson Tasks","Weekly Review"].map((n,i)=>
e.currentTarget.style.backgroundColor=c.bgInput} onMouseLeave={e=>e.currentTarget.style.backgroundColor="transparent"}>
{n}
{["1d","3d"][i]}
)}
{["Henderson Discovery Priorities","Judge Chen Notes","Privilege Checklist"].map((n,i)=>
e.currentTarget.style.backgroundColor=c.bgInput} onMouseLeave={e=>e.currentTarget.style.backgroundColor="transparent"}>
{n}
{["2h","3d","1d"][i]}{i===0&&" · 💬2"}
)}
12 notes · Modified
}
{/* MAIN WORKSPACE */}
{/* Toolbar (from Q_NOTES_FULL) */}
Paragraph H1 H2
B}/>I}/>U}/>
}/>}/>
} title="Copy" onClick={()=>flash("Copied")}/>
} label="Save As…" dropdown onClick={e=>{e.stopPropagation();setOpenDrop(openDrop==="save"?null:"save")}}/>
{openDrop==="save"&&e.stopPropagation()} style={{position:"absolute",top:28,left:0,backgroundColor:c.bgCard,border:`1px solid ${c.border}`,borderRadius:R.sm,boxShadow:"0 8px 24px rgba(0,0,0,0.12)",zIndex:999,minWidth:180,padding:4}}>
{flash("Export MD");setOpenDrop(null)}}>Export as Markdown
{flash("Export DOCX");setOpenDrop(null)}}>Export as DOCX
{flash("Export PDF");setOpenDrop(null)}}>Export as PDF
{flash("Save as Prompt");setOpenDrop(null)}}>Save as Prompt
}
} label="Ref" onClick={()=>flash("Ref copied")}/>
} active={findBar} onClick={()=>setFindBar(!findBar)}/>} active={fullScreen} onClick={()=>setFullScreen(!fullScreen)}/>
} label="2" active={commentsOpen&&rightTab==="comments"} onClick={()=>{if(commentsOpen&&rightTab==="comments")setCommentsOpen(false);else{setCommentsOpen(true);setRightTab("comments")}}}/>
} label="Markup" active/>
} label="0 ▾"/>
Saved just now
{if(commentsOpen&&rightTab==="send")setCommentsOpen(false);else{setCommentsOpen(true);setRightTab("send")}}} style={{padding:"3px 10px",borderRadius:R.sm,border:`1px solid ${c.accentBtn}40`,backgroundColor:(commentsOpen&&rightTab==="send")?c.accentBtn:c.accentBtn+"08",cursor:"pointer",display:"flex",alignItems:"center",gap:4,color:(commentsOpen&&rightTab==="send")?"#fff":c.accentBtn,fontFamily:font.sans,fontSize:10.5,fontWeight:600,height:26}}>Send to Agent
{findBar&&0/0 setFindBar(false)} style={{padding:2,border:"none",cursor:"pointer",backgroundColor:"transparent",display:"flex",color:c.textTer}}>
}
{/* CONTENT */}
{if(bubbleMenu&&!e.target.closest("[data-bubble]"))setBubbleMenu(null)}}>
{/* Title */}
Today — Wednesday, March 18
Pinned · Auto-updating · Configurable modules
flash("Configure workspace template…")} style={{border:`1px solid ${c.borderLight}`,borderRadius:3,backgroundColor:"transparent",cursor:"pointer",padding:"1px 6px",fontSize:9,color:c.textTer,fontFamily:font.sans,display:"flex",alignItems:"center",gap:2,marginLeft:4}}>Configure
{/* Render all blocks with inserters between them */}
{blocks.map((block,idx)=>
{renderBlock(block,idx)}
)}
{/* Slash command hint */}
Hover between blocks to insert · Type /todo /feed /thread · Type @Elnor anywhere
{/* Bubble menu */}
{bubbleMenu&&
{flash("Comment…");dismissBubble()}} style={{padding:"5px 10px",borderRadius:R.sm,border:"none",cursor:"pointer",backgroundColor:c.accentBtn,color:"#fff",fontSize:11,fontWeight:600,fontFamily:font.sans,display:"flex",alignItems:"center",gap:4}}>Comment
{agent.name}
{flash(`Ask ${agent.name} inline…`);dismissBubble()}} style={{padding:"5px 8px",borderRadius:R.sm,border:"none",cursor:"pointer",backgroundColor:"transparent",color:c.textSec,fontSize:11,fontFamily:font.sans,display:"flex",alignItems:"center",gap:3}} onMouseEnter={e=>e.currentTarget.style.backgroundColor=c.bgInput} onMouseLeave={e=>e.currentTarget.style.backgroundColor="transparent"}>Ask inline
{["Rewrite","Expand","Shorten"].map(a=>
{flash(`${agent.name}: ${a}…`);dismissBubble()}} style={{padding:"5px 8px",borderRadius:R.sm,border:"none",cursor:"pointer",backgroundColor:"transparent",color:c.textSec,fontSize:11,fontFamily:font.sans}} onMouseEnter={e=>e.currentTarget.style.backgroundColor=c.bgInput} onMouseLeave={e=>e.currentTarget.style.backgroundColor="transparent"}>{a} )}
}
{/* COMMENTS PANEL placeholder */}
{commentsOpen&&!fullScreen&&
setRightTab("comments")} style={{flex:1,padding:"7px 0",border:"none",cursor:"pointer",backgroundColor:rightTab==="comments"?c.bgPanelAlt:c.bgInput,color:rightTab==="comments"?c.accentBtn:c.textTer,fontSize:10.5,fontWeight:rightTab==="comments"?650:450,fontFamily:font.sans,borderBottom:rightTab==="comments"?`2px solid ${c.accentBtn}`:"2px solid transparent",display:"flex",alignItems:"center",justifyContent:"center",gap:3}}>Comments
setRightTab("send")} style={{flex:1,padding:"7px 0",border:"none",cursor:"pointer",backgroundColor:rightTab==="send"?c.bgPanel:c.bgInput,color:rightTab==="send"?c.accentBtn:c.textTer,fontSize:10.5,fontWeight:rightTab==="send"?650:450,fontFamily:font.sans,borderBottom:rightTab==="send"?`2px solid ${c.accentBtn}`:"2px solid transparent",display:"flex",alignItems:"center",justifyContent:"center",gap:3}}>Send to Agent
setCommentsOpen(false)} style={{width:26,border:"none",cursor:"pointer",backgroundColor:"transparent",display:"flex",alignItems:"center",justifyContent:"center",color:c.textTer}}>
Comments + Send to Agent from Q_NOTES_FULL.jsx plugs in here@mention support in specs
}
{/* CHAT INDICATOR */}
);
}