This commit is contained in:
2026-09-21 02:30:48 +08:00
parent a1089efd18
commit 7a3769670b
50 changed files with 3375 additions and 783 deletions

View File

@@ -15,23 +15,21 @@
z-index: var(--z-sidebar);
/* 宽度由 .app-shell 的 grid 模板通过 --sidebar-width 决定;这里不再写死 px */
min-width: 0;
/* container query 锚点:让 .sidebar 内部元素能根据侧栏实际宽度自适应。
用途:当侧栏拖到 ~240px 以下时,「新建笔记」内联按钮的"新建笔记"文字
自动隐藏、只保留 + 图标,给 sort 按钮(「名称」「修改时间」)腾空间。
230px 是经验阈值:sort 文字 + icon + 内边距刚好能完整显示的临界点。
命名空间 "sidebar" 与下面 @container 配套,避免与未来其他容器冲突 */
container-type: inline-size;
container-name: sidebar;
}
.sidebar-header {
/* 紧凑的 header —— 上下 12px、左右 14px,让搜索框有呼吸但不浪费空间 */
padding: 12px 14px;
border-bottom: 1px solid var(--border-subtle);
display: flex;
align-items: center;
gap: var(--space-2);
}
/* (.sidebar-header 已删除 —— 2026-09 设计优化:搜索框上移到工具栏,
侧栏垂直空间让给文件列表 + 排序条。首行直接是 sort + 新建笔记合并行) */
/* 新建笔记行:放在 .sidebar-header 下方、排序条上方的独立主操作行。
左右 padding 用 10px(与 .sidebar-sort / .file-list 对齐),
让「创建」按钮和它作用的列表视觉上是一组;搜索框保留 14px 更深的内嵌来强调 */
.sidebar-new-row {
padding: 10px 10px 8px;
}
/* (.sidebar-new-row 已删除 —— 2026-09 设计优化:把「新建笔记」按钮合并到
.sidebar-sort 同一行的右端(用 .sidebar-new-btn--inline + margin-left:auto),
节省侧栏首屏的垂直空间。原独立行的顶部呼吸转移到了 .sidebar-sort 的 padding-top) */
/* 「+ 新建笔记」按钮:全宽、带文字的主操作按钮
——accent 文字 + 微微的 accent 底色 + 1px accent 边框,hover/active 进一步加深。
@@ -78,77 +76,86 @@
outline-offset: 1px;
}
.search-wrap {
position: relative;
flex: 1;
min-width: 0;
}
.search-icon {
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
/* 用 secondary 替代 tertiary:搜索框是核心入口,图标应该一眼看清 */
color: var(--fg-secondary);
pointer-events: none;
transition: color var(--transition-fast);
}
.search-input {
width: 100%;
/* 收紧内边距、改为 8px/0/8px/32px;高度由 line-height + 7px*2 padding 决定 ≈ 30px */
padding: 7px 10px 7px 32px;
background: var(--bg-card);
border: 1px solid transparent;
border-radius: var(--radius-sm);
/* 「新建笔记」按钮的紧凑内联变体(.sidebar-new-btn--inline):
与 .sidebar-sort-btn 并排在 .sidebar-sort 行内,靠 margin-left:auto 推到右端。
设计目标:
1) 与 sort 按钮同高(覆盖 base 的固定 height:34px → 自适应高度),
否则 34px 的新建笔记会撑爆整行、视觉上"跳"出来,盖过 sort 按钮;
2) 宽度按内容(flex:0 0 auto),不抢 sort 按钮的弹性空间;
3) icon 同步缩到 13px(base 是 14px),与 sort 按钮视觉重量一致;
4) 保留 accent 文字 + 软底色 + 1px accent 边框的主操作语义不变。
—— base 类继续被侧栏底部 AI 按钮(#btn-ai)复用,仍是 34px 全宽语义。 */
.sidebar-new-btn--inline {
flex: 0 0 auto;
margin-left: auto;
width: auto;
height: auto;
/* 5/6 padding 与 sort 按钮对齐:整行按钮横向 padding 一致,视觉上"一排",
而不是 sort 紧、新建笔记松。同节奏点击区也更整齐 */
padding: 5px 6px;
font-size: var(--fs-sm);
color: var(--fg-primary);
transition: border-color var(--transition-fast), background var(--transition-fast), box-shadow var(--transition-fast);
letter-spacing: var(--tracking-wide);
}
.sidebar-new-btn--inline svg {
width: 13px;
height: 13px;
}
/* 内联态下取消 base 的 scale 反馈 —— 整行按钮高度统一,按下时整行一起缩更协调;
若只缩新建笔记,按下瞬间会显得"错位跳出",与同行 sort 按钮的 active 态不齐 */
.sidebar-new-btn--inline:active {
transform: none;
}
.search-input::placeholder {
/* 占位符原本用 fg-muted(暗色 ~2:1 几乎看不见),提到 fg-secondary 让"搜索文件..."
提示文字可见 —— 用户至少能看清这里有输入框 */
color: var(--fg-tertiary);
}
.search-input:hover {
border-color: var(--border-default);
}
.search-input:focus {
/* 鼠标点击不画外圈:键盘 focus-visible 由全局规则接管(见 :focus-visible 基线) */
outline: none;
border-color: var(--accent);
box-shadow: var(--shadow-glow);
background: var(--bg-elevated);
}
@supports (focus-visible) {
.search-input:focus:not(:focus-visible) {
box-shadow: none;
}
.search-input:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
/* 窄侧栏适配:当侧栏 ≤260px 时,「新建笔记」文字隐藏,只显 + 图标,
给 sort 按钮腾出 ~50px 空间,「修改时间」能完整显示。
container query(而不是 @media viewport):跟随 .sidebar 实际渲染宽度,
跟主窗口大小解耦。@supports 检测兼容性:旧 Chromium 不支持 container
query 会跳过规则,回退到全文字(最差也是 ellipsis,不算破图)
阈值 260px 是经验值:sort 「修改时间」4 字 + 新建笔记 4 字同时显示需要
~250px+ 侧栏宽度(实测 240px 时 sort 仍被截断),取 260px 给点余量 */
@supports (container-type: inline-size) {
@container sidebar (max-width: 260px) {
.sidebar-new-btn--inline span {
/* 视觉上隐藏文字,但保留 a11y / 屏幕阅读器朗读「新建笔记」 */
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.sidebar-new-btn--inline {
/* 只显图标时,按钮收紧到 icon + 少量水平内边距即可 */
padding: 5px 8px;
}
}
}
.search-input:focus + .search-icon {
color: var(--accent);
}
/* (search-wrap / search-icon / search-input 已移到 04-toolbar.css —— 2026-09
设计优化:搜索框从侧栏上移到工具栏,样式跟随 HTML 一起走) */
/* ============================================================
Sidebar 排序工具条
Sidebar 排序工具条 + 新建笔记(合并到一行)
紧贴它作用的 .file-list 上方 —— 这是「列表的工具」,
不应该埋进三层深的设置对话框(见 [[feedback-prefer-near-affected-area]])。
设计目标:紧凑到不抢搜索框注意力,active 态明确但不过重。
2026-09 优化:「新建笔记」从独立行合并到右端,
margin-left:auto 把新建笔记推到行尾,与左侧 sort 按钮形成「列表的工具 vs 主操作」的层次。
gap 同步从 2px → 4px:插入「新建笔记」后与 sort 按钮之间需要稍宽间距,避免视觉粘连。
============================================================ */
.sidebar-sort {
display: flex;
align-items: center;
/* gap 2px:sort 按钮之间 2px(连成一组 —— 都是"列表的工具"),
margin-left:auto 把"新建笔记"推到最后,自然形成「sort 组」与「主操作」的分组 */
gap: 2px;
/* 顶 header 12px、底 6px —— 让工具条与列表的视觉关联 > 与 header 的关联 */
padding: 6px 10px 8px 10px;
/* 顶 8px / 底 8px:sort 是侧栏首屏第一行,工具栏底边已经有 ~8px breathing,
这里再给 8px 顶距足够拉开层次(10px → 8px 省 2px 给文件列表);
上下对称让 sort 行居中感更强,border-bottom 自然分隔 */
padding: 8px 10px;
border-bottom: 1px solid var(--border-subtle);
}
@@ -159,7 +166,11 @@
align-items: center;
justify-content: center;
gap: 5px;
padding: 5px 8px;
/* 横向 padding 8px → 6px:sort 标签"修改时间" 4 字 + icon 在默认 220px 侧栏下
需要 ~83px,原 5/8 padding + 4px row gap 把每个 sort 按钮挤到 80px,
「修改时间」就被截断成「修改时」。收到 6px 后单 sort 按钮宽度降到 76px,
省下来的 4×2=8px 让 sort 行整体宽松,可完整显示 4 字标签 */
padding: 5px 6px;
background: transparent;
border: 1px solid transparent;
border-radius: var(--radius-sm);
@@ -234,7 +245,7 @@
color: var(--fg-tertiary);
font-size: var(--fs-sm);
line-height: var(--lh-relaxed);
/* 留点上方间距,与 sidebar-header 拉开 */
/* 留点上方间距,与上方 sort/新建笔记行拉开 */
margin-top: var(--space-2);
/* 避免一行字过长在窄侧栏里截断为半个字 */
word-break: break-word;
@@ -315,9 +326,17 @@
top: 50%;
transform: translateY(-50%);
width: 3px;
height: 60%;
/* 60% → 70%:原 60% 在 13px name + 12px meta 共 31px 行高下占 18px,
加上色条本身的圆角显得"瘦长"。提到 70% (22px) 后,与 file-name +
meta 二行总高的占比更平衡,色条"贴"住视觉单元,不漂在 item 中央。
仍留 30% 上下气口,避免色条顶到 file-name / meta 行边沿 */
height: 70%;
border-radius: 0 2px 2px 0;
background: var(--accent);
/* 加微 box-shadow 让色条在 accent-soft 底色上"浮"起来一点 —
纯色 accent 在 #2a325c 类 accent-soft 背景下,RGB 距离很短,
加 4px 投影能把色条对比拉高一档 */
box-shadow: 0 0 4px color-mix(in srgb, var(--accent) 40%, transparent);
}
.file-name {
@@ -377,6 +396,9 @@
}
.sidebar-footer {
/* 现在侧栏底部只剩 AI 一个按钮(文件夹管理已搬到状态栏左段,
见 [[feedback-folder-actions-to-statusbar]]),padding 收紧到 10px 12px
让按钮离文件列表稍近、视觉关系更紧 */
padding: 10px 12px;
border-top: 1px solid var(--border-subtle);
display: flex;
@@ -384,65 +406,6 @@
gap: 2px;
}
/* 侧栏底部视觉分隔:把上方"打开/切换数据目录"二级链接和下方 AI 主操作分开。
用 1px 细线 + 上下 6px 留白,避免紧贴导致 AI 按钮和文件夹链接"挤成一团" */
.sidebar-footer-sep {
height: 1px;
background: var(--border-subtle);
margin: 6px 0;
}
/* AI 主操作按钮在侧栏底部已不再与 footer-sep 紧邻(sep 在 AI 上方),
不再需要 margin-bottom: 0 来解耦 gap。 */
.link-subtle {
display: flex;
align-items: center;
gap: var(--space-2);
/* 11px 字号在低 DPI 上偏糊,提到 12px(fs-xs-readable)保持视觉小但不模糊;
颜色已用 secondary(2026-08 提亮后约 8.5:1 on dark) */
font-size: var(--fs-xs-readable);
color: var(--fg-secondary);
padding: 6px 10px;
border-radius: var(--radius-sm);
transition: background var(--transition-fast), color var(--transition-fast);
font-weight: 500;
min-width: 0; /* 允许 flex item 在窄侧栏(180px)收缩到内容宽度以下 */
}
/* 文字单行 + 溢出省略号:防止「切换数据文件夹…」在窄侧栏里折成两行 */
.link-subtle > span {
flex: 1;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* link-subtle / footer-action:侧栏底部"打开数据目录 / 切换目录"等
二级链接。hover 时给 bg-hover + accent 文字提示"可点"——
与全局 a 一致用 --accent-text,让"hover 才出颜色"的反馈也维持文字版。 */
.link-subtle:hover {
background: var(--bg-hover);
color: var(--accent-text);
}
/* <button> 重置:与 .link-subtle 一致的"链接外观",但语义上是动作按钮 */
.footer-action {
width: 100%;
text-align: left;
background: transparent;
border: 0;
cursor: pointer;
font: inherit;
}
/* 键盘 focus 高亮 —— 鼠标点击不画,键盘 Tab 才出现(hover 不等于 focus) */
.link-subtle:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
/* ============================================================
Viewer
============================================================ */
@@ -507,7 +470,10 @@
color: var(--accent);
margin-bottom: var(--space-3);
position: relative;
/* 让 halo 缓慢呼吸,强化「等待/邀请」感 */
/* 让 halo 缓慢呼吸,强化「等待/邀请」感。
1.04 → 1.02:旧值在 4s 周期下肉眼明显能看出"放大再缩回",
用户长时间停留空状态(常见:刚启动、刚切数据文件夹)会被这个 4% 缩放
持续吸引注意力;改 2% 后仍保留"呼吸"暗示,但不再"主动拉视线" */
animation: empty-halo 4s ease-in-out infinite;
}
.empty-state-icon::after {
@@ -528,12 +494,14 @@
}
@keyframes empty-halo {
/* 振幅 1 → 1.02(+2%):保留"呼吸"质感的同时不抢占视线。
透明度仍 0.95 ↔ 1,让 halo 在淡入淡出之间柔和过渡 */
0%, 100% {
transform: scale(1);
opacity: 0.95;
}
50% {
transform: scale(1.04);
transform: scale(1.02);
opacity: 1;
}
}
@@ -574,13 +542,20 @@
.empty-state .hint.hint-secondary {
color: var(--fg-tertiary);
font-size: var(--fs-xs-readable);
margin-top: 6px;
/* margin-top 6 → 10px:原 6px 让主 hint 与次 hint 之间几乎贴住,
加上两行 lh-relaxed (1.7) 后视觉上更挤。提到 10px 让两组 hint
之间形成明确的"主 → 次"层次(主是引导、次是补充操作) */
margin-top: 10px;
max-width: 380px;
/* 1.55 让次级提示的换行节奏与主 hint(1.6)接近,避免出现"次 hint 文字挤一行"的突兀感 */
line-height: 1.55;
}
.empty-state .hint kbd {
/* .md 这种代码 chip 用 kbd 标签更语义化 */
padding: 2px 7px;
/* padding 2/7 → 1/6:在 12px 字号下原 2/7 让 kbd chip 显得"鼓鼓的",
跟相邻的中文小字节奏不齐。收 1px 上下让 chip 更贴字高基线 */
padding: 1px 6px;
background: var(--bg-hover);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
@@ -590,6 +565,8 @@
color: var(--fg-secondary);
font-weight: 600;
box-shadow: 0 1px 0 var(--border-subtle);
/* 上下微 margin 让 kbd 与相邻文字垂直居中对齐(默认 baseline 会让 kbd 显得"沉") */
margin: 0 1px;
}
.empty-state code {
@@ -649,10 +626,11 @@ body[data-editor-mode="split"] .editor-pane {
flex-direction: column;
}
/* 让编辑器像 viewer 一样「居中 + 限定行宽」,与预览区域视觉重量一致。
max-width 与 .markdown-body 共用 --w-reader-max,保证 gutter + 内容总宽
不超过 reader max;margin auto 在更宽的窗口中把编辑器推到中部。
窄窗口下 max-width 不再生效,编辑器自然占满全宽(不破坏小屏体验)。 */
/* 让编辑器与预览区域保持一致的宽度处理:共用 --w-reader-max。
默认 token 设为 none(content 完全填满区域,最大限度显示内容),
若未来想恢复"最优阅读宽度"上限,把 01-tokens.css 里的 --w-reader-max
改回 px 值(如 720px)即可,不用改这里。margin auto 仍保留,方便
切回 px 上限后让内容在更宽的窗口里居中。 */
.editor-pane .cm-editor {
max-width: var(--w-reader-max);
margin: 0 auto;