Streamline board chrome and case report
This commit is contained in:
@@ -27,6 +27,7 @@ async function waitForSave(page: Page, action: () => Promise<void>) {
|
|||||||
test('move, folder expansion, empty-board pan, desktop wheel zoom, mobile pinch, and reload persistence', async ({ page }) => {
|
test('move, folder expansion, empty-board pan, desktop wheel zoom, mobile pinch, and reload persistence', async ({ page }) => {
|
||||||
await page.goto('/?level=e2e-level&edit=1')
|
await page.goto('/?level=e2e-level&edit=1')
|
||||||
await expect(page.getByRole('heading', { name: 'Browser Safety Test' })).toBeVisible()
|
await expect(page.getByRole('heading', { name: 'Browser Safety Test' })).toBeVisible()
|
||||||
|
await expect(page.locator('.case-heading')).toHaveText('Browser Safety Test')
|
||||||
await expect(page.getByRole('button', { name: 'ADMIN', exact: true })).toBeVisible()
|
await expect(page.getByRole('button', { name: 'ADMIN', exact: true })).toBeVisible()
|
||||||
expect((await page.locator('.menubar nav > button, .menubar nav > .admin-menu > button').allTextContents()).map(label => label.replace(/\d+$/, ''))).toEqual(['EVIDENCE', 'BRIEF', 'HELP', 'ADMIN'])
|
expect((await page.locator('.menubar nav > button, .menubar nav > .admin-menu > button').allTextContents()).map(label => label.replace(/\d+$/, ''))).toEqual(['EVIDENCE', 'BRIEF', 'HELP', 'ADMIN'])
|
||||||
await expect(page.getByRole('button', { name: 'Timeline settings', exact: true })).toBeVisible()
|
await expect(page.getByRole('button', { name: 'Timeline settings', exact: true })).toBeVisible()
|
||||||
|
|||||||
+26
-12
@@ -612,7 +612,7 @@ export function App() {
|
|||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<div className="board-shell" onDragEnter={e => { if (e.dataTransfer.types.includes('Files')) { e.preventDefault(); setDraggingFiles(true) } }} onDragOver={e => { e.preventDefault(); e.dataTransfer.dropEffect = 'copy' }} onDragLeave={e => { if (!e.currentTarget.contains(e.relatedTarget as Node)) setDraggingFiles(false) }} onDrop={e => { e.preventDefault(); if (e.dataTransfer.files.length) void uploadFiles(e.dataTransfer.files) }}>
|
<div className="board-shell" onDragEnter={e => { if (e.dataTransfer.types.includes('Files')) { e.preventDefault(); setDraggingFiles(true) } }} onDragOver={e => { e.preventDefault(); e.dataTransfer.dropEffect = 'copy' }} onDragLeave={e => { if (!e.currentTarget.contains(e.relatedTarget as Node)) setDraggingFiles(false) }} onDrop={e => { e.preventDefault(); if (e.dataTransfer.files.length) void uploadFiles(e.dataTransfer.files) }}>
|
||||||
<div className="case-heading"><div><small>{requestedEditMode && caseState.editingAllowed ? 'AUTHORING LEVEL' : 'ACTIVE INVESTIGATION'}</small><h1>{caseState.title}</h1><p>{caseState.subtitle || caseState.id.toUpperCase()}</p></div><div className="case-number">{requestedEditMode && caseState.editingAllowed ? 'DRAFT' : 'CASE'}<br/><b>{caseState.levelStatus?.toUpperCase() || 'ACTIVE'}</b></div></div>
|
<div className="case-heading"><h1>{caseState.title}</h1></div>
|
||||||
<Board state={caseState} selected={selected} locatorDocumentId={docsOpen && documents.some(document => document.id === selected) ? selected : null} linkFrom={linkFrom} recentlyCreatedExhibitId={recentlyCreatedExhibitId} arrivingExhibitIds={arrivingExhibitIds} recentlyCreatedConnectionId={recentlyCreatedConnectionId} tool={boardTool} boardRef={boardRef} update={update} onCardClick={handleCardClick} onConnectionTarget={completeThread} onEditConnection={connection => setThreadDraft(connection)} onDiscardExhibit={removeExhibit} onOpenSource={id => setOpenDoc(documents.find(d => d.id === id) || null)} onUpdateDocumentCue={(id, cue) => update(state => ({ ...state, exhibits: state.exhibits.map(exhibit => exhibit.id === id && exhibit.type === 'document' ? { ...exhibit, metadata: { ...exhibit.metadata, memory_cue: cue } } : exhibit) }))} onEditFolder={setEditingFolderId} onEditFile={setEditingFileId} onEditEvent={setEditingEventId} onEditParty={setEditingPartyId} />
|
<Board state={caseState} selected={selected} locatorDocumentId={docsOpen && documents.some(document => document.id === selected) ? selected : null} linkFrom={linkFrom} recentlyCreatedExhibitId={recentlyCreatedExhibitId} arrivingExhibitIds={arrivingExhibitIds} recentlyCreatedConnectionId={recentlyCreatedConnectionId} tool={boardTool} boardRef={boardRef} update={update} onCardClick={handleCardClick} onConnectionTarget={completeThread} onEditConnection={connection => setThreadDraft(connection)} onDiscardExhibit={removeExhibit} onOpenSource={id => setOpenDoc(documents.find(d => d.id === id) || null)} onUpdateDocumentCue={(id, cue) => update(state => ({ ...state, exhibits: state.exhibits.map(exhibit => exhibit.id === id && exhibit.type === 'document' ? { ...exhibit, metadata: { ...exhibit.metadata, memory_cue: cue } } : exhibit) }))} onEditFolder={setEditingFolderId} onEditFile={setEditingFileId} onEditEvent={setEditingEventId} onEditParty={setEditingPartyId} />
|
||||||
{briefOpen && <BriefPanel
|
{briefOpen && <BriefPanel
|
||||||
brief={caseState.brief}
|
brief={caseState.brief}
|
||||||
@@ -1144,6 +1144,18 @@ function CaseReportPanel({ report, defaultInvestigator, hasNext, onClose, onSubm
|
|||||||
onSubmit:(input:CaseReportSubmissionInput)=>Promise<CaseReport>;onContinue:()=>void
|
onSubmit:(input:CaseReportSubmissionInput)=>Promise<CaseReport>;onContinue:()=>void
|
||||||
}) {
|
}) {
|
||||||
const investigatorName=report.investigatorName || defaultInvestigator
|
const investigatorName=report.investigatorName || defaultInvestigator
|
||||||
|
const unfinishedStatement=(value:string) => !value.trim() || /^proof that(?:\s*(?:…|\.\.\.))?$/i.test(value.trim())
|
||||||
|
const missingItems=report.claims.flatMap((claim,claimIndex) => claim.evidence.length
|
||||||
|
? claim.evidence.flatMap(item => [
|
||||||
|
!item.publishedAt ? `CLAIM ${claimIndex + 1} / EXHIBIT ${item.displayNumber} DATE` : '',
|
||||||
|
!item.sourceCitation?.trim() ? `CLAIM ${claimIndex + 1} / EXHIBIT ${item.displayNumber} SOURCE` : '',
|
||||||
|
unfinishedStatement(item.relationText) ? `CLAIM ${claimIndex + 1} / EXHIBIT ${item.displayNumber} STATEMENT` : '',
|
||||||
|
].filter(Boolean))
|
||||||
|
: [`CLAIM ${claimIndex + 1} SUPPORTING EVIDENCE`])
|
||||||
|
const reportStatus=report.status === 'accepted' ? 'ACCEPTED'
|
||||||
|
: report.status === 'evidence_insufficient' ? 'RETURNED — EVIDENCE NOT ESTABLISHED'
|
||||||
|
: report.status === 'evidence_accepted_report_incomplete' ? `RETURNED${missingItems.length ? ` — ${missingItems.length} ITEM${missingItems.length === 1 ? '' : 'S'} MISSING` : ''}`
|
||||||
|
: missingItems.length ? `INCOMPLETE — ${missingItems.length} ITEM${missingItems.length === 1 ? '' : 'S'} MISSING` : 'READY TO FILE'
|
||||||
const [busy,setBusy]=useState(false)
|
const [busy,setBusy]=useState(false)
|
||||||
const [error,setError]=useState('')
|
const [error,setError]=useState('')
|
||||||
const submit=async (event:React.FormEvent) => {
|
const submit=async (event:React.FormEvent) => {
|
||||||
@@ -1154,22 +1166,24 @@ function CaseReportPanel({ report, defaultInvestigator, hasNext, onClose, onSubm
|
|||||||
}
|
}
|
||||||
return <div className="modal-shade case-report-shade"><form className="window case-report" onSubmit={event => void submit(event)}>
|
return <div className="modal-shade case-report-shade"><form className="window case-report" onSubmit={event => void submit(event)}>
|
||||||
<header><ClipboardCheck size={16}/><b>{report.title}</b><span/><button type="button" aria-label="Close case report" onClick={onClose}><X size={14}/></button></header>
|
<header><ClipboardCheck size={16}/><b>{report.title}</b><span/><button type="button" aria-label="Close case report" onClick={onClose}><X size={14}/></button></header>
|
||||||
<div className="case-report-paper"><div className="case-report-letterhead"><small>GLITCH UNIVERSITY · PRINCIPAL INVESTIGATOR PROGRAMME</small><h2>CASE REPORT</h2><span>FORM GUPI–7 / EVIDENTIARY FINDING</span></div>
|
<div className="case-report-paper"><div className="case-report-letterhead"><h2>CASE REPORT</h2><p>{report.title}</p></div>
|
||||||
|
<div className="report-summary"><p>INVESTIGATOR: <span>{investigatorName}</span></p><p>STATUS: <strong className={report.status === 'accepted' ? 'complete' : missingItems.length || report.status !== 'draft' ? 'incomplete' : ''}>{reportStatus}</strong></p></div>
|
||||||
|
<div className="report-rule" aria-hidden="true"/>
|
||||||
{report.claims.map((claim,claimIndex) => <section className="report-claim" key={claim.claimExhibitId}>
|
{report.claims.map((claim,claimIndex) => <section className="report-claim" key={claim.claimExhibitId}>
|
||||||
<h3><span>CLAIM {claimIndex + 1}</span>{claim.statement}</h3>
|
<h3>CLAIM {String(claimIndex + 1).padStart(2,'0')}</h3><blockquote>{claim.statement}</blockquote>
|
||||||
<h4>EVIDENCE</h4>
|
<h4>EVIDENCE</h4>
|
||||||
{claim.evidence.length === 0 ? <div className="report-empty-evidence">No source evidence is connected to this claim. Return to the board and use red thread to attach a document.</div>
|
{claim.evidence.length === 0 ? <div className="report-empty-evidence">[ SUPPORTING EVIDENCE MISSING ]</div>
|
||||||
: claim.evidence.map(item => { const rejected=report.status !== 'draft' && !item.evidenceAccepted; return <article className={`report-evidence ${item.evidenceAccepted ? 'verified' : rejected ? 'rejected' : ''}`} key={item.connectionId}>
|
: claim.evidence.map(item => { const rejected=report.status !== 'draft' && !item.evidenceAccepted; return <article className={`report-evidence ${item.evidenceAccepted ? 'verified' : rejected ? 'rejected' : ''}`} key={item.connectionId}>
|
||||||
<div className="report-evidence-heading"><b>Exhibit {item.displayNumber}</b><span>{item.fileType.replaceAll('_',' ')} · {item.documentTitle}</span>{item.evidenceAccepted ? <em>CONTENT VERIFIED</em> : rejected ? <em className="rejected">NOT VERIFIED</em> : null}</div>
|
<h5>EXHIBIT {item.displayNumber} — {item.fileType.replaceAll('_',' ').toUpperCase()}</h5>
|
||||||
{rejected && <p className="report-evidence-diagnostic">{item.verification.detail}</p>}
|
<p className="report-document-title">{item.documentTitle}</p>
|
||||||
<div className="report-reference"><span>EVIDENTIARY STATEMENT</span><p>{item.relationText || 'No evidentiary statement attached.'}</p></div>
|
<p className="report-evidence-sentence">Exhibit {item.displayNumber}, dated {item.publishedAt?.slice(0,10) || <strong className="report-missing">[ DATE MISSING ]</strong>}, from {item.sourceCitation || <strong className="report-missing">[ SOURCE MISSING ]</strong>}:</p>
|
||||||
<div className="report-fields"><div className="report-reference"><span>DATED</span><p>{item.publishedAt?.slice(0,10) || 'NOT RECORDED'}</p></div>
|
<blockquote>{unfinishedStatement(item.relationText) ? <strong className="report-missing">[ CONNECTION STATEMENT MISSING ]</strong> : item.relationText}</blockquote>
|
||||||
<div className="report-reference"><span>SOURCE / PUBLICATION</span><p>{item.sourceCitation || 'NOT RECORDED'}</p></div></div>
|
<p className="report-source-line">SOURCE LINK: {item.sourceUri ? <a href={item.sourceUri} target="_blank" rel="noreferrer">{item.sourceUri}</a> : <span>[ NOT RECORDED · OPTIONAL ]</span>}</p>
|
||||||
<div className="report-reference"><span>SOURCE LINK · IF AVAILABLE</span>{item.sourceUri ? <a href={item.sourceUri} target="_blank" rel="noreferrer">{item.sourceUri}</a> : <p>NOT RECORDED</p>}</div>
|
{rejected && <p className="report-evidence-diagnostic">NOT VERIFIED: {item.verification.detail}</p>}
|
||||||
</article> })}
|
</article> })}
|
||||||
</section>)}
|
</section>)}
|
||||||
<div className="report-investigator report-reference"><span>INVESTIGATOR</span><p>{investigatorName}</p></div>
|
<div className="report-rule" aria-hidden="true"/>
|
||||||
{report.status !== 'draft' && <section className={`report-verdict ${report.status}`} role="status"><small>{report.status === 'accepted' ? 'REPORT ACCEPTED' : report.status === 'evidence_accepted_report_incomplete' ? 'EVIDENCE PASSED · REPORT RETURNED' : 'EVIDENCE NOT ESTABLISHED'}</small><p>{report.feedback}</p></section>}
|
{report.status !== 'draft' && <section className={`report-verdict ${report.status}`} role="status"><h3>{report.status === 'accepted' ? 'REPORT ACCEPTED' : 'REPORT RETURNED'}</h3><p>{report.feedback}</p></section>}
|
||||||
{error && <p className="flag-error">{error}</p>}
|
{error && <p className="flag-error">{error}</p>}
|
||||||
<div className="case-report-actions"><button type="button" onClick={onClose}>RETURN TO BOARD</button>{report.status === 'accepted'
|
<div className="case-report-actions"><button type="button" onClick={onClose}>RETURN TO BOARD</button>{report.status === 'accepted'
|
||||||
? <button className="primary" type="button" onClick={onContinue}>{hasNext ? 'CONTINUE' : 'CLOSE CASE'} <span>▸</span></button>
|
? <button className="primary" type="button" onClick={onContinue}>{hasNext ? 'CONTINUE' : 'CLOSE CASE'} <span>▸</span></button>
|
||||||
|
|||||||
+14
-20
@@ -22,7 +22,7 @@ button:focus-visible { outline: 2px solid #e99a44; outline-offset: 2px; }
|
|||||||
.documents-panel { width: 315px; flex: 0 0 auto; background: #102722; border-right: 1px solid #3c514b; transition: margin .25s; display: grid; grid-template-rows: auto auto auto 1fr auto; z-index: 5; box-shadow: 10px 0 40px #00100d66; }
|
.documents-panel { width: 315px; flex: 0 0 auto; background: #102722; border-right: 1px solid #3c514b; transition: margin .25s; display: grid; grid-template-rows: auto auto auto 1fr auto; z-index: 5; box-shadow: 10px 0 40px #00100d66; }
|
||||||
.documents-panel.closed { margin-left: -315px; }
|
.documents-panel.closed { margin-left: -315px; }
|
||||||
.panel-heading { padding: 25px 20px 17px; display: flex; justify-content: space-between; align-items: start; }
|
.panel-heading { padding: 25px 20px 17px; display: flex; justify-content: space-between; align-items: start; }
|
||||||
.panel-heading small, .case-heading small, .timeline small, .help small { font: 500 9px IBM Plex Mono; letter-spacing: .18em; color: #78958d; }
|
.panel-heading small, .timeline small, .help small { font: 500 9px IBM Plex Mono; letter-spacing: .18em; color: #78958d; }
|
||||||
.panel-heading h2 { font: 600 17px IBM Plex Mono; letter-spacing: .04em; margin: 6px 0 0; }
|
.panel-heading h2 { font: 600 17px IBM Plex Mono; letter-spacing: .04em; margin: 6px 0 0; }
|
||||||
.panel-heading sup { color: #d89043; font-size: 10px; }
|
.panel-heading sup { color: #d89043; font-size: 10px; }
|
||||||
.panel-heading button { background: none; border: 0; color: #6f8b83; cursor: pointer; }
|
.panel-heading button { background: none; border: 0; color: #6f8b83; cursor: pointer; }
|
||||||
@@ -48,11 +48,8 @@ button:focus-visible { outline: 2px solid #e99a44; outline-offset: 2px; }
|
|||||||
.panel-foot { height: 42px; border-top: 1px solid #354b45; padding: 0 16px; display: flex; align-items: center; gap: 8px; font: 9px IBM Plex Mono; color: #718d84; }
|
.panel-foot { height: 42px; border-top: 1px solid #354b45; padding: 0 16px; display: flex; align-items: center; gap: 8px; font: 9px IBM Plex Mono; color: #718d84; }
|
||||||
.panel-foot span { margin-left: auto; color: #b27b43; }
|
.panel-foot span { margin-left: auto; color: #b27b43; }
|
||||||
.board-shell { flex: 1; min-width: 0; position: relative; background: #0b1d19; }
|
.board-shell { flex: 1; min-width: 0; position: relative; background: #0b1d19; }
|
||||||
.case-heading { position: absolute; top: 20px; left: 27px; z-index: 2; display: flex; color: #dde2de; pointer-events: none; }
|
.case-heading { position:absolute;top:20px;left:27px;z-index:2;color:#dde2de;pointer-events:none; }
|
||||||
.case-heading h1 { font: 500 24px Special Elite, serif; margin: 6px 0 5px; letter-spacing: .02em; }
|
.case-heading h1 { margin:0;font:500 24px Special Elite,serif;letter-spacing:.02em; }
|
||||||
.case-heading p { margin: 0; color: #a06d3e; font: 9px IBM Plex Mono; letter-spacing: .13em; }
|
|
||||||
.case-number { border-left: 1px solid #415750; margin-left: 26px; padding-left: 17px; font: 8px IBM Plex Mono; color: #6d867f; line-height: 1.5; }
|
|
||||||
.case-number b { color: #bdc9c3; font-size: 13px; }
|
|
||||||
.board-viewport { position: absolute; inset: 0; overflow: hidden; touch-action: none; overscroll-behavior: contain; cursor: default; background-image: radial-gradient(#49615a55 1px, transparent 1px), linear-gradient(90deg, #18302a33 1px, transparent 1px), linear-gradient(#18302a33 1px, transparent 1px); background-size: 20px 20px, 100px 100px, 100px 100px; }
|
.board-viewport { position: absolute; inset: 0; overflow: hidden; touch-action: none; overscroll-behavior: contain; cursor: default; background-image: radial-gradient(#49615a55 1px, transparent 1px), linear-gradient(90deg, #18302a33 1px, transparent 1px), linear-gradient(#18302a33 1px, transparent 1px); background-size: 20px 20px, 100px 100px, 100px 100px; }
|
||||||
.board-viewport.tool-move { cursor: grab; }
|
.board-viewport.tool-move { cursor: grab; }
|
||||||
.board-viewport.tool-move:active { cursor: grabbing; }
|
.board-viewport.tool-move:active { cursor: grabbing; }
|
||||||
@@ -376,18 +373,16 @@ button:focus-visible { outline: 2px solid #e99a44; outline-offset: 2px; }
|
|||||||
.match-rule-layout { display: grid; grid-template-columns: minmax(250px, .75fr) minmax(390px, 1.25fr); gap: 13px; align-items: start; }.match-rule-list { max-height: 560px; overflow: auto; border: 1px solid #8b938d; background: #d3d4cc; }
|
.match-rule-layout { display: grid; grid-template-columns: minmax(250px, .75fr) minmax(390px, 1.25fr); gap: 13px; align-items: start; }.match-rule-list { max-height: 560px; overflow: auto; border: 1px solid #8b938d; background: #d3d4cc; }
|
||||||
.match-rule-row { min-height: 58px; display: grid; grid-template-columns: minmax(0, 1fr) auto 28px; align-items: center; gap: 6px; padding: 7px; border-bottom: 1px solid #a0a69f; }.match-rule-row.disabled { opacity: .55; }.match-rule-row > div { min-width: 0; display: grid; gap: 4px; }.match-rule-row b, .match-rule-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.match-rule-row b { color: #273d36; font: 600 9px IBM Plex Mono; }.match-rule-row small { color: #737d77; font: 7px IBM Plex Mono; }.match-rule-row button, .match-rule-form button { min-height: 27px; border: 1px outset #89938d; background: #c6cbc4; color: #30463f; cursor: pointer; font: 8px IBM Plex Mono; }.match-rule-row button:last-child { display: grid; place-items: center; color: #783f2e; }
|
.match-rule-row { min-height: 58px; display: grid; grid-template-columns: minmax(0, 1fr) auto 28px; align-items: center; gap: 6px; padding: 7px; border-bottom: 1px solid #a0a69f; }.match-rule-row.disabled { opacity: .55; }.match-rule-row > div { min-width: 0; display: grid; gap: 4px; }.match-rule-row b, .match-rule-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.match-rule-row b { color: #273d36; font: 600 9px IBM Plex Mono; }.match-rule-row small { color: #737d77; font: 7px IBM Plex Mono; }.match-rule-row button, .match-rule-form button { min-height: 27px; border: 1px outset #89938d; background: #c6cbc4; color: #30463f; cursor: pointer; font: 8px IBM Plex Mono; }.match-rule-row button:last-child { display: grid; place-items: center; color: #783f2e; }
|
||||||
.match-rule-form { padding: 13px; border: 1px solid #8b938d; background: #cecfc7; }.match-rule-form-heading, .anchor-heading { display: flex; justify-content: space-between; align-items: center; margin-bottom: 11px; color: #44504c; font: 8px IBM Plex Mono; letter-spacing: .08em; }.match-rule-form-heading button, .anchor-heading button { display: flex; align-items: center; gap: 4px; padding: 5px 8px; }.match-rule-fields { display: grid; grid-template-columns: minmax(0, 1fr) 110px; gap: 9px; }.match-rule-enabled { display: flex; align-items: center; gap: 7px; margin: 10px 0 15px; color: #59645e; font: 8px IBM Plex Mono; }.anchor-heading { margin: 0; padding: 8px 0; border-bottom: 2px solid #59625d; }.anchor-list { max-height: 295px; overflow: auto; border: 1px solid #929991; border-top: 0; background: #d7d8d0; }.anchor-row { display: grid; grid-template-columns: minmax(0, 1fr) 88px 28px; align-items: end; gap: 7px; padding: 8px; border-bottom: 1px solid #a1a69f; }.anchor-row > div, .anchor-row label { display: grid; gap: 4px; }.anchor-row small, .anchor-row label span { color: #6b756f; font: 7px IBM Plex Mono; }.anchor-row textarea { min-width: 0; resize: vertical; padding: 7px; background: #eeeadd; font: 9px/1.4 IBM Plex Mono; }.anchor-row input { min-width: 0; padding: 7px 4px; font: 8px IBM Plex Mono; }.anchor-row > button { display: grid; place-items: center; color: #783f2e; }.match-rule-form .folder-editor-actions { margin-top: 12px; }.match-rule-form .folder-editor-actions button { padding: 8px 11px; }.match-rule-form .folder-editor-actions button:disabled, .match-rule-row button:disabled, .anchor-row > button:disabled { opacity: .45; cursor: default; }.match-rule-form .flag-error { margin: 9px 0 0; color: #8a342e; font: 8px IBM Plex Mono; }
|
.match-rule-form { padding: 13px; border: 1px solid #8b938d; background: #cecfc7; }.match-rule-form-heading, .anchor-heading { display: flex; justify-content: space-between; align-items: center; margin-bottom: 11px; color: #44504c; font: 8px IBM Plex Mono; letter-spacing: .08em; }.match-rule-form-heading button, .anchor-heading button { display: flex; align-items: center; gap: 4px; padding: 5px 8px; }.match-rule-fields { display: grid; grid-template-columns: minmax(0, 1fr) 110px; gap: 9px; }.match-rule-enabled { display: flex; align-items: center; gap: 7px; margin: 10px 0 15px; color: #59645e; font: 8px IBM Plex Mono; }.anchor-heading { margin: 0; padding: 8px 0; border-bottom: 2px solid #59625d; }.anchor-list { max-height: 295px; overflow: auto; border: 1px solid #929991; border-top: 0; background: #d7d8d0; }.anchor-row { display: grid; grid-template-columns: minmax(0, 1fr) 88px 28px; align-items: end; gap: 7px; padding: 8px; border-bottom: 1px solid #a1a69f; }.anchor-row > div, .anchor-row label { display: grid; gap: 4px; }.anchor-row small, .anchor-row label span { color: #6b756f; font: 7px IBM Plex Mono; }.anchor-row textarea { min-width: 0; resize: vertical; padding: 7px; background: #eeeadd; font: 9px/1.4 IBM Plex Mono; }.anchor-row input { min-width: 0; padding: 7px 4px; font: 8px IBM Plex Mono; }.anchor-row > button { display: grid; place-items: center; color: #783f2e; }.match-rule-form .folder-editor-actions { margin-top: 12px; }.match-rule-form .folder-editor-actions button { padding: 8px 11px; }.match-rule-form .folder-editor-actions button:disabled, .match-rule-row button:disabled, .anchor-row > button:disabled { opacity: .45; cursor: default; }.match-rule-form .flag-error { margin: 9px 0 0; color: #8a342e; font: 8px IBM Plex Mono; }
|
||||||
.case-report-shade { padding:24px; }.case-report { width:min(900px,94vw); height:min(860px,94vh); display:grid; grid-template-rows:31px minmax(0,1fr); overflow:hidden; }
|
.case-report-shade { padding:24px; }.case-report { width:min(820px,94vw);height:min(860px,94vh);display:grid;grid-template-rows:31px minmax(0,1fr);overflow:hidden; }
|
||||||
.case-report > header { cursor:default; }.case-report-paper { overflow:auto; padding:42px clamp(26px,7vw,74px) 34px; color:#202622; background-color:#ebe7d8; background-image:linear-gradient(#7e897e18 1px,transparent 1px); background-size:100% 28px; box-shadow:inset 0 0 46px #8d877466; font-family:Special Elite,serif; }
|
.case-report > header { cursor:default; }.case-report-paper { overflow:auto;padding:42px clamp(24px,7vw,68px) 34px;color:#202421;background:#eeeadd;box-shadow:inset 0 0 48px #8d87743d;font:14px/1.7 "Courier New",Courier,monospace; }
|
||||||
.case-report-letterhead { position:relative; padding-bottom:22px; border-bottom:3px double #343b37; text-align:center; }.case-report-letterhead small,.case-report-letterhead span { display:block; color:#59625d; font:7px IBM Plex Mono; letter-spacing:.16em; }.case-report-letterhead h2 { margin:9px 0 7px; color:#1d2622; font:30px Special Elite; letter-spacing:.11em; }
|
.case-report-letterhead { margin:0 0 24px;text-align:left; }.case-report-letterhead h2 { margin:0;color:#171b18;font:700 25px/1.1 "Courier New",Courier,monospace;letter-spacing:.08em; }.case-report-letterhead p { margin:5px 0 0;font-weight:700;text-transform:uppercase; }
|
||||||
.report-claim { margin-top:30px; }.report-claim h3 { margin:0 0 22px; font:21px/1.45 Special Elite; }.report-claim h3 span { display:block; margin-bottom:5px; color:#915c30; font:7px IBM Plex Mono; letter-spacing:.14em; }.report-claim h4 { margin:0; padding-bottom:6px; border-bottom:1px solid #4c554f; font:600 8px IBM Plex Mono; letter-spacing:.15em; }
|
.report-summary { margin:0 0 24px; }.report-summary p { margin:2px 0; }.report-summary span { font-weight:700; }.report-summary strong { font-weight:700; }.report-summary strong.incomplete,.report-missing { color:#8c302b; }.report-summary strong.complete { color:#315f4c; }
|
||||||
.report-empty-evidence { margin-top:13px; padding:17px; border:1px dashed #8a6550; color:#76513c; background:#d9d1bd; font:10px/1.5 IBM Plex Mono; }
|
.report-rule { height:1px;margin:22px 0;background:#343a36;box-shadow:0 5px 0 -4px #343a36; }
|
||||||
.report-evidence { margin-top:14px; padding:14px 16px 16px; border-left:4px solid #8b5b38; background:#e1ddcfcc; box-shadow:0 1px #fff8; }.report-evidence.verified { border-left-color:#46705c; }.report-evidence.rejected { border-left-color:#913d35;background:#e5d2c7cc; }
|
.report-claim { margin:28px 0; }.report-claim > h3,.report-claim > h4,.report-evidence h5,.report-verdict h3 { margin:0;font:700 14px/1.5 "Courier New",Courier,monospace;letter-spacing:.05em; }.report-claim > blockquote { margin:9px 0 24px;padding:0;font:700 17px/1.55 "Courier New",Courier,monospace; }.report-claim > h4 { margin-bottom:12px; }
|
||||||
.report-evidence-heading { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:10px; margin-bottom:12px; }.report-evidence-heading b { color:#25332d; font:14px Special Elite; }.report-evidence-heading span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:#646c67; font:8px IBM Plex Mono; text-transform:uppercase; }.report-evidence-heading em { padding:3px 5px; border:1px solid #577665; color:#436753; font:600 6px IBM Plex Mono; letter-spacing:.08em; font-style:normal; }
|
.report-empty-evidence { margin:8px 0 20px;color:#8c302b;font-weight:700; }
|
||||||
.report-evidence-heading em.rejected { border-color:#98534b;color:#813a34; }.report-evidence-diagnostic { margin:-3px 0 13px;padding:9px 10px;border:1px solid #b78376;background:#ead8cc;color:#6f302d;font:9px/1.5 IBM Plex Mono; }
|
.report-evidence { margin:0 0 28px;padding:0 0 25px;border-bottom:1px dashed #77766d;background:transparent;box-shadow:none; }.report-evidence:last-child { border-bottom:0; }.report-evidence h5 { margin-bottom:2px; }.report-document-title { margin:0 0 12px;color:#555a55;text-transform:uppercase;font-size:12px; }.report-evidence-sentence { margin:0 0 10px; }.report-evidence blockquote { margin:0 0 13px;padding-left:18px;border-left:2px solid #4c514d;font-weight:700; }.report-source-line { margin:0;overflow-wrap:anywhere;font-size:12px; }.report-source-line a { color:#26554a;text-underline-offset:3px; }.report-source-line span { color:#696b65; }.report-evidence-diagnostic { margin:14px 0 0;padding:9px 0;border-top:1px solid #9b554f;border-bottom:1px solid #9b554f;color:#762b27;font-weight:700;font-size:12px; }
|
||||||
.report-reference { display:grid; gap:4px; margin-top:9px; }.report-reference > span { color:#5c655f; font:600 7px IBM Plex Mono; letter-spacing:.11em; }.report-reference > p,.report-reference > a { width:100%; min-width:0; min-height:31px; margin:0; padding:7px 8px; border-bottom:1px solid #747b75; background:#f2eee0a8; color:#1d2622; font:12px/1.45 Special Elite; overflow-wrap:anywhere; }.report-reference > a { color:#315b52; text-decoration-thickness:1px; text-underline-offset:3px; }
|
.report-verdict { margin:24px 0 0;padding:0;background:transparent;border:0;transform:none; }.report-verdict h3 { color:#8c302b; }.report-verdict.accepted h3 { color:#315f4c; }.report-verdict p { margin:7px 0 0;font:14px/1.7 "Courier New",Courier,monospace; }
|
||||||
.report-fields { display:grid; grid-template-columns:155px minmax(0,1fr); gap:13px; }.report-investigator { margin-top:30px; padding-top:13px; border-top:1px solid #4c554f; }.report-investigator p { max-width:390px; }
|
.case-report-actions { position:sticky;bottom:-34px;display:flex;justify-content:flex-end;gap:9px;margin:34px -12px -20px;padding:17px 12px 20px;background:linear-gradient(transparent,#eeeadd 28%); }.case-report-actions button { border:1px solid #6e736e;padding:9px 12px;color:#28332f;background:#d4d3ca;cursor:pointer;font:700 10px "Courier New",Courier,monospace; }.case-report-actions .primary { float:none;color:#f3f0e7;background:#263f37; }.case-report-actions button:disabled { opacity:.55;cursor:progress; }
|
||||||
.report-verdict { margin-top:28px; padding:17px 19px; border:2px solid #874339; background:#e0c7b9; transform:rotate(-.25deg); }.report-verdict small { color:#7c352f; font:700 8px IBM Plex Mono; letter-spacing:.13em; }.report-verdict p { margin:9px 0 0; font:15px/1.5 Special Elite; }.report-verdict.accepted { border-color:#47705c; background:#d2ddcf; }.report-verdict.accepted small { color:#315b48; }
|
|
||||||
.case-report-actions { position:sticky; bottom:-34px; display:flex; justify-content:flex-end; gap:9px; margin:30px -12px -20px; padding:14px 12px 20px; background:linear-gradient(transparent,#ebe7d8 25%); }.case-report-actions button { border:1px outset #8c948e; padding:10px 13px; color:#34443e; background:#c8cbc4; cursor:pointer; font:8px IBM Plex Mono; letter-spacing:.06em; }.case-report-actions .primary { float:none; color:#fff; background:#174337; }.case-report-actions button:disabled { opacity:.55;cursor:progress; }
|
|
||||||
.boot { height: 100vh; background: #071916; display: grid; place-content: center; justify-items: center; color: #819b93; font: 11px IBM Plex Mono; letter-spacing: .15em; }.boot .seal { width: 70px; height: 70px; display: grid; place-items: center; border: 2px solid #b87337; color: #d58a46; margin-bottom: 24px; font-weight: 600; }.boot small { color: #4e6a62; }
|
.boot { height: 100vh; background: #071916; display: grid; place-content: center; justify-items: center; color: #819b93; font: 11px IBM Plex Mono; letter-spacing: .15em; }.boot .seal { width: 70px; height: 70px; display: grid; place-items: center; border: 2px solid #b87337; color: #d58a46; margin-bottom: 24px; font-weight: 600; }.boot small { color: #4e6a62; }
|
||||||
.empty-archive { height: 100vh; display: grid; place-content: center; justify-items: center; text-align: center; background: radial-gradient(circle, #123029 0, #071916 65%); color: #9bb0a9; }.empty-archive .seal { width: 72px; height: 72px; display: grid; place-items: center; border: 2px solid #b87337; color: #d58a46; font: 600 14px IBM Plex Mono; margin-bottom: 25px; }.empty-archive small { font: 9px IBM Plex Mono; letter-spacing: .18em; color: #68837b; }.empty-archive h1 { margin: 12px 0 5px; color: #e0e5e1; font: 27px Special Elite; }.empty-archive p { font-size: 12px; }.empty-archive button { margin-top: 18px; display: flex; align-items: center; gap: 8px; background: #1a493d; border: 1px solid #6f8f85; padding: 11px 16px; font: 10px IBM Plex Mono; cursor: pointer; }.empty-archive .hint { margin-top: 20px; color: #718a83; }.empty-archive code { color: #d59450; }
|
.empty-archive { height: 100vh; display: grid; place-content: center; justify-items: center; text-align: center; background: radial-gradient(circle, #123029 0, #071916 65%); color: #9bb0a9; }.empty-archive .seal { width: 72px; height: 72px; display: grid; place-items: center; border: 2px solid #b87337; color: #d58a46; font: 600 14px IBM Plex Mono; margin-bottom: 25px; }.empty-archive small { font: 9px IBM Plex Mono; letter-spacing: .18em; color: #68837b; }.empty-archive h1 { margin: 12px 0 5px; color: #e0e5e1; font: 27px Special Elite; }.empty-archive p { font-size: 12px; }.empty-archive button { margin-top: 18px; display: flex; align-items: center; gap: 8px; background: #1a493d; border: 1px solid #6f8f85; padding: 11px 16px; font: 10px IBM Plex Mono; cursor: pointer; }.empty-archive .hint { margin-top: 20px; color: #718a83; }.empty-archive code { color: #d59450; }
|
||||||
@media (max-width: 900px) {
|
@media (max-width: 900px) {
|
||||||
@@ -412,13 +407,12 @@ button:focus-visible { outline: 2px solid #e99a44; outline-offset: 2px; }
|
|||||||
.timeline-track { margin: 0 23px; }
|
.timeline-track { margin: 0 23px; }
|
||||||
.document-window { width: 80vw; }
|
.document-window { width: 80vw; }
|
||||||
.case-heading { left: 18px; }
|
.case-heading { left: 18px; }
|
||||||
.case-number { display: none; }
|
|
||||||
.brief-panel { position: fixed; inset: 0; width: 100vw; height: 100dvh; max-height: none; border-width: 0; box-shadow: none; }
|
.brief-panel { position: fixed; inset: 0; width: 100vw; height: 100dvh; max-height: none; border-width: 0; box-shadow: none; }
|
||||||
.brief-panel > header { position: sticky; z-index: 2; top: 0; min-height: 48px; padding-left: max(13px, env(safe-area-inset-left)); padding-right: max(7px, env(safe-area-inset-right)); }
|
.brief-panel > header { position: sticky; z-index: 2; top: 0; min-height: 48px; padding-left: max(13px, env(safe-area-inset-left)); padding-right: max(7px, env(safe-area-inset-right)); }
|
||||||
.brief-panel.minimized { inset: 82px 8px auto; width: auto; height: 48px; max-height: 48px; border: 2px solid #d8dbd4; box-shadow: 5px 6px 0 #020a08; }
|
.brief-panel.minimized { inset: 82px 8px auto; width: auto; height: 48px; max-height: 48px; border: 2px solid #d8dbd4; box-shadow: 5px 6px 0 #020a08; }
|
||||||
.folder-member, .file-editor-grid { grid-template-columns: 1fr; gap: 7px; }
|
.folder-member, .file-editor-grid { grid-template-columns: 1fr; gap: 7px; }
|
||||||
.match-rules-editor { width: 100vw; height: 100dvh; max-height: none; border: 0; }.match-rules-body { padding: 16px; }.match-rule-layout { grid-template-columns: 1fr; }.match-rule-list { max-height: 180px; }.match-rule-fields { grid-template-columns: 1fr 100px; }
|
.match-rules-editor { width: 100vw; height: 100dvh; max-height: none; border: 0; }.match-rules-body { padding: 16px; }.match-rule-layout { grid-template-columns: 1fr; }.match-rule-list { max-height: 180px; }.match-rule-fields { grid-template-columns: 1fr 100px; }
|
||||||
.case-report-shade { padding:0; }.case-report { width:100vw;height:100dvh;border:0; }.case-report-paper { padding:28px 17px 24px; }.report-fields { grid-template-columns:1fr;gap:0; }.report-evidence-heading { grid-template-columns:auto 1fr; }.report-evidence-heading em { grid-column:1/-1;width:max-content; }.case-report-actions { bottom:-24px;margin-left:-7px;margin-right:-7px; }
|
.case-report-shade { padding:0; }.case-report { width:100vw;height:100dvh;border:0; }.case-report-paper { padding:28px 18px 24px;font-size:13px; }.case-report-letterhead h2 { font-size:22px; }.report-claim > blockquote { font-size:15px; }.case-report-actions { bottom:-24px;margin-left:-7px;margin-right:-7px; }
|
||||||
.evidence-classification-shade { padding:0; }.evidence-classification { width:100vw;max-width:none;max-height:100dvh;border-width:0;box-shadow:none; }.evidence-classification-body { padding:18px 16px 22px; }.classification-options { grid-template-columns:1fr; }.classification-source { grid-template-columns:92px minmax(0,1fr); }.classification-source > img { width:92px;height:66px; }.classification-question h2 { font-size:22px; }
|
.evidence-classification-shade { padding:0; }.evidence-classification { width:100vw;max-width:none;max-height:100dvh;border-width:0;box-shadow:none; }.evidence-classification-body { padding:18px 16px 22px; }.classification-options { grid-template-columns:1fr; }.classification-source { grid-template-columns:92px minmax(0,1fr); }.classification-source > img { width:92px;height:66px; }.classification-question h2 { font-size:22px; }
|
||||||
.board-actions button { width: 38px; padding: 0; justify-content: center; gap: 0; font-size: 0; }
|
.board-actions button { width: 38px; padding: 0; justify-content: center; gap: 0; font-size: 0; }
|
||||||
.board-actions > b { display: none; }
|
.board-actions > b { display: none; }
|
||||||
|
|||||||
Reference in New Issue
Block a user