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 — inline, not absolute ───
const DragHandle=()=>
e.currentTarget.style.opacity=0.55} onMouseLeave={e=>e.currentTarget.style.opacity=0.18}>
;
// ─── 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"}} 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}}>
{e.stopPropagation();deleteBlock(block.id)}} title="Delete block" style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}} onMouseEnter={e=>e.currentTarget.style.color=c.error} onMouseLeave={e=>e.currentTarget.style.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.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
{const d=e.currentTarget.querySelector("[data-del]");if(d)d.style.opacity=0.4}} onMouseLeave={e=>{const d=e.currentTarget.querySelector("[data-del]");if(d)d.style.opacity=0}}>
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"}
deleteBlock(block.id)} style={{opacity:0,border:"none",background:"none",cursor:"pointer",padding:2,display:"flex",color:c.textTer,flexShrink:0,marginTop:6,transition:"opacity 0.1s"}} title="Delete block">
;
// 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}`}}>
{editingTitle===block.id? {setBlocks(p=>p.map(b=>b.id===block.id?{...b,title:e.target.value||block.title}:b));setEditingTitle(null)}} onKeyDown={e=>{if(e.key==="Enter"){setBlocks(p=>p.map(b=>b.id===block.id?{...b,title:e.target.value||block.title}:b));setEditingTitle(null)}if(e.key==="Escape")setEditingTitle(null)}} onClick={e=>e.stopPropagation()} style={{flex:1,fontSize:12.5,fontWeight:700,border:`1px solid ${c.accentBtn}40`,borderRadius:3,padding:"1px 6px",outline:"none",fontFamily:font.sans,backgroundColor:c.bgCard}}/>
:{e.stopPropagation();setEditingTitle(block.id)}}>{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}}>
{e.stopPropagation();deleteBlock(block.id)}} title="Delete block" style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}} onMouseEnter={e=>e.currentTarget.style.color=c.error} onMouseLeave={e=>e.currentTarget.style.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?.map(s=>
toggleSub(block.id,task.id,s.id)} style={{width:13,height:13,accentColor:c.accentBtn}}/>
{s.text}
)}
{/* Add subtask input */}
setNewSubText(p=>({...p,[task.id]:e.target.value}))} placeholder="Add subtask…" onKeyDown={e=>{if(e.key==="Enter")addSubtask(block.id,task.id,newSubText[task.id]||"")}} style={{flex:1,border:"none",borderBottom:`1px solid ${c.borderLight}`,outline:"none",fontSize:12,fontFamily:font.sans,color:c.textPri,backgroundColor:"transparent",padding:"2px 0"}}/>
{/* Action row */}
flash(`Opening chat with ref to task "${task.text.slice(0,30)}…"`)}>@Elnor
flash(task.link?`Open "${task.link}"`:"Link note…")}>{task.link?"Open Note":"Link Note"}
}
)}
{/* Add new task — real input */}
setNewTaskText(e.target.value)} placeholder="Add task…" onKeyDown={e=>{if(e.key==="Enter"){addTask(block.id,newTaskText)}}} style={{flex:1,border:"none",borderBottom:`1px solid ${c.borderLight}`,outline:"none",fontSize:13.5,fontFamily:font.sans,color:c.textPri,backgroundColor:"transparent",padding:"2px 0"}}/>
{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}`}}>
{editingTitle===block.id? {setBlocks(p=>p.map(b=>b.id===block.id?{...b,title:e.target.value||block.title}:b));setEditingTitle(null)}} onKeyDown={e=>{if(e.key==="Enter"){setBlocks(p=>p.map(b=>b.id===block.id?{...b,title:e.target.value||block.title}:b));setEditingTitle(null)}if(e.key==="Escape")setEditingTitle(null)}} onClick={e=>e.stopPropagation()} style={{flex:1,fontSize:12.5,fontWeight:700,border:`1px solid ${c.accentBtn}40`,borderRadius:3,padding:"1px 6px",outline:"none",fontFamily:font.sans,backgroundColor:c.bgCard}}/>
:{e.stopPropagation();setEditingTitle(block.id)}}>{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}}>
{e.stopPropagation();deleteBlock(block.id)}} title="Delete block" style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}} onMouseEnter={e=>e.currentTarget.style.color=c.error} onMouseLeave={e=>e.currentTarget.style.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"}} 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}
{e.stopPropagation();deleteBlock(block.id)}} title="Delete block" style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}} onMouseEnter={e=>e.currentTarget.style.color=c.error} onMouseLeave={e=>e.currentTarget.style.color=c.textTer}>
;
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}" }
{e.stopPropagation();deleteBlock(block.id)}} title="Delete block" style={{border:"none",background:"none",cursor:"pointer",padding:1,display:"flex",color:c.textTer}} onMouseEnter={e=>e.currentTarget.style.color=c.error} onMouseLeave={e=>e.currentTarget.style.color=c.textTer}>
{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"}}>
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
}
{/* 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={showMarkup?"Markup":"Clean"} active={showMarkup} onClick={()=>setShowMarkup(!showMarkup)}/>
} 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 */}
);
}