ELNOR REPO READER TEXT MIRROR Original path: Design Mockups/DOC20 Mockups/Q_ARTIFACT_VIEWER.jsx Source repo: /Users/OpenClaw1/Elnor/Elnor Specs Git branch: main Git commit: dbaa25962edc11ab30e8d4ca1715f9ae5bf77331 Generated: 2026-06-09T01:23:58.539Z --- import { useState, useRef, useCallback, useEffect } from "react"; const font={sans:"'Söhne','Helvetica Neue',-apple-system,BlinkMacSystemFont,sans-serif"}; const R={sm:"6px",md:"10px",lg:"14px",full:"9999px"}; const c={bgApp:"#F8F8F6",bgPanel:"#FFFFFF",bgPanelAlt:"#F9FAFB",bgCard:"#FFFFFF",bgInput:"#EFF1F3",textPri:"#1A1D21",textSec:"#5E6570",textTer:"#8B919A",accentBtn:"#31588c",warn:"#D97706",error:"#B04040",border:"#E0E2E5",borderLight:"#ECEEF0",green:"#2E8B57",agentAv:"#a1a7aa"}; const Ic=({d,size=18,color,sw=1.75})=>; const I={Plus:p=>,X:p=>,Check:p=>,Copy:p=>,FileText:p=>,ExtLink:p=>,Spark:p=>,MsgCircle:p=>,Clock:p=>,ChevD:p=>,Search:p=>,Pin:p=>,Maximize:p=>,Printer:p=>,Save:p=>,Link:p=>,Eye:p=>,Edit:p=>,}; const Dot=({color,size=8})=>; const Btn=({children,primary,ghost,small,onClick,disabled,style:s})=>; const Av=({letter,color,size=20})=>
{letter}
; const TBtn=({icon,title,active,onClick,label,dropdown})=>; const Sep=()=>
; const Toast=({msg,onDone})=>{useEffect(()=>{const t=setTimeout(onDone,2200);return()=>clearTimeout(t)},[onDone]);return
{msg}
}; const DItem=({children,onClick,active})=>; const Radio=({selected,label,desc,onClick})=>; const acDel="#B04040",acIns="#2E8B57"; const agents=[{name:"Elnor",color:c.agentAv,letter:"E"},{name:"Scout",color:"#5B5F97",letter:"S"},{name:"Reviewer",color:"#7C3AED",letter:"R"}]; const chats=[{name:"Henderson discovery",color:c.accentBtn,origin:true},{name:"Quark patent search",color:c.green},{name:"New chat",color:c.textTer}]; const initComments=[ {id:"ac1",author:"You",color:c.accentBtn,body:"Verify Vivendi citation — still good law in this circuit?",time:"10m ago",status:"open",anchor:"See In re Vivendi Universal",replies:[]}, {id:"ac2",author:"You",color:c.accentBtn,body:"Strengthen internal audit section — emphasize scienter.",time:"8m ago",status:"open",anchor:"Internal audit findings from June 2023",replies:[{id:"ar1",author:"Elnor",color:c.agentAv,body:"Can expand with specific audit findings. Cross-ref deposition?",time:"5m ago"}]}, {id:"ac3",author:"You",color:c.accentBtn,body:"Add Bloomberg market loss data.",time:"6m ago",status:"open",anchor:"wiping out approximately $2.3 billion",replies:[]}, ]; const initDiffs=[ {id:"d1",match:"See In re Vivendi Universal",old:"See In re Vivendi Universal, S.A. Sec. Litig., 838 F.3d 223, 246 (2d Cir. 2016).",add:"; see also Omnicare, 575 U.S. 175, 186 (2015).",status:"pending"}, {id:"d2",match:"Internal audit findings from June 2023",old:"Internal audit findings from June 2023 identifying material weaknesses in DataCorp's revenue recognition practices, specifically related to the premature booking of multi-year service contracts.",add:" Audit report (Ex. 47): ~$134M prematurely recognized (15.8%). CFO Chen's note: \"Do NOT share outside exec team.\"",status:"pending"}, {id:"d3",match:"wiping out approximately $2.3 billion",old:"wiping out approximately $2.3 billion in market capitalization.",add:" Stock: $47.82→$31.56 on 12.4M shares (~8x avg).",status:"pending"}, ]; const docLines=[ {t:"h1",v:"Motion for Summary Judgment — Response Brief"}, {t:"h2",v:"I. Introduction"}, {t:"p",v:"Plaintiff Henderson brings this action under Section 10(b) and Rule 10b-5, alleging DataCorp made materially false statements in Q2/Q3 2023 earnings."}, {t:"p",v:"Defendant moves for summary judgment. This motion should be denied."}, {t:"h2",v:"II. Statement of Facts"}, {t:"h3",v:"A. Q2 2023 Earnings"}, {t:"p",v:"On July 15, 2023, DataCorp stated \"revenue growth remains strong.\""}, {t:"h3",v:"B. Internal Documents"}, {t:"li",v:"1. CFO Chen email (June 28): \"Q3 numbers tracking significantly below guidance.\""}, {t:"li",v:"2. Board presentation (July 2): projected Q3 revenue $712M — 16% decline from Q2."}, {t:"li",v:"3. Internal audit findings from June 2023 identifying material weaknesses in DataCorp's revenue recognition practices, specifically related to the premature booking of multi-year service contracts."}, {t:"h3",v:"C. Market Response"}, {t:"p",v:"Actual Q3 results (Oct 15): revenue $698M, stock declined 34%, wiping out approximately $2.3 billion in market capitalization."}, {t:"h2",v:"IV. Argument"}, {t:"p",v:"\"Revenue growth remains strong\" is present fact, not forward-looking. See In re Vivendi Universal, S.A. Sec. Litig., 838 F.3d 223, 246 (2d Cir. 2016)."}, {t:"p",v:"PSLRA safe harbor does not protect statements made with actual knowledge of falsity."}, ]; export default function ArtifactViewer(){ const idC=useRef(200);const nid=()=>"x"+(++idC.current); const [comments,setComments]=useState(initComments); const [diffs,setDiffs]=useState(initDiffs); const [activeComment,setActiveComment]=useState(null); const [bubbleMenu,setBubbleMenu]=useState(null); const [rightOpen,setRightOpen]=useState(true); const [rightTab,setRightTab]=useState("comments"); const [showMarkup,setShowMarkup]=useState(true); const [findBar,setFindBar]=useState(false); const [pinned,setPinned]=useState(false); const [toast,setToast]=useState(null); const [openDrop,setOpenDrop]=useState(null); const [agentIdx,setAgentIdx]=useState(0);const [agentDrop,setAgentDrop]=useState(false); const [chatIdx,setChatIdx]=useState(0);const [chatDrop,setChatDrop]=useState(false); const [sendScope,setSendScope]=useState("full"); const [selectedCmIds,setSelectedCmIds]=useState(new Set()); const [outputMode,setOutputMode]=useState("respond_in_chat"); const [subMode,setSubMode]=useState("revise_artifact"); const [instruction,setInstruction]=useState(""); const [replyingTo,setReplyingTo]=useState(null);const [replyText,setReplyText]=useState(""); const [editingId,setEditingId]=useState(null);const [editText,setEditText]=useState(""); const [deletingId,setDeletingId]=useState(null); const [newCm,setNewCm]=useState(null);const [newCmText,setNewCmText]=useState(""); const editorRef=useRef(null);const cmRef=useRef(null); const agent=agents[agentIdx]; const openC=comments.filter(x=>x.status==="open");const resolvedC=comments.filter(x=>x.status==="resolved"); const pendingDiffs=diffs.filter(d=>d.status==="pending"); const flash=msg=>setToast(msg); const handleMouseUp=useCallback(e=>{if(e.target.closest("[data-bubble]"))return;const sel=window.getSelection();if(!sel||sel.isCollapsed||!sel.toString().trim()){setBubbleMenu(null);return}const text=sel.toString().trim();if(text.length<3)return;const rect=sel.getRangeAt(0).getBoundingClientRect();const er=editorRef.current?.getBoundingClientRect();if(!er)return;setBubbleMenu({x:rect.left-er.left+rect.width/2,y:rect.top-er.top-8,text})},[]); const dismissBubble=()=>{setBubbleMenu(null);window.getSelection()?.removeAllRanges()}; const startComment=()=>{if(!bubbleMenu)return;setNewCm({text:bubbleMenu.text});setBubbleMenu(null);setRightOpen(true);setRightTab("comments");setTimeout(()=>cmRef.current?.focus(),100)}; const addComment=()=>{if(!newCmText.trim())return;const cm={id:nid(),author:"You",color:c.accentBtn,body:newCmText.trim(),time:"just now",status:"open",anchor:newCm?.text||null,replies:[]};setComments(p=>[...p,cm]);setNewCm(null);setNewCmText("");setActiveComment(cm.id)}; const addReply=cmId=>{if(!replyText.trim())return;setComments(p=>p.map(cm=>cm.id===cmId?{...cm,replies:[...cm.replies,{id:nid(),author:"You",color:c.accentBtn,body:replyText.trim(),time:"just now"}]}:cm));setReplyingTo(null);setReplyText("")}; const saveEdit=id=>{if(!editText.trim())return;setComments(p=>p.map(cm=>cm.id===id?{...cm,body:editText.trim()}:cm));setEditingId(null)}; const doDelete=id=>{setComments(p=>p.filter(cm=>cm.id!==id));setDeletingId(null)}; const resolveComment=id=>{setComments(p=>p.map(cm=>cm.id===id?{...cm,status:"resolved"}:cm));if(activeComment===id)setActiveComment(null)}; const reopenComment=id=>setComments(p=>p.map(cm=>cm.id===id?{...cm,status:"open"}:cm)); const acceptDiff=id=>setDiffs(d=>d.map(x=>x.id===id?{...x,status:"accepted"}:x)); const rejectDiff=id=>setDiffs(d=>d.map(x=>x.id===id?{...x,status:"rejected"}:x)); const acceptAll=()=>{setDiffs(d=>d.map(x=>x.status==="pending"?{...x,status:"accepted"}:x));flash("All accepted")}; const rejectAll=()=>{setDiffs(d=>d.map(x=>x.status==="pending"?{...x,status:"rejected"}:x));flash("All rejected")}; const toggleCmSelect=id=>{const s=new Set(selectedCmIds);s.has(id)?s.delete(id):s.add(id);setSelectedCmIds(s)}; const handleSend=()=>{if(outputMode==="respond_in_chat"){flash(`Opening "${chats[chatIdx].name}" with ref:artifact:a1…`)}else{if(!instruction.trim())return;flash(`${agent.name}: ${subMode} (ref:artifact:a1)…`)}}; const renderLine=(line,i)=>{ const diff=diffs.find(d=>line.v.includes(d.match)); const hasCm=openC.some(cm=>cm.anchor&&line.v.includes(cm.anchor.slice(0,25))); const isAct=activeComment&&comments.find(cm=>cm.id===activeComment)?.anchor&&line.v.includes((comments.find(cm=>cm.id===activeComment)?.anchor||"").slice(0,25)); const hl=isAct?{backgroundColor:c.accentBtn+"18",borderRadius:3,padding:"2px 4px",margin:"-2px -4px",boxShadow:`inset 0 0 0 1.5px ${c.accentBtn}40`}:hasCm?{backgroundColor:c.accentBtn+"08",borderRadius:3,padding:"1px 3px",margin:"-1px -3px"}:{}; if(diff&&diff.status==="pending"&&showMarkup){const idx=line.v.indexOf(diff.old);if(idx===-1)return plain(line,i,hl);const bef=line.v.slice(0,idx),aft=line.v.slice(idx+diff.old.length);const el={bef}{diff.old}{diff.old}{diff.add}{" "}{agent.name}{aft};return line.t==="li"?
{el}
:

{el}

} if(diff&&(diff.status==="accepted"||(diff.status==="pending"&&!showMarkup)))return plain({...line,v:line.v.replace(diff.old,diff.old+diff.add)},i,hl); return plain(line,i,hl); }; const plain=(line,i,hl={})=>{const s={marginBottom:8,...hl};if(line.t==="h1")return

{line.v}

;if(line.t==="h2")return

{line.v}

;if(line.t==="h3")return

{line.v}

;if(line.t==="li")return
{line.v}
;return

{line.v}

}; // Comment card with Spark icon in the action row (bottom), full opacity const CmCard=({cm,resolved})=>{const isAct=activeComment===cm.id;return
setActiveComment(isAct?null:cm.id)}>
{cm.anchor&&
"{cm.anchor.slice(0,55)}"
}
{cm.author}{cm.time}
{editingId===cm.id?
e.stopPropagation()}>