Commit Graph

50 Commits

Author SHA1 Message Date
f9d539ad42 fix(ui): 撤除 v77–v85 页脚定位实验,回到 v76 的文档流形态
用户反馈"怎么又变成悬浮在底部了?而且好丑",确认 fixed 不符合预期。
v77–v85 这一串在 fixed/static 之间反复摇摆,且 v81 用 :not(:has(...))
造出 (0,11,x) 高特异性 static 钉子,使后续所有 position 修改全部失效,
导致 /workspace 页脚始终被撑出视口(bottom=740 > 720)。

本版一次性删除这些实验段,恢复为:页脚静态排在内容流末尾(v76 形态),
保留用户已确认的内容类改动:
 - v79/v80 两列两行版式(左两行备案 / 右两行座右铭)
 - v78 文字加深(备案 7.6:1、一言 4.8:1)
 - 座右铭固定文案(不再是随机的 hitokoto)
 - 悬浮按钮无灰底、切换视图菜单可点(v74/v75,属独立修复,不动)
2026-09-12 20:19:14 +08:00
e9fab61a2e fix(ui): 删除 v81 的高特异性 static 钉子,页脚统一固定贴底
真凶(打印命中规则并按特异性排序后确认):
 v81 引入了
   html[data-theme] body:has(.minimal-home) .navi-footer-host,
   html[data-theme] body:not(:has(.minimal-home)) .navi-footer-host { position: static !important }
 特异性 (0,11,4)~(0,11,5),压过此后所有 fixed 规则 (0,4,4),
 使 /workspace 页脚永远停在文档流位置:bottom=737 > 视口 720(第二行掉出视口)、
 页面被撑出滚动条。用户实测症状:"工作区整体可以滑动""底栏只显示备案号""mini 底部看不到"。

本版:整段删除 v81(文档流方案),并以简单选择器统一
 .navi-footer-host / footer > .navi-footer 为 position:fixed; bottom:0,
 内容容器 #app 留 44px 净空避免遮挡。

教训:用 :not(:has(...)) 构造的"通用覆盖"会形成无法覆盖的高特异性钉子。
2026-09-12 20:00:47 +08:00
c77a1795a3 fix(ui): 页脚改回固定贴底(文档流方案会让页脚掉出视口)+ 内容留净空
用户实测反馈三点,经真实视口复现确认:
① /workspace 不滚动时页脚 bottom=737 > 视口 720 → 第二行(豫公网安备/无谓前路之沧桑)
   落在视口外,且页面被撑高 → '工作区整体能滑动'、'底栏只显示备案号';
② 文档流方案(v81-v83)在视口较矮或内容较多时页脚必然掉出视口,
   用户评价'不如上一版'—— 因为上一版是固定层,任何视口都可见;
③ 我此前用'距文档底=0px'当成功判据,但那只证明它是文档最后一项,
   **不能证明它在视口内可见** —— 判据再次用错。

本版:恢复 position:fixed/bottom:0(同 v76 做法),
并成对给内容容器留出 44px 底部净空避免遮挡;
固定层不参与文档高度,避免页面被撑出滚动条。
2026-09-12 19:53:47 +08:00
cb82a938f6 fix(ui): 页脚贴住页面最底 —— 消除 #app 吞掉剩余空间
实测(滚到最底时的 host.bottom / 文档高):
  /         720 / 720  → 0px ✓
  /minimal  717 / 720  → 余 3px
  /workspace 674 / 720 → **余 46px**
根因:body 为 display:flex/column,其中 #app 是 flex:1 1 auto,
吃掉全部剩余高度,使页脚只能排在 #app 之后的中途位置。
修法:body 直接含 .navi-footer-host 时令 #app 改为 flex:0 0 auto(不再伸展),
页脚用 margin-top:auto 落到最底;并清掉 minimal 内容链末尾的余量。
2026-09-12 19:38:12 +08:00
b017c3a4b8 fix(ui): 三视图页脚真正落到页面最底 + workspace 的 grid 生效
父链实测(v81,三个视图结构不同):
  /          .navi-footer[grid] < FOOTER[pb:8px] < #dashy < #app < BODY
  /minimal   .navi-footer[grid] < .navi-footer-host[flex] < BODY
  /workspace .navi-footer[flex ✗] < .navi-footer-host[flex] < BODY
问题:① / 多出 8px 空隙(来自 <footer> 的 padding-bottom);
     ② /workspace 页脚停在 y=624,下方仍有 80px 空;
     ③ /workspace 页脚未被 grid 规则命中(写成 flex),四子项挤在同一行。
改动:
 - 补 body > .navi-footer-host > .navi-footer 的 grid 规则与 2×2 显式定位
   (覆盖 host 直接挂 body 的视图);
 - body > .navi-footer-host 用 margin-top:auto 推到页面最底、不留空;
 - 首页清掉 #dashy > footer 的 padding-bottom(8px 空隙来源)。
选择器均按实测父链结构编写,非猜测。
2026-09-12 19:10:53 +08:00
a2bead912f fix(ui): 页脚回归文档流(用户要求:位于页面底部,而非悬浮于底部)
实测 v80:三视图 .navi-footer-host/.navi-footer 均 position:fixed + z-index:3,
是永远贴住视口、盖在内容之上的悬浮层(/workspace 还因此底部出血 8px)。
用户明确要求页脚应是**页面底部的内容**,滚到最底才出现,不悬在内容上。

改动:host 与 .navi-footer 一律 position:static(回到正常文档流),
取消 z-index、取消为固定页脚预留的 margin-bottom(26/40px),
pointer-events 恢复 auto(不再是浮层无需穿透),
透明/无边框/无模糊保持不变。
2026-09-12 19:00:20 +08:00
e3770cd10a fix(ui): 修 v79 页脚三行问题(隐藏分隔符仍占网格格位)
实测 v79:grid 算成 3 行(y=671/688/705),左列多出一行。
原因:.navi-footer-sep 虽设 display:none,但被更高特异性规则压过,
仍占据 grid 第 2 行格位,把「豫公网安备」挤到第 3 行。
修法:同级别选择器彻底隐藏分隔符(display:none + 绝对定位移出流外),
并用 grid-column/grid-row 显式定位:左列 1/2 行 = 两个备案号,
右列 1/2 行 = 两句座右铭;grid-auto-rows:0 防止隐式行撑高。
2026-09-12 18:54:52 +08:00
38467a1724 feat(ui): 页脚改为「左两行备案 / 右两行一言」,一言换成用户座右铭
用户要求:
① 左侧两行 = 两个备案号;右侧两行 = 一言两句;
② 一言不用随机 API(原 hitokoto + 随机兜底,观感中二且不可控),
   改为固定座右铭「不念往昔之繁华 / 无谓前路之沧桑」。

实现:
- navi.js:installDailyQuote 重写为固定文案,移除 fetch(hitokoto) 与随机 FALLBACK。
- navi.css:.navi-footer 改 CSS Grid(2 列 × 2 行 + grid-auto-flow:column),
  使「备案A / 备案B」落入左列两行、「quote1 / quote2」落入右列两行,
  一言列右对齐;隐藏原分隔符;内容框底部预留提升到 40px 以容纳两行页脚。
2026-09-12 18:51:19 +08:00
8cc94e91f0 fix(ui): 页脚文字加深 —— 备案号 #94a3b8→#475569、一言 #b6c2d2→#64748b
用户反馈「文字颜色过浅」。实测前景色与亮度:
  备案号/分隔符 rgb(148,163,184)=#94a3b8(亮度 160)
  每日一言     rgb(182,194,210)=#b6c2d2(亮度 187)
均为 11px 小字 + 透明背景(叠在浅色页面底图上),对比度偏低、观感发虚。
改为中性 slate:#475569(对白底约 8.9:1)、一言 #64748b;
并去掉一言的斜体(小字号下进一步降低可读性);hover 加深为 #1e293b + 下划线。
深色主题改用 #cbd5e1 / #94a3b8 保持可读。
2026-09-12 18:35:56 +08:00
175788e4eb fix(ui): 首页/工作台页脚对齐 —— 首页固定贴底、workspace 不再出血
复核发现(同一套判据,1280×720):
① /:.navi-footer 位于 Dashy <footer> 内、position:static、bottomPx=1092,
   页脚在文档流里 → 必须滚动才可见('备案号各视图可见'被破坏);
   且该视图无 .navi-footer-host 包裹层,结构与其他视图不一致。
② /workspace:.navi-footer-host 虽 fixed bottom:0,但 bottomPx=733 > 视口 720,
   底部约 13px 出血。

修法:
- 首页:对 footer > .navi-footer 直接固定贴底(flex row + 两端分布 + 透明一行),
  不改动 DOM 结构;
- workspace:显式 bottom:0 并限制 footer 高度上限 20px。
两视图的悬浮按钮经复核已是 idle α=0、无阴影(v75 已修),菜单在 / 上可点且真跳转。
2026-09-12 18:20:15 +08:00
38ba5584f0 fix(ui): 页脚被内容链规则压成竖排 —— 排除 .navi-footer-host/.navi-footer
几何实测(v75):.navi-footer display=flex 但 flex-direction=column,
5 个子项竖排 y=694/715/736/757/778,每日一言 h=0 且落在视口外;
host overflow=hidden。
根因:那两条 body:has(.minimal-home) > div / > div > div 规则命中 .navi-footer,
使其成为 column + overflow:hidden 的容器。
v71 的 row 规则特异性 (0,4,2) 本可压过原规则 (0,2,4),
但 v74 为修「菜单被裁剪」给该规则加了 3 个 :not(),
特异性升到 (0,5,4),反而压过了页脚规则 —— 同一个 :not() 修好菜单、踩坏页脚。
修法:把 .navi-footer-host / .navi-footer 也加入 :not() 排除
(两者均为固定定位,本就不应参与该压缩链)。
2026-09-12 18:07:07 +08:00
c299a666f6 fix(ui): 删除 v68 引入的按钮灰底(源头),不再叠加覆盖
用户反馈:两个悬浮按钮下面都有方形灰色背景,点击时背景还会高亮。
来源即本段(v68 为不再显灰而加的 rgba(255,255,255,0.92) + 描边 + 投影)。
v73 试图改成透明未生效,因为该段选择器 html[data-theme]:not(.navi-dark) .navi-*
特异性 (0,3,1) 高于 v73 的 (0,2,2) —— 又一次被特异性反超。
故直接删除本段,按钮回到既有设计:idle 透明、仅 hover/focus-visible 圆形淡染。
2026-09-12 18:05:05 +08:00
b967dd409e fix(ui): 源头修复「切换视图菜单被裁剪」—— 排除导航控件子树
真因(已定位到具体规则与行号):
 navi.css 729-730 行(v60 为修 flex 压缩链而写)
   html[data-theme] body:has(.minimal-home) > div,
   html[data-theme] body:has(.minimal-home) > div > div { … overflow: hidden !important }
 匹配了 body 下所有 div 与 div>div,因此:
   .navi-dock(body 直接子元素)、.navi-view-switch 也被设成
   overflow:hidden + display:flex + column + max-height:100%。
 菜单(.navi-view-menu)是 .navi-view-switch 的子元素,超出 52×52 盒的部分被裁剪,
 只露一条缝:像素比对证明它在渲染,但中心 elementFromPoint 命中 #dashy,
 三个选项全部点不到 → 用户观感点了没反应,残留碎片即方形灰色背景。
 先前 v73 的覆盖选择器特异性不足(0,2,2 < 该规则的 0,2,3 起),故无效。

修法:在该规则上加 :not(.navi-dock):not(.navi-view-switch):not(.navi-view-menu),
不动其它内容链行为。配套 v73 的 overflow:visible/z-index:1000 现已生效。
2026-09-12 18:03:00 +08:00
d7cada953c fix(ui): 修切换视图菜单被 overflow 裁剪('点了没反应'真因)+ 按钮去灰底板
真因(两条独立证据 + 像素证据):
- 祖先链:.navi-view-switch{overflow:hidden} → .navi-dock{overflow:hidden};
- 菜单开/关截图像素比对有变化(确实在渲染),但菜单中心的 elementFromPoint
  命中 #dashy → 超出 52×52 按钮盒的面板被裁剪,看不见也点不到;
- 用户所称方形灰色背景即被裁剪后残留的菜单面板碎片。
此前我误判它'可见',因为 getBoundingClientRect 不受裁剪影响 —— 判据已改为像素比对 + 命中测试。

改动:.navi-dock/.navi-view-switch overflow:visible;.navi-view-menu z-index:1000 +
pointer-events:auto;三个悬浮按钮去掉背景/描边/阴影(透明圆形),
仅在 hover/focus-visible 时给一层圆形淡染,点击不再出现方块高亮。
2026-09-12 18:00:28 +08:00
26b3bac329 feat(ui): 页脚左右分栏——备案号靠左并列、每日一言靠右
需求(用户):备案号并列在左侧,一言在右侧。
结构不变(备案 A / sep / 公安备案 A / sep / .navi-quote),用
.navi-quote { margin-left: auto } 把一言推到右端,其余靠左排列;
宽度改为 100%(上限 calc(100vw - 32px))以便两端分布。
隐藏紧邻一言的那条分隔符(左右分栏后不再需要)。
沿用 v71 的同特异性选择器,避免被中间重复定义覆盖。
2026-09-12 17:56:56 +08:00
0cd0d253d3 fix(ui): 页脚补宽度约束 + 更正上一提交的根因叙述
更正:上一提交称 824 行 'display: block' 压制了 flex —— 实际读该行是
  .navi-footer-host > * { pointer-events: auto }
设的是 pointer-events,与 display 无关。真实成因是 **折行**:
页脚宽度实测仅约 192px(内容需约 470px),flex-wrap 生效下折成 3~4 行,
总高约 63px(与 scrollHeight=65 吻合),第 4 行的每日一言被排到 y=743,
超出视口 720 → 不可见。
本版补 width: max-content + max-width: calc(100vw - 24px),
配合 v70 的 flex-wrap: nowrap,使四个子项落在同一行。
判据仍为 y>=0 且 bottom<=innerHeight(元素有尺寸但位于视口外不算可见)。
2026-09-12 17:47:17 +08:00
ab2e514e00 fix(ui): 页脚真凶——同特异性覆盖 .navi-footer 的 display,恢复横排一行
几何实测(v69):.navi-footer 运行时 display=block,四个子元素纵向堆叠
(y=680/701/722/743),盒高 26px 而已 bottom=720 →
每日一言在视口下方(y=743 > 720),**根本没有显示**。
此前我改高度、行高、加 !important、挪到文件末尾全部无效,
因为根因是 824 行的
  html[data-theme] body:has(.minimal-home) .navi-footer-host > * { display: block !important }
—— 特异性 (0,2,1) 高于我的 (0,1,1):同等 !important 下按特异性取胜,与顺序无关。

修法:用同特异性选择器(.navi-footer-host > .navi-footer)覆盖为
display:flex + flex-direction:row + nowrap,子项高度 auto,每日一言省略号。

判据修正(此前两次误判为成功):
不再只看 height>0,而要求 y>=0 且 bottom<=innerHeight —— 元素有尺寸但在视口外仍属不可见。
2026-09-12 17:47:01 +08:00
7f6bec43f2 fix(ui): 撤销 v68 页脚固定行盒(倒退),恢复 v67 形态,保留按钮底色改良
v68 实测为倒退:页脚 scrollHeight 65 / clientHeight 26,每日一言被挤出到高度 0
(v67 时它 13px 可见)。撤销 20px 行盒相关规则,回到 v67 页脚形态;
保留同时交付的按钮样式(0.92 中性亮面 + 描边 + 柔投影),该改动实测有效。
2026-09-12 17:45:04 +08:00
65138f7d83 fix(ui): 页脚固定 20px 行盒消除 1-2px 裁切;底部按钮改中性亮面不再显灰
- v67 遗留:.navi-footer 高 26px 但 scrollHeight 超出 clientHeight 1-2px(下缘被切)。
  改为 20/20/20 + line-height:20px + overflow:visible,单行行盒不再溢出。
- 浅色主题下 .navi-view-toggle/.navi-admin-entry 底色 rgba(255,255,255,.72)
  叠在浅背景上观感发灰 → 改 0.92 亮面 + 中性描边 + 柔投影,hover 纯白,
  focus-visible 用中性色轮廓(不引入蓝色)。深色主题规则不变。
- 视图切换保持点开弹菜单(用户明确选择),未改动其交互。
2026-09-12 17:42:51 +08:00
e84d51f747 fix(ui): 页脚最终覆盖移到文件末尾(此前被同优先级规则按级联顺序盖掉)
v66 实测:重叠已消除(-19/-83px)、底部控件全部可点(命中自身),
但页脚背景仍是 rgba(255,255,255,.55) + blur(14px)、每日一言 height:0 ——
因为 navi.css 里 .navi-footer 有多处重复定义(1016/1447/1515…),
我插在中间的规则被后面同优先级规则覆盖。

本提交把页脚最终形态(透明、无边框/模糊、一行、26px host + 20px footer)
统一追加到文件**末尾**,并给每日一言 display:inline-block + min-height:13px,
确保它参与行盒、有实际高度而不会被裁成 0。
2026-09-12 17:30:51 +08:00
cb0f8111d8 fix(ui): 页脚改为"真正一行 + 布局预留",消除遮挡与裁切(第三次,纠正前两版)
实测故障(1280×720):
  .navi-footer-host y=598 h=123 fixed;.navi-footer 209×93 半透明 + overflow:hidden;
  内容区底=701 → 与页脚重叠约 103px。那块半透明白块既是"灰色遮罩"又挡住底部点击。

与前两次的区别(前两次的错):
- v63:只改字号/背景,页脚仍 113px 高(另有规则撑高),没解决遮挡
- v64:用 height:22px + overflow:hidden 硬压 → **把内容裁掉**(每日一言高 0 不可见)

本版:
- 去掉胶囊(透明/无边框/无模糊/无圆角),内容自然排成一行 → 不靠裁切
- .navi-footer 用 inline-flex + width:max-content + max-width:calc(100vw-16px),
  每日一言 min-width:0 + ellipsis(超长才省略,不会消失)
- **在布局里预留 26px**(.item-group-container margin-bottom:26px),
  内容框不再与固定页脚重叠;内框 padding-bottom 由 96px 降为 8px
- 重新加入每日一言(按天缓存 + 3s 超时 + 内置兜底)
2026-09-12 17:27:38 +08:00
cad98c9f11 Revert "fix(ui): 备案号压成一行小字贴底,并在旁边加"每日一言"点缀"
This reverts commit 80fd9b9ffa.
2026-09-12 17:09:28 +08:00
691245122c Revert "fix(ui): 页脚强制 22px 高度上限(实测曾被撑到 113px)"
This reverts commit 4a66b2559a.
2026-09-12 17:09:28 +08:00
4a66b2559a fix(ui): 页脚强制 22px 高度上限(实测曾被撑到 113px)
上一版只改了字号/背景/边框,实测页脚高仍为 113px —— 说明另有规则在撑它,
视觉上依旧一大块。本次对 .navi-footer-host 与 .navi-footer 显式限定
height/max-height: 22px + overflow:hidden + box-sizing:border-box,
把它压成真正的一行小字(配 nowrap + ellipsis,不会显示成半截字)。
2026-09-12 16:55:45 +08:00
80fd9b9ffa fix(ui): 备案号压成一行小字贴底,并在旁边加"每日一言"点缀
用户反馈:备案区域太大、喧宾夺主,且位置不贴底。

CSS(web/navi.css):
- .navi-footer-host / .navi-footer 去掉胶囊底、玻璃模糊、边框与投影
- 字体 11px、内边距 2px 10px、单行 nowrap、居中、透明背景
- 文字色降为 muted(浅色 #94a3b8 / 深色 #7c8ea6,hover 略亮)
- 新增 .navi-quote 样式(斜体、更淡一档、超长省略;窄屏限制宽度)

JS(web/navi.js):
- 安装"每日一言":按天缓存于 localStorage,请求 hitokoto 文本接口(3s 超时),
  失败/超时用内置句子兜底;页脚尚未注入时最多轮询 20×500ms 再挂载
- 装饰性内容不影响可用性:任何失败都不抛出、不阻塞页面
2026-09-12 16:51:28 +08:00
fdfee17726 fix(ui): mini 页备案号脱离内容流固定贴底,使页框高度恒定
实测(1280×720,逐页签):
  页脚 .navi-footer-host 的 top 在 481~527 间漂移 —— 内容多的页签页脚更低,
  因为它处在内容流里;用户反馈"内容没撑满时备案号位置就不对"。

改动:
- body:has(.minimal-home) 下,.navi-footer-host 改为 position:fixed 贴视口底部
  (pointer-events 仅容器 none、子元素 auto,链接照常可点)
- 表项框底部净空 84px → 96px,给固定页脚留位,最后一行不被压住

这样内容框吃满"视口 - 顶部chrome - 固定页脚",高度与内容多少无关。
2026-09-12 16:46:19 +08:00
925fae13a4 fix(ui): 滚动区层级修正——只让表项框滚动,页签行保持固定
用户实测:滚动时页签与会一起被带走。原因是我把滚动放在 .item-group-container 上,
而 Dashy 的 DOM 里**页签行(.minimal-headings-wrap)也在该容器内**,
所以整块(页签+内容)一起滚。

本版:
- .minimal-home > .item-group-container:仅 flex 列布局 + min-height:0,**overflow:visible(不滚)**
- .minimal-home > .item-group-container > .minimal-section-inner:设为**唯一滚动区**
  (overflow-y:auto + min-height:0 + flex:1 + 底部 84px 净空)
- .minimal-headings-wrap:flex:0 0 auto,固定在上方不参与滚动
2026-09-12 16:41:32 +08:00
26924ca719 fix(ui): 修正 mini 页滚动——补 flex 链条 min-height:0,滚动交给内容框
上一版只把 body 锁成 overflow:hidden,既没提供可滚动内层,也没让框收缩,
等于把超出视口的内容"藏起来"。用户直接指出:应当让框收缩到一屏刚好撑满。

根因:Dashy 的 DOM 链条是
  .minimal-section-inner ← .item-group-container ← .minimal-home ← div ← div ← body
中间两层无名 wrapper 没有 min-height:0,flex 项无法压缩 → 容器被内容撑高,
既撑出页面(已锁住)又不产生内部滚动。

本版:
- body(:has(.minimal-home)) 锁 100dvh,并把中间两层 wrapper 也设为
  flex:1 + min-height:0 + max-height:100% + overflow:hidden(补齐链条)
- 滚动显式交给 .minimal-home > .item-group-container(flex:1 + min-height:0 +
  overflow-y:auto + padding-bottom 84px 给底部悬浮件/备案号留净空)
- .minimal-section-inner 不再自成滚动区(overflow:visible),避免双层滚动条
2026-09-12 16:18:00 +08:00
536c7e09ec fix(ui): mini 页内容框按视口自适应并在框内滚动 + 去除硬编码蓝色
两个反馈一次处理:

1) 滚动行为割裂
   实测 .minimal-section-inner 为 max-height:none / overflow:visible,
   内容多即撑高整页 → 滚动落在页面;分组内容多少不同,就出现"有的能滚有的不能"。
   改为:body(:has(.minimal-home)) 锁 100dvh 且 overflow:hidden,主体纵向 flex,
   内容外框/内框 flex:1 + min-height:0 + overflow-y:auto,滚动统一切到框内;
   底部留 84px 净空避免被悬浮件/备案号压住;仅作用于 mini 页,不影响首页与工作区。

2) 硬编码蓝色(9 处,全在 web/navi.css)
   - Dashy 主题变量 --primary/--primary-alt/--info/--footer-text-color-link/
     --nav-link-border-color-hover 原为 #38bdf8/#0ea5e9 → 改中性 slate
     (深色块用 #cbd5e1/#94a3b8 保证可读)——这是全站泛蓝的源头
   - 按钮蓝色渐变 linear-gradient(#0ea5e9,#2563eb) ×2 → 中性 slate 渐变
   - 深色页脚链接 hover #38bdf8 → #e2e8f0
2026-09-12 16:06:24 +08:00
106a178726 fix(ui): mini 页签去图标与蓝色,选中态改为中心向外扩散的高亮
按用户要求调整 /minimal 顶部页签:
- 删除页签内小图标(.section-icon/.item-icon 隐藏)——它同时是 Dashy --primary(#0ea5e9)
  蓝色最显眼的一处来源
- 选中态不再用"更实底色 + 内描边"(会读成描边/填充),改为**径向渐变**:
  中心接近纯白、向四周渐淡至透明,视觉上"从中心向外扩散";
  未选中页签显式清掉 background-image,形成"选中=有光晕"的对照,不靠颜色区分
- 文字强制回中性色(浅色 #0f172a / 未选 #334155;深色 #f1f5f9 / 未选 #a9b8cd)
  并加轻微 text-shadow,保证中心亮底上的可读性
- 深色模式同款径向高亮(冷白偏蓝的暗底亮斑),文字对比度同步
- 焦点态改为细白环(去掉会读成描边的默认 outline)
2026-09-12 15:32:45 +08:00
6e073a9201 fix(ui): mini 页顶部页签补齐玻璃质感(与搜索栏/浮动件同一配方)
问题:/minimal 顶部那排页签(.headings)与左右翻页按钮只有尺寸与圆角,
没有底色/边框/backdrop-filter,而页面其它玻璃面(dock、搜索栏、分组容器)
用的是 blur(22px) saturate(180%) + 半透明白底 + 内高光边框 → 顶部一排显得十分割裂。

改动(web/navi.css):
- .minimal-headings-row .headings 补玻璃底/边框/投影/模糊,与搜索栏同配方
- 选中态(.active / aria-selected)底色更实 + 内描边,保持可辨识
- 左右翻页按钮同样上玻璃(略小模糊),disabled 时降透明度
- 深色模式给对应的深色玻璃值(rgba(20,31,49,.78) 系),避免深色下发白刺眼
- 支持 prefers-reduced-motion

注意:本次为纯 CSS 改动,尚未做真实渲染验证(需部署后截图核对)。
2026-09-12 15:25:31 +08:00
f08e0bf844 fix(workspace): 弹窗卡片在深色下仍是白卡(补齐)
实测(打开被拒绝内嵌的应用时弹出提示):
.navi-ws-modal 遮罩已是深色,但 .navi-ws-modal-card 仍为 rgba(255,255,255,.96),
深色下是刺眼白块且与浅色文字冲突;按钮同样是亮色。

补齐卡片/标题/正文/按钮的深色样式。内嵌区上一条已改为透明(去黑方块)。
2026-09-12 08:39:43 +08:00
b794aed18e fix(workspace): 去掉内嵌应用区的黑方块(改透明)
用户反馈工作空间深色下有黑色方块。实测:亮色时代该区域是 #fff,我在 v44
把它改成 #0f172a,于是打开应用时那块区域变成一整块不透明黑。

修法:内嵌区与 iframe 一律透明(露出壁纸/玻璃底),应用自身背景照常显示,
空态也不再出现突兀方块。深/浅两种模式行为一致。
2026-09-12 08:37:02 +08:00
2d3b1e31de fix(layout): 矮视口下备案号移出文档流,彻底修掉 minimal 纵向滚动
实测:仅压缩内边距后 .navi-footer-host 仍有 37px 高且在 flow 中,
900x520 下 minimal 的 scrollH=536 > viewH=520(溢出 16px)。
改为 position:fixed 后不再撑高页面;搜索栏与按钮组已在 bottom:60px,不会相撞。
workspace 视图原本就是这样处理。

同时记录另一处误判:矩阵里"900x520 失去深色"是我等待不足(2s)抢在
navi.js 应用主题前测量所致;复测 mq=true/navi-dark 均已生效,深色无问题。
2026-09-12 08:12:09 +08:00
67038ce4de fix(layout): 矮视口下备案号不再撑高页面(修 minimal 纵向滚动)
实测复现:900x520 时 .navi-footer-host 由 39px 换行涨到 69px,因处于文档流
(margin-top:auto)把页面顶高 47px,minimal 出现纵向滚动;1280x720 等常见尺寸
复现不出来,所以此前漏检。

只对 max-height:560px 收紧:缩小内边距/字号 + 禁止换行,并同步上移搜索栏
与按钮组,避免与备案号相撞。高窗口与移动端不受影响。
2026-09-12 07:55:22 +08:00
c8f6ac68fe fix(theme): workspace/minimal 深色补齐(侧栏白色药丸、内嵌应用白框)
实测(computed style):
- nav.side-bar 已是深色,但 .side-bar-item 仍为 rgba(255,255,255,.7) 白色药丸
- .work-space .web-content 为 rgb(255,255,255) 纯白,深色下形成刺眼白框
- .navi-ws-bar-btn / 工具条 / 提示框一并补齐深色

minimal 的纵向滚动在 1280x720 下复现不出来(scrollable=false),
需要用更矮视口复现后再修,避免凭猜测改动布局。
2026-09-12 07:53:08 +08:00
064f986a7f fix(theme): 深色遮罩交给服务端,避免双重压暗
实测发现深色下 body 的 background-image 仍是亮色的 70% 白遮罩(壁纸被洗白)。
遮罩由服务端 applyWallpaperBlock 写进 conf.yml,因此在那里补一条深色规则
(同一张壁纸 + rgba(6,12,24,dim+0.15) 遮罩),并移除 navi.css 里那层
body::before 遮罩,避免壁纸被双重压暗。加单测断言深浅两条规则共存、
且移除壁纸时一并清除。
2026-09-12 07:49:34 +08:00
1257164c3f fix(theme): 备案号深色药丸 + 确认不再用 background 简写
浏览器规则枚举确认元凶:navi.css 的 html.navi-dark body 用 background 简写
(特异性 0,2,1 > 壁纸规则 0,1,1),简写把 background-image 重置为 initial,
于是壁纸消失。本地已改为仅 background-color + body::before 深色遮罩。

同时按实测补上备案号药丸的深色样式(此前实测仍是 rgba(255,255,255,.55)),
并把内部元素强制透明,避免深底上贴一块白。
实测数据:备案号位于文档最底部(y=1079..1125 / 文档高 1125),与悬浮件无重叠。
2026-09-12 07:46:09 +08:00
e064ef5296 fix(theme): 深色不再抹掉壁纸,改为深色遮罩压暗
用户反馈深色下背景图片消失。原因:我在深色里用了 background 简写并带
!important(特异性 0,2,1 > 壁纸规则的 0,1,1),把壁纸的 background-image
清成了 none。

改为:只覆盖 background-color,另加 body::before 深色遮罩(与亮色模式
白色遮罩同思路,z-index:-1 是本站既有做法),壁纸依旧可见、只是变暗。
同时修正上一轮验证方法的缺陷:那几次"看到旧样式"是浏览器缓存造成的假象。
2026-09-12 07:40:56 +08:00
817a5991b3 fix(theme): 基于真实浏览器渲染修复深色文字与右侧方块
此前只检查 CSS 规则存在,没有检查真实页面 computed style,导致标题、分组标题、
卡片正文仍被前面的亮色 !important 规则覆盖;右侧 dock/view-switch 布局容器也被
错误涂上背景,形成灰色方块。

这次通过共享 Chromium 实际登录并强制深色模式,逐项读取 computed style:
- 顶部标题 #f1f5f9
- 分组标题 #dce6f5
- 卡片主文字 #f1f5f9、说明 #a9b8cd
- 分组/卡片使用协调的深色玻璃层级
- dock 与 view-switch 布局容器完全透明,仅两个圆形按钮着色
- 备案号为完整深色胶囊,子元素透明
- 工作空间/极简视图同步补齐深色侧栏、工具条和弹窗

自动验证同时断言:文字亮度、深色面板、透明容器、圆形按钮、零运行时异常。
新增 deploy/zd-host.sh,供单容器正式接管入口后的 host 网络部署使用;失败自动回滚。
2026-09-12 07:30:00 +08:00
44e2792f0e fix(theme): 深色下主页底色与右下悬浮件仍不生效
现象:主页大面积没变深;右下角仍有一块灰色方块。

根因:
1. conf.yml 的玻璃主题用 html[data-theme] body 设了亮色背景,特异度与
   html.navi-dark body 相同(0,1,1),而 customCss 由 Dashy 运行时注入、排在
   navi.css 之后 —— 平局时后者胜出,所以页面底色没被改掉。
2. 右下那块是我们自己的悬浮件,但此前只逐个类名列举,漏掉的类名就保持原样。

改法:
- navi.js 把 navi-dark 同时打到 <html> 与 <body>(并在 DOMContentLoaded 再应用一次)
- navi.css 用 html.navi-dark body.navi-dark 提高特异度到 (0,2,1),压过 customCss,
  与注入顺序无关
- 兜住 Dashy 外层容器(#dashy/.home/.workspace/.minimal-home)与原生页脚
- 用 [class^="navi-"]/[class*=" navi-"] 整体兜住我们注入的悬浮件,避免再漏类名
2026-09-11 23:38:56 +08:00
b1e4367937 fix(theme): 深色改为整套主题变量覆盖,不再改写 data-theme
用户反馈"深色区域有的方形、有的根本没变深"。根因有两层,都是我的做法错了:

1. navi.js 会把 <html data-theme> 改成 "dark"。Dashy 的配色变量是按主题名
   作用域输出的(本站主题 jianf-glass),改掉它 → 整套主题变量失配 →
   有的区域完全没变深。
2. navi.css 之前只覆盖"页面底色 + 我们自己的悬浮件",Dashy 自己的卡片/侧栏/
   头部仍走原主题 → 与深底色拼在一起,就成了直角圆角混杂。

改法:
- navi.js 只切 <html class="navi-dark">(并设 color-scheme),绝不碰 data-theme
- navi.css 用 html.navi-dark 一次性覆盖 jianf-glass 的全部配色变量(47 个:
  背景/卡片分组/条目文字/侧栏/头部导航/搜索框/设置面板/弹层/滚动条/语义色),
  Dashy 自身界面随之整体一致变深;形状由元素自身样式决定,不再混杂
- 选择器 html.navi-dark 特异度(0,1,1) 高于 [data-theme=…](0,1,0),与注入顺序无关

需要目视确认配色层次(变量值只能看着调)。
2026-09-11 23:31:27 +08:00
a8ce6ad759 feat(theme): 导航页恢复自动深浅色(跟随系统),保留隐藏原生设置入口
用户反馈:现在没有自动深/浅色。实测原因有两层:
1. Dashy 原生的日/夜切换按钮在设置面板里,而该面板按要求被隐藏;
2. navi.css 没有任何 prefers-color-scheme 分支,且多处写死亮色。

本提交按"我们自己接管"实现(不去赌 Dashy 压缩后的主题存储键):
- navi.js:默认跟 prefers-color-scheme;手动切换过以 localStorage.navi-theme 为准;
  系统偏好变化实时跟随;给 <html> 设 data-theme 与 .navi-dark,并设 color-scheme。
  Dashy 挂载后可能覆写 data-theme,用短暂定时对齐 + 属性观察器收口
  (仅在"与期望不一致"时回写,避免自激循环)。
- navi.css:深色下覆盖页面底色与文字,以及我们自己注入的悬浮控件
  (搜索条/收边控件/页脚/工作空间工具条与弹窗/迷你视图标签条)。
  选择器带 body 以压过主题注入的 customCss。

需要人工目视确认观感(深色下的玻璃层次只能靠眼睛调)。
2026-09-11 23:18:54 +08:00
26a0b15014 perf(web)+fix(admin): 撤掉卡片层模糊、补隐藏动画、后台窄屏适配、收边两段式
1) 卡顿:撤掉"重复且参与动画"的卡片层 backdrop-filter
   实测首页 37 个元素带模糊(24 张卡片 + 6 个分组容器 + 顶栏 + 悬浮件)。
   模糊要对背景逐帧重采样,而卡片又参与逐张淡入与悬停位移,叠加就是卡顿。
   现在只保留分组容器的玻璃感与悬浮件(搜索栏因宽/圆角/内边距一直在变也去掉)。
   实测:/ 从 37 → 12,/minimal 从 15 → 4。
   注意:选择器必须写成 html[data-theme] body a.item —— 主题的 customCss 由
   Dashy 运行时注入,同权重 + 同为 !important 时靠文档顺序决胜,写在 navi.css
   里的规则会输,必须提高特异性。

2) 隐藏/出现补动画
   ≤380px 让位隐藏按钮组:加上 opacity+位移过渡,并把 visibility 延迟到淡出
   结束再切(否则瞬间消失、看不到过渡)。弹层关闭先加 .closing 淡出再摘节点。
   降动效模式下不再用 transform:none 抹掉"收边"的位移,避免隐藏失效。

3) 工作空间收边改为"第一次交互只滑出"
   收起态点一下只滑出、不触发(否则贴边的按钮会被直接点中,比如想看搜索框
   结果把管理后台打开了);第二次点击才生效。判据是"元素是否真的露在视口内",
   所以鼠标悬停已展开时一次点击即生效。6 秒无操作或 Esc 自动收回。

4) 后台窄屏:分组行原本是内联 flex + 固定 max-width,窄屏既不能换行也不能
   收缩,输入框顶破卡片。改用类 + ≤560px 适配(竖排、整行占满、按钮右对齐、
   字号 16px 防 iOS 聚焦缩放)。实测 390px:scrollWidth == innerWidth、
   零横向溢出。
2026-09-11 20:13:44 +08:00
76a6a83e7d feat(web): 不支持内嵌时明确弹层;修掉被 promise 吞掉的 ReferenceError
1) 点不支持在工作区显示的应用 → 弹出提示卡片
   标题「该应用不支持在工作区显示」+ 域名 + 服务器返回的原因 +
   「在新标签页打开 / 知道了」两个按钮;面板里同时保留同样的说明。
   之前只在面板里显示一行字,用户点了之后缺少明确反馈。

2) 修 ReferenceError: openUrl is not defined(线上真实故障)
   setWorkspaceState 第 4 个参数早先从 openUrl 改名为 note 时,blocked
   分支漏改,于是每次被拒内嵌都在函数内部抛异常,异常沿 promise 链被吞,
   导致后面的弹层根本没有执行、面板提示也只渲染到一半(URL 行和按钮缺失)。
   教训:验收必须采集 Runtime.exceptionThrown,并且断言交互元素真的存在;
   只断言"状态=blocked + 提示文字前缀"会恰好掩盖这类错误。
2026-09-11 19:52:19 +08:00
f40e54287b fix(web): 极窄屏备案号不再顶到按钮;mini 叶签两端改为渐变淡出
1) 备案号与自定义按钮只剩 1px
   实测 320x640:备案号换行成两行、高 66px,占据距底 11..77;而搜索球/
   按钮组固定在 bottom:76px → 两者实测只剩 1px(视觉上已贴上)。
   修法:≤380px 时把按钮上移到 bottom:88px,并收紧页脚 gap/padding
   (两行高度仍 66px)→ 实测净间隙 11px。≥390px 时备案号是单行 39px,
   间隙本就充足,保持不变。

2) mini 顶部叶签被两侧按钮硬切
   结构是 [‹按钮 34px][滚动行][›按钮 34px],滚动行 overflow-x:auto
   (内容 858px / 可视 294px),卡片直接在滚动行边缘被切断,没有任何过渡。
   修法:给滚动行加 mask-image 两端各 24px 渐变淡出,并用 :has() 关联
   翻页按钮的 disabled 状态 —— 已经在尽头的一侧不再淡出(两端都到头则
   完全不遮罩),避免"到头了还在渐隐"的错觉。
   实测:最左时 mask 为「左侧实心 + 右侧渐隐」,滚到最右变为
   「左侧渐隐 + 右侧实心」。
2026-09-11 19:18:00 +08:00
8ba5e5117b feat(web): 工作空间内嵌网页 + 控件收边 + 页脚去重 + 窄屏不再重叠
1) 工作空间真的在中间打开网页
   Dashy 的面板就是 iframe,但它的 launchApp() 只在 target 不是 newtab 时
   才把 URL 灌进 iframe;而且侧栏项目大多没有 per-item target,Dashy 走的是
   Vue 直接改 iframe.src 的路径 —— 根本不经过 window.open,导致判定逻辑被
   绕过(实测:Gitea 仍被内嵌、空白)。现在两条路径统一进 verifyAndShow():
   先探测再决定内嵌还是明确提示;被拒时还会清空 iframe 的 src。

2) 控件在工作空间收边
   中间嵌的是别人的应用,常驻控件会遮挡。搜索球收左边缘、右下角两个按钮
   组成 dock 整组收右边缘、备案号收下边缘,各露 14px(备案号 13px),
   鼠标移入或点击、聚焦时滑出展开。只在工作空间生效。

3) 修 iframe 撑高页面 77px
   Dashy 的 .web-content iframe 是 position:absolute,包含块是 #dashy 而非
   .web-content,外层 overflow:hidden 拦不住它,它按 #dashy 高度撑到 814px
   (164+814=977 正好等于页面 scrollHeight)。补 position:static 后归零。

4) 首页不再出现两个备案号
   Vue 异步挂载,navi.js 可能先补了一份页脚,之后 Dashy 的页脚才出现;
   原来的守卫只判断 .navi-footer 是否存在,不会回收自己早先注入的那份。
   新增 dashyFooterNode() 区分两者,发现 Dashy 的就把我们补的移除。

5) 窄屏展开搜索框不再压住右下按钮组
   手机端展开宽度是 calc(100% - 86px),而按钮组占最后 114px → 重叠 38px。
   改为按按钮组真实占位预留(≥600px: min(560px, 100% - 158px);
   ≤599px: calc(100% - 132px));≤380px 时输入框会窄到不可用,改为
   临时隐藏按钮组(用 visibility 而非 transform,因为 prefers-reduced-motion
   会强制 transform:none)。
2026-09-11 19:04:38 +08:00
da196abcb5 feat(web): 隐藏原生设置、圆形视图切换、工作空间改列表、三视图标题统一
用户提出的四条,都基于实测数据而不是猜测:

1) 隐藏 Dashy 原生设置入口
   顶栏的 .config-launcher(齿轮+铅笔+调色板)与我们的 /admin/ 重复,
   连同 .options-trigger/.settings-outer 一起隐藏。

2) 视图切换图标改成圆形,紧贴自定义入口左侧
   原生切换按钮是侧栏底部的方形图标(.switch-view-buttons),已隐藏;
   改为右下角圆形悬浮按钮 .navi-view-switch,点开是「首页/极简/工作空间」
   菜单并标出当前视图。
   顺带修掉 2px 错位:管理入口是内容盒(48+2px 边框=50),视图按钮是
   边框盒(48),并排时差 2px;给管理入口补 box-sizing: border-box。

3) 工作空间「点了没反应」
   读 Dashy 自己的 Workspace 组件(assets/Workspace-*.js)得到结论:
   右侧面板就是一个 iframe,launchApp() 只有 target 不是 newtab 才把 URL
   灌进面板;我们全局 openingMethod: newtab,所以每次点击都走 window.open
   分支,this.url 恒为空 → 面板永远空白。
   就算灌进去也没用:Gitea 实测 X-Frame-Options: sameorigin 拒绝被嵌
   (Refused to display … in a frame)。
   所以改成:点左侧分组 → 右侧列出该分组应用卡片(数据取自
   /admin/api/sections),不依赖目标站点是否允许 iframe,首页仍保持新标签页。

4) 三视图标题割裂
   实测 /minimal 是 48px 居中 -1.92px,而 / 与 /workspace 是顶栏里 40px
   左对齐、无字距。现在三个视图共用同一条规则(clamp(1.75rem,4vw,2.75rem)、
   700、-0.035em、居中;移动端 clamp(1.6rem,8vw,2.2rem)),副标题也居中置灰。

另外:工作空间面板原本用 position: fixed 钉在视口中间(1364×654,上距顶栏
7px、下距搜索栏 8px),把页面切成「顶栏/大方块/底部」三段;改为正常文档流,
内容多时页面自然滚动。
2026-09-11 18:17:23 +08:00
80b0e5f51e feat(web): 搜索框收起态 + admin 入口 + 修正多余滚动
- 搜索栏默认收起为左下角放大镜悬浮球(52/56px),点它展开成输入框,
  输入框内左侧仍是同一个放大镜,点它收起;Esc 也可收起
- Dashy 页面补右下角 /admin/ 悬浮入口(原先没有任何管理入口)
- 短页面不再凭空可滚动:body 留白 104->84px,并给 #dashy 扣掉同样高度
  (Dashy 的 #dashy 本已撑满 100vh,叠加留白就多出约 134px 滚动)
- 补的备案号页脚改为固定在搜索栏正上方,不再参与文档流撑高页面
- 弹层打开时搜索栏与管理入口一并让位
2026-09-11 17:03:33 +08:00
9eb8214fab fix(web): 搜索栏改为底部悬浮,补极简视图页脚与整体动效
- 搜索栏 position:fixed 悬浮在视口下侧,任何视图/滚动位置都可见;
  原先是流式跟在页脚之后,手机上要滚到底才看得到
- 极简视图(/minimal)与工作空间不渲染 Dashy 页脚,备案号整段消失;
  navi.js 从只读 pageinfo 取回页脚补一份(DOMParser,不用 innerHTML)
- 空分组不再渲染成空玻璃条(:not(:has(a.item))),修掉 mini 页底部一排空框
- 图标统一 56/48px 容器 + object-fit:contain,修 24px 与 56px 混排
- 备案号页脚改为胶囊样式
- 新增动效层:视图/卡片淡入、搜索栏滑入、悬停位移,全部只动
  transform/opacity 并遵循 prefers-reduced-motion
2026-09-11 16:25:26 +08:00