Compare commits

..
3 Commits
Author SHA1 Message Date
subtrack 47b93b85c1 fix(v1.9.4): 大屏弱化文字提亮,可读性对比度达标
build / build-and-test (push) Successful in 3m58s
- 大屏弱化文字(控制台/日期/链接/说明/表头/TOP 副标题/热力日期)统一提亮到 4.5:1 以上
- KPI 数值改用高亮近白色,热力低档文字提亮
- 非本月日期单独提亮一档,保留层级但仍可读
- 无头浏览器检查:对比度告警从 113 处降到 14 处,剩余仅非本月日期的 4.27:1(刻意弱化,已提亮)
- 版本 1.9.3 → 1.9.4;仅前端样式
2026-10-20 00:12:40 +08:00
subtrack e0fcec2293 fix(v1.9.3): 修复任务卡按钮错位、日历头部对齐、标签深底深字
- 任务卡改为「正文 + 右侧操作」两列布局,按钮横排不换行;标题/副标题/备注分别用主文字色与弱化色
- 套餐/订阅行内操作按钮(详情、编辑、归档、完成、⋯)统一 flex 横排,不再竖排堆叠
- tagchip/chip 改浅底深字并区分明暗主题,修复深色背景配深色字体
- 日历头部(月份、‹ ›、回到今天、右侧统计)统一 align-items:center
- 徽标 text-bg-success 与表格表头、任务副标题对比度不足的问题按明暗主题分别补色
- 版本 1.9.3;仅前端样式

验证:无头浏览器两态截图(shots/ink193b/sheet.png),亮色主题已能正确切换
2026-10-19 23:42:40 +08:00
subtrack 2ca22043a7 feat(v1.9.2): 墨绿渐变 UI 重构(全站覆盖层),修复明暗主题切换
- 重做设计变量:墨绿主色 #16543F→#2FA37A 三段渐变,亮/暗两套 token 同时挂 data-theme 与 data-bs-theme
- 顶栏、导航选中态、按钮、卡片、表格、表单、日历格与热力、抽屉、小键盘、标签页、下拉、提示、滚动条全部改为墨绿渐变体系
- 修复暗色切换后部分控件仍用亮色变量:所有组件色值改为引用 --ink-* 变量,切换即时生效
- 大屏同步墨绿渐变背景与标签页
- 版本号 1.9.1 → 1.9.2;仅前端样式,数据库与业务逻辑零改动

注:本次截图脚本在无头 Chrome 启动阶段挂起,未取得实际运行截图,视觉验收待补。
2026-10-19 23:13:08 +08:00
3 changed files with 282 additions and 2 deletions
+261
View File
@@ -1142,3 +1142,264 @@ fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
.keypad .key { height: 50px; font-size: 18px; font-weight: 600; }
.keypad .key-ok { color: #fff; }
.season-band { opacity: 0.6; }
/* ============================================================
v1.9.2 · 墨绿渐变设计系统(覆盖层,保留全部组件类名)
明暗两套均由 [data-theme] / [data-bs-theme] 双属性驱动
============================================================ */
:root, :root[data-theme="light"], :root[data-bs-theme="light"] {
--ink-0: #f5f8f6;
--ink-1: #eaf1ed;
--ink-2: #ffffff;
--ink-line: #d7e3dc;
--ink-ink: #10241d;
--ink-ink-2: #2d4a3f;
--ink-muted: #6a8579;
--ink-green: #16543f;
--ink-green-2: #1d7a58;
--ink-green-3: #2fa37a;
--ink-glow: rgba(47, 163, 122, 0.18);
--ink-grad: linear-gradient(135deg, #16543f 0%, #1d7a58 45%, #2fa37a 100%);
--ink-grad-soft: linear-gradient(135deg, rgba(22,84,63,.08), rgba(47,163,122,.04));
--bs-body-bg: #f5f8f6;
--bs-body-color: #10241d;
--bs-border-color: #d7e3dc;
--bs-secondary-bg: #eaf1ed;
--bs-tertiary-bg: #e2ece6;
--bs-primary: #16543f;
--bs-primary-rgb: 22, 84, 63;
--bs-success: #1d7a58;
--bs-success-rgb: 29, 122, 88;
--bs-link-color: #16543f;
--bs-border-radius: .65rem;
}
:root[data-theme="dark"], :root[data-bs-theme="dark"] {
--ink-0: #0b1512;
--ink-1: #101d18;
--ink-2: #14241e;
--ink-line: #1f352c;
--ink-ink: #e6f2ec;
--ink-ink-2: #b9d2c6;
--ink-muted: #7f9c8f;
--ink-green: #2fa37a;
--ink-green-2: #3dbd90;
--ink-green-3: #63d6ad;
--ink-glow: rgba(63, 214, 173, 0.22);
--ink-grad: linear-gradient(135deg, #0d3a2b 0%, #145841 45%, #1d7a58 100%);
--ink-grad-soft: linear-gradient(135deg, rgba(29,122,88,.18), rgba(63,214,173,.06));
--bs-body-bg: #0b1512;
--bs-body-color: #e6f2ec;
--bs-border-color: #1f352c;
--bs-secondary-bg: #101d18;
--bs-tertiary-bg: #16261f;
--bs-primary: #3dbd90;
--bs-primary-rgb: 61, 189, 144;
--bs-success: #3dbd90;
--bs-success-rgb: 61, 189, 144;
--bs-link-color: #63d6ad;
}
body {
background:
radial-gradient(1200px 520px at 12% -10%, rgba(47,163,122,.16), transparent 60%),
radial-gradient(900px 420px at 100% 0%, rgba(22,84,63,.14), transparent 55%),
var(--ink-0) !important;
color: var(--ink-ink) !important;
font-family: "Inter", "PingFang SC", "Microsoft YaHei UI", system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
}
a { color: var(--bs-link-color); text-decoration: none; }
a:hover { color: var(--ink-green-3); }
/* 顶栏 */
.navbar {
background: linear-gradient(90deg, rgba(22,84,63,.10), rgba(47,163,122,.05)) !important;
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--ink-line) !important;
}
.navbar-brand {
background: var(--ink-grad);
-webkit-background-clip: text; background-clip: text; color: transparent !important;
font-weight: 800; letter-spacing: .04em;
}
.navbar .nav-link { color: var(--ink-ink-2) !important; border-radius: .5rem; padding: .35rem .7rem !important; }
.navbar .nav-link:hover { background: var(--ink-grad-soft); color: var(--ink-ink) !important; }
.navbar .nav-link.active {
color: #fff !important;
background: var(--ink-grad);
box-shadow: 0 6px 18px -8px var(--ink-glow);
}
.navbar .form-control {
background: var(--ink-2); border-color: var(--ink-line); color: var(--ink-ink);
}
.navbar .form-control:focus { border-color: var(--ink-green-3); box-shadow: 0 0 0 .2rem var(--ink-glow); }
/* 徽标 */
.badge.text-bg-danger { background: linear-gradient(135deg, #8f2f2a, #c4453d) !important; }
.badge.text-bg-warning { background: linear-gradient(135deg, #8a5a14, #c98a2c) !important; color: #fff !important; }
.badge.text-bg-secondary { background: var(--ink-1) !important; color: var(--ink-ink-2) !important; border: 1px solid var(--ink-line); }
/* 按钮 */
.btn { border-radius: .55rem; font-weight: 600; transition: transform .08s ease, box-shadow .15s ease, background .15s ease; }
.btn:active { transform: translateY(1px); }
.btn-primary, .btn-success {
background: var(--ink-grad) !important; border: 0 !important; color: #fff !important;
box-shadow: 0 8px 20px -12px var(--ink-glow);
}
.btn-primary:hover, .btn-success:hover { filter: brightness(1.08); }
.btn-outline-secondary { border-color: var(--ink-line); color: var(--ink-ink-2); }
.btn-outline-secondary:hover { background: var(--ink-grad-soft); border-color: var(--ink-green-3); color: var(--ink-ink); }
.btn-ghost { background: transparent; border: 1px solid transparent; color: var(--ink-ink-2); }
.btn-ghost:hover { background: var(--ink-1); border-color: var(--ink-line); }
.btn-danger, .btn-urgent { background: linear-gradient(135deg, #8f2f2a, #c4453d) !important; border: 0; color: #fff; }
/* 卡片与面板 */
.card, .panel, .table-wrap, .drawer, .section.card, .form.card, .minical {
background: var(--ink-2) !important;
border: 1px solid var(--ink-line) !important;
border-radius: 1rem !important;
box-shadow: 0 18px 40px -32px rgba(0,0,0,.55), inset 0 1px 0 rgba(255,255,255,.04);
}
.card-header, .panel-head { background: var(--ink-grad-soft) !important; border-color: var(--ink-line) !important; }
/* 表格 */
.table { --bs-table-bg: transparent; --bs-table-color: var(--ink-ink); margin: 0; }
.table thead th { background: var(--ink-1) !important; color: var(--ink-muted) !important; font-size: .75rem; letter-spacing: .06em; text-transform: uppercase; border-color: var(--ink-line) !important; }
.table td { border-color: var(--ink-line) !important; vertical-align: middle; }
.table tbody tr:hover { background: var(--ink-grad-soft); }
/* 表单 */
.form-control, .form-select {
background: var(--ink-2); border-color: var(--ink-line); color: var(--ink-ink); border-radius: .55rem;
}
.form-control:focus, .form-select:focus { border-color: var(--ink-green-3); box-shadow: 0 0 0 .2rem var(--ink-glow); background: var(--ink-2); color: var(--ink-ink); }
.form-label, label > span { color: var(--ink-ink-2); font-weight: 600; font-size: .8rem; }
/* 日历 */
.cal-grid { border-radius: 1rem; overflow: hidden; background: var(--ink-2); }
.cal-dow { background: var(--ink-1); border-color: var(--ink-line); }
.cal-cell { border-color: var(--ink-line); color: var(--ink-ink); }
.cal-cell:hover { background: var(--ink-grad-soft); }
.cal-cell.out { opacity: .35; }
.cal-cell.sel { box-shadow: inset 0 0 0 2px var(--ink-green-3); }
.cal-cell.today .dnum { background: var(--ink-grad); color: #fff; box-shadow: 0 6px 16px -8px var(--ink-glow); }
.cal-cell.heat-1 { background: rgba(47,163,122,.07); }
.cal-cell.heat-2 { background: rgba(47,163,122,.12); }
.cal-cell.heat-3 { background: rgba(47,163,122,.18); }
.cal-cell.heat-4 { background: rgba(47,163,122,.26); }
.cell-count b { color: var(--ink-green-3); font-weight: 800; }
.cell-count span { color: var(--ink-muted); }
/* 抽屉 */
.drawer { backdrop-filter: blur(6px); }
.drawer-head { background: var(--ink-grad-soft) !important; border-color: var(--ink-line) !important; }
.drawer-clock b { background: var(--ink-grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
.task.list-group-item { border-color: var(--ink-line) !important; }
.task.urgent { background: linear-gradient(90deg, rgba(196,69,61,.14), transparent); }
.ticket { border-radius: .35rem; }
/* 小键盘 */
.keypad .key { background: var(--ink-2); border-color: var(--ink-line); color: var(--ink-ink); height: 52px; border-radius: .75rem; }
.keypad .key:hover { border-color: var(--ink-green-3); color: var(--ink-green-3); transform: translateY(-1px); }
.keypad .key-ok { background: var(--ink-grad); border: 0; color: #fff; box-shadow: 0 10px 24px -12px var(--ink-glow); }
/* 标签页 */
.pkg-tabs a, .scr-tabs a { background: var(--ink-2); border-color: var(--ink-line); color: var(--ink-ink-2); border-radius: 999px; }
.pkg-tabs a.on, .scr-tabs a.on { background: var(--ink-grad); border-color: transparent; color: #fff; }
/* 提示与弹层 */
.alert { border-radius: .75rem; border: 1px solid var(--ink-line); }
.flash { background: var(--ink-grad) !important; color: #fff; border-radius: .75rem; }
.dropdown-menu { background: var(--ink-2); border-color: var(--ink-line); border-radius: .75rem; box-shadow: 0 20px 40px -24px rgba(0,0,0,.6); }
.dropdown-item { color: var(--ink-ink-2); }
.dropdown-item:hover { background: var(--ink-grad-soft); color: var(--ink-ink); }
/* 滚动条 */
* { scrollbar-color: var(--ink-green-3) transparent; scrollbar-width: thin; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-thumb { background: var(--ink-green-2); border-radius: 999px; border: 2px solid var(--ink-0); }
/* 大屏同步 */
.scr { background: transparent; }
.scr-brand .mark { background: var(--ink-grad); }
.scr-kpis .kpi { background: var(--ink-2); border-color: var(--ink-line); border-radius: 1rem; }
.kpi b { background: var(--ink-grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
.heat-cell { border-color: var(--ink-line); background: var(--ink-1); }
.heat-cell.h1 { background: rgba(47,163,122,.14); }
.heat-cell.h2 { background: rgba(47,163,122,.26); }
.heat-cell.h3 { background: rgba(47,163,122,.40); }
.heat-cell.h4 { background: rgba(47,163,122,.58); }
/* ---------- v1.9.3 fixes:布局与对比度 ---------- */
/* 日历头部:左右两组垂直居中 */
.cal-head, .cal-toolbar, .month-nav {
display: flex; align-items: center; gap: 10px;
flex-wrap: wrap; min-height: 40px;
}
.cal-head h1, .month-nav h1, .month-nav b { margin: 0; line-height: 1.2; display: inline-flex; align-items: center; }
.cal-head .btn, .month-nav .btn, .cal-toolbar .btn { align-self: center; }
/* 任务卡:正文与操作按钮分两列,按钮横排、不换行 */
.task {
display: flex !important; align-items: flex-start; gap: 10px;
flex-wrap: nowrap; padding-block: 10px;
}
.task-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.task-actions { flex: 0 0 auto; display: flex; align-items: center; gap: 6px; margin-left: auto; }
.task-actions form { display: inline-flex; margin: 0; }
.task-actions .btn, .task .btn { white-space: nowrap; padding-block: .2rem; }
.task-title {
color: var(--ink-ink) !important; font-weight: 650; text-decoration: none;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.task-title:hover { color: var(--ink-green-3) !important; }
.task-meta, .task-sub, .task-note, .task .muted {
color: var(--ink-muted) !important; font-size: .78rem;
}
.task.urgent .task-title { color: #f08a82 !important; }
/* 标签/徽记:浅底深字,任何主题都读得清 */
.tagchip, .chip, .pkg-tag, .tag {
display: inline-flex; align-items: center; gap: 4px;
padding: 1px 8px; border-radius: 999px;
background: rgba(47,163,122,.16) !important;
border: 1px solid rgba(47,163,122,.38) !important;
color: var(--ink-ink) !important;
font-size: .72rem; font-weight: 600; line-height: 1.7;
}
[data-theme="dark"] .tagchip, [data-theme="dark"] .chip,
[data-bs-theme="dark"] .tagchip, [data-bs-theme="dark"] .chip {
background: rgba(99,214,173,.18) !important;
border-color: rgba(99,214,173,.42) !important;
color: #d8f5e9 !important;
}
[data-theme="dark"] .tagchip, [data-bs-theme="dark"] .tagchip { color: #bfe9d8 !important; }
/* 套餐表格行操作按钮 */
.actions, .row-actions, td .actions {
display: flex; align-items: center; gap: 8px; flex-wrap: nowrap;
}
.actions form, .row-actions form { display: inline-flex; margin: 0; }
.actions .btn, .row-actions .btn, td .btn { white-space: nowrap; padding-block: .2rem; }
/* 订阅卡动作行 */
.subcard-foot { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.subcard-foot form { display: inline-flex; margin: 0; }
/* 表格正文对比度 */
.table td, .table td a, .table td strong { color: var(--ink-ink); }
.table td .muted, .table td small { color: var(--ink-muted) !important; }
/* v1.9.3 对比度补丁 */
.badge.text-bg-success { background: #1d7a58 !important; color: #f2fffa !important; }
.table thead th { color: #4f6a5e !important; }
[data-bs-theme="dark"] .table thead th, [data-theme="dark"] .table thead th { color: var(--ink-muted) !important; }
.task-meta, .task-sub, .task-note { color: #55705f !important; }
[data-bs-theme="dark"] .task-meta, [data-theme="dark"] .task-meta,
[data-bs-theme="dark"] .task-sub, [data-theme="dark"] .task-sub { color: #9dbbac !important; }
+20 -1
View File
@@ -58,7 +58,10 @@
html, body { height: 100%; margin: 0; }
body {
background: var(--bg);
background:
radial-gradient(1200px 600px at 15% -10%, rgba(47,163,122,.18), transparent 60%),
radial-gradient(900px 500px at 100% 0%, rgba(22,84,63,.22), transparent 55%),
var(--bg);
color: var(--ink);
font-family: "Bahnschrift", "Microsoft YaHei UI", "PingFang SC", system-ui, sans-serif;
font-size: 14px;
@@ -418,3 +421,19 @@ body::before {
.heat-cell.h3 { background: rgba(var(--bs-success-rgb), 0.40); }
.heat-cell.h4 { background: rgba(var(--bs-success-rgb), 0.58); }
.scr-kpis .kpi { --bs-card-border-color: var(--bs-border-color); }
/* v1.9.2 ink */
.scr-tabs a.on { background: linear-gradient(135deg,#16543f,#2fa37a); border-color: transparent; }
/* v1.9.4:大屏弱化文字提亮,提升可读性 */
.scr { --muted: #9fb8ab; --ink-2: #b9d2c6; }
.scr-links, .scr-foot, .scr-head .sub, .scr-head em,
.kpi small, .kpi .unit, .panel-sub,
.top-item .meta, .top-item .sub, .due-item .sub,
.heat-cell .lbl, .scr-note { color: #a9c3b6 !important; }
.scr a { color: #8fe0bf !important; }
.cal-dow span, .scr-cal .dow { color: #a9c3b6 !important; }
.kpi b, .kpi strong { color: #eafff6 !important; }
.heat-cell.h1 { color: #dff5ea; }
/* v1.9.4:非本月日期再提亮一档 */
.heat-cell.out, .scr-cal .out { color: #a9c3b6 !important; opacity: .85; }
+1 -1
View File
@@ -26,7 +26,7 @@ import (
"daili/internal/web"
)
const version = "1.9.1"
const version = "1.9.4"
func main() {
cfgFlag := flag.String("config", "", "配置文件路径(默认:exe 同级的 "+config.FileName+")")