Files
Ncurator/prototypes/ink-codex-theme-preview.html
T

556 lines
14 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>NCurator Ink Mono Preview</title>
<style>
:root {
--canvas: #f6f5f1;
--paper: #fffdf8;
--paper-soft: #faf9f5;
--wash: #f0efeb;
--wash-strong: #e8e6df;
--ink: #181818;
--ink-2: #3f3f3d;
--ink-3: #6e6d69;
--ink-4: #9c9a94;
--line: #e1ded6;
--line-strong: #cbc7bd;
--seal: #a83a31;
--shadow: 0 1px 2px rgba(24, 24, 24, 0.04), 0 20px 44px rgba(24, 24, 24, 0.07);
--panel-radius: 22px;
--control-radius: 10px;
color: var(--ink);
font-family:
Inter, "Segoe UI", "PingFang SC", "Microsoft YaHei", Arial, sans-serif;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
background:
linear-gradient(90deg, #eeeeea 0 232px, transparent 232px),
radial-gradient(circle at 80% 8%, rgba(24, 24, 24, 0.035), transparent 30%),
var(--canvas);
}
body::before {
position: fixed;
inset: 0;
pointer-events: none;
content: "";
opacity: 0.18;
background-image:
linear-gradient(rgba(24, 24, 24, 0.022) 1px, transparent 1px),
linear-gradient(90deg, rgba(24, 24, 24, 0.018) 1px, transparent 1px);
background-size: 28px 28px;
mask-image: linear-gradient(180deg, #000, transparent 78%);
}
.app {
display: grid;
grid-template-columns: 232px minmax(640px, 1fr) 312px;
min-height: 100vh;
}
.sidebar {
padding: 18px 10px;
border-right: 1px solid rgba(203, 199, 189, 0.7);
}
.brand {
display: flex;
align-items: center;
gap: 10px;
height: 38px;
padding: 0 10px;
margin-bottom: 16px;
color: var(--ink);
font-weight: 680;
}
.brand-mark {
display: grid;
width: 24px;
height: 24px;
place-items: center;
border: 1px solid var(--ink);
border-radius: 7px;
font-size: 13px;
font-weight: 760;
background: var(--paper);
}
.nav-section {
margin-top: 18px;
}
.nav-title {
padding: 8px 12px;
color: var(--ink-4);
font-size: 12px;
}
.nav-item {
display: flex;
align-items: center;
gap: 10px;
min-height: 34px;
padding: 0 12px;
border-radius: var(--control-radius);
color: var(--ink-3);
font-size: 14px;
}
.nav-item.active {
color: var(--ink);
background: var(--wash-strong);
box-shadow: inset 3px 0 0 var(--ink);
}
.nav-item.muted {
color: var(--ink-4);
}
.main {
display: flex;
flex-direction: column;
min-width: 0;
margin-top: 32px;
background: var(--paper);
border: 1px solid var(--line);
border-bottom: 0;
border-radius: var(--panel-radius) var(--panel-radius) 0 0;
box-shadow: var(--shadow);
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 54px;
padding: 0 24px;
border-bottom: 1px solid var(--line);
}
.thread-title {
display: flex;
align-items: center;
gap: 10px;
color: var(--ink);
font-weight: 650;
}
.ink-dot {
width: 8px;
height: 8px;
border-radius: 999px;
background: var(--ink);
}
.actions {
display: flex;
gap: 8px;
}
.icon-button {
display: grid;
width: 32px;
height: 32px;
place-items: center;
border: 1px solid var(--line);
border-radius: var(--control-radius);
color: var(--ink-3);
background: var(--paper);
font-size: 14px;
}
.thread {
flex: 1;
width: min(760px, calc(100% - 56px));
margin: 0 auto;
padding: 34px 0 20px;
}
.message {
margin-bottom: 22px;
}
.meta {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
color: var(--ink-4);
font-size: 12px;
}
.user-card {
padding: 14px 16px;
border: 1px solid var(--line);
border-radius: 14px;
background: var(--paper-soft);
line-height: 1.65;
font-size: 14px;
}
.assistant-text {
max-width: 680px;
color: var(--ink-2);
line-height: 1.7;
font-size: 14px;
}
.process {
margin: 18px 0 4px 3px;
padding-left: 17px;
border-left: 1px solid var(--line-strong);
}
.process-row {
position: relative;
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: start;
min-height: 34px;
color: var(--ink-3);
font-size: 13px;
line-height: 1.45;
}
.process-row::before {
position: absolute;
left: -22px;
top: 5px;
width: 8px;
height: 8px;
content: "";
border: 2px solid var(--paper);
border-radius: 999px;
background: var(--ink-4);
box-shadow: 0 0 0 1px var(--line-strong);
}
.process-row.strong::before {
background: var(--ink);
}
.process-row.risk::before {
background: var(--seal);
}
.tag {
display: inline-flex;
align-items: center;
height: 22px;
padding: 0 8px;
border: 1px solid var(--line);
border-radius: 999px;
color: var(--ink-3);
background: var(--paper);
font-size: 12px;
white-space: nowrap;
}
.tag.dark {
color: var(--paper);
border-color: var(--ink);
background: var(--ink);
}
.tag.risk {
color: var(--ink);
}
.tag.risk::before {
width: 6px;
height: 6px;
margin-right: 6px;
content: "";
border-radius: 999px;
background: var(--seal);
}
.composer-zone {
position: sticky;
bottom: 0;
width: min(760px, calc(100% - 56px));
margin: 0 auto;
padding: 10px 0 28px;
background: linear-gradient(180deg, rgba(255, 253, 248, 0), var(--paper) 28%);
}
.approval {
overflow: hidden;
border: 1px solid var(--line-strong);
border-radius: 22px;
background: rgba(255, 253, 248, 0.98);
box-shadow: 0 22px 52px rgba(24, 24, 24, 0.13);
}
.approval-head {
display: flex;
align-items: center;
gap: 10px;
padding: 18px 20px 10px;
color: var(--ink);
font-size: 15px;
font-weight: 650;
}
.approval-mark {
display: grid;
flex: 0 0 auto;
width: 26px;
height: 26px;
place-items: center;
border: 1px solid var(--ink);
border-radius: 9px;
background: var(--paper);
font-size: 13px;
}
.approval-subtitle {
margin: 0 20px 12px;
color: var(--ink-3);
font-size: 13px;
line-height: 1.5;
}
.command {
margin: 0 20px 14px;
padding: 12px 14px;
border: 1px solid var(--line);
border-radius: 12px;
color: var(--ink-2);
background: var(--wash);
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
font-size: 13px;
}
.options {
padding: 0 10px 10px;
}
.option {
display: grid;
grid-template-columns: 28px 1fr 18px;
align-items: center;
min-height: 44px;
padding: 0 12px;
border-radius: 12px;
color: var(--ink-3);
font-size: 13px;
}
.option.selected {
color: var(--ink);
background: var(--wash);
box-shadow: inset 3px 0 0 var(--ink), inset 0 0 0 1px var(--line);
}
.option-index,
.option-key {
color: var(--ink-4);
}
.approval-foot {
display: flex;
justify-content: flex-end;
gap: 10px;
padding: 12px 16px 16px;
border-top: 1px solid var(--line);
}
button {
height: 34px;
padding: 0 14px;
border-radius: 999px;
font: inherit;
font-size: 13px;
font-weight: 650;
}
.ghost {
color: var(--ink-3);
border: 1px solid transparent;
background: transparent;
}
.primary {
color: var(--paper);
border: 1px solid var(--ink);
background: var(--ink);
}
.sidepanel {
margin: 64px 20px 0;
}
.env-card {
padding: 16px;
border: 1px solid var(--line);
border-radius: 18px;
background: rgba(255, 253, 248, 0.85);
box-shadow: 0 1px 2px rgba(24, 24, 24, 0.04);
}
.env-title {
display: flex;
justify-content: space-between;
margin-bottom: 12px;
color: var(--ink-2);
font-size: 14px;
font-weight: 650;
}
.env-row {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 32px;
border-top: 1px solid rgba(225, 222, 214, 0.82);
color: var(--ink-3);
font-size: 13px;
}
.env-row:first-of-type {
border-top: 0;
}
.mono {
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
}
.delta {
color: var(--ink);
}
.delete {
color: var(--ink-4);
text-decoration: line-through;
}
@media (max-width: 1120px) {
.app {
grid-template-columns: 210px minmax(0, 1fr);
}
.sidepanel {
display: none;
}
}
</style>
</head>
<body>
<div class="app">
<aside class="sidebar">
<div class="brand"><span class="brand-mark">N</span><span>NCurator</span></div>
<div class="nav-item active">新对话</div>
<div class="nav-item">搜索</div>
<div class="nav-item">插件</div>
<div class="nav-item">自动化</div>
<div class="nav-section">
<div class="nav-title">工作区</div>
<div class="nav-item">资料整理</div>
<div class="nav-item muted">文档索引</div>
<div class="nav-item muted">内容审阅</div>
<div class="nav-item muted">研究记录</div>
</div>
</aside>
<main class="main">
<header class="topbar">
<div class="thread-title"><span class="ink-dot"></span><span>馆藏资料整理</span></div>
<div class="actions">
<div class="icon-button">⌕</div>
<div class="icon-button">☷</div>
</div>
</header>
<section class="thread">
<article class="message">
<div class="meta">用户 · 09:41</div>
<div class="user-card">
帮我整理这批资料,先分析结构,再给出可以归档的分类建议。
</div>
</article>
<article class="message">
<div class="meta">NCurator · 已处理 1m 18s</div>
<div class="assistant-text">
我会先识别资料来源、文件层级与重复片段,再把可归档的内容按主题、时间和可信度拆成几个候选集合。
</div>
<div class="process">
<div class="process-row strong">
<span class="tag dark">已读取</span>
<span>扫描工作区中的资料目录与索引状态。</span>
</div>
<div class="process-row">
<span class="tag">已分析</span>
<span>抽取标题、来源、时间线和疑似重复内容。</span>
</div>
<div class="process-row risk">
<span class="tag risk">待确认</span>
<span>检测到一个需要人工授权的本地操作,底部输入区已切换为审核态。</span>
</div>
</div>
</article>
</section>
<section class="composer-zone">
<div class="approval">
<div class="approval-head">
<span class="approval-mark">审</span>
<span>需要确认此操作</span>
</div>
<p class="approval-subtitle">
此操作会读取本地资料目录的文件列表,用于继续生成归档建议。确认前,输入框会暂时隐藏。
</p>
<div class="command">list workspace documents --scope current</div>
<div class="options">
<div class="option selected">
<span class="option-index">1.</span>
<span>允许本次操作</span>
<span class="option-key">↵</span>
</div>
<div class="option">
<span class="option-index">2.</span>
<span>允许同类只读操作,后续不再询问</span>
<span></span>
</div>
<div class="option">
<span class="option-index">3.</span>
<span>拒绝,并说明需要调整的范围</span>
<span></span>
</div>
</div>
<div class="approval-foot">
<button class="ghost">跳过</button>
<button class="primary">提交</button>
</div>
</div>
</section>
</main>
<aside class="sidepanel">
<div class="env-card">
<div class="env-title"><span>环境信息</span><span>设置</span></div>
<div class="env-row"><span>变更</span><span><span class="delta">+24</span> <span class="delete">-6</span></span></div>
<div class="env-row"><span>模式</span><span>本地</span></div>
<div class="env-row"><span>分支</span><span class="mono">main</span></div>
<div class="env-row"><span>状态</span><span>等待审核</span></div>
</div>
</aside>
</div>
</body>
</html>