feat(web): 微信任务徽章改品牌绿 + 微信 logo + 整行绿边 + bump 0.23.1
上版徽章复用 .badge.active(蓝灰)与旁边「进行中」状态徽章撞色、不显眼。 新增 .badge.wx(微信绿 #07C160 + 白字 + 内嵌微信 logo SVG)与 .task-row.wx (绿色左边框 + 极淡绿底 + hover 加深),让置顶的微信任务从普通任务里跳出来。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
85336ccb7e
commit
340786a42f
|
|
@ -21,6 +21,11 @@
|
||||||
|
|
||||||
## 已完成关键能力
|
## 已完成关键能力
|
||||||
|
|
||||||
|
### 2026-06-24 / 微信任务徽章改品牌绿 + 微信 logo + 整行绿边(bump 0.23.1)
|
||||||
|
|
||||||
|
- 上一版徽章复用 `.badge.active`(蓝灰),与旁边「进行中」状态徽章撞色、不显眼。
|
||||||
|
- 新增 `.badge.wx`(微信品牌绿 `#07C160` + 白字 + 内嵌微信 logo SVG)与 `.task-row.wx`(绿色左边框 + 极淡绿底 + hover 加深),让置顶的微信任务从普通任务里跳出来。文件:`web/static/dev.html`(CSS)、`web/static/js/chat.js`(`WECHAT_ICON` 常量 + badge/row class)。
|
||||||
|
|
||||||
### 2026-06-24 / 微信对话 task 渠道标记 + 置顶(bump 0.23.0)
|
### 2026-06-24 / 微信对话 task 渠道标记 + 置顶(bump 0.23.0)
|
||||||
|
|
||||||
- 痛点:微信常驻 task 与网页常规 task 结构相同,只能靠 description 魔法值反推;且 `created_at` 固定后随用户开新 task 越沉越深,这个「渠道收件箱」反而最难找。
|
- 痛点:微信常驻 task 与网页常规 task 结构相同,只能靠 description 魔法值反推;且 `created_at` 固定后随用户开新 task 越沉越深,这个「渠道收件箱」反而最难找。
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
|
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
|
||||||
# 改版本只动这一行。
|
# 改版本只动这一行。
|
||||||
__version__ = "0.23.0"
|
__version__ = "0.23.1"
|
||||||
|
|
|
||||||
|
|
@ -544,6 +544,14 @@
|
||||||
.badge.completed { background: var(--c-green-bg); color: var(--c-green); }
|
.badge.completed { background: var(--c-green-bg); color: var(--c-green); }
|
||||||
.badge.abandoned { background: var(--accent-soft); color: var(--accent); }
|
.badge.abandoned { background: var(--accent-soft); color: var(--accent); }
|
||||||
.badge.active { background: #eef; color: #336; }
|
.badge.active { background: #eef; color: #336; }
|
||||||
|
/* 微信渠道专属:品牌绿徽章(白字 + 内嵌微信图标),与蓝灰状态徽章拉开区分 */
|
||||||
|
.badge.wx { background: #07C160; color: #fff; display: inline-flex; align-items: center;
|
||||||
|
gap: 3px; vertical-align: 1px; }
|
||||||
|
.badge.wx svg { width: 11px; height: 11px; fill: currentColor; display: block; }
|
||||||
|
/* 整行标记:绿色左边框 + 极淡绿底,让置顶的微信任务从普通任务里跳出来 */
|
||||||
|
.task-row.wx { border-left: 3px solid #07C160; padding-left: 9px; background: rgba(7,193,96,.05); }
|
||||||
|
.task-row.wx:hover { background: rgba(7,193,96,.10); }
|
||||||
|
.task-row.wx.active { background: var(--accent-soft); border-left-color: #07C160; }
|
||||||
.empty { padding: 24px; color: var(--muted); text-align: center; font-size: 13px; }
|
.empty { padding: 24px; color: var(--muted); text-align: center; font-size: 13px; }
|
||||||
|
|
||||||
/* ───── chat ───── */
|
/* ───── chat ───── */
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,9 @@ import { api } from "./api.js";
|
||||||
import { escapeHtml, fmtTime, fmtTokens, fmtTimeAgo, taskUsageTooltip, formatTaskUsage, formatContextStats, formatUsageStats } from "./format.js";
|
import { escapeHtml, fmtTime, fmtTokens, fmtTimeAgo, taskUsageTooltip, formatTaskUsage, formatContextStats, formatUsageStats } from "./format.js";
|
||||||
import { renderMd, highlightIn } from "./markdown.js";
|
import { renderMd, highlightIn } from "./markdown.js";
|
||||||
import { mqPhone, setMobileView } from "./layout.js";
|
import { mqPhone, setMobileView } from "./layout.js";
|
||||||
|
|
||||||
|
// 微信 logo(simple-icons WeChat path),用于渠道任务徽章;fill 走 currentColor(徽章里为白)
|
||||||
|
const WECHAT_ICON = `<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.5-6.446 1.45-1.595 3.711-2.55 6.286-2.55.165 0 .33.01.495.027C18.486 4.916 13.929 2.188 8.691 2.188zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.121 2.361-.343a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088a8.067 8.067 0 0 0-.346-.034zm-2.71 3.711c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z"/></svg>`;
|
||||||
import { logout } from "./auth.js";
|
import { logout } from "./auth.js";
|
||||||
import { openFilePreview, openPasteFilePreview, closePreviewIfShowing } from "./preview.js";
|
import { openFilePreview, openPasteFilePreview, closePreviewIfShowing } from "./preview.js";
|
||||||
import { loadFiles, scheduleFilesRefresh, uploadFiles, formatUploadProgress } from "./files.js";
|
import { loadFiles, scheduleFilesRefresh, uploadFiles, formatUploadProgress } from "./files.js";
|
||||||
|
|
@ -124,12 +127,14 @@ function renderTaskList(tasks, append = false) {
|
||||||
const desc = t.description || "";
|
const desc = t.description || "";
|
||||||
const statusLabel = statusLabels[t.status] || t.status;
|
const statusLabel = statusLabels[t.status] || t.status;
|
||||||
const rowTitle = `${taskName}\n${t.task_id}`; // hover 出全名 + 完整 id(替代 meta 里被去掉的 id8)
|
const rowTitle = `${taskName}\n${t.task_id}`; // hover 出全名 + 完整 id(替代 meta 里被去掉的 id8)
|
||||||
// 微信渠道任务:置顶 + 名前打绿色「微信」徽章,一眼可辨(后端已强制排最上)
|
// 微信渠道任务:置顶 + 名前打微信绿徽章(含 logo)+ 整行绿边,一眼可辨(后端已强制排最上)
|
||||||
const wechatTag = t.channel === "wechat"
|
const isWechat = t.channel === "wechat";
|
||||||
? `<span class="badge active" title="微信 ClawBot 渠道" style="margin-right:4px;">微信</span>`
|
const wechatTag = isWechat
|
||||||
|
? `<span class="badge wx" title="微信 ClawBot 渠道" style="margin-right:4px;">${WECHAT_ICON}微信</span>`
|
||||||
: "";
|
: "";
|
||||||
|
const wxRow = isWechat ? " wx" : "";
|
||||||
return `
|
return `
|
||||||
<div class="task-row${active}" data-tid="${t.task_id}" title="${escapeHtml(rowTitle)}" style="display:flex;align-items:flex-start;gap:6px;">
|
<div class="task-row${active}${wxRow}" data-tid="${t.task_id}" title="${escapeHtml(rowTitle)}" style="display:flex;align-items:flex-start;gap:6px;">
|
||||||
<div style="flex:1;min-width:0;">
|
<div style="flex:1;min-width:0;">
|
||||||
<div class="desc">${wechatTag}${escapeHtml(taskName)}</div>
|
<div class="desc">${wechatTag}${escapeHtml(taskName)}</div>
|
||||||
${wdName ? `<div class="meta muted" title="${escapeHtml(t.working_dir || "")}" style="display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">📁 ${escapeHtml(wdName)}</div>` : ""}
|
${wdName ? `<div class="meta muted" title="${escapeHtml(t.working_dir || "")}" style="display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">📁 ${escapeHtml(wdName)}</div>` : ""}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue