diff --git a/apps/web/src/app/styles/app.css b/apps/web/src/app/styles/app.css index 4a367b2..c527146 100644 --- a/apps/web/src/app/styles/app.css +++ b/apps/web/src/app/styles/app.css @@ -2958,3 +2958,23 @@ .proto-root .jc-empty.t-muted .r1 { background: radial-gradient(circle, var(--line-soft), transparent 72%); } .proto-root .jc-empty.t-muted .r2 { background: var(--line-soft); } .proto-root .jc-empty.t-muted .jc-empty-ico { color: var(--ink-3); } + +/* ── 助理栏的「不在岗」态(补充,非原型)────────────────────────────── + 审批 / 消息 / 纪要 / 汇报四面的助理栏:对话流按 OS 4.1 只长在任务上, + 这四面用不到它。章不打彩色渐变 —— 亮着像在待命,灰着才说得清「这儿不说话」。 */ +.proto-root .jc-tch-mark.t-idle { background: var(--line-soft); color: var(--ink-3); box-shadow: none; } + +/* ── 助理栏题头的抗压(补充,非原型)──────────────────────────────── + 题头一行摆四件:章 · 任务助理 · Agent · 说明句。对话区被压到 ~210px 时, + 说明句只剩 29px 宽,被省略号截成「汇…」—— 一个字都读不出来,等于白占地方。 + 让它在挤的时候**换到第二行**,拿整行说完;右对齐也一并取消(自己一行就不用靠边)。 + + 按**自己这一栏的宽度**判断,不按视口 —— 对话区宽度还受收起状态影响, + 视口断点管不住它。容器上下文落在 `.jc-tch`(内层壳)而不是 `.session-chat`: + 后者带着拖拽调宽的柄(负偏移),不给它加 containment。 */ +.proto-root .jc-tch { container-type: inline-size; } + +@container (max-width: 300px) { + .proto-root .jc-tch-head { flex-wrap: wrap; row-gap: 2px; } + .proto-root .jc-tch-desc { flex: 1 0 100%; text-align: left; white-space: normal; } +} diff --git a/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx b/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx index a99499b..7ddf2ea 100644 --- a/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx +++ b/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx @@ -12,7 +12,7 @@ import { decideApprovalRoute, listApprovalsForMeRoute } from '@contracts'; import { Ico } from '@web-shared/Ico.tsx'; import ScrollArea from '@web-shared/ScrollArea.tsx'; import { call } from '@web-shared/typed-fetch.ts'; -import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; +import { AssistantAside, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; const STATE_CHIP = { pending: { tone: 'todo' as const, label: '待审批', pulse: true }, @@ -188,6 +188,13 @@ export function ApprovalDesk() { )} )} + + ); } diff --git a/apps/web/src/features/desk-message/internal/MessageDesk.tsx b/apps/web/src/features/desk-message/internal/MessageDesk.tsx index cd88920..3d7d13f 100644 --- a/apps/web/src/features/desk-message/internal/MessageDesk.tsx +++ b/apps/web/src/features/desk-message/internal/MessageDesk.tsx @@ -13,7 +13,7 @@ import { answerMessageRoute, listMessagesRoute, markMessageReadRoute } from '@co import { Ico } from '@web-shared/Ico.tsx'; import ScrollArea from '@web-shared/ScrollArea.tsx'; import { call } from '@web-shared/typed-fetch.ts'; -import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; +import { AssistantAside, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; const KIND_META: Readonly> = { notice: { icon: 'bell', grad: ['#7f3bf5', '#5b21cf'], kicker: '系统 · 通知' }, @@ -151,6 +151,13 @@ export function MessageDesk() { )} )} + + ); } diff --git a/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx b/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx index f3a3c3f..15dbdeb 100644 --- a/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx +++ b/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx @@ -12,7 +12,7 @@ import { appendResolutionRoute, createMinuteRoute, listMinutesRoute, registerRes import { Ico } from '@web-shared/Ico.tsx'; import ScrollArea from '@web-shared/ScrollArea.tsx'; import { call } from '@web-shared/typed-fetch.ts'; -import { Avatar, AvatarStack, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; +import { AssistantAside, Avatar, AvatarStack, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; export function MinuteDesk() { const queryClient = useQueryClient(); @@ -269,6 +269,13 @@ export function MinuteDesk() { )} + + ); } diff --git a/apps/web/src/features/desk-report/internal/ReportDesk.tsx b/apps/web/src/features/desk-report/internal/ReportDesk.tsx index 10dbd97..4f443e9 100644 --- a/apps/web/src/features/desk-report/internal/ReportDesk.tsx +++ b/apps/web/src/features/desk-report/internal/ReportDesk.tsx @@ -12,7 +12,7 @@ import { REPORT_PERIOD_LABEL, draftReportRoute, submitReportRoute } from '@contr import { Ico } from '@web-shared/Ico.tsx'; import ScrollArea from '@web-shared/ScrollArea.tsx'; import { call } from '@web-shared/typed-fetch.ts'; -import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; +import { AssistantAside, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx'; const PERIODS: ReadonlyArray<{ k: ReportPeriodName; ico: string }> = [ { k: 'day', ico: 'calendar-days' }, @@ -191,6 +191,13 @@ export function ReportDesk() { )} + + ); } diff --git a/apps/web/src/shared/desk/module-kit.tsx b/apps/web/src/shared/desk/module-kit.tsx index 144414d..9731e9d 100644 --- a/apps/web/src/shared/desk/module-kit.tsx +++ b/apps/web/src/shared/desk/module-kit.tsx @@ -229,3 +229,47 @@ export function EmptyState({ ); } + +/** + * 助理栏 —— 审批 / 消息 / 纪要 / 汇报四面右侧那一栏。 + * + * `.workspace` 是**三列**网格(侧栏 · 工作区 · 助理栏)。这四个模块原来只渲染两栏, + * 右边就空出一条 234px 的白带 —— 不是空态,是**什么都没有**,看着像坏了。 + * + * 那一栏摆什么?按 OS 4.1,「对话流」是**工作台-任务**的交互结构、是回环输入的唯一入口; + * 这四个要素各有自己的形态:审批是通过/驳回附依据、消息是就地答、纪要靠人记、 + * 汇报是确认即提交 —— 都不经对话流。所以这里不摆一个能打字的输入框(那是许诺聊得起来), + * 只如实说明这一栏是什么、这一面该怎么用、想说话该去哪儿。 + * + * 色调用 `muted`:通路不在这儿,灰着就不许诺。 + */ +export function AssistantAside({ + ico, + title, + desc, + note, +}: { + ico: string; + title: string; + desc: string; + /** 题头右侧那半句 —— 一句话说清这一栏在本面的角色 */ + note: string; +}) { + return ( +
+
+
+ + + + 任务助理 + Agent + {note} +
+
+ +
+
+
+ ); +} diff --git a/packages/ui-kit/src/Ico.tsx b/packages/ui-kit/src/Ico.tsx index b26b8c2..f11eac5 100644 --- a/packages/ui-kit/src/Ico.tsx +++ b/packages/ui-kit/src/Ico.tsx @@ -75,6 +75,9 @@ export function Ico({ name, s = 18 }: { name: string; s?: number }) { "shield-check": (<>), scan: (<>), "file-check": (<>), + gavel: (<>), + "pencil-line": (<>), + "chart-column": (<>), "trending-up": (<>), ban: (<>), key: (<>),