|
|
292e77097d
|
fix(history): 访问计数按设备去重 + 后台返回全量
- Entry 增加 DeviceVisits:同一 URL 多次/多设备上报取各设备最大值再求和,
不再平方级放大(30 次访问曾被计成 465 次)
- handleGet 不再截断 100 条,返回 {items,total},后台显示当前条数
- 清理死代码(hostVisits/hostOf/visitCount/isCodeHostVal/dashySection)
- 守门测试:重复上报、多设备求和、陈旧数据、持久化、统计、门户文案、第 101 条可见性
|
2026-10-02 11:24:55 +08:00 |
|
|
|
b256a8d7f1
|
fix(favicon): 失败重试间隔不再挡住"缓存文件丢失后的重抓"
实测:删掉 item-icons 里三个被污染的图标后,rebuild 不再重抓,图标永久缺失
(只有重启容器才恢复)。根因:faviconWorker 在**每次**尝试后都写 faviconAttempted,
而 queueFavicon 会用 faviconRetryGap 挡住"近期尝试过"的 host —— 于是
cachedFavicon() 为空(文件确实不存在)也照样被跳过。
修法:成功时 delete(faviconAttempted, hostport),只给失败保留节流记录。
这样缓存文件被手工清理或数据卷恢复后,下一次 rebuild 就能立即重抓。
|
2026-09-13 09:02:50 +08:00 |
|
|
|
ca80ba2510
|
fix(gateway): auth 类路由重复写 /favicon.ico 导致 nginx -t 失败(v96 部署被回滚的真因)
v96 部署时脚本报"网关配置重新生成失败 → 回滚到 ui-v95"。根因:auth 类路由的 Upstream
是在 writeErrorPages 之后才赋值的,所以它先按"门户自己渲染"拿到了门户 favicon,
随后新的"favicon 直通上游"块又写了同一个 location → nginx 拒绝重复 location。
修法:直通块对 auth 类跳过(门户页/登录页继续用门户自己的图标)。
另加回归测试 TestNoDuplicateExactLocations:解析渲染结果,断言任一 server 块内
不得出现重复的 `location = X`;已用"临时移除守卫"做过反向对照,确认该测试真能抓到。
|
2026-09-13 08:58:41 +08:00 |
|
|
|
9c0d9f2bb5
|
fix(gateway): 被代理站点的 favicon 免登录直通上游(而非门户静态文件/登录墙)
承接上一提交:把门户 favicon 从代理块里去掉后暴露两个问题:
- requireLogin 的站点 /favicon.ico 变成 302(浏览器标签与图标抓取都取不到);
- 而 favicon 本来就不该要求登录。
改为:代理块显式写
location = /favicon.ico { auth_request off; proxy_pass <上游>; ... }
location = /favicon.svg { auth_request off; proxy_pass <上游>; ... }
(https/自签上游附带 proxy_ssl_verify off)。
效果:浏览器标签显示各站点自己的图标、无需登录;抓取端也因此能在未登录时取到真实图标。
门户页/登录页/默认 404 块仍提供门户自己的 favicon。测试断言同步改为"直通上游"语义。
|
2026-09-13 08:52:41 +08:00 |
|
|
|
3d1ed788f3
|
fix(gateway/favicon): 被代理域名的 /favicon.ico 被门户图标顶掉(图标全错的真因)
用户问"同时被路由的网站为什么图标不正确"。实测三处证据:
① gateway.conf 里**每个** server 块都有
location = /favicon.ico { auth_request off; try_files $uri =404; }
而 try_files 在门户自己的 root(/app/portal) 里找文件;
② 于是 https://pi|ittools|vikunja.jianfgit.xyz/favicon.ico 三者返回**同一个**
门户图标(md5 80498a88…),而它们内部上游的真实图标各不相同
(ittools dc36588f… / vikunja 6d9507b6… / pi cf3332ac…);
③ 导航图标抓取优先抓 /favicon.ico → pi/ittools/vikunja 存下了同一张 1091B 门户图标。
修法两处:
- admin-server/gateway.go:门户 favicon 的两个 location 只在"门户自己渲染"的
server 块(kind=portal/auth、默认 404 块)里输出;代理到上游的块不再输出,
让 /favicon.ico 正常走 location / 落到上游。新增断言测试。
- history-server/favicon.go:抓取改为**优先走内部上游**(读 gateway.yml 把对外域名
映射到内部地址,带 Host 头、容忍自签证书),失败才回落对外地址 —— 这样受统一登录
保护的站点也能拿到真实图标,且不再依赖门户的 favicon 行为。
|
2026-09-13 08:48:42 +08:00 |
|
|
|
30aff4ffd8
|
docs: 同步「常用服务 / 历史访问」的新规则(不再限制条数、历史含站内服务)
- 常用服务:从"点击次数前 5"改为"所有被点击过的导航项(按次数降序,不限条数)"
- 历史访问:不限条数,且不再排除站内服务(相当于"最近访问");并提示可用 history.json 的 mtime 判断扩展是否还在同步
- README 三处 + AGENTS 一处的过时说明一并更新
|
2026-09-13 08:39:00 +08:00 |
|
|
|
bcc05bd352
|
feat(nav): 历史访问不再排除站内服务(用户:尽最大可能显示)
用户要求:历史访问应尽最大可能显示,不要限制条目;并确认取消"排除已是导航项的站点"。
此前该组会跳过所有已是导航项的 host(避免与其它分组重复),副作用是**站内服务的真实
访问记录永远进不来**,这一组长期只有 1 条(外加插件安装入口)。现改为:整份浏览器历史
全部收录,按访问次数降序;首条仍是插件安装入口。条数上限此前已移除。
注:常用服务的候选集本就排除「历史访问」分组自身,所以站内服务进了历史访问后
不会反过来污染常用服务的计数与排序。
|
2026-09-13 08:36:07 +08:00 |
|
|
|
305eb27acc
|
feat(nav): 「常用服务」与「历史访问」不再限制条目数
用户要求:这两个聚合分组应当尽最大可能显示,而不应限制条数。
- 常用服务:原先截断为 favTopN=5,现改为展示**所有被点击过**(visits>0)的导航项,
仍按访问频次降序、同频次保持原序、按 host 去重。0 次点击的不算"常用",
不塞进来(否则等同于把所有分组复制一份)。
- 历史访问:原先截断为 20 条(histItems >= 21 即 break),现改为全部非导航历史主机。
首条仍是插件安装入口,排序仍按访问次数降序。
- 注释同步更新(rebuildDashySections 的 4 条说明与容量提示)。
数据实况(改动前):nav-visits.json 有 10 个 host 有计数,其中 8 个是导航项
→ 常用服务从 5 项变 8 项;history.json 去重主机仅 1 个 → 历史访问上限本就未触顶。
|
2026-09-13 08:29:57 +08:00 |
|
|
|
3d18fb59ce
|
fix(ui): 登录页页脚被当纯文本显示(html/template 转义)+ 三处页脚统一
用户发现登录页出现 `<div class="navi-footer">…` 这串标记文字。
① 根因:auth.go 把 beianFooter() 的字符串塞进 Go html/template(map[string]string),
模板自动转义整段 HTML → 页面上直接显示标记源码。
修法:改用 map[string]any + template.HTML(beianFooter 内部已对备案号做 html.EscapeString,
注入合法)。
② 登录页与门户页此前**都无视**后台的「页脚」自定义字段(后台提示语写的是"填写后以这里为准")。
新增统一入口 siteFooter(info):自定义 footer 优先,否则按 icp/gongan/座右铭生成;
pages.go(门户页)与 auth.go(登录页)都改走它。
③ 页脚座右铭此前只由 navi.js 在 Dashy 页客户端注入 → 登录页/门户页永远没有。
新增 pageInfo 字段 motto(换行或 | 分行,留空用内置默认),
footerMarkup() 生成时一并输出 .navi-quote 两行;navi.js 已有幂等判断不会重复注入。
后台「站点信息」新增座右铭输入框,并登记进 /api/schema。
④ 登录页 / 门户页补页脚样式:左列两行备案号、右列两行座右铭;窄屏退化为居中单列。
|
2026-09-13 07:56:38 +08:00 |
|
|
|
ba22d3a1de
|
docs: 记录极简页分组切换手势(README)+ 交互类改动的真实输入验证要求(AGENTS)
README 新增「极简页分组切换(点击 / 滑动 / 键盘)」:四种输入、判定阈值、clamp 边界、
只对页框内元素做动画、页签行跟随(含实测数字 1306 > 828)、防误触、以及
"接 Dashy DOM 契约、类名变化会静默失效 + data-navi-swipe 自检"这一限制。
AGENTS §5 补充:交互类改动必须用真实输入(CDP 触摸注入/真实鼠标/wheel deltaX)验证,
断言"切换真的发生"而非"监听器已挂载"——本项目实测踩过事件全到达但被自建拦截器吞掉的坑。
|
2026-09-12 22:10:05 +08:00 |
|
|
|
86aced0c4a
|
fix(ui): 滑动切换只淡出页框内元素(页签行不动)+ 页签行跟随选中项
用户反馈两点,均已实测定位:
① 整框(含顶部页签行)跟着淡出淡入 —— 不该动页签。
原实现把 opacity 打在 .item-group-container 上(它同时包含页签行与内容)。
改为只对 .minimal-section-inner.selected > *(.section-items + .minimal-widget-wrap)
做 keyframes 淡出/淡入;框体与页签行保持不动。
用 keyframes 而非 transition:这些子元素自带 `transition: all`,改 transition 会
覆盖它们原有的 hover 过渡。
② 页签行不联动 —— 实测 .minimal-headings-row 可横向滚动
(scrollWidth 1306 > clientWidth 828)但 scrollLeft 恒为 0,
切到第 7/8 个分组时选中页签落在视口外(x=1374..1532 > 1280),
用户看不出切换发生。新增 swipeRevealTab() 把选中项滚进可视区(居中,reduced-motion 下瞬时),
手势切换与手动点页签都会触发。
另:边界回弹提示也改为只动页框内容,不再带动页签行。
|
2026-09-12 22:06:26 +08:00 |
|
|
|
f27f46099c
|
fix(ui): 修正滑动手势的两个确凿缺陷(触屏不切换 / 触控板方向反)
v89 实测 12/16,且已测出事件确实到达(触摸 touch+pointer 各 7 个、wheel deltaX=40 共 4 次),
证明不是"事件没到",而是逻辑把结果吃掉了:
① 防误触拦截器把自己吞了:滑动后 400ms 内抑制 click(防误开卡片),
而切换手势发的正是 tabs[j].click() → 被自己拦掉 → 表现为"滑了没反应"。
修法:程序化切换 click 期间置 swipeSelfClick 放行,并清掉本次抑制窗口。
② 触控板方向反了:两指向左滑时浏览器给 deltaX > 0(内容右移),
原实现映射成"上一个",在第一个分组会被 clamp → 看起来完全没反应。
修法:deltaX > 0 → 下一个分组。
|
2026-09-12 21:59:11 +08:00 |
|
|
|
3deffc1a77
|
feat(ui): 极简页支持左右滑动切换分组(触屏/触控板/鼠标拖拽)
需求:极简页的内容框此前只有竖向滚动手势,加入横滑切换"页面"(分组)。
实现(web/navi.js 新增 bindTabSwipe + web/navi.css v89):
· 契约:.minimal-headings-row > .minimal-section-heading.headings(当前项 .selected),
切换 = 对该元素派发真实 click(实测有效,不触碰 Dashy 内部状态)。
· 三种输入:pointer 事件覆盖触屏与鼠标拖拽;wheel 的 deltaX 累积覆盖触控板双指横滑。
· 判定:|dx| >= 56 且 |dx| > 1.5|dy| 才切换;先判 |dy| > |dx| 则直接让给竖向滚动。
· 边界:clamp —— 到头不动,给一次轻微回弹提示(prefers-reduced-motion 时改为淡闪)。
· 动画:纯淡入淡出(不位移),并遵守 prefers-reduced-motion。
· 防误触:横拖超过 20px 后吞掉紧随的一次 click,避免误开卡片链接。
· 不抢横滑:手势起点若落在可横向滚动的容器内、或输入框内,直接放行。
· 可访问性:键盘 ←/→ 也能切换;touch-action 用 pan-y pinch-zoom(保留双指缩放)。
· 自检:匹配不到标签时在 <html> 上置 data-navi-swipe="unavailable"(不刷控制台)。
|
2026-09-12 21:54:35 +08:00 |
|
|
|
6062c9cdc2
|
fix(ui): 工作空间页脚的 2×2 网格未生效 —— 通用选择器特异性不足
v87 实测:/workspace 页脚 display 仍是 flex(四段挤在一行,行数=1)。
原因:网格规则里的通用选择器 html[data-theme] .navi-footer 为 (0,2,1),
低于 EOF 处 html[data-theme] body .navi-footer 的 (0,2,2),
而工作空间的页脚父级是 .navi-footer-host(页面里没有 <footer> 元素),
前两条结构选择器都不匹配 → 网格规则整条落败。
修法:补两条结构路径 body > .navi-footer-host > .navi-footer((0,3,2))
与 body .navi-footer-host > .navi-footer。
|
2026-09-12 20:31:55 +08:00 |
|
|
|
d327864348
|
fix(ui): 清除 v80 里遗留的全部"页脚 fixed 浮层"规则(共 5 处)
v80 的 CSS 含有 v77/矮视口/EOF 覆盖等 5 处把 .navi-footer-host 或
footer > .navi-footer 设为 position:fixed 的规则,它们位于文件更靠后、
特异性更高,会把 v87 的 static 改动全部盖掉(用户看到的"又悬浮了")。
本版在源码处逐条改为静态布局行(flex:0 0 auto + width:100%),
并消除 26px 高度上限;同时把首页 #dashy > footer 的底部内边距清零。
|
2026-09-12 20:28:29 +08:00 |
|
|
|
4c61952cf1
|
fix(ui): 页脚改为布局中的最后一行(去掉悬浮),三视图结构一致
用户反馈"怎么又变成悬浮在底部了?而且好丑" —— 确认 position:fixed 浮层不可接受。
本版在源码处把页脚从浮层改为 body 纵向 flex 的最后一"行":
- minimal/workspace 的 .navi-footer-host: position:static + flex:0 0 auto
(内容链 flex:1 min-height:0,内部自行滚动 → 页脚常驻视口底部但不覆盖内容)
- workspace 页脚不再参与 0.55 半透明渐隐、不再 translateY 藏匿
- 删除为"固定页脚"预留的 margin/padding(26px / 40px / 96px)
- 恢复 v80 的 2×2 网格版式与文字加深(上一版误删)
判据:position 必须为 static(非悬浮)+ 四段文字完整在视口内 + 页面不出现滚动条。
|
2026-09-12 20:26:51 +08:00 |
|
|
|
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 |
|
|
|
1ac8d2a0f2
|
docs: 修正过时端口(8080→18080)与 statusCheck 示例值
审计发现 README 三处过时:
- 快速开始示例 docker run -p 3003:8080(容器内 nginx 已是 18080)
- 遗留 portal-nginx 配置示例里 blog 上游仍写 8080
- 配置示例里 statusCheck: true(该项已按要求关闭,示例值应同步为 false 并注明原因)
|
2026-09-12 15:17:42 +08:00 |
|
|
|
16707bdfab
|
docs: 同步「常用服务」新机制(导航项点击计数)并补 nav-visit 接口
审计发现文档仍有旧描述,且新端点完全没写:
- README:分组注释/机制说明/系统分组警示/history-server 职责 仍写成泛指的"访问频次",
容易让人以为常用服务来自浏览器历史。统一改为"导航项点击次数(nav-visits.json)",
并明确两者数据源互相独立(常用服务不看浏览器历史)
- README 接口表 + AGENTS.md §4.2 补 POST /api/history/nav-visit 的可执行示例
- AGENTS.md 已知坑补一条:顺序不像"最常点的"时如何排查
|
2026-09-12 15:16:57 +08:00 |
|
|
|
b980ce6292
|
fix(build): 测试文件 import 改为块形式(os/filepath/testing)
main_test.go 原为单行 import "testing",补 import 的替换锚点没命中,
导致 os/filepath 未导入、history-server 编译失败(承接上一提交的坏状态)。
本次改为块形式导入,go vet 与 go test 均通过。
|
2026-09-12 12:42:08 +08:00 |
|