diff --git a/mobile-uni/src/pages.json b/mobile-uni/src/pages.json
index 73f4d23a..c3695551 100644
--- a/mobile-uni/src/pages.json
+++ b/mobile-uni/src/pages.json
@@ -127,12 +127,24 @@
"navigationBarTitleText": "团队画像"
}
},
+ {
+ "path": "pages/supervisor/member/index",
+ "style": {
+ "navigationBarTitleText": "成员详情"
+ }
+ },
{
"path": "pages/supervisor/assign/index",
"style": {
"navigationBarTitleText": "指派专项"
}
},
+ {
+ "path": "pages/supervisor/assign/result",
+ "style": {
+ "navigationBarTitleText": "派发结果"
+ }
+ },
{
"path": "pages/supervisor/reviews/index",
"style": {
diff --git a/mobile-uni/src/pages/supervisor/assign/index.vue b/mobile-uni/src/pages/supervisor/assign/index.vue
index 6a75e7a2..4d88e0bd 100644
--- a/mobile-uni/src/pages/supervisor/assign/index.vue
+++ b/mobile-uni/src/pages/supervisor/assign/index.vue
@@ -28,33 +28,38 @@
-
+
- 训练对象
+ 训练对象
-
+
+
+
当前项目暂无可指派的在职员工,请先同步人力系统组织数据。
已选择 {{ selectedMemberIds.length }} 人:{{ selectedMemberNames }}
单次最多派发 {{ maxAssignmentTargets }} 人,超出人员请分批派发。
+
- 岗位内容
+
+ 岗位与场景
+ 岗位
- 场景、SOP 与题目按岗位版本加载,不跨岗位混用。
-
- 训练场景
+ 场景
暂无可派发的已启用场景
+ 场景、SOP 与题目按岗位版本加载,不跨岗位混用。
+
- 截止日期
-
-
- {{ dueDate }}
-
-
-
+
+ 完成时间
+
+
+ {{ dueDate }}
+ ›
+
+
+
+
- 指派说明(选填)
+
+
+ 指派说明(选填)
+ {{ assignmentReason.length }}/200
+
-
-
-
- 本次派发结果
- {{ batchResultSummary }}
-
-
-
-
- {{ item.traineeName || '未命名员工' }}
- {{ item.message }}
-
- {{ batchStatusLabel(item.status) }}
-
-
-
+
@@ -186,7 +183,6 @@ import type {
PracticeAlert,
PracticeAssignment,
PracticeAssignmentBatchItemResult,
- PracticeAssignmentBatchItemStatus,
PracticeTeamMember
} from '@/types/api';
import { clearAuth, getAuth, isLoggedIn, rememberLoginRedirect } from '@/services/auth';
@@ -205,6 +201,7 @@ import {
const basePath = '/pages/supervisor/assign/index';
const maxAssignmentTargets = 100;
+const assignResultStorageKey = 'aihr_supervisor_assign_result_v1';
const pendingBatchStoragePrefix = 'aihr_supervisor_assignment_pending_v1';
const pendingBatchTtlMs = 24 * 60 * 60 * 1000;
interface PendingBatchDraft {
@@ -226,7 +223,6 @@ const scenarioLoading = ref(false);
const assignmentReason = ref('');
const dueDate = ref('');
const pendingRequestId = ref('');
-const batchResultItems = ref([]);
const assignments = ref([]);
const teamMembers = ref([]);
const alerts = ref([]);
@@ -251,17 +247,10 @@ const selectedMemberNames = computed(() => {
return names.length > 3 ? `${preview} 等 ${names.length} 人` : preview;
});
const selectAllLabel = computed(() => teamMembers.value.length > maxAssignmentTargets ? `选前${maxAssignmentTargets}人` : '全选');
-const batchResultSummary = computed(() => {
- const created = batchResultItems.value.filter((item) => item.status === 'CREATED').length;
- const duplicate = batchResultItems.value.filter((item) => item.status === 'DUPLICATE').length;
- const failed = batchResultItems.value.filter((item) => item.status === 'FAILED').length;
- return `成功 ${created + duplicate} · 失败 ${failed}`;
-});
const dueDateOptions = [
- { label: '当天', days: 0 },
{ label: '明天', days: 1 },
- { label: '3天内', days: 3 },
- { label: '7天内', days: 7 }
+ { label: '3天后', days: 3 },
+ { label: '7天后', days: 7 }
];
const formatDate = (date: Date) => {
const year = date.getFullYear();
@@ -395,7 +384,6 @@ const clearPrivateState = () => {
resetDraft();
assignments.value = [];
teamMembers.value = [];
- batchResultItems.value = [];
alerts.value = [];
historyLoading.value = false;
historyRequests.invalidate();
@@ -516,19 +504,21 @@ const assignPractice = async () => {
reason: assignmentReason.value.trim() || undefined,
dueDate: dueDate.value
});
- batchResultItems.value = result.results || [];
+ const resultItems: PracticeAssignmentBatchItemResult[] = result.results || [];
+ const resultDueDate = dueDate.value;
+ const resultScenarioName = scenarioOptions.value.find((item) => item.id === assignmentScenarioId.value)?.name || '专项训练';
clearPendingBatchDraft();
- const completedIds = new Set(batchResultItems.value
- .filter((item) => item.status !== 'FAILED')
- .map((item) => item.extPartyId));
- selectedMemberIds.value = selectedMemberIds.value.filter((id) => !completedIds.has(id));
- if (!result.failed) {
- resetDraft();
- uni.showToast({ title: `已派发${result.created + result.duplicate}人`, icon: 'none' });
- } else {
- message.value = `${result.created + result.duplicate}人派发成功,${result.failed}人失败,请查看明细`;
- }
+ selectedMemberIds.value = [];
await loadAssignments(true);
+ uni.setStorageSync(assignResultStorageKey, {
+ scenarioName: resultScenarioName,
+ dueDate: resultDueDate,
+ createdAt: Date.now(),
+ items: resultItems,
+ progress: { ...progressCounts.value }
+ });
+ resetDraft();
+ uni.redirectTo({ url: '/pages/supervisor/assign/result' });
} catch (error) {
handleRequestError(error, '指派失败');
} finally {
@@ -543,7 +533,6 @@ const createBatchRequestId = () => {
const touchDraft = () => {
clearPendingBatchDraft();
- batchResultItems.value = [];
};
const isMemberSelected = (extPartyId: string) => selectedMemberIds.value.includes(extPartyId);
@@ -601,12 +590,6 @@ const selectDueDate = (event: { detail?: { value?: string } }) => {
touchDraft();
};
-const batchStatusLabel = (status: PracticeAssignmentBatchItemStatus) => {
- if (status === 'CREATED') return '成功';
- if (status === 'DUPLICATE') return '已存在';
- return '失败';
-};
-
const assignmentSourceLabel = (source: string) => {
if (source === 'retry') return '再练';
if (source === 'camp') return '训练营';
@@ -709,15 +692,34 @@ onBeforeUnmount(() => {
line-height: 1.5;
}
-.field-label {
- display: block;
- color: #334155;
- font-size: 13px;
- font-weight: 800;
+.form-panel {
+ margin-top: 16px;
}
-.section-label {
- margin-top: 16px;
+.form-panel + .form-panel {
+ margin-top: 14px;
+}
+
+.panel-title-note {
+ color: var(--employee-muted);
+ font-size: 12px;
+ font-weight: 400;
+}
+
+.reason-counter {
+ color: var(--employee-muted);
+ font-size: 12px;
+}
+
+.sub-label {
+ display: block;
+ margin-top: 12px;
+ color: var(--employee-muted);
+ font-size: 12px;
+}
+
+.sub-label.scenario-sub {
+ margin-top: 14px;
}
.field-heading,
@@ -741,6 +743,7 @@ onBeforeUnmount(() => {
min-height: 32px;
align-items: center;
justify-content: center;
+ margin: 0;
padding: 0 8px;
border: 0;
background: transparent;
@@ -749,37 +752,45 @@ onBeforeUnmount(() => {
line-height: 1.2;
}
+.text-button::after {
+ border: 0;
+}
+
.field-input,
.reason-input,
-.scenario-row,
-.submit-button {
+.scenario-row {
margin-top: 9px;
}
.member-list {
- max-height: 216px;
- margin-top: 10px;
+ max-height: 190px;
+ margin-top: 12px;
+}
+
+.member-chip-wrap {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
}
.member-option {
display: inline-flex;
align-items: center;
- width: calc(50% - 5px);
- min-height: 44px;
- margin: 0 10px 8px 0;
+ min-height: 38px;
+ margin: 0;
padding: 0 12px;
border: 1px solid #dbe4f0;
- border-radius: 10px;
+ border-radius: 19px;
background: #fff;
color: #0f172a;
- font-size: 14px;
+ font-size: 13px;
font-weight: 700;
- line-height: 1.25;
+ line-height: 1;
text-align: left;
}
-.member-option:nth-child(2n) {
- margin-right: 0;
+.member-option::after {
+ border: 0;
}
.member-option.selected {
@@ -792,13 +803,14 @@ onBeforeUnmount(() => {
display: inline-flex;
align-items: center;
justify-content: center;
- width: 18px;
- height: 18px;
- margin-right: 8px;
+ width: 16px;
+ height: 16px;
+ margin-right: 6px;
border: 1px solid #cbd5e1;
- border-radius: 5px;
+ border-radius: 50%;
color: #fff;
- font-size: 12px;
+ font-size: 11px;
+ line-height: 1;
}
.member-option.selected .member-check {
@@ -829,22 +841,29 @@ onBeforeUnmount(() => {
line-height: 1.5;
}
-.due-date-row {
- margin-top: 9px;
-}
-
.due-date-picker {
display: flex;
align-items: center;
+ justify-content: space-between;
min-height: 44px;
+ margin-top: 10px;
padding: 0 12px;
border: 1px solid #dbe4f0;
border-radius: 10px;
background: #fff;
+}
+
+.due-date-text {
color: #0f172a;
font-size: 14px;
}
+.due-date-arrow {
+ color: #c0c4cc;
+ font-size: 18px;
+ line-height: 1;
+}
+
.quick-date-row {
gap: 6px;
margin-top: 8px;
@@ -859,8 +878,10 @@ onBeforeUnmount(() => {
}
.quick-date-chip.active {
- background: var(--employee-primary-soft);
- color: var(--employee-primary);
+ border-color: var(--employee-primary);
+ background: var(--employee-primary);
+ color: #ffffff;
+ font-weight: 800;
}
.scenario-row {
@@ -891,65 +912,15 @@ onBeforeUnmount(() => {
}
.scenario-chip.active {
- background: var(--employee-primary-soft);
- color: var(--employee-primary);
+ border-color: var(--employee-primary);
+ background: var(--employee-primary);
+ color: #ffffff;
+ font-weight: 800;
}
.submit-button {
width: 100%;
-}
-
-.batch-result-panel {
- margin-top: 14px;
-}
-
-.batch-result-list {
- margin-top: 8px;
-}
-
-.batch-result-row {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 12px;
- padding: 11px 0;
- border-bottom: 1px solid #e2e8f0;
-}
-
-.batch-result-row:last-child {
- border-bottom: 0;
-}
-
-.batch-result-name,
-.batch-result-message {
- display: block;
-}
-
-.batch-result-name {
- color: #0f172a;
- font-size: 14px;
- font-weight: 800;
-}
-
-.batch-result-message {
- margin-top: 3px;
- color: #64748b;
- font-size: 12px;
-}
-
-.batch-result-status {
- flex: 0 0 auto;
- color: #64748b;
- font-size: 12px;
- font-weight: 800;
-}
-
-.batch-result-status.created {
- color: #047857;
-}
-
-.batch-result-status.failed {
- color: #dc2626;
+ margin-top: 16px;
}
.assignment-list {
diff --git a/mobile-uni/src/pages/supervisor/assign/result.vue b/mobile-uni/src/pages/supervisor/assign/result.vue
new file mode 100644
index 00000000..3481a9ce
--- /dev/null
+++ b/mobile-uni/src/pages/supervisor/assign/result.vue
@@ -0,0 +1,464 @@
+
+
+
+
+
+
+
+
+
+
+ 已完成派发
+ {{ bannerSummary }}
+
+
+
+
+
+ 本次结果
+ {{ payload.items.length }} 人
+
+
+
+
+ {{ memberInitial(item.traineeName) }}
+
+
+ {{ item.traineeName || '未命名员工' }}
+ {{ resultDesc(item) }}
+
+ {{ badgeLabel(item.status) }}
+ ›
+
+
+
+
+
+
+ 任务进度
+ 团队当前
+
+
+
+ {{ payload.progress.pending }}
+ 待训练
+
+
+ {{ payload.progress.completed }}
+ 已完成
+
+
+ {{ payload.progress.retry }}
+ 低分再练
+
+
+
+
+
+
+ 后续提醒
+
+
+ 截止前1天提醒未完成人员
+
+
+
+ 完成后自动进入待复盘
+
+
+
+
+
+
+
+
+
+
+
+ 暂无本次派发结果,请先在指派页完成派发。
+
+
+
+
+
+
+
+
+
+
diff --git a/mobile-uni/src/pages/supervisor/member/index.vue b/mobile-uni/src/pages/supervisor/member/index.vue
new file mode 100644
index 00000000..668a540e
--- /dev/null
+++ b/mobile-uni/src/pages/supervisor/member/index.vue
@@ -0,0 +1,708 @@
+
+
+
+
+ {{ message }}
+
+
+ 无主管权限
+ 当前账号不是主管或项目经理,无法查看成员训练数据。
+
+
+
+
+
+
+
+
+ 需要登录
+ 登录后查看成员详情。
+
+
+
+
+
+
+
+ {{ memberInitial }}
+
+
+
+ {{ riskBadgeText }}
+ 最近训练 {{ profile?.latestScoreText || '暂无评分' }}
+
+ {{ headReason }}
+
+
+
+
+
+ {{ totalSessions }}
+ 训练次数
+
+
+ {{ profile?.pendingReview ?? 0 }}
+ 待复盘
+
+
+ {{ profile?.pendingAssignment ?? 0 }}
+ 待训练
+
+
+
+
+
+ 训练趋势
+ 最近 {{ trendItems.length }} 次
+
+
+
+ {{ item.scene }}
+
+
+
+ {{ item.score }}
+
+
+ 暂无训练记录
+
+
+
+
+ 成长证据
+
+
+
+ 已完成 {{ totalSessions }} 次训练
+
+
+ {{ lowScoreScene ? `连续低分场景:${lowScoreScene}` : '暂无连续低分场景' }}
+
+
+ {{ mainProblem }}
+
+
+
+
+
+
+ 当前任务
+ {{ pendingTasks.length }} 项待完成
+
+
+
+
+
+
+
+ {{ task.scenarioName }}专项
+ {{ task.dueDate ? `截止 ${task.dueDate}` : '长期有效' }} · {{ task.status }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mobile-uni/src/pages/supervisor/team/index.vue b/mobile-uni/src/pages/supervisor/team/index.vue
index f7b778aa..52204cd8 100644
--- a/mobile-uni/src/pages/supervisor/team/index.vue
+++ b/mobile-uni/src/pages/supervisor/team/index.vue
@@ -35,14 +35,17 @@
{{ riskCounts.high }}
高风险
+
{{ riskCounts.medium }}
待复盘
+
{{ riskCounts.low }}
正常
+
@@ -56,15 +59,14 @@
-
-
- {{ item.scenarioName }}
- {{ item.count }} 次
-
- {{ item.cause }} · {{ item.affectedPeople }} 名成员 · 平均 {{ item.averageScore }} 分
- 最近发生 {{ item.latestTime || '暂无时间' }}
+
+
-
@@ -82,62 +84,26 @@
v-for="member in teamProfiles"
:key="member.key"
class="team-row"
- :class="member.risk"
- @click="selectMember(member)"
+ @click="openMember(member)"
>
-
-
- {{ member.displayName }}
- {{ member.latestScoreText }}
-
- {{ member.reason }}
-
- 待复盘 {{ member.pendingReview }}
- 待训练 {{ member.pendingAssignment }}
- {{ member.latestScene }}
-
+ {{ riskBadge(member.risk) }}
+
+ {{ memberInitial(member.displayName) }}
- 派专项
+
+ {{ member.displayName }}
+ {{ memberStatsLine(member) }}
+
+ 派专项
+ ›
暂无团队画像数据
-
-
-
- {{ selectedMember.displayName }} · 能力详情
- 收起
-
-
-
- {{ selectedMember.latestScoreText }}
- 最近训练评分
-
-
- {{ memberRecords.length }}
- 训练次数
-
-
- {{ selectedMember.pendingReview }}
- 待复盘
-
-
- 训练趋势
-
-
- {{ item.scene }}
-
- {{ item.score }}
-
-
- 暂无训练评分,先派发一次专项训练
- 成长证据
-
- 已完成 {{ memberRecords.filter((item) => item.status === '已完成').length }} 次训练
- 当前 {{ selectedMember.pendingAssignment }} 项专项待训练
- {{ selectedMember.reason }}
-
-
@@ -168,12 +134,10 @@ const loggedIn = ref(false);
const accessDenied = ref(false);
const loading = ref(false);
const message = ref('');
-const selectedMember = ref(null);
const difficultySorts = [
{ key: 'count', label: '出现次数' },
{ key: 'people', label: '涉及人数' },
- { key: 'score', label: '低分优先' },
- { key: 'latest', label: '最近发生' }
+ { key: 'score', label: '低分优先' }
] as const;
type DifficultySort = typeof difficultySorts[number]['key'];
const difficultySort = ref('count');
@@ -189,16 +153,9 @@ const riskCounts = computed(() => teamProfiles.value.reduce(
},
{ high: 0, medium: 0, low: 0 }
));
-const memberRecords = computed(() => {
- if (!selectedMember.value) return [];
- return records.value
- .filter((item) => item.extPartyId === selectedMember.value?.extPartyId)
- .slice(0, 6);
-});
const sortedDifficulties = computed(() => [...mistakes.value].sort((a, b) => {
if (difficultySort.value === 'people') return b.affectedPeople - a.affectedPeople;
if (difficultySort.value === 'score') return a.averageScore - b.averageScore;
- if (difficultySort.value === 'latest') return String(b.latestTime).localeCompare(String(a.latestTime));
return b.count - a.count;
}));
@@ -207,7 +164,6 @@ const clearData = () => {
assignments.value = [];
members.value = [];
mistakes.value = [];
- selectedMember.value = null;
};
const refreshAuthState = () => {
@@ -268,8 +224,19 @@ const assignMember = (member: TeamProfile) => {
uni.navigateTo({ url: `/pages/supervisor/assign/index?${query}` });
};
-const selectMember = (member: TeamProfile) => {
- selectedMember.value = selectedMember.value?.key === member.key ? null : member;
+const riskBadge = (risk: TeamProfile['risk']) => (risk === 'high' ? '高' : risk === 'medium' ? '中' : '低');
+
+const memberInitial = (name: string) => name.trim().charAt(0) || '员';
+
+const memberStatsLine = (member: TeamProfile) =>
+ `最近${member.latestScoreText} · 待复盘${member.pendingReview} · 待训练${member.pendingAssignment}`;
+
+const openMember = (member: TeamProfile) => {
+ const query = [
+ `extPartyId=${encodeURIComponent(member.extPartyId)}`,
+ `name=${encodeURIComponent(member.displayName)}`
+ ].join('&');
+ uni.navigateTo({ url: `/pages/supervisor/member/index?${query}` });
};
const tomorrow = () => {
@@ -375,8 +342,7 @@ onUnload(invalidateRequests);
}
.login-panel,
-.section-head,
-.team-title-row {
+.section-head {
display: flex;
align-items: center;
justify-content: space-between;
@@ -401,28 +367,26 @@ onUnload(invalidateRequests);
}
.risk-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 5px;
padding: 13px 8px;
border-right: 1px solid #dbe7ff;
- text-align: center;
}
.risk-item:last-child {
border-right: 0;
}
-.risk-value,
-.risk-label {
- display: block;
-}
-
.risk-value {
color: #0f172a;
font-size: 23px;
font-weight: 900;
+ line-height: 1.2;
}
.risk-label {
- margin-top: 4px;
color: #64748b;
font-size: 12px;
}
@@ -455,6 +419,7 @@ onUnload(invalidateRequests);
align-items: center;
justify-content: center;
min-height: 34px;
+ margin: 0;
padding: 0 10px;
border: 1px solid #d7e0eb;
background: #ffffff;
@@ -463,6 +428,10 @@ onUnload(invalidateRequests);
line-height: 1;
}
+.difficulty-sort button::after {
+ border: 0;
+}
+
.difficulty-sort button.active {
border-color: #ef9da5;
background: var(--employee-primary-soft);
@@ -477,7 +446,6 @@ onUnload(invalidateRequests);
.mistake-row {
display: flex;
align-items: center;
- justify-content: space-between;
gap: 10px;
padding: 12px 0;
border-bottom: 1px solid #e5edf7;
@@ -487,42 +455,41 @@ onUnload(invalidateRequests);
border-bottom: 0;
}
+.entry-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 38px;
+ height: 38px;
+ flex: 0 0 auto;
+ border-radius: 10px;
+ background: var(--brand);
+}
+
+.entry-icon.soft {
+ background: var(--employee-primary-soft);
+}
+
.mistake-main {
min-width: 0;
flex: 1;
}
-.mistake-title-row {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 8px;
-}
-
.mistake-title,
-.mistake-cause,
-.mistake-time {
+.mistake-cause {
display: block;
-}
-
-.mistake-title {
overflow: hidden;
- color: var(--employee-text);
- font-size: 14px;
- font-weight: 900;
text-overflow: ellipsis;
white-space: nowrap;
}
-.mistake-count {
- flex: 0 0 auto;
- color: #b91c1c;
- font-size: 13px;
+.mistake-title {
+ color: var(--employee-text);
+ font-size: 14px;
font-weight: 900;
}
-.mistake-cause,
-.mistake-time {
+.mistake-cause {
margin-top: 5px;
color: var(--employee-muted);
font-size: 12px;
@@ -530,11 +497,29 @@ onUnload(invalidateRequests);
}
.mistake-action {
- min-width: 64px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
min-height: 34px;
flex: 0 0 auto;
- padding: 0 8px;
+ margin: 0;
+ padding: 0 12px;
+ border: 0;
+ border-radius: 17px;
+ background: var(--brand);
+ color: #ffffff;
font-size: 12px;
+ font-weight: 800;
+ line-height: 1;
+ white-space: nowrap;
+}
+
+.mistake-action::after {
+ border: 0;
+}
+
+.mistake-action:disabled {
+ opacity: 0.6;
}
.team-list {
@@ -544,29 +529,57 @@ onUnload(invalidateRequests);
.team-row {
display: flex;
align-items: center;
- justify-content: space-between;
gap: 10px;
- padding: 14px 0 14px 12px;
- border: 1px solid #e5edf7;
- border-left: 4px solid var(--employee-primary);
- border-radius: 14px;
- background: #ffffff;
+ padding: 13px 0;
+ border-bottom: 1px solid #e5edf7;
}
.team-row:last-child {
border-bottom: 0;
}
-.team-row.high {
- border-left-color: #dc2626;
+.risk-badge {
+ flex: 0 0 auto;
+ min-width: 22px;
+ padding: 3px 6px;
+ border-radius: 8px;
+ font-size: 11px;
+ font-weight: 800;
+ line-height: 1.3;
+ text-align: center;
}
-.team-row.medium {
- border-left-color: #f59e0b;
+.risk-badge.high {
+ background: var(--employee-primary-soft);
+ color: var(--employee-primary);
}
-.team-row.low {
- border-left-color: #d7dde5;
+.risk-badge.medium {
+ background: #fff7ed;
+ color: #d97706;
+}
+
+.risk-badge.low {
+ background: #f0fdf4;
+ color: #16a34a;
+}
+
+.member-avatar {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ flex: 0 0 auto;
+ overflow: hidden;
+ border-radius: 50%;
+ background: var(--employee-primary-soft);
+}
+
+.member-avatar-text {
+ color: var(--employee-primary);
+ font-size: 16px;
+ font-weight: 900;
}
.team-main {
@@ -575,7 +588,7 @@ onUnload(invalidateRequests);
}
.team-name {
- min-width: 0;
+ display: block;
overflow: hidden;
color: #0f172a;
font-size: 15px;
@@ -584,148 +597,44 @@ onUnload(invalidateRequests);
white-space: nowrap;
}
-.team-score {
- flex: 0 0 auto;
- color: #1d4ed8;
- font-size: 14px;
- font-weight: 900;
-}
-
.team-desc {
display: block;
- margin-top: 6px;
+ margin-top: 5px;
+ overflow: hidden;
color: #475569;
font-size: 12px;
line-height: 1.45;
-}
-
-.team-tags {
- display: flex;
- flex-wrap: wrap;
- gap: 6px;
- margin-top: 8px;
-}
-
-.team-tag {
- padding: 4px 7px;
- border-radius: 8px;
- background: var(--employee-primary-soft);
- color: var(--employee-primary);
- font-size: 12px;
- font-weight: 800;
-}
-
-.team-action {
- min-width: 72px;
- min-height: 38px;
- flex: 0 0 auto;
- padding: 0 10px;
- font-size: 12px;
-}
-
-.member-detail-panel {
- margin-top: 14px;
-}
-
-.text-button {
- min-height: 32px;
- padding: 0;
- background: transparent;
- color: var(--employee-primary);
- font-size: 13px;
- font-weight: 800;
-}
-
-.member-summary {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 8px;
- margin-top: 14px;
- padding: 12px 8px;
- border-radius: 14px;
- background: var(--employee-primary-soft);
- text-align: center;
-}
-
-.member-score,
-.member-summary-label,
-.trend-scene,
-.trend-score,
-.subsection-title,
-.evidence-list text {
- display: block;
-}
-
-.member-score {
- color: var(--employee-primary);
- font-size: 20px;
- font-weight: 900;
-}
-
-.member-summary-label {
- margin-top: 4px;
- color: var(--employee-muted);
- font-size: 12px;
-}
-
-.subsection-title {
- margin-top: 16px;
- color: var(--employee-text);
- font-size: 14px;
- font-weight: 900;
-}
-
-.trend-list {
- margin-top: 8px;
-}
-
-.trend-row {
- display: grid;
- grid-template-columns: 92px 1fr 30px;
- align-items: center;
- gap: 8px;
- margin-top: 8px;
-}
-
-.trend-scene,
-.trend-score {
- overflow: hidden;
- color: var(--employee-muted);
- font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
-.trend-score {
- color: var(--employee-primary);
- font-weight: 900;
- text-align: right;
-}
-
-.trend-track {
- height: 8px;
- overflow: hidden;
- border-radius: 999px;
- background: #e7eefc;
-}
-
-.trend-fill {
- height: 100%;
- border-radius: inherit;
- background: linear-gradient(90deg, #6f9cff, #2f6bff);
-}
-
-.evidence-list {
+.team-action {
display: flex;
- flex-direction: column;
- gap: 6px;
- margin-top: 8px;
+ align-items: center;
+ justify-content: center;
+ min-height: 34px;
+ flex: 0 0 auto;
+ margin: 0;
+ padding: 0 14px;
+ border: 0;
+ border-radius: 17px;
+ background: var(--brand);
+ color: #ffffff;
+ font-size: 12px;
+ font-weight: 800;
+ line-height: 1;
+ white-space: nowrap;
}
-.evidence-list text,
-.detail-empty {
- color: var(--employee-muted);
- font-size: 12px;
- line-height: 1.5;
+.team-action::after {
+ border: 0;
+}
+
+.team-arrow {
+ flex: 0 0 auto;
+ padding: 0 4px;
+ color: #c0c4cc;
+ font-size: 20px;
+ line-height: 1;
}