eli-video-interview 1.6.5 → 1.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/esm/components/Charts/ReportPie.js +5 -5
  2. package/esm/modules/ai-report/components/ScoreReport/styled.d.ts +1 -1
  3. package/esm/modules/ai-report-v2/components/ScoreReport/styled.d.ts +1 -1
  4. package/esm/modules/ai-report-v3/Root.js +3 -3
  5. package/esm/modules/ai-report-v3/components/AIEvaluate/Evaluate.js +67 -12
  6. package/esm/modules/ai-report-v3/components/AIEvaluate/Graph.d.ts +1 -1
  7. package/esm/modules/ai-report-v3/components/AIEvaluate/Graph.js +198 -66
  8. package/esm/modules/ai-report-v3/components/AIEvaluate/index.js +2 -2
  9. package/esm/modules/ai-report-v3/components/CheatRisk/CheatRisk.js +77 -26
  10. package/esm/modules/ai-report-v3/components/Form/Form.js +1 -1
  11. package/esm/modules/ai-report-v3/components/ModuleTitle.d.ts +3 -1
  12. package/esm/modules/ai-report-v3/components/ModuleTitle.js +19 -8
  13. package/esm/modules/ai-report-v3/components/ScoreReport/styled.d.ts +1 -1
  14. package/esm/modules/ai-report-v3/components/SectionTabs/SectionTabs.js +1 -1
  15. package/esm/modules/ai-report-v3/components/V3Header/V3Header.d.ts +2 -1
  16. package/esm/modules/ai-report-v3/components/V3Header/V3Header.js +18 -49
  17. package/esm/modules/ai-report-v3/components/VideoQuestion/QuestionItem.js +50 -18
  18. package/esm/modules/ai-report-v3/components/VideoQuestion/index.js +4 -3
  19. package/esm/modules/ai-report-v3/interface.d.ts +4 -0
  20. package/esm/modules/ai-report-v3/useAiReport.d.ts +1 -0
  21. package/esm/modules/ai-template/components/TemplateList/styled.d.ts +1 -1
  22. package/esm/utils/interceptor.js +35 -0
  23. package/lib/components/Charts/ReportPie.js +5 -5
  24. package/lib/modules/ai-report/components/ScoreReport/styled.d.ts +1 -1
  25. package/lib/modules/ai-report-v2/components/ScoreReport/styled.d.ts +1 -1
  26. package/lib/modules/ai-report-v3/Root.js +3 -3
  27. package/lib/modules/ai-report-v3/components/AIEvaluate/Evaluate.js +65 -10
  28. package/lib/modules/ai-report-v3/components/AIEvaluate/Graph.d.ts +1 -1
  29. package/lib/modules/ai-report-v3/components/AIEvaluate/Graph.js +198 -66
  30. package/lib/modules/ai-report-v3/components/AIEvaluate/index.js +1 -1
  31. package/lib/modules/ai-report-v3/components/CheatRisk/CheatRisk.js +76 -25
  32. package/lib/modules/ai-report-v3/components/Form/Form.js +1 -1
  33. package/lib/modules/ai-report-v3/components/ModuleTitle.d.ts +3 -1
  34. package/lib/modules/ai-report-v3/components/ModuleTitle.js +19 -8
  35. package/lib/modules/ai-report-v3/components/ScoreReport/styled.d.ts +1 -1
  36. package/lib/modules/ai-report-v3/components/SectionTabs/SectionTabs.js +1 -1
  37. package/lib/modules/ai-report-v3/components/V3Header/V3Header.d.ts +2 -1
  38. package/lib/modules/ai-report-v3/components/V3Header/V3Header.js +18 -49
  39. package/lib/modules/ai-report-v3/components/VideoQuestion/QuestionItem.js +50 -18
  40. package/lib/modules/ai-report-v3/components/VideoQuestion/index.js +4 -3
  41. package/lib/modules/ai-report-v3/interface.d.ts +4 -0
  42. package/lib/modules/ai-report-v3/useAiReport.d.ts +1 -0
  43. package/lib/modules/ai-template/components/TemplateList/styled.d.ts +1 -1
  44. package/lib/utils/interceptor.js +35 -0
  45. package/package.json +1 -1
@@ -1,3 +1,14 @@
1
+ var __values = (this && this.__values) || function(o) {
2
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
3
+ if (m) return m.call(o);
4
+ if (o && typeof o.length === "number") return {
5
+ next: function () {
6
+ if (o && i >= o.length) o = void 0;
7
+ return { value: o && o[i++], done: !o };
8
+ }
9
+ };
10
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
11
+ };
1
12
  var __read = (this && this.__read) || function (o, n) {
2
13
  var m = typeof Symbol === "function" && o[Symbol.iterator];
3
14
  if (!m) return o;
@@ -30,46 +41,75 @@ function setupCanvas(canvas) {
30
41
  // Good: Array<number>;
31
42
  // Best: Array<number>;
32
43
  // }
33
- var MAX_WIDTH = 315;
34
- var MAX_HEIGHT = 24;
44
+ var MAX_WIDTH = 354;
45
+ var MAX_HEIGHT = 18;
46
+ // 底部"更多考核维度"提示胶囊(设计稿「容器 14851」,画进 canvas 而非 HTML)
47
+ var CAPTION_TEXT = '更多考核维度请展开上方综合评价查看详情';
48
+ var CAPTION_HEIGHT = 20;
49
+ // 粗略估算文本像素宽(与下方绘制所用 sans-serif 接近;中文宽、拉丁/数字窄)
50
+ var estimateTextWidth = function (s, cjkW, latinW) {
51
+ var e_1, _a;
52
+ if (cjkW === void 0) { cjkW = 14; }
53
+ if (latinW === void 0) { latinW = 7.5; }
54
+ var w = 0;
55
+ try {
56
+ for (var s_1 = __values(s), s_1_1 = s_1.next(); !s_1_1.done; s_1_1 = s_1.next()) {
57
+ var ch = s_1_1.value;
58
+ w += /[ -鿿＀-￯]/.test(ch) ? cjkW : latinW;
59
+ }
60
+ }
61
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
62
+ finally {
63
+ try {
64
+ if (s_1_1 && !s_1_1.done && (_a = s_1.return)) _a.call(s_1);
65
+ }
66
+ finally { if (e_1) throw e_1.error; }
67
+ }
68
+ return w;
69
+ };
35
70
  var levelOrder = ['Bad', 'Good', 'Best'];
36
- var levelOrderScore = [0, 60, 80, 100];
71
+ // 表头三段宽度(设计稿 176:89:89,铺满轨道 MAX_WIDTH)
72
+ var LEVEL_WIDTHS = {
73
+ Bad: (MAX_WIDTH * (176 / 354)) | 0,
74
+ Good: (MAX_WIDTH * (89 / 354)) | 0,
75
+ Best: MAX_WIDTH - ((MAX_WIDTH * (176 / 354)) | 0) - ((MAX_WIDTH * (89 / 354)) | 0),
76
+ };
37
77
  var levelConf = {
38
78
  Bad: {
39
79
  label: '欠佳',
40
- width: (MAX_WIDTH * 0.6) | 0,
41
- fontColor: '#0D67FF',
42
- color: [229, 115, 115],
80
+ fontColor: '#FFFFFF',
81
+ color: [98, 156, 255],
43
82
  gradient: ['#629CFF', 'rgba(75,141,255,0.08)'],
44
83
  scoreGradient: ['#4B87F0', '#D2E2FF'],
45
84
  backgroundColor: 'rgba(98,156,255,0.15)',
46
- shadowColor: 'rgba(98, 156, 255, 0.40)',
85
+ shadowColor: 'rgba(98,156,255,0.4)',
86
+ textColor: '#2E6ED8',
47
87
  endScore: 60,
48
- pointColor: ['RGB(229, 115, 115)', 'RGB(255, 67, 102)'],
88
+ pointColor: ['RGB(98, 156, 255)', 'RGB(98, 156, 255)'],
49
89
  },
50
90
  Good: {
51
91
  label: '适中',
52
- width: (MAX_WIDTH * 0.2) | 0,
53
- fontColor: '#00A276',
54
- color: [255, 183, 77],
92
+ fontColor: '#ffffff',
93
+ color: [0, 217, 157],
55
94
  gradient: ['#00D99D', '#CBFFF1'],
56
95
  scoreGradient: ['#0ACB96', '#65FFD4'],
57
96
  backgroundColor: 'rgba(0,217,157,0.15)',
58
- shadowColor: 'rgba(0, 217, 157, 0.40)',
97
+ shadowColor: 'rgba(0,217,157,0.4)',
98
+ textColor: '#0A9E71',
59
99
  endScore: 80,
60
- pointColor: ['RGB(255, 183, 77)', 'RGB(255, 152, 0)'],
100
+ pointColor: ['RGB(0, 217, 157)', 'RGB(0, 217, 157)'],
61
101
  },
62
102
  Best: {
63
103
  label: '优秀',
64
- width: (MAX_WIDTH * 0.2) | 0,
65
- fontColor: '#DF8500',
66
- color: [0, 217, 157],
104
+ fontColor: '#ffffff',
105
+ color: [255, 153, 3],
67
106
  gradient: ['#FF9903', 'rgba(255,218,165,0.29)'],
68
107
  scoreGradient: ['#FF9903', '#FFDF9D'],
69
- shadowColor: 'rgba(255, 153, 3, 0.40)',
70
108
  backgroundColor: 'rgba(255,183,77,0.15)',
109
+ shadowColor: 'rgba(255,153,3,0.4)',
110
+ textColor: '#E07E00',
71
111
  endScore: 100,
72
- pointColor: ['RGB(0, 217, 157)', 'RGB(0, 176, 127)'],
112
+ pointColor: ['RGB(255, 153, 3)', 'RGB(255, 153, 3)'],
73
113
  },
74
114
  };
75
115
  var tipEl = document.createElement('div');
@@ -87,34 +127,28 @@ function isInPath(x, y, rect, ctx) {
87
127
  }
88
128
  var drawTop = function (layout, ctx) {
89
129
  // 设置全局样式
90
- var leftLableWidth = layout.leftLableWidth, height = layout.height;
130
+ var leftLableWidth = layout.leftLableWidth, shiftY = layout.shiftY, dashEndY = layout.dashEndY;
131
+ ctx.font = '14px sans-serif';
91
132
  var offset = leftLableWidth;
92
- var lineEndY = height - 40; // 虚线结束位置,距离底部40px
93
- var scoreTextY = height - 25; // 分数文字的Y位置,距离底部25px
94
- levelOrder.forEach(function (level, i) {
95
- var _a = levelConf[level], width = _a.width, gradient = _a.gradient, label = _a.label, fontColor = _a.fontColor;
96
- // 绘制渐变背景
97
- var gradientFill = ctx.createLinearGradient(0, 0, 0, 25);
133
+ levelOrder.forEach(function (level) {
134
+ var width = LEVEL_WIDTHS[level];
135
+ var _a = levelConf[level], gradient = _a.gradient, label = _a.label, fontColor = _a.fontColor;
136
+ // 绘制渐变背景(设计稿 180deg:上=主色,下=淡色过渡)
137
+ var gradientFill = ctx.createLinearGradient(0, shiftY, 0, shiftY + 25);
98
138
  gradientFill.addColorStop(0, gradient[0]);
99
139
  gradientFill.addColorStop(1, gradient[1]);
100
140
  ctx.fillStyle = gradientFill;
101
- ctx.fillRect(offset, 0, width, 25);
102
- // 绘制标签文本
141
+ ctx.fillRect(offset, shiftY, width, 25);
142
+ // 绘制标签文本(置于色带中上,避开底部透明渐变区)
103
143
  var labelWidth = measureTextWidth(ctx, label);
104
144
  ctx.fillStyle = fontColor;
105
- ctx.fillText(label, offset + width / 2 - labelWidth / 2, 18);
106
- // 绘制垂直虚线
107
- drawVerticalDashedLine(ctx, offset - 1, 0, lineEndY, 2, 2);
108
- // 绘制分数文本
109
- ctx.fillStyle = '#4CAF50';
110
- ctx.fillText("".concat(levelOrderScore[i]), offset - (i === 0 ? 5 : 9), scoreTextY);
111
- offset += width + 1;
112
- // 绘制结束的虚线和文本 '100'
113
- if (i === levelOrder.length - 1) {
114
- drawVerticalDashedLine(ctx, offset - 2, 0, lineEndY, 2, 2);
115
- ctx.fillText('100', offset - 2 - 24, scoreTextY);
116
- }
145
+ ctx.fillText(label, offset + width / 2 - labelWidth / 2, shiftY + 16);
146
+ // 绘制垂直虚线(色带分隔 → 末条底部下方 dashEndY)
147
+ drawVerticalDashedLine(ctx, offset - 1, shiftY + 25, dashEndY, 2, 2);
148
+ offset += width;
117
149
  });
150
+ // 右端收口虚线
151
+ drawVerticalDashedLine(ctx, offset - 1, shiftY + 25, dashEndY, 2, 2);
118
152
  };
119
153
  var truncateString = function (str) { return (str.length > 7 ? "".concat(str.slice(0, 6), "...") : str); };
120
154
  var drawLable = function (lable, x, y, ctx) {
@@ -125,7 +159,7 @@ function drawVerticalDashedLine(ctx, x, startY, endY, dashLength, gapLength) {
125
159
  if (dashLength === void 0) { dashLength = 2; }
126
160
  if (gapLength === void 0) { gapLength = 1; }
127
161
  ctx.lineWidth = 1;
128
- ctx.strokeStyle = 'rgba(76, 175, 80, 0.30)';
162
+ ctx.strokeStyle = 'rgba(153, 153, 153, 0.35)';
129
163
  ctx.beginPath();
130
164
  ctx.setLineDash([dashLength, gapLength]);
131
165
  ctx.moveTo(x, startY);
@@ -161,35 +195,43 @@ export function getLevel(score) {
161
195
  }
162
196
  }
163
197
  var drawScore = function (layout, ctx, config, rect, score) {
164
- var gradient = ctx.createLinearGradient(layout.leftLableWidth + rect.width, 30, layout.leftLableWidth, 30);
198
+ var text = "".concat(score);
199
+ ctx.save();
200
+ // 渐变数据条(设计稿 90deg:左=强色 0% → 右=淡色 100%),圆角胶囊
201
+ var gradient = ctx.createLinearGradient(rect.x, 0, rect.x + rect.width, 0);
165
202
  gradient.addColorStop(0, config.scoreGradient[0]);
166
203
  gradient.addColorStop(1, config.scoreGradient[1]);
167
204
  ctx.fillStyle = gradient;
168
- // // 设置阴影
169
205
  ctx.shadowOffsetX = 0;
170
206
  ctx.shadowOffsetY = 4;
171
207
  ctx.shadowBlur = 6;
172
- // ctx.shadowColor = config.shadowColor;
173
- // 绘制圆角矩形
174
- var borderRadius = 12;
175
- drawRoundedRect(rect.x, rect.y, rect.width, rect.height, borderRadius, true, false, ctx);
176
- ctx.fillStyle = score < 10 ? '#0D67FF' : '#fff';
177
- var scoreWidth = measureTextWidth(ctx, "".concat(score));
178
- ctx.fillText("".concat(score), layout.leftLableWidth + rect.width + (score < 10 ? 4 : -scoreWidth - 4), rect.y + 18);
208
+ ctx.shadowColor = config.shadowColor;
209
+ var barRadius = rect.height / 2;
210
+ drawRoundedRect(rect.x, rect.y, rect.width, rect.height, barRadius, true, false, ctx);
211
+ ctx.restore();
212
+ // 分数数字直接放在条末端右侧(无圆形背景,颜色取该档主色加深保证可读)
213
+ ctx.save();
214
+ ctx.font = 'bold 13px sans-serif';
215
+ var textW = measureTextWidth(ctx, text);
216
+ ctx.fillStyle = config.textColor || '#333';
217
+ ctx.textAlign = 'left';
218
+ ctx.textBaseline = 'middle';
219
+ ctx.fillText(text, rect.x + rect.width + 6, rect.y + rect.height / 2 + 1);
220
+ ctx.restore();
221
+ return textW;
179
222
  };
180
223
  var draw = function (layout, dimensions, pathRef, ctx) {
181
224
  ctx.font = '14px sans-serif';
182
225
  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
226
+ var shiftY = layout.shiftY;
183
227
  dimensions.forEach(function (v, i) {
184
228
  var config = getLevel(v.score);
185
- // 绘制圆角矩形
186
- var borderRadius = 12;
187
229
  var x = layout.leftLableWidth;
188
- var y = 50 + layout.itemSpacing * i;
189
- // 设置背景颜色
230
+ var y = shiftY + 46 + layout.itemSpacing * i;
231
+ // 轨道胶囊背景(设计稿「条状图*条背景」:本档淡色 + 全圆角)
190
232
  ctx.fillStyle = config.backgroundColor;
191
- drawRoundedRect(x, y, MAX_WIDTH, MAX_HEIGHT, borderRadius, true, false, ctx);
192
- var endPointY = 50 + 15 + layout.itemSpacing * i; // 50是顶部偏移,15是文字相对矩形的偏移
233
+ drawRoundedRect(x, y, MAX_WIDTH, MAX_HEIGHT, MAX_HEIGHT / 2, true, false, ctx);
234
+ var endPointY = shiftY + 46 + 14 + layout.itemSpacing * i; // TOP_OFFSET是顶部偏移,14是文字相对矩形的偏移
193
235
  drawLable(v.name, 0, endPointY, ctx);
194
236
  pathRef.push({ x: 0, y: y, width: layout.leftLableWidth, height: 22, tips: "".concat(v.name, ": ").concat(v.score) });
195
237
  var score = v.score === 0 ? 0 : Math.max(v.score, 4);
@@ -202,21 +244,91 @@ var draw = function (layout, dimensions, pathRef, ctx) {
202
244
  });
203
245
  drawTop(layout, ctx);
204
246
  };
247
+ // 底部提示胶囊:浅绿圆角胶囊(#EBFCF7, 淡青描边) + 居中青色(#0087B4)文字(y 为胶囊顶)
248
+ var drawCaption = function (ctx, canvasWidth, y) {
249
+ var width = Math.min(440, canvasWidth - 24);
250
+ var height = CAPTION_HEIGHT;
251
+ var x = (canvasWidth - width) / 2;
252
+ ctx.save();
253
+ ctx.fillStyle = '#EBFCF7';
254
+ ctx.strokeStyle = 'rgba(0,135,180,0.1)';
255
+ ctx.lineWidth = 1;
256
+ drawRoundedRect(x, y, width, height, height / 2, true, true, ctx);
257
+ ctx.font = '12px sans-serif';
258
+ ctx.textAlign = 'center';
259
+ ctx.textBaseline = 'middle';
260
+ ctx.fillStyle = '#0087B4';
261
+ ctx.fillText(CAPTION_TEXT, canvasWidth / 2, y + height / 2);
262
+ ctx.restore();
263
+ };
264
+ // 刻度值:欠佳|适中 分界=60、适中|优秀 分界=80、优秀满格(右端线)=100
265
+ var drawScaleTicks = function (ctx, opts) {
266
+ var y = opts.y, x60 = opts.x60, x80 = opts.x80, xRight = opts.xRight;
267
+ ctx.save();
268
+ ctx.font = '11px sans-serif';
269
+ ctx.textBaseline = 'middle';
270
+ ctx.fillStyle = 'rgba(102,102,102,0.78)';
271
+ ctx.textAlign = 'center';
272
+ ctx.fillText('60', x60, y);
273
+ ctx.fillText('80', x80, y);
274
+ ctx.textAlign = 'right';
275
+ ctx.fillText('100', xRight - 3, y); // 右端线:右对齐向内收,避免出画布
276
+ ctx.restore();
277
+ };
205
278
  var Graph = function (_a) {
206
279
  var _b = _a.items, items = _b === void 0 ? [] : _b;
207
280
  var ref = useRef(null);
208
281
  var pathRef = useRef([]);
209
282
  var _c = __read(useState(), 2), ctx = _c[0], setCtx = _c[1];
210
- // 统一间距配置
211
- var ITEM_SPACING = 40;
212
- var TOP_OFFSET = 50;
213
- var BOTTOM_SPACING = 20; // 最后一个item与虚线之间的间距
214
- var SCORE_AREA_HEIGHT = 40; // 分数区域的高度
215
- var height = useMemo(function () {
283
+ // ---- 垂直布局常量(条图 → 刻度 → 胶囊 的紧凑垂直流)----
284
+ var ITEM_SPACING = 28; // 相邻条间距
285
+ var TOP_OFFSET = 46; // 条顶相对内容顶 shiftY 的偏移
286
+ var CANVAS_HEIGHT = 300; // 与右侧饼图等高(内容不足时保持,超出按流增高)
287
+ var DASH_TAIL = 8; // 刻度虚线超出最后一条条底的长度
288
+ var TICK_LINE = 14; // 刻度数值行高
289
+ var GAP_CAPTION = 8; // 刻度数 → 提示胶囊间距
290
+ var CAPTION_PAD_BOTTOM = 12; // 胶囊下方留白
291
+ // 条形区域高度(shiftY 内容顶 → 最后一条条底)
292
+ var contentHeight = useMemo(function () {
293
+ if (items.length === 0)
294
+ return 0;
295
+ return TOP_OFFSET + (items.length - 1) * ITEM_SPACING + MAX_HEIGHT;
296
+ }, [items]);
297
+ // 可见内容块高度(条图 → 刻度 → 胶囊),不含外留白
298
+ var bodyHeight = contentHeight + DASH_TAIL + TICK_LINE + GAP_CAPTION + CAPTION_HEIGHT;
299
+ // 画布高:≥300,且内容上下各保留 ≥CAPTION_PAD_BOTTOM 的对称留白
300
+ var canvasHeight = useMemo(function () { return Math.max(CANVAS_HEIGHT, bodyHeight + 2 * CAPTION_PAD_BOTTOM); }, [bodyHeight]);
301
+ // 内容块在画布内垂直居中 → 上留白 = 下留白
302
+ var shiftY = useMemo(function () {
303
+ if (bodyHeight <= 0)
304
+ return 0;
305
+ return Math.max(0, Math.round((canvasHeight - bodyHeight) / 2));
306
+ }, [bodyHeight, canvasHeight]);
307
+ var dashEndY = shiftY + contentHeight + DASH_TAIL; // 虚线终点 = 末条条底 + DASH_TAIL
308
+ var tickMidY = shiftY + contentHeight + DASH_TAIL + Math.round(TICK_LINE / 2);
309
+ var captionY = shiftY + contentHeight + DASH_TAIL + TICK_LINE + GAP_CAPTION; // 胶囊顶
310
+ // 左标签列宽度贴合最长维度名,压缩文字与条形之间留白
311
+ var leftLabelWidth = useMemo(function () {
216
312
  if (items.length === 0)
217
313
  return 0;
218
- return TOP_OFFSET + (items.length - 1) * ITEM_SPACING + MAX_HEIGHT + BOTTOM_SPACING + SCORE_AREA_HEIGHT;
314
+ var mx = 0;
315
+ items.forEach(function (it) { return (mx = Math.max(mx, estimateTextWidth(truncateString(it.name)))); });
316
+ return Math.min(Math.round(mx) + 18, 210);
219
317
  }, [items]);
318
+ // 右边界:默认=色带/轨道右端(leftLabelWidth+MAX_WIDTH)。仅当某条高分条形末端的分数字(条尾+6px+数字宽)超出轨道时顺延,避免满格数字被裁。
319
+ var rightmostX = useMemo(function () {
320
+ var end = leftLabelWidth + MAX_WIDTH;
321
+ items.forEach(function (it) {
322
+ var s = it.score || 0;
323
+ var barWidth = s === 0 ? 0 : (MAX_WIDTH * Math.min(Math.max(s, 4), 100)) / 100;
324
+ var numEnd = leftLabelWidth + barWidth + 6 + estimateTextWidth("".concat(s));
325
+ if (numEnd > end)
326
+ end = numEnd;
327
+ });
328
+ return end;
329
+ }, [items, leftLabelWidth]);
330
+ // 画布宽紧贴内容,只留 6px 尾余(替代原固定 +48px 右留白)
331
+ var canvasWidth = Math.round(rightmostX + 6);
220
332
  useEffect(function () {
221
333
  if (items.length === 0)
222
334
  return;
@@ -241,15 +353,35 @@ var Graph = function (_a) {
241
353
  useEffect(function () {
242
354
  if (ctx) {
243
355
  var layout = {
244
- leftLableWidth: 140,
356
+ leftLableWidth: leftLabelWidth,
245
357
  topLableHeight: 40,
246
358
  itemSpacing: ITEM_SPACING,
247
- height: height,
359
+ height: contentHeight,
360
+ shiftY: shiftY,
361
+ dashEndY: dashEndY,
248
362
  };
249
363
  pathRef.current = [];
250
364
  draw(layout, items, pathRef.current, ctx);
365
+ drawScaleTicks(ctx, {
366
+ y: tickMidY,
367
+ x60: leftLabelWidth + LEVEL_WIDTHS.Bad,
368
+ x80: leftLabelWidth + LEVEL_WIDTHS.Bad + LEVEL_WIDTHS.Good,
369
+ xRight: leftLabelWidth + MAX_WIDTH,
370
+ });
371
+ drawCaption(ctx, canvasWidth, captionY);
251
372
  }
252
- }, [ctx, items, height, ITEM_SPACING]);
373
+ }, [
374
+ ctx,
375
+ items,
376
+ contentHeight,
377
+ shiftY,
378
+ leftLabelWidth,
379
+ canvasWidth,
380
+ ITEM_SPACING,
381
+ dashEndY,
382
+ tickMidY,
383
+ captionY,
384
+ ]);
253
385
  var handleMouseMove = useCallback(function (e) {
254
386
  if (ctx) {
255
387
  var p = pathRef.current.find(function (p) { return isInPath(e.nativeEvent.offsetX, e.nativeEvent.offsetY, p, ctx); });
@@ -264,6 +396,6 @@ var Graph = function (_a) {
264
396
  }
265
397
  }
266
398
  }, [ctx, pathRef]);
267
- return _jsx("canvas", { ref: ref, onMouseOut: function () { return (tipEl.style.display = 'none'); }, onMouseMove: handleMouseMove, style: { width: 460, height: height } });
399
+ return (_jsx("canvas", { ref: ref, onMouseOut: function () { return (tipEl.style.display = 'none'); }, onMouseMove: handleMouseMove, style: { width: canvasWidth, height: canvasHeight } }));
268
400
  };
269
401
  export default memo(Graph);
@@ -9,7 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
13
  import Report from '../ScoreReport/Report';
14
14
  import Evaluate from './Evaluate';
15
15
  import Graph from './Graph';
@@ -27,6 +27,6 @@ var Index = function () {
27
27
  }, [collection]);
28
28
  if (!showAiDimension)
29
29
  return null;
30
- return (_jsx(Box, __assign({ id: "report-evaluate", sx: { px: 2, mt: 3 } }, { children: _jsx(Box, __assign({ component: Paper, elevation: 0, bgcolor: "transparent", mb: 3 }, { children: _jsxs(Stack, { children: [workplaceEvaluation && (_jsx(Evaluate, { orderToken: orderToken, canEdit: canEditAiDimension, evaluation: workplaceEvaluation, title: "\u7EFC\u5408\u8BC4\u4EF7", mode: "show" })), collection.length > 0 && (_jsxs(Stack, __assign({ direction: "row", alignItems: "center", justifyContent: "space-between" }, { children: [_jsx(Box, __assign({ mt: 2, flex: 1 }, { children: _jsx(Graph, { items: items }) })), _jsx(Report, {})] })))] }) })) })));
30
+ return (_jsx(Box, __assign({ id: "report-evaluate", sx: { px: 2, mt: 1.5 } }, { children: _jsx(Box, __assign({ component: Paper, elevation: 0, bgcolor: "transparent", mb: 3 }, { children: _jsxs(Stack, { children: [workplaceEvaluation && (_jsx(Evaluate, { orderToken: orderToken, canEdit: canEditAiDimension, evaluation: workplaceEvaluation, title: "\u7EFC\u5408\u8BC4\u4EF7", mode: "show" })), collection.length > 0 && (_jsx(_Fragment, { children: _jsxs(Stack, __assign({ direction: "row", alignItems: "center", justifyContent: "space-between" }, { children: [_jsx(Box, __assign({ flex: 1, minWidth: 0, sx: { display: 'flex', alignItems: 'center', justifyContent: 'center' } }, { children: _jsx(Box, __assign({ sx: { display: 'inline-flex', flexDirection: 'column', alignItems: 'center' } }, { children: _jsx(Graph, { items: items }) })) })), _jsx(Report, {})] })) }))] }) })) })));
31
31
  };
32
32
  export default memo(Index);
@@ -9,34 +9,85 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- var __read = (this && this.__read) || function (o, n) {
13
- var m = typeof Symbol === "function" && o[Symbol.iterator];
14
- if (!m) return o;
15
- var i = m.call(o), r, ar = [], e;
16
- try {
17
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
18
- }
19
- catch (error) { e = { error: error }; }
20
- finally {
21
- try {
22
- if (r && !r.done && (m = i["return"])) m.call(i);
23
- }
24
- finally { if (e) throw e.error; }
25
- }
26
- return ar;
27
- };
28
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
29
13
  import { Box, Stack } from 'fbm-ui/lib/mui';
30
14
  import { Typography } from 'fbm-ui';
31
- import { useState } from 'react';
32
- // 作弊风险模块:产品逻辑未确认前仅保留样式与收起交互,不渲染任何未确认数据。
15
+ import { useAiReportStore } from "../../../../store/ai-report/global-store";
16
+ // 报告头部与"作弊风险"章节共用的风险标签名(命中其一即视为存在面试过程风险)
17
+ var RISK_TAG_NAMES = ['疑似读稿', '疑似作弊', '面试切屏'];
18
+ // 作弊检测详情表(仅命中风险时展示;"有风险"文案取自蓝湖,未命中的行第三列统一"暂无风险")
19
+ var CHEAT_ROWS = [
20
+ {
21
+ name: '疑似读稿',
22
+ detail: '根据候选人面试回答过程的眼神表现,以及回答内容,候选人有读背稿的嫌疑,也有可能候选人的眼神变化只是在思考。',
23
+ },
24
+ {
25
+ name: '面试切屏',
26
+ detail: '候选人面试答题过程中有切屏的动作,可能是去查阅资料,也有可能是系统其他应用弹窗导致。',
27
+ },
28
+ {
29
+ name: '疑似作弊',
30
+ detail: '面试过程眼神、回答内容、面试行为综合诊断,候选人可能有作弊的嫌疑。',
31
+ },
32
+ ];
33
+ // 单个风险标签胶囊(橙色警示样式,紧凑小号)
34
+ var RiskPill = function (_a) {
35
+ var name = _a.name;
36
+ return (_jsxs(Box, __assign({ sx: {
37
+ display: 'inline-flex',
38
+ alignItems: 'center',
39
+ gap: 0.5,
40
+ bgcolor: '#FFF7E6',
41
+ color: '#FA8C16',
42
+ border: '1px solid #FFD591',
43
+ borderRadius: '999px',
44
+ height: 20,
45
+ px: '8px',
46
+ fontSize: 12,
47
+ lineHeight: 1,
48
+ whiteSpace: 'nowrap',
49
+ } }, { children: [_jsxs("svg", __assign({ width: "12", height: "12", viewBox: "0 0 24 24", fill: "none" }, { children: [_jsx("path", { d: "M12 3 1.5 21h21L12 3Z", fill: "#FA8C16" }), _jsx("rect", { x: "11", y: "9", width: "2", height: "5", rx: "1", fill: "#fff" }), _jsx("rect", { x: "11", y: "15.5", width: "2", height: "2", rx: "1", fill: "#fff" })] })), name] })));
50
+ };
51
+ // 表格里的风险评估徽标
52
+ var RiskBadge = function (_a) {
53
+ var has = _a.has;
54
+ return (_jsx(Box, __assign({ sx: __assign({ display: 'inline-flex', alignItems: 'center', px: 1, py: 0.25, borderRadius: '999px', fontSize: 12, fontWeight: 500, whiteSpace: 'nowrap' }, (has
55
+ ? { color: '#FA8C16', bgcolor: '#FFF7E6', border: '1px solid #FFD591' }
56
+ : { color: '#52C41A', bgcolor: '#EAFBEA', border: '1px solid #B7EB8F' })) }, { children: has ? '有风险' : '无风险' })));
57
+ };
58
+ // 作弊检测详情表(不带头标题行,仅表格)
59
+ var COL_W1 = 118; // 检测项目列宽
60
+ var COL_W2 = 130; // 风险评估列宽
61
+ var TEXT_COLOR = 'rgba(0,0,0,0.85)'; // 表格文字:比 0.6 深、不纯黑
62
+ var CheatDetailTable = function (_a) {
63
+ var hitNames = _a.hitNames;
64
+ return (_jsxs(Box, __assign({ sx: { mt: 2, borderRadius: 2, overflow: 'hidden', border: '1px solid rgba(0,191,255,0.05)', bgcolor: '#fff' } }, { children: [_jsxs(Stack, __assign({ direction: "row", sx: { background: 'rgba(0,191,255,0.04)', px: 1.5, py: 0.75, alignItems: 'center' } }, { children: [_jsx(Typography, __assign({ sx: { width: COL_W1, flexShrink: 0, textAlign: 'center', color: TEXT_COLOR, fontSize: 12, fontWeight: 600 } }, { children: "\u68C0\u6D4B\u9879\u76EE" })), _jsx(Typography, __assign({ sx: { width: COL_W2, flexShrink: 0, textAlign: 'center', color: TEXT_COLOR, fontSize: 12, fontWeight: 600 } }, { children: "\u98CE\u9669\u8BC4\u4F30" })), _jsx(Typography, __assign({ sx: { flex: 1, textAlign: 'center', color: TEXT_COLOR, fontSize: 12, fontWeight: 600 } }, { children: "\u8BE6\u60C5\u8BF4\u660E" }))] })), CHEAT_ROWS.map(function (row, i) {
65
+ var hit = hitNames.has(row.name);
66
+ return (_jsxs(Stack, __assign({ direction: "row", sx: {
67
+ px: 1.5,
68
+ py: 0.75,
69
+ alignItems: 'center',
70
+ borderTop: '1px solid #F2F4F6',
71
+ bgcolor: i % 2 ? '#FAFCFE' : '#fff',
72
+ } }, { children: [_jsx(Typography, __assign({ sx: { width: COL_W1, flexShrink: 0, textAlign: 'center', color: TEXT_COLOR, fontSize: 12 } }, { children: row.name })), _jsx(Box, __assign({ sx: { width: COL_W2, flexShrink: 0, display: 'flex', justifyContent: 'center' } }, { children: _jsx(RiskBadge, { has: hit }) })), _jsx(Typography, __assign({ sx: { flex: 1, textAlign: 'center', color: TEXT_COLOR, fontSize: 12, lineHeight: '20px' } }, { children: hit ? row.detail : '暂无风险' }))] }), row.name));
73
+ })] })));
74
+ };
33
75
  var CheatRisk = function () {
34
- var _a = __read(useState(true), 2), open = _a[0], setOpen = _a[1];
35
- return (_jsxs(Box, __assign({ id: "report-risk", px: 2, mt: 3 }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", spacing: 1 }, { children: [_jsx(Box, { sx: {
36
- width: 16,
37
- height: 16,
38
- borderRadius: '50%',
39
- background: 'linear-gradient(158deg, #5EE2B8 2.38%, #41C446 97.38%)',
40
- } }), _jsx(Typography, __assign({ variant: "subtitle1", fontWeight: "bold", sx: { fontSize: 16 } }, { children: "\u4F5C\u5F0A\u98CE\u9669" })), _jsx(Box, { flex: 1 }), _jsx(Typography, __assign({ variant: "body2", sx: { cursor: 'pointer', color: '#00996B', userSelect: 'none' }, onClick: function () { return setOpen(!open); } }, { children: open ? '收起' : '展开' }))] })), open && (_jsx(Box, __assign({ mt: 1.5, border: "1px solid #E7F4EC", borderRadius: 2, p: 3, textAlign: "center" }, { children: _jsx(Typography, __assign({ variant: "body2", color: "rgba(0,0,0,0.26)" }, { children: "\u4F5C\u5F0A\u98CE\u9669\u8BC4\u4F30 / \u9632\u4F5C\u5F0A\u68C0\u6D4B\u660E\u7EC6\uFF1A\u5F85\u4EA7\u54C1\u786E\u8BA4\u6570\u636E\u4E0E\u4EA4\u4E92\u540E\u63A5\u5165" })) })))] })));
76
+ var _a;
77
+ var store = useAiReportStore();
78
+ var v3AssetBase = store.v3AssetBase || '';
79
+ var reportResult = store.reportResult || {};
80
+ var interviewCheat = store.interviewCheat;
81
+ var _b = reportResult.screenSwitchCount, screenSwitchCount = _b === void 0 ? 0 : _b, _c = reportResult.candidateInfo, candidateInfo = _c === void 0 ? {} : _c, _d = reportResult.tags, reportTags = _d === void 0 ? [] : _d;
82
+ // 与报告头部同源取标签:候选人信息卡标签优先,兜底报告级标签
83
+ var tagList = ((_a = candidateInfo === null || candidateInfo === void 0 ? void 0 : candidateInfo.tags) === null || _a === void 0 ? void 0 : _a.length) ? candidateInfo.tags : reportTags;
84
+ var hitNames = new Set((tagList || []).map(function (t) { return t === null || t === void 0 ? void 0 : t.name; }).filter(function (n) { return Boolean(n); }));
85
+ var riskTags = (tagList || []).filter(function (t) { return RISK_TAG_NAMES.includes(t === null || t === void 0 ? void 0 : t.name); });
86
+ // 命中风险标签 或 旧字段(isCheat/切屏次数) 均视为有风险
87
+ var hasRisk = riskTags.length > 0 || !!(interviewCheat === null || interviewCheat === void 0 ? void 0 : interviewCheat.isCheat) || screenSwitchCount > 0;
88
+ var fallbackInfo = (interviewCheat === null || interviewCheat === void 0 ? void 0 : interviewCheat.info) || '面试过程中可能存在作弊行为,请结合面试视频核对。';
89
+ return (_jsxs(Box, __assign({ id: "report-risk", px: 2, mt: 3 }, { children: [_jsx(Box, __assign({ sx: { display: 'flex', alignItems: 'center' } }, { children: v3AssetBase && _jsx("img", { src: "".concat(v3AssetBase, "/risk_title.png"), alt: "\u4F5C\u5F0A\u98CE\u9669", width: 94, height: 28, style: { flexShrink: 0 } }) })), hasRisk ? (_jsxs(_Fragment, { children: [_jsx(Box, __assign({ sx: { bgcolor: 'rgba(0,191,255,0.03)', borderRadius: 2, p: 2, mt: 2 } }, { children: riskTags.length > 0 ? (_jsxs(Stack, __assign({ direction: "row", alignItems: "center", flexWrap: "wrap", gap: 1 }, { children: [_jsx(Typography, __assign({ sx: { color: '#1890FF', fontSize: 14, fontWeight: 600 } }, { children: "\u9762\u8BD5\u8FC7\u7A0B\u98CE\u9669" })), riskTags.map(function (t) { return (_jsx(RiskPill, { name: t.name }, t.token || t.name)); })] }))) : (_jsx(Typography, __assign({ sx: { color: 'rgba(0,0,0,0.6)', fontSize: 14 } }, { children: fallbackInfo }))) })), _jsx(CheatDetailTable, { hitNames: hitNames })] })) : (
90
+ /* 无风险(蓝湖「AI面试报告 v16」定义):作弊风险评估 + 无风险(不显示表格) */
91
+ _jsxs(Box, __assign({ sx: { bgcolor: '#F0F8FB', borderRadius: 2, p: 2, mt: 2 } }, { children: [_jsxs(Typography, __assign({ sx: { color: '#1890FF', fontSize: 14, fontWeight: 600 } }, { children: ["\u4F5C\u5F0A\u98CE\u9669\u8BC4\u4F30\uFF1A", _jsx("span", __assign({ style: { color: '#52C41A', fontWeight: 600 } }, { children: "\u65E0\u98CE\u9669" }))] })), _jsx(Typography, __assign({ sx: { color: 'rgba(0,0,0,0.6)', fontSize: 14, mt: 1 } }, { children: "\u672A\u53D1\u73B0\u660E\u786E\u4F5C\u5F0A\u98CE\u9669\uFF0C\u8BF7\u7ED3\u5408\u9762\u8BD5\u89C6\u9891\u7EE7\u7EED\u6838\u5BF9\u3002" }))] })))] })));
41
92
  };
42
93
  export default CheatRisk;
@@ -59,7 +59,7 @@ var template = (_a = {},
59
59
  _a);
60
60
  var Form = function (_a) {
61
61
  var answers = _a.answers, _b = _a.customProcessName, customProcessName = _b === void 0 ? '资料收集' : _b;
62
- return (_jsxs(Box, __assign({ px: 2, mt: 3 }, { children: [_jsx(ModuleTitle, { title: customProcessName }), _jsxs(Box, __assign({ mt: 1.5, border: "1px solid #E7F4EC", borderRadius: 2, overflow: "hidden" }, { children: [_jsxs(Stack, __assign({ direction: "row", sx: { background: '#EBFCF7' } }, { children: [_jsx(Box, __assign({ width: 52, flexShrink: 0, py: 1, px: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", fontWeight: 700, sx: { color: '#00996B', fontSize: 14, lineHeight: '22px' } }, { children: "\u5E8F\u53F7" })) })), _jsx(Box, __assign({ flex: 1, minWidth: 0, py: 1, px: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", fontWeight: 700, sx: { color: '#00996B', fontSize: 14, lineHeight: '22px' } }, { children: "\u9898\u76EE" })) })), _jsx(Box, __assign({ flex: 1, minWidth: 0, py: 1, px: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", fontWeight: 700, sx: { color: '#00996B', fontSize: 14, lineHeight: '22px' } }, { children: "\u56DE\u7B54" })) }))] })), answers === null || answers === void 0 ? void 0 : answers.map(function (answer, index) {
62
+ return (_jsxs(Box, __assign({ px: 2, mt: 3 }, { children: [_jsx(ModuleTitle, { title: customProcessName, iconVariant: "person" }), _jsxs(Box, __assign({ mt: 1.5, border: "1px solid #E7F4EC", borderRadius: 2, overflow: "hidden" }, { children: [_jsxs(Stack, __assign({ direction: "row", sx: { background: '#EBFCF7' } }, { children: [_jsx(Box, __assign({ width: 52, flexShrink: 0, py: 1, px: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", fontWeight: 700, sx: { color: '#00996B', fontSize: 14, lineHeight: '22px' } }, { children: "\u5E8F\u53F7" })) })), _jsx(Box, __assign({ flex: 1, minWidth: 0, py: 1, px: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", fontWeight: 700, sx: { color: '#00996B', fontSize: 14, lineHeight: '22px' } }, { children: "\u9898\u76EE" })) })), _jsx(Box, __assign({ flex: 1, minWidth: 0, py: 1, px: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", fontWeight: 700, sx: { color: '#00996B', fontSize: 14, lineHeight: '22px' } }, { children: "\u56DE\u7B54" })) }))] })), answers === null || answers === void 0 ? void 0 : answers.map(function (answer, index) {
63
63
  var _a;
64
64
  return (_jsxs(Stack, __assign({ direction: "row", borderTop: "1px solid #F0F6F2" }, { children: [_jsx(Box, __assign({ width: 52, flexShrink: 0, p: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", sx: { color: 'rgba(0,0,0,0.6)', fontSize: 14 } }, { children: index + 1 })) })), _jsx(Box, __assign({ flex: 1, minWidth: 0, p: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", sx: { color: 'rgba(0,0,0,0.6)', fontSize: 14 } }, { children: answer.formTypeKey })) })), _jsx(Box, __assign({ flex: 1, minWidth: 0, p: 1.5 }, { children: _jsx(Typography, __assign({ variant: "body2", sx: { color: 'rgba(0,0,0,0.6)', fontSize: 14 } }, { children: (_a = template[answer.formTypeId]) === null || _a === void 0 ? void 0 : _a.call(template, answer) })) }))] }), index));
65
65
  })] }))] })));
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
- export declare const ModuleTitle: ({ title, action }: {
2
+ export declare const ModuleTitle: ({ title, action, icon, iconVariant, }: {
3
3
  title: React.ReactNode;
4
4
  action?: React.ReactNode;
5
+ icon?: string | undefined;
6
+ iconVariant?: "doc" | "person" | "shield" | undefined;
5
7
  }) => JSX.Element;
@@ -12,13 +12,24 @@ var __assign = (this && this.__assign) || function () {
12
12
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
13
  import { Box, Typography } from 'fbm-ui';
14
14
  import { Stack } from 'fbm-ui/lib/mui';
15
+ // 章节标题:绿色圆角图标盒(设计稿切片 icon 或默认绿色盒) + 加粗标题
16
+ // 设计稿章节头 = 绿色圆角方块图标 + 深色加粗标题,无下划线(避免牛客风)
15
17
  export var ModuleTitle = function (_a) {
16
- var title = _a.title, action = _a.action;
17
- return (_jsxs(Box, { children: [_jsxs(Box, __assign({ sx: { position: 'relative' } }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", spacing: 1 }, { children: [_jsx(Box, { sx: {
18
- width: 16,
19
- height: 16,
20
- borderRadius: '50%',
21
- flexShrink: 0,
22
- background: 'linear-gradient(158deg, #5EE2B8 2.38%, #41C446 97.38%)',
23
- } }), _jsx(Typography, __assign({ fontWeight: 700, sx: { color: 'rgba(0,0,0,0.86)', fontSize: 16, lineHeight: '24px' } }, { children: title }))] })), action && _jsx(Box, __assign({ sx: { position: 'absolute', top: 0, right: 0 } }, { children: action }))] })), _jsx(Box, { sx: { height: 2, mt: 1, borderRadius: 2, background: 'linear-gradient(90deg, #5EE2B8 0%, rgba(94,226,184,0) 100%)' } })] }));
18
+ var title = _a.title, action = _a.action, icon = _a.icon, iconVariant = _a.iconVariant;
19
+ return (_jsx(Box, { children: _jsxs(Box, __assign({ sx: { position: 'relative' } }, { children: [_jsxs(Stack, __assign({ direction: "row", alignItems: "center", spacing: 1 }, { children: [icon ? (_jsx("img", { src: icon, alt: "", width: 24, height: 24, style: { flexShrink: 0 } })) : (_jsx(Box, __assign({ sx: {
20
+ width: 26,
21
+ height: 26,
22
+ borderRadius: '7px',
23
+ flexShrink: 0,
24
+ background: 'linear-gradient(158deg, #5EE2B8 2.38%, #41C446 97.38%)',
25
+ display: 'flex',
26
+ alignItems: 'center',
27
+ justifyContent: 'center',
28
+ } }, { children: iconVariant === 'person' ? (
29
+ // 资料收集:人形剪影
30
+ _jsxs("svg", __assign({ width: "16", height: "16", viewBox: "0 0 24 24", fill: "none" }, { children: [_jsx("circle", { cx: "12", cy: "8", r: "3.6", fill: "#fff" }), _jsx("path", { d: "M4 20c.8-4 4-6 8-6s7.2 2 8 6", stroke: "#fff", strokeWidth: "2", strokeLinecap: "round" })] }))) : iconVariant === 'shield' ? (
31
+ // 作弊风险:盾牌 + 感叹号
32
+ _jsxs("svg", __assign({ width: "16", height: "16", viewBox: "0 0 24 24", fill: "none" }, { children: [_jsx("path", { d: "M12 2.5 5 5v6c0 4.5 3 8 7 9.5 4-1.5 7-5 7-9.5V5l-7-2.5Z", fill: "#fff" }), _jsx("rect", { x: "11", y: "6.6", width: "2", height: "5.4", rx: "1", fill: "#41C446" }), _jsx("rect", { x: "11", y: "13.6", width: "2", height: "2.4", rx: "1", fill: "#41C446" })] }))) : (
33
+ // 默认/面试详情:文档 + 双横线
34
+ _jsxs("svg", __assign({ width: "16", height: "16", viewBox: "0 0 24 24", fill: "none" }, { children: [_jsx("rect", { x: "5", y: "3", width: "14", height: "18", rx: "2.5", fill: "#fff" }), _jsx("rect", { x: "8.5", y: "7", width: "7", height: "1.8", rx: "0.9", fill: "#41C446" }), _jsx("rect", { x: "8.5", y: "11", width: "7", height: "1.8", rx: "0.9", fill: "#41C446" }), _jsx("rect", { x: "8.5", y: "15", width: "4.5", height: "1.8", rx: "0.9", fill: "#41C446" })] }))) }))), _jsx(Typography, __assign({ fontWeight: 700, sx: { color: 'rgba(0,0,0,0.86)', fontSize: 18, lineHeight: '24px' } }, { children: title }))] })), action && _jsx(Box, __assign({ sx: { position: 'absolute', top: 0, right: 0 } }, { children: action }))] })) }));
24
35
  };