Musubi / static /index.html
Cizencoder's picture
fix: prevent placeholder wipe on re-analyze; default to abstract granularity; polish header
1cd9426
Raw
History Blame Contribute Delete
6.07 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Musubi</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='.9em' font-size='90'%3E%F0%9F%A7%AC%3C/text%3E%3C/svg%3E" />
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
<link rel="stylesheet" href="/static/style.css" />
</head>
<body class="h-screen overflow-hidden">
<div class="flex flex-col h-full">
<!-- Header -->
<header class="flex items-center justify-between px-5 py-3 border-b border-slate-700/60">
<div>
<h1 class="text-xl font-semibold text-violet-300 tracking-tight">Musubi <span class="text-slate-400 font-normal">(結び)</span></h1>
<p class="text-xs text-slate-500">Tying entities into hypotheses.</p>
</div>
<button id="btnPubmed"
class="px-3 py-1.5 rounded-md border border-violet-500/40 hover:border-violet-400 hover:bg-violet-500/10 text-sm text-violet-200 transition-colors">
PubMed search
</button>
</header>
<!-- Main -->
<main class="flex flex-1 min-h-0">
<!-- Sidebar -->
<aside class="w-80 flex-shrink-0 border-r border-slate-700/60 flex flex-col p-4 gap-4 overflow-y-auto">
<div>
<label class="block text-xs font-medium text-slate-400 mb-1">Abstracts (separate by blank line)</label>
<textarea id="txtInput" rows="10"
class="w-full p-2 rounded bg-slate-900/80 border border-slate-700 text-sm focus:outline-none focus:border-violet-500 resize-none"
placeholder="Paste PubMed abstracts here..."></textarea>
</div>
<button id="btnAnalyze"
class="w-full py-2 rounded bg-violet-600 hover:bg-violet-500 font-semibold text-white">
Analyze
</button>
<hr class="border-slate-700/60" />
<div>
<label class="flex justify-between text-xs font-medium text-slate-400 mb-1">
<span>Min confidence</span>
<span id="lblConf">0.50</span>
</label>
<input id="sldConf" type="range" min="0" max="1" step="0.05" value="0.5" class="w-full accent-violet-500" />
</div>
<div>
<label class="block text-xs font-medium text-slate-400 mb-1">Granularity</label>
<div class="flex gap-2">
<label class="flex items-center gap-1 text-sm">
<input type="radio" name="gran" value="sentence" class="accent-violet-500" /> Sentence
</label>
<label class="flex items-center gap-1 text-sm">
<input type="radio" name="gran" value="abstract" checked class="accent-violet-500" /> Abstract
</label>
</div>
</div>
<div>
<label class="block text-xs font-medium text-slate-400 mb-2">Pair types</label>
<div id="pairFilters" class="grid grid-cols-2 gap-1 text-xs"></div>
</div>
<div id="statsBox" class="text-xs text-slate-400 mt-auto pt-2 border-t border-slate-700/60 hidden">
<div>Abstracts: <span id="stAb">-</span></div>
<div>Sentences: <span id="stSent">-</span></div>
<div>Entities: <span id="stEnt">-</span></div>
<div>Elapsed: <span id="stEl">-</span>s</div>
</div>
</aside>
<!-- Graph + Evidence -->
<section class="flex flex-col flex-1 min-w-0">
<div class="flex-1 relative">
<div id="graph" class="absolute inset-0"></div>
<div id="placeholder"
class="absolute inset-0 flex items-center justify-center text-slate-500 text-sm pointer-events-none">
Paste abstracts and click <span class="mx-1 px-2 py-0.5 rounded bg-slate-800 text-violet-300">Analyze</span> to see the graph.
</div>
</div>
<div id="evidencePanel"
class="border-t border-slate-700/60 bg-slate-900/60 max-h-72 overflow-y-auto p-3 text-sm hidden">
<div class="flex items-center justify-between mb-2">
<h3 class="font-semibold text-violet-300">Evidence</h3>
<button id="btnCloseEv" class="text-xs text-slate-400 hover:text-white">close ✕</button>
</div>
<div id="evidenceBody" class="space-y-2"></div>
</div>
</section>
</main>
</div>
<!-- Loading overlay -->
<div id="overlay" class="fixed inset-0 bg-slate-950/70 hidden flex items-center justify-center z-40">
<div class="bg-slate-800 px-6 py-4 rounded shadow-lg flex items-center gap-3">
<div class="w-5 h-5 border-2 border-violet-400 border-t-transparent rounded-full animate-spin"></div>
<span id="ovText">Analyzing...</span>
</div>
</div>
<!-- PubMed modal -->
<div id="modal" class="fixed inset-0 bg-slate-950/70 hidden flex items-center justify-center z-50">
<div class="bg-slate-800 p-5 rounded-lg w-96 space-y-3 border border-slate-700">
<h3 class="font-semibold text-violet-300">PubMed search</h3>
<input id="modalQuery" type="text" placeholder="e.g. SARS-CoV-2 ACE2 spike"
class="w-full px-2 py-1.5 rounded bg-slate-900 border border-slate-700 text-sm focus:outline-none focus:border-violet-500" />
<div class="flex items-center gap-2 text-xs text-slate-400">
<span>Max results</span>
<input id="modalMax" type="number" min="1" max="50" value="10"
class="w-20 px-2 py-1 rounded bg-slate-900 border border-slate-700 text-sm" />
</div>
<p id="modalErr" class="text-xs text-red-400 hidden"></p>
<div class="flex justify-end gap-2 pt-2">
<button id="modalCancel" class="px-3 py-1.5 text-sm text-slate-300 hover:text-white">Cancel</button>
<button id="modalFetch" class="px-3 py-1.5 rounded bg-violet-600 hover:bg-violet-500 text-white text-sm">Fetch</button>
</div>
</div>
</div>
<script src="/static/app.js"></script>
</body>
</html>