From 97f8f0edc93b9f5fce4dbee2a6bd0e1060919cdf Mon Sep 17 00:00:00 2001 From: NathanAlex7 <18898599977@163.com> Date: Tue, 15 Sep 2026 14:34:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=8A=A9=E6=89=8B?= =?UTF-8?q?=E6=84=8F=E5=9B=BE=E5=9B=9E=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/project_assistant.py | 87 +++++++++++++++++- backend/test_project_assistant.py | 22 +++++ ...兴邦金租对公智能评审平台业务手册-v1.0.docx | Bin 0 -> 64264 bytes scripts/test_ui_readability.cjs | 26 ++++++ scripts/verify.py | 1 + src/app/data-access/workspace.css | 38 ++++++++ src/app/globals.css | 16 +++- src/app/operations-center/operations.css | 10 ++ .../xingbang/business-assistant.css | 12 +++ src/components/xingbang/navigation.css | 12 +++ 10 files changed, 218 insertions(+), 6 deletions(-) create mode 100644 docs/兴邦金租对公智能评审平台业务手册-v1.0.docx create mode 100644 scripts/test_ui_readability.cjs diff --git a/backend/api/project_assistant.py b/backend/api/project_assistant.py index 2c45df0..f1ea1e0 100644 --- a/backend/api/project_assistant.py +++ b/backend/api/project_assistant.py @@ -334,11 +334,88 @@ def business_command(payload: CommandInput, request: Request): return {"intent": "submit_review", "message": "AI预审报告已提交评审,历史版本保持可查看。", "object_id": submitted["id"], "url": f"/review-pool?submitted={payload.project_id}"} unresolved = [f for f in project_body["findings"] if f["status"] not in ("已解决", "不适用")] latest = project_body["runs"][0] if project_body["runs"] else None - message_text = f"{project_body['customer']}当前有{len(unresolved)}项待处理风险、{len(project_body['pending_candidates'])}项材料候选待确认。" - if latest: - message_text += f"最近一次{('独立评审' if latest.get('run_kind') == 'independent_review' else 'AI预审')}状态为{latest['status']}。" - message_text += "下一步:" + (f"处理“{unresolved[0]['title']}”" if unresolved else "生成报告或提交下一环节") - return {"intent": "project_status", "message": message_text, "items": [{"id": f["id"], "title": f["title"], "status": f["status"]} for f in unresolved[:5]], "url": f"/xingbang-workbench?project={payload.project_id}"} + pending = project_body["pending_candidates"] + project_url = f"/xingbang-workbench?project={quote(payload.project_id)}" + run_labels = {"queued": "等待执行", "running": "执行中", "completed": "已完成", "partial": "部分完成", "failed": "执行失败", "cancelled": "已取消"} + workflow_labels = {"report_ready": "报告准备", "supplementing": "补充材料", "submitted": "待评审领取", "under_review": "评审办理", "returned": "退回补件", "review_approved": "评审通过", "withdrawn": "已撤回"} + field_labels = {"facility.amount": "融资金额", "lease.total_value": "租赁物价值", "lease.duplicate_count": "设备清单重复情况", "financial.operating_cashflow": "经营现金流资料", "financial.total_liabilities": "财报负债", "due_diligence.liabilities": "尽调负债", "collection.evidence": "回款依据", "credit.overdue_count": "征信逾期记录", "credit.report_date": "征信报告日期"} + + def finding_title(item): + title = item.get("title", "待核查问题") + if "." in title and title.endswith("完整性"): + field = next(iter(item.get("fields", [])), title[:-3]) + return field_labels.get(field, title) + "是否完整" + return title + + if any(word in message for word in ("下一步", "接下来", "要做什么", "该做什么", "怎么推进", "如何推进", "怎么办")): + workflow = project_body.get("workflow_state", "") + independent = next((r for r in project_body["runs"] if r.get("run_kind") == "independent_review"), None) + if current_role == "reviewer" and workflow == "submitted" and not project_body.get("reviewer_id"): + next_text = "下一步请先到项目评审池领取该项目;领取后再发起独立评审。" + next_url = "/review-pool" + elif current_role == "reviewer" and not independent: + next_text = "下一步请发起独立评审,系统会基于评审员专用 Skills 与规则重新核查全链路。" + next_url = project_url + "&tab=review" + elif workflow == "returned": + returned = next((d for d in project_body["review_decisions"] if d.get("decision") == "退回" and not d.get("finding_id") and not d.get("node_id")), None) + reason = (returned or {}).get("opinion") or "请查看评审员的退回要求" + next_text = f"下一步请先补充退回材料:{reason}。确认材料来源后,重新发起AI预审。" + next_url = project_url + "&tab=findings" + elif pending: + next_text = f"下一步请先确认{len(pending)}项材料候选,确认期间、口径和来源后再更新项目事实。" + next_url = project_url + "&tab=findings" + elif latest and latest["status"] in ("queued", "running"): + next_text = f"本次{('独立评审' if latest.get('run_kind') == 'independent_review' else 'AI预审')}正在{run_labels[latest['status']]}。下一步先查看运行进度,完成后再处理问题。" + next_url = project_url + elif unresolved: + first = unresolved[0] + action = first.get("suggested_action") or "补充对应材料并说明核实口径" + next_text = f"下一步先处理“{finding_title(first)}”:{action}。处理后重新AI预审,确认问题是否闭环。" + next_url = project_url + "&tab=findings#project-findings" + elif not latest: + next_text = "下一步请发起AI预审,系统会检查当前材料并列出需要补充或人工确认的事项。" + next_url = project_url + elif not project_body["reports"]: + next_text = "当前问题已闭环。下一步请生成AI预审报告,并核对报告内容和来源版本。" + next_url = project_url + "&tab=report" + elif workflow != "submitted": + next_text = "当前报告已经具备送审条件。下一步请核对报告后提交正式评审。" + next_url = project_url + "&tab=report" + else: + next_text = "项目已经提交。下一步请到项目评审池查看领取状态和等待时间。" + next_url = "/review-pool" + return {"intent": "next_step", "message": next_text, "url": next_url} + + if any(word in message for word in ("什么问题", "哪些问题", "问题是什么", "风险", "异常")): + if unresolved: + details = ";".join(f"{index + 1}.{finding_title(item)}({item['status']})" for index, item in enumerate(unresolved[:5])) + message_text = f"当前共有{len(unresolved)}项未闭环问题:{details}。打开问题页可以逐项查看数据来源、AI判断和解决建议。" + else: + message_text = "当前没有未闭环问题。你可以继续生成报告,或查看历史检查记录和来源依据。" + return {"intent": "project_issues", "message": message_text, "items": [{"id": f["id"], "title": f["title"], "status": f["status"]} for f in unresolved[:5]], "url": project_url + "&tab=findings#project-findings"} + + if any(word in message for word in ("还缺", "缺什么", "缺少", "材料", "补件")): + if pending: + fields = "、".join(str(item.get("field") or "待确认字段") for item in pending[:5]) + message_text = f"当前有{len(pending)}项材料解析候选尚未确认:{fields}。请打开材料档案,核对期间、单位和来源后确认。" + elif unresolved: + message_text = f"当前没有待确认的材料解析候选,但仍有{len(unresolved)}项业务问题。请先查看“{finding_title(unresolved[0])}”的数据依据和补件建议。" + else: + message_text = f"当前没有待确认的材料候选,已归档{len(project_body['documents'])}份材料,现有问题已闭环。" + return {"intent": "materials", "message": message_text, "url": project_url + "&tab=findings"} + + if any(word in message for word in ("到哪", "进度", "状态", "阶段", "办到")): + stage = workflow_labels.get(project_body.get("workflow_state", ""), project_body.get("stage") or "处理中") + message_text = f"{project_body['customer']}当前处于“{stage}”阶段:有{len(unresolved)}项风险待处理,{len(pending)}项材料候选待确认。" + if latest: + run_name = "独立评审" if latest.get("run_kind") == "independent_review" else "AI预审" + message_text += f"最近一次{run_name}{run_labels.get(latest['status'], latest['status'])}。" + return {"intent": "project_status", "message": message_text, "items": [{"id": f["id"], "title": f["title"], "status": f["status"]} for f in unresolved[:5]], "url": project_url} + + if any(word in message for word in ("能做什么", "可以做什么", "怎么用", "如何使用", "帮助")) or message in ("你好", "您好", "嗨"): + return {"intent": "help", "message": "我可以帮你查项目进度、说明下一步、列出问题与缺失材料,也可以发起AI预审、生成报告和提交正式评审。你可以直接问:这个项目到哪一步了?或:我接下来要做什么?", "url": project_url} + + return {"intent": "clarify", "message": "我还不能确定你要查哪一项。你可以直接说“查看项目进度”“下一步做什么”“有哪些问题”“还缺什么材料”,也可以使用左侧快捷操作。复杂的自由分析请切换到 mini-openclaw。", "url": project_url} @router.get("/projects/{project_id}/reports/{report_id}/export") diff --git a/backend/test_project_assistant.py b/backend/test_project_assistant.py index db0c177..01e6044 100644 --- a/backend/test_project_assistant.py +++ b/backend/test_project_assistant.py @@ -351,6 +351,28 @@ class ProjectAssistantTests(unittest.TestCase): self.assertEqual(returned["next_action"], "查看退回要求并补充材料") self.assertTrue(returned["returned_at"]) + def test_conversation_read_questions_receive_distinct_answers(self): + env = {"XINGBANG_DEMO_ROLE_LOGIN": "1", "XINGBANG_DEMO_PROJECTS": "DEMO-A,DEMO-B,DEMO-C"} + headers = {"X-Xingbang-Demo-Role": "manager"} + with patch.dict(os.environ, env): + status = self.post("/commands", {"project_id": "DEMO-B", "message": "这个项目到哪一步了?"}, headers=headers) + next_step = self.post("/commands", {"project_id": "DEMO-B", "message": "我接下来要做什么?"}, headers=headers) + issues = self.post("/commands", {"project_id": "DEMO-B", "message": "现在有哪些风险?"}, headers=headers) + materials = self.post("/commands", {"project_id": "DEMO-B", "message": "还缺什么材料?"}, headers=headers) + unknown = self.post("/commands", {"project_id": "DEMO-B", "message": "请详细分析这个客户"}, headers=headers) + for response in (status, next_step, issues, materials, unknown): + self.assertEqual(response.status_code, 200, response.text) + self.assertEqual(status.json()["intent"], "project_status") + self.assertIn("当前处于", status.json()["message"]) + self.assertEqual(next_step.json()["intent"], "next_step") + self.assertIn("下一步", next_step.json()["message"]) + self.assertNotIn("lease.duplicate_count完整性", next_step.json()["message"]) + self.assertNotEqual(status.json()["message"], next_step.json()["message"]) + self.assertEqual(issues.json()["intent"], "project_issues") + self.assertIn("未闭环问题", issues.json()["message"]) + self.assertEqual(materials.json()["intent"], "materials") + self.assertEqual(unknown.json()["intent"], "clarify") + def test_full_review_topics_gate_approval_and_freeze_trace(self): pre_run = self.run_project("DEMO-A") report = self.post("/projects/DEMO-A/reports", {"run_id": pre_run["id"]}).json() diff --git a/docs/兴邦金租对公智能评审平台业务手册-v1.0.docx b/docs/兴邦金租对公智能评审平台业务手册-v1.0.docx new file mode 100644 index 0000000000000000000000000000000000000000..b191bfb4f2fca6b8d7968b7b8d5a445d621d3538 GIT binary patch literal 64264 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π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 Ysj@sYIGOotAj1T#fyV{x>tCP#2b%r;+W-In literal 0 HcmV?d00001 diff --git a/scripts/test_ui_readability.cjs b/scripts/test_ui_readability.cjs new file mode 100644 index 0000000..55f1e5a --- /dev/null +++ b/scripts/test_ui_readability.cjs @@ -0,0 +1,26 @@ +const assert = require("node:assert/strict"); +const fs = require("node:fs"); +const path = require("node:path"); + +const root = path.resolve(__dirname, ".."); +const read = (file) => fs.readFileSync(path.join(root, file), "utf8"); + +const globals = read("src/app/globals.css"); +const navigation = read("src/components/xingbang/navigation.css"); +const workspace = read("src/app/data-access/workspace.css"); +const assistant = read("src/components/xingbang/business-assistant.css"); +const operations = read("src/app/operations-center/operations.css"); + +assert.match(globals, /font-size:\s*16px/, "全局正文应提供清晰的基础字号"); +assert.match(globals, /:focus-visible/, "键盘操作应有明显焦点提示"); +assert.match(navigation, /\.xb-agent-nav a\{min-height:42px[^}]*font-size:14px/, "主导航应扩大文字和点击区域"); +assert.match(navigation, /\.xb-role-switch\{min-height:42px/, "身份选择器应保留足够大的点击区域"); +assert.match(workspace, /\.ra-button\{min-height:42px[^}]*font-size:14px[^}]*font-weight:700/, "工作台按钮应清晰且易点击"); +assert.match(workspace, /\.ra-button\.primary\{background:#17634c/, "主操作按钮应采用稳定的主色强调"); +assert.match(workspace, /\.xb-review-final>\.ra-button:not\(\.primary\)\{border-color:#d7837b/, "退回操作应与批准操作清楚区分"); +assert.match(workspace, /\.xb-panel>p,.xb-panel p,.xb-panel details\{font-size:14px/, "业务面板正文不应继续使用过小字号"); +assert.match(assistant, /\.ba-messages article p\{font-size:15px/, "助手对话正文应易于阅读"); +assert.match(assistant, /\.ba-workspace aside button\{min-height:46px/, "助手快捷操作应有明显点击区域"); +assert.match(operations, /\.td-hero-actions button,.td-hero-actions select\{height:46px/, "时效看板操作控件应易于辨认和点击"); + +console.log("Business UI readability checks passed"); diff --git a/scripts/verify.py b/scripts/verify.py index 570ecae..ea7e292 100644 --- a/scripts/verify.py +++ b/scripts/verify.py @@ -210,6 +210,7 @@ def main() -> int: ("backend-unit", [project_python(), "-m", "unittest", "discover", "-s", ".", "-p", "test_*.py", "-v"], BACKEND), ("reviewer-workspace-ui", [executable("node"), "scripts/test_reviewer_workspace.cjs"], ROOT), ("identity-recovery-ui", [executable("node"), "scripts/test_identity_recovery.cjs"], ROOT), + ("ui-readability", [executable("node"), "scripts/test_ui_readability.cjs"], ROOT), ("frontend-build", [npm, "run", "build"], ROOT), ("compose-local-config", [docker, "compose", "-f", "docker-compose.yml", "config", "--quiet"], ROOT), ("compose-aliyun-config", [docker, "compose", "--env-file", "deploy/aliyun.env.example", "-f", "deploy/docker-compose.aliyun.yml", "config", "--quiet"], ROOT), diff --git a/src/app/data-access/workspace.css b/src/app/data-access/workspace.css index d728836..c823a4e 100644 --- a/src/app/data-access/workspace.css +++ b/src/app/data-access/workspace.css @@ -12,3 +12,41 @@ .xb-decision-editor{display:block;margin-top:10px}.xb-decision-editor>span{display:block;margin-bottom:6px;color:#51675a;font-size:10px;font-weight:700}.xb-decision-editor textarea{box-sizing:border-box;width:100%;min-height:82px;padding:10px 11px;resize:vertical;border:1px solid #d9e2dc;border-radius:7px;background:#fff;color:#273c30;font:inherit;line-height:1.6;outline:none}.xb-decision-editor textarea:focus{border-color:#3b8d64;box-shadow:0 0 0 3px #3b8d6418}.xb-decision-editor>small{display:block;margin-top:4px;text-align:right;color:#8a958e;font-size:9px} .xb-return-reason{display:block;width:min(360px,100%)}.xb-return-reason>span{display:block;margin-bottom:5px;color:#587063;font-size:9px;font-weight:700}.xb-return-reason textarea{box-sizing:border-box;width:100%;min-height:58px;padding:8px 10px;resize:vertical;border:1px solid #ccdcd2;border-radius:7px;background:#fff;color:#273c30;font:inherit;line-height:1.5;outline:none}.xb-return-reason textarea:focus{border-color:#3b8d64;box-shadow:0 0 0 3px #3b8d6418}@media(max-width:900px){.xb-return-reason{width:100%}} .xb-project-card.is-returned{border-color:#e7847b;background:#fff1ef;box-shadow:0 7px 24px #b8403020}.xb-project-card.is-returned:hover{border-color:#c74d42;box-shadow:0 9px 28px #b8403030}.xb-project-card.is-returned>span{background:#c9463b;color:#fff}.xb-returned-summary{display:grid;gap:6px;margin:15px 0;padding:12px 14px;border-left:3px solid #d04d43;border-radius:7px;background:#fff8f7}.xb-returned-summary small{color:#9a5c56}.xb-returned-summary strong{font-size:12px;line-height:1.6;color:#8d3029} + +/* Readability and action hierarchy for all consolidated business workspaces. */ +.ra-app{font-family:"Microsoft YaHei","PingFang SC",sans-serif;font-size:15px;line-height:1.65} +.ra-main,.xb-overview{color:#24352c} +.ra-heading h1{font-size:31px}.ra-heading p,.xb-overview-heading p{font-size:14px;color:#65766d} +.ra-eyebrow,.ra-side-label{font-size:12px}.ra-top{font-size:14px}.ra-badge,.ra-status{font-size:12px} +.ra-button{min-height:42px;padding:10px 16px;border:1px solid #b8c8bf;border-radius:8px;background:#fff;color:#234d39;font-size:14px;font-weight:700;box-shadow:0 2px 7px #173d2b0c;transition:background-color .16s,border-color .16s,box-shadow .16s,transform .16s} +.ra-button:hover{background:#edf6f1;border-color:#4e8b6c;box-shadow:0 5px 15px #173d2b16;transform:translateY(-1px)} +.ra-button.primary{background:#17634c;border-color:#17634c;color:#fff;box-shadow:0 5px 14px #17634c30}.ra-button.primary:hover{background:#104d3a;border-color:#104d3a} +.ra-button:disabled{box-shadow:none;transform:none} +.ra-field,.ra-run-form label{font-size:14px;color:#53675c}.ra-field>span{font-weight:600} +.ra-field input,.ra-field textarea,.ra-field select,.ra-run-form input,.ra-run-form select,.xb-actions input,.xb-actions select,.xb-panel>select,.xb-report>select{min-height:42px;padding:10px 12px;border-color:#c6d2cb;border-radius:7px;font-size:14px;color:#283b31} +.ra-field input:focus,.ra-field textarea:focus,.ra-field select:focus,.xb-actions input:focus,.xb-actions select:focus{border-color:#3b8d64;box-shadow:0 0 0 3px #3b8d6418} +.ra-alert{padding:15px 16px;border-radius:8px;font-size:14px;font-weight:600} +.ra-pipeline-step b{font-size:14px}.ra-pipeline-step small{font-size:12px} +.ra-card h2{font-size:18px}.ra-card>p{font-size:14px;color:#66756d}.ra-chips span,.ra-card-detail,.ra-card footer{font-size:12px} +.xb-role-banner{padding:7px 11px;font-size:12px}.xb-project-card{padding:24px;border-color:#cedbd3;border-radius:12px;box-shadow:0 3px 12px #244a3708} +.xb-project-card>span{font-size:12px;font-weight:700}.xb-project-card h2{font-size:20px}.xb-project-card p{font-size:14px;color:#64766c}.xb-project-card footer b,.xb-project-card footer small{font-size:13px} +.xb-next{padding:14px}.xb-next small{font-size:12px}.xb-next b{font-size:14px} +.xb-tabs button,.xb-tabs a{min-height:46px;padding:14px 18px;font-size:15px;font-weight:600}.xb-tabs button:hover,.xb-tabs a:hover{background:#edf5f0;color:#17633f} +.xb-panel{border-color:#cedbd3;border-radius:10px}.xb-panel h2{font-size:21px}.xb-panel h3{font-size:17px}.xb-panel>p,.xb-panel p,.xb-panel details{font-size:14px;color:#586d61} +.xb-finding b{font-size:15px}.xb-finding p{font-size:14px}.xb-finding small{font-size:12px} +.xb-status,.xb-result{font-size:12px}.xb-review-clock small,.xb-review-clock span{font-size:12px}.xb-review-clock b{font-size:13px}.xb-review-clock strong{font-size:17px} +.xb-step-business>summary{padding:18px 20px;cursor:pointer}.xb-step-business>summary small{font-size:13px}.xb-step-business>summary strong{font-size:13px} +.xb-solution b{font-size:14px}.xb-solution small{font-size:13px} +.xb-review-heading>div>span{font-size:12px}.xb-review-heading h2{font-size:25px}.xb-review-heading p{font-size:14px}.xb-review-progress small{font-size:12px} +.xb-review-kpis span,.xb-review-lanes span{font-size:13px}.xb-review-topic>summary span>small,.xb-review-topic>summary>strong{font-size:12px}.xb-topic-lanes h3{font-size:15px} +.xb-source>summary{padding:12px}.xb-source>summary span>small,.xb-source>summary em{font-size:11px}.xb-source>p{font-size:12px!important;line-height:1.6}.xb-empty-source{font-size:12px} +.xb-ai-state p{font-size:13px!important}.xb-ai-check>span{height:auto;font-size:11px}.xb-ai-check b{font-size:13px}.xb-ai-check p,.xb-ai-check small{font-size:12px!important} +.xb-decision-editor>span,.xb-return-reason>span{font-size:13px}.xb-decision-editor>small,.xb-current-decision small,.xb-trace-note{font-size:11px} +.xb-decision-actions{gap:9px}.xb-decision-actions .ra-button{min-height:40px;padding:9px 12px;font-size:13px} +.xb-review-final{padding:20px;border:1px solid #cce2d5}.xb-review-final b{font-size:16px}.xb-review-final small{font-size:13px} +.xb-review-final>.ra-button:not(.primary){border-color:#d7837b;background:#fff7f5;color:#9b382f}.xb-review-final>.ra-button:not(.primary):hover{border-color:#bb4d43;background:#ffebe8} +.xb-return-reason textarea,.xb-decision-editor textarea{font-size:14px;border-color:#bfcfc6} +.xb-timeline article b,.xb-timeline article strong{font-size:14px}.xb-timeline article p{font-size:13px}.xb-timeline article small{font-size:12px} +.xb-history-counts button,.xb-event-list a{font-size:14px}.xb-history-counts small,.xb-event-list small{font-size:12px} +.xb-returned-summary small{font-size:12px}.xb-returned-summary strong{font-size:14px} +@media(max-width:760px){.ra-button{min-height:42px;font-size:13px}.xb-project-card h2{font-size:18px}.xb-tabs button,.xb-tabs a{font-size:13px}.xb-review-heading h2{font-size:22px}} diff --git a/src/app/globals.css b/src/app/globals.css index 4503fbd..59b22a2 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -16,10 +16,24 @@ body { min-height: 100%; } body { color: var(--text-primary); - font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", "Segoe UI", Roboto, sans-serif; + font-family: "Microsoft YaHei", "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + font-size: 16px; + line-height: 1.6; -webkit-font-smoothing: antialiased; } +button, +input, +select, +textarea { + font: inherit; +} + +:focus-visible { + outline: 3px solid rgba(23, 99, 76, 0.28); + outline-offset: 3px; +} + /* ── Layered background ─────────────────────────────── */ .app-bg { background: diff --git a/src/app/operations-center/operations.css b/src/app/operations-center/operations.css index 080984f..1499b69 100644 --- a/src/app/operations-center/operations.css +++ b/src/app/operations-center/operations.css @@ -1 +1,11 @@ .td-shell{min-height:100vh;background:#071711;color:#eff8f3;font-family:Arial,"Microsoft YaHei",sans-serif}.td-main{max-width:1500px;margin:auto;padding:42px 38px 80px}.td-hero{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;padding:34px 38px;border:1px solid #ffffff16;border-radius:22px;background:radial-gradient(circle at 75% 5%,#1b725850,transparent 35%),linear-gradient(135deg,#102b20,#0a1d16);box-shadow:0 28px 80px #0006;position:relative;overflow:hidden}.td-hero:after{content:"";position:absolute;width:260px;height:260px;border:1px solid #6ce1ae20;border-radius:50%;right:-80px;top:-150px}.td-hero p,.td-panel header p,.td-projects>header p{font-size:10px;letter-spacing:.18em;color:#72c99f;margin-bottom:12px}.td-hero h1{font-family:Georgia,"Microsoft YaHei",serif;font-size:38px;font-weight:500;letter-spacing:-.03em}.td-hero span{display:block;color:#91ab9e;font-size:13px;margin-top:13px}.td-hero-actions{display:flex;gap:10px;z-index:1}.td-hero-actions button,.td-hero-actions select{height:42px;padding:0 15px;border-radius:10px;border:1px solid #ffffff1f;background:#ffffff0d;color:#d9eee3;font-size:12px}.td-hero-actions option{color:#17251e}.td-hero-actions button{display:flex;align-items:center;gap:8px;background:#46c98c;color:#062116;border:0;font-weight:700}.spin{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.td-error,.td-loading{padding:24px;border:1px solid #ffffff18;border-radius:15px;margin-top:20px}.td-loading{display:flex;align-items:center;justify-content:center;gap:12px;color:#80a391;min-height:180px}.td-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:18px 0}.td-kpis article{padding:22px 23px;border:1px solid #ffffff12;border-radius:16px;background:#0d2119}.td-kpis article.accent{background:linear-gradient(145deg,#163a2b,#10271d);border-color:#5ad39838}.td-kpis article>div{display:flex;justify-content:space-between;color:#86a495;font-size:11px}.td-kpis article>div svg{color:#4cc68c}.td-kpis strong{font-size:27px;font-weight:500;display:block;margin:17px 0 9px}.td-kpis strong small{font-size:11px;margin-left:4px;color:#718e80}.td-kpis p{font-size:10px;color:#627b6f;line-height:1.6}.td-insight{display:flex;align-items:center;justify-content:space-between;padding:26px 31px;margin-bottom:18px;border-radius:18px;background:linear-gradient(100deg,#eaf8f1,#dff2e8);color:#11261c}.td-insight p{font-size:10px;color:#4d8068;letter-spacing:.1em;margin-bottom:9px}.td-insight h2{font-family:Georgia,"Microsoft YaHei",serif;font-size:20px;font-weight:500}.td-donut{width:72px;height:72px;border-radius:50%;background:conic-gradient(#e2a354 0 58%,#38c487 58% 100%);display:grid;place-items:center;position:relative}.td-donut:after{content:"";position:absolute;inset:8px;border-radius:50%;background:#e6f5ed}.td-donut strong,.td-donut span{position:absolute;z-index:1}.td-donut strong{font-size:17px}.td-donut span{font-size:8px;margin-top:25px;color:#5d7f6e}.td-grid{display:grid;grid-template-columns:minmax(0,2.2fr) minmax(260px,.8fr);gap:16px}.td-panel,.td-projects{border:1px solid #ffffff12;background:#0d2119;border-radius:18px;padding:26px}.td-panel header,.td-projects>header{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.td-panel h2,.td-projects h2{font-size:18px;font-weight:500}.td-panel header small,.td-projects>header>span{font-size:10px;color:#658073}.td-phase{display:grid;grid-template-columns:180px 1fr 75px;gap:14px;align-items:center;margin:18px 0}.td-phase>div:first-child{display:flex;justify-content:space-between;align-items:center}.td-phase b{font-size:11px}.td-phase span{font-size:9px;color:#688174}.td-track{height:8px!important;border-radius:10px;background:#ffffff09;overflow:hidden}.td-track i{display:block;height:100%;border-radius:10px;background:linear-gradient(90deg,#309e70,#59d4a0);box-shadow:0 0 15px #3bd29144}.td-phase>strong{font-size:11px;text-align:right;color:#a9c0b5}.td-legend>div{display:grid;grid-template-columns:12px 1fr auto;align-items:center;gap:9px;padding:14px 0;border-bottom:1px solid #ffffff0b;font-size:11px}.td-legend>div i{width:8px;height:8px;border-radius:50%}.td-legend>div strong{font-weight:500}.td-legend>p{font-size:10px;color:#668174;line-height:1.8;margin-top:20px}.td-projects{margin-top:16px}.td-project{display:grid;grid-template-columns:240px 1fr 120px;gap:25px;align-items:center;padding:22px 0;border-top:1px solid #ffffff0d;color:inherit}.td-project:hover h3{color:#66daa5}.td-project-title>span{font-size:9px;letter-spacing:.12em;color:#5ab98b}.td-project-title h3{font-size:14px;margin:7px 0}.td-project-title small,.td-project-total small{font-size:9px;color:#61796d}.td-bars{height:24px;display:flex;gap:3px;align-items:center}.td-segment{height:100%;min-width:4px;border-radius:4px;display:grid;place-items:center;overflow:hidden}.td-segment span{font-size:8px;color:#062218;white-space:nowrap}.td-project-total{display:grid;grid-template-columns:1fr auto;align-items:center}.td-project-total small{grid-column:1/-1}.td-project-total strong{font-size:15px;margin-top:5px}.td-project-total svg{color:#58c892}.td-project-events{grid-column:2/-1;display:flex;gap:14px;flex-wrap:wrap}.td-project-events>span{display:grid;grid-template-columns:8px auto auto;gap:6px;align-items:center;font-size:9px;color:#799486}.td-project-events i{width:6px;height:6px;border-radius:50%}.td-project-events b{color:#bdd0c7}.td-project-events small{grid-column:2/-1;color:#536a5e}@media(max-width:950px){.td-kpis{grid-template-columns:1fr 1fr}.td-grid{grid-template-columns:1fr}.td-project{grid-template-columns:1fr}.td-project-events{grid-column:auto}.td-hero{align-items:flex-start;flex-direction:column}}@media(max-width:600px){.td-main{padding:20px 14px 60px}.td-hero{padding:27px 22px}.td-hero h1{font-size:29px}.td-kpis{grid-template-columns:1fr}.td-phase{grid-template-columns:1fr}.td-phase>strong{text-align:left}.td-projects,.td-panel{padding:20px}.td-hero-actions{width:100%}.td-hero-actions select,.td-hero-actions button{flex:1}} + +/* Larger dashboard labels and a stronger refresh action. */ +.td-shell{font-family:"Microsoft YaHei","PingFang SC",sans-serif;font-size:15px} +.td-hero p,.td-panel header p,.td-projects>header p{font-size:12px}.td-hero span{font-size:15px;line-height:1.7} +.td-hero-actions button,.td-hero-actions select{height:46px;padding:0 17px;font-size:14px;border-color:#ffffff38}.td-hero-actions button{box-shadow:0 7px 18px #0003}.td-hero-actions button:hover{background:#5bd79d;transform:translateY(-1px)} +.td-kpis article>div{font-size:13px}.td-kpis p{font-size:12px;color:#819b8e}.td-kpis strong small{font-size:13px} +.td-insight p{font-size:12px}.td-insight h2{font-size:23px}.td-donut span{font-size:10px} +.td-panel h2,.td-projects h2{font-size:20px}.td-panel header small,.td-projects>header>span{font-size:12px;color:#82998e} +.td-phase b,.td-phase>strong{font-size:13px}.td-phase span{font-size:11px}.td-legend>div{font-size:13px}.td-legend>p{font-size:12px;color:#81998d} +.td-project-title>span{font-size:11px}.td-project-title h3{font-size:17px}.td-project-title small,.td-project-total small{font-size:11px}.td-project-total strong{font-size:17px}.td-project-events>span{font-size:11px}.td-segment span{font-size:10px;font-weight:700} diff --git a/src/components/xingbang/business-assistant.css b/src/components/xingbang/business-assistant.css index 990b269..a844e30 100644 --- a/src/components/xingbang/business-assistant.css +++ b/src/components/xingbang/business-assistant.css @@ -1 +1,13 @@ .ba-shell{min-height:100vh;background:#f1f5f2;color:#173127;font-family:Arial,"Microsoft YaHei",sans-serif}.ba-shell *{box-sizing:border-box}.ba-main{max-width:1420px;margin:auto;padding:44px 38px 70px}.ba-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:24px}.ba-heading>div>p{font-size:10px;letter-spacing:.16em;color:#378265;margin-bottom:10px}.ba-heading h1{font:500 36px/1.2 Georgia,"Microsoft YaHei",serif}.ba-heading>div>span{display:block;color:#74857d;font-size:12px;margin-top:12px}.ba-mode-tabs{display:flex;gap:5px;margin-top:28px}.ba-mode-tabs button{display:flex;align-items:center;gap:7px;border:0;background:transparent;color:#6f8178;padding:10px 13px;border-radius:9px;font-size:11px}.ba-mode-tabs button.active{background:#dcece3;color:#17633f;font-weight:700}.ba-context{display:grid;grid-template-columns:minmax(280px,1.4fr) .7fr 1fr auto;align-items:center;gap:18px;background:#0e2a1e;color:white;margin:10px 0 16px;padding:18px 22px;border-radius:15px;box-shadow:0 15px 42px #0d2d201c}.ba-context>div{min-width:0;border-right:1px solid #ffffff17}.ba-context span{display:block;font-size:9px;color:#7ba18e;margin-bottom:7px}.ba-context select{width:90%;border:0;background:transparent;color:#eaf7f0;font-size:13px;font-weight:700}.ba-context select option{color:#1a2a22}.ba-context b{display:block;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ba-context>a{display:flex;align-items:center;gap:6px;color:#73dfa9;font-size:11px}.ba-workspace{display:grid;grid-template-columns:290px minmax(0,1fr);min-height:610px;border:1px solid #dfe8e2;border-radius:18px;overflow:hidden;background:#fff;box-shadow:0 30px 80px #274d3a0e}.ba-workspace>aside{padding:30px 24px;background:linear-gradient(160deg,#f7fbf8,#edf5f0);border-right:1px solid #e1eae4}.ba-workspace>aside>svg{color:#2c9c6a}.ba-workspace aside h2{font-size:17px;margin:18px 0 10px}.ba-workspace aside p{color:#718179;font-size:11px;line-height:1.8;margin-bottom:24px}.ba-workspace aside button{width:100%;display:flex;justify-content:space-between;align-items:center;border:1px solid #dbe7df;background:#fff;color:#345a48;padding:12px 13px;border-radius:9px;margin-bottom:9px;font-size:11px;cursor:pointer}.ba-workspace aside button:hover{border-color:#62ad89;color:#17633f}.ba-workspace aside small{display:flex;align-items:flex-start;gap:7px;color:#8a9991;font-size:9px;line-height:1.7;margin-top:28px}.ba-chat{display:flex;flex-direction:column;min-width:0}.ba-messages{flex:1;padding:28px 34px;overflow:auto;max-height:560px}.ba-messages article{max-width:75%;margin-bottom:18px}.ba-messages article>div{display:flex;align-items:flex-start;gap:9px}.ba-messages article p{padding:13px 15px;border-radius:12px;background:#edf4f0;color:#385347;font-size:12px;line-height:1.8}.ba-messages article.user{margin-left:auto}.ba-messages article.user p{background:#17633f;color:#fff}.ba-messages article svg{color:#369367;margin-top:13px;flex-shrink:0}.ba-messages article small{display:block;color:#9aa6a0;font-size:9px;margin:7px 0 0 25px}.ba-messages article a{display:inline-flex;align-items:center;gap:4px;color:#24724f;font-size:10px;margin:6px 0 0 25px}.ba-messages .pending{opacity:.65}.ba-error{margin:0 28px 10px;color:#9c463b;background:#fff0ed;padding:10px 13px;border-radius:8px;font-size:11px}.ba-chat form{display:flex;align-items:center;gap:9px;margin:0 28px;padding:8px 9px;border:1px solid #d8e3dc;border-radius:13px;background:#fff;box-shadow:0 8px 25px #244a370d}.ba-chat form>input{flex:1;border:0;outline:0;padding:10px;font-size:12px}.ba-chat form>button,.ba-attach{width:38px;height:38px;display:grid;place-items:center;border:0;border-radius:9px;cursor:pointer}.ba-chat form>button{background:#17633f;color:#fff}.ba-chat form>button:disabled{opacity:.4}.ba-attach{color:#668078;background:#eff4f1}.ba-attach input{display:none}.ba-chat footer{display:flex;align-items:center;gap:6px;color:#93a199;font-size:9px;padding:10px 38px 20px}.ba-native{height:610px;display:grid;grid-template-rows:auto 1fr;overflow:hidden;border:1px solid #dfe8e2;border-radius:18px;background:#fff;box-shadow:0 30px 80px #274d3a0e}.ba-native>header{display:flex;justify-content:space-between;align-items:center;padding:14px 20px;border-bottom:1px solid #e1e9e4;background:#f6faf7}.ba-native>header>div,.ba-native>header>a{display:flex;align-items:center;gap:9px}.ba-native>header b{font-size:12px}.ba-native>header span{display:block;color:#819087;font-size:9px;margin-top:4px}.ba-native>header>a{color:#21704d;font-size:10px}@media(max-width:820px){.ba-main{padding:26px 14px 50px}.ba-heading{align-items:flex-start;flex-direction:column}.ba-heading h1{font-size:29px}.ba-context{grid-template-columns:1fr 1fr}.ba-workspace{grid-template-columns:1fr}.ba-workspace>aside{border-right:0;border-bottom:1px solid #e1eae4}.ba-messages{padding:22px 18px}.ba-messages article{max-width:90%}.ba-chat form{margin:0 14px}.ba-chat footer{padding-left:22px}} + +/* Larger business copy and clearer assistant actions. */ +.ba-shell{font-family:"Microsoft YaHei","PingFang SC",sans-serif;font-size:15px} +.ba-heading>div>p{font-size:12px}.ba-heading>div>span{font-size:14px;line-height:1.7} +.ba-mode-tabs button{min-height:44px;padding:11px 16px;font-size:14px;border:1px solid transparent;cursor:pointer} +.ba-mode-tabs button:hover{background:#e8f1ec;color:#17633f}.ba-mode-tabs button.active{border-color:#bdd9c8;box-shadow:0 3px 12px #1c5a3b12} +.ba-context span{font-size:12px}.ba-context select{font-size:15px}.ba-context b{font-size:14px}.ba-context>a{font-size:13px;font-weight:700} +.ba-workspace aside h2{font-size:20px}.ba-workspace aside p{font-size:14px;color:#5d7167}.ba-workspace aside button{min-height:46px;padding:12px 15px;border-color:#c9d9d0;font-size:14px;font-weight:600;box-shadow:0 2px 8px #244a3708} +.ba-workspace aside button:hover{background:#edf7f1;border-color:#3e8f68;box-shadow:0 4px 14px #244a3712} +.ba-workspace aside small{font-size:12px}.ba-messages article p{font-size:15px}.ba-messages article small{font-size:12px}.ba-messages article a{font-size:13px;font-weight:700} +.ba-error{font-size:14px}.ba-chat form{border-color:#bdd2c6;box-shadow:0 8px 28px #244a3715}.ba-chat form>input{font-size:15px}.ba-chat form>button,.ba-attach{width:44px;height:44px}.ba-chat footer{font-size:12px} +.ba-native>header b{font-size:14px}.ba-native>header span{font-size:12px}.ba-native>header>a{font-size:13px;font-weight:700} diff --git a/src/components/xingbang/navigation.css b/src/components/xingbang/navigation.css index d3c5f37..2987644 100644 --- a/src/components/xingbang/navigation.css +++ b/src/components/xingbang/navigation.css @@ -1 +1,13 @@ .xb-agent-nav{position:sticky;top:0;z-index:100;display:flex;align-items:center;gap:8px;padding:10px 22px;background:#fffffff5;backdrop-filter:blur(18px);border-bottom:1px solid #dfe7e3;color:#667b6d;box-shadow:0 2px 14px #1e3d2e0f;font-family:Arial,"Microsoft YaHei",sans-serif}.xb-agent-nav a{display:flex;align-items:center;gap:7px;padding:8px 10px;min-height:36px;border-radius:7px;font-size:12px;font-weight:500}.xb-agent-nav a:hover{background:#f2f6f3;color:#216b48}.xb-agent-nav a.selected{background:#e4f1e9;color:#17633f;box-shadow:inset 0 0 0 1px #cce2d4}.xb-agent-nav .xb-brand{gap:8px;padding:2px 14px 2px 0;margin-right:2px;border-right:1px solid #e4eae5;border-radius:0}.xb-brand-mark{width:30px;height:30px;display:grid;place-items:center;border-radius:7px;background:#17634c;color:#fff;font-size:15px;font-weight:700;box-shadow:inset 0 -2px 0 #0002}.xb-brand b{display:block;color:#17634c;font-size:13px;line-height:1.1}.xb-brand small{display:block;margin-top:4px;color:#91a197;font-size:9px;line-height:1.1}.xb-nav-spacer{flex:1}.xb-project-context{font-size:10px;color:#58705f;background:#f2f7f3;border:1px solid #deebe1;border-radius:999px;padding:7px 11px;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xb-identity{display:flex;align-items:center;gap:7px;padding:7px 11px;border-radius:999px;background:#f2f6f3;border:1px solid #dce8e0;font-size:10px;color:#7d8c82;white-space:nowrap}.xb-identity i{width:7px;height:7px;border-radius:50%;background:#55a778;box-shadow:0 0 0 4px #55a77818}.xb-identity b{font-size:11px;color:#244a36}.xb-identity.role-reviewer{background:#eef2fb;border-color:#dce3f3}.xb-identity.role-reviewer i{background:#607bb8}.xb-identity.role-reviewer b{color:#344c82}.xb-identity.role-admin{background:#f8f2e8;border-color:#eadfc9}.xb-identity.role-admin i{background:#bc8541}.xb-identity.role-admin b{color:#76511f}.xb-overview{max-width:1480px;margin:auto;padding:32px}.xb-overview-heading{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:28px}.xb-overview-heading h1{font-size:26px;font-weight:600}.xb-overview-heading p{font-size:12px;color:#84948b;margin-top:9px}.xb-role-switch{display:flex;align-items:center;gap:8px;border:1px solid #cee0d5;background:#fff;padding:9px 12px;border-radius:12px;box-shadow:0 7px 24px #183b2b0b}.xb-role-switch>span{font-size:10px;color:#87978f}.xb-role-switch svg{color:#27805a}.xb-role-switch select{font-weight:700;color:#245c43;border:0;background:transparent;outline:none}.xb-role-switch.dark{border-color:#ffffff1f;background:#ffffff0d;box-shadow:none}.xb-role-switch.dark>span{color:#8daf9e}.xb-role-switch.dark svg{color:#55d49b}.xb-role-switch.dark select{color:#e1f5eb}.xb-role-switch.dark select option{color:#17251e}@media(max-width:760px){.xb-agent-nav{padding:8px 10px;gap:3px;flex-wrap:wrap}.xb-agent-nav a{font-size:10px;padding:6px}.xb-agent-nav .xb-brand{border:0;padding-right:5px}.xb-brand small,.xb-nav-spacer,.xb-identity>span{display:none}.xb-identity{margin-left:auto}.xb-project-context{order:10;width:100%;max-width:none}.xb-overview{padding:22px 15px}.xb-overview-heading{align-items:flex-start;flex-wrap:wrap}} + +/* Business UI readability: keep navigation and identity obvious at a glance. */ +.xb-agent-nav{min-height:64px;padding:11px 24px;gap:10px;font-family:"Microsoft YaHei","PingFang SC",sans-serif} +.xb-agent-nav a{min-height:42px;padding:10px 13px;border-radius:9px;font-size:14px;font-weight:600;transition:background-color .16s,color .16s,box-shadow .16s} +.xb-agent-nav a.selected{box-shadow:inset 0 0 0 1px #bdd8c8,0 3px 10px #1d563a12} +.xb-brand-mark{width:36px;height:36px;font-size:17px} +.xb-brand b{font-size:15px}.xb-brand small{font-size:11px} +.xb-project-context{font-size:12px;padding:8px 13px} +.xb-role-switch{min-height:42px;padding:8px 13px;border-color:#bcd5c6;box-shadow:0 4px 16px #183b2b12} +.xb-role-switch>span{font-size:12px}.xb-role-switch select{font-size:14px;cursor:pointer} +.xb-overview-heading h1{font-size:30px;line-height:1.35}.xb-overview-heading p{font-size:14px;line-height:1.75;color:#667970} +@media(max-width:760px){.xb-agent-nav a{font-size:12px;min-height:38px;padding:8px}.xb-brand b{font-size:14px}.xb-overview-heading h1{font-size:26px}}