aegon-dangerious 1.0.0

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 (32) hide show
  1. package/build-report/components/AiPromptGenerateDialog.vue +349 -0
  2. package/build-report/components/CapsuleScrollbar.vue +145 -0
  3. package/build-report/components/ChapterTitleScroll.vue +292 -0
  4. package/build-report/components/PromptField.vue +314 -0
  5. package/build-report/components/RecentReportsTable.vue +408 -0
  6. package/build-report/components/ReportChapterPreview.vue +437 -0
  7. package/build-report/components/ReportChapterWorkspace.vue +923 -0
  8. package/build-report/components/ReportCollapsibleSection.vue +132 -0
  9. package/build-report/components/ReportConfigPanel.vue +609 -0
  10. package/build-report/components/ReportGenerateSettingsPanel.vue +403 -0
  11. package/build-report/components/ReportGeneratingPanel.vue +908 -0
  12. package/build-report/components/ReportHistoryList.vue +157 -0
  13. package/build-report/components/ReportHistoryPanel.vue +140 -0
  14. package/build-report/components/ReportPromptPanel.vue +445 -0
  15. package/build-report/components/ReportSectionConfirmPopover.vue +232 -0
  16. package/build-report/components/ReportSourceFileSummary.vue +544 -0
  17. package/build-report/components/ReportSourcesMoreOverlay.vue +279 -0
  18. package/build-report/components/ReportSourcesPanel.vue +1055 -0
  19. package/build-report/components/ReportTemplateDetail.vue +176 -0
  20. package/build-report/components/ReportTemplateEditorFormPanel.vue +602 -0
  21. package/build-report/components/ReportTemplatePicker.vue +802 -0
  22. package/build-report/components/ReportTemplatePromptField.vue +314 -0
  23. package/build-report/components/ReportWorkflowSidebar.vue +104 -0
  24. package/build-report/components/reportEdit.vue +334 -0
  25. package/build-report/index.vue +646 -0
  26. package/build-report/report-list.vue +407 -0
  27. package/build-report/report-template-data.ts +248 -0
  28. package/build-report/styles/report-workflow-dialog.css +33 -0
  29. package/build-report/useReportWorkflow.ts +343 -0
  30. package/build-report/utils/report-edit-route.ts +109 -0
  31. package/build-report/utils/scroll.ts +361 -0
  32. package/package.json +12 -0
@@ -0,0 +1,802 @@
1
+ <template>
2
+ <section class="report-template-picker">
3
+ <section class="template-center-hero">
4
+ <h2 class="template-center-hero__title">選擇模板</h2>
5
+ <p class="template-center-hero__desc gen-ai-page-hero-desc">點擊列表中的模板進入詳情與章節預覽</p>
6
+ </section>
7
+
8
+ <section class="template-center-toolbar">
9
+ <div class="template-center-toolbar__controls">
10
+ <div class="template-center-toolbar__right">
11
+ <label class="template-center-field">
12
+ <span class="gen-ai-filter-field-label">單位</span>
13
+ <el-select v-model="unitFilter" placeholder="" clearable class="template-center-field__select">
14
+ <el-option v-for="item in unitOptions" :key="item" :label="item" :value="item" />
15
+ </el-select>
16
+ </label>
17
+
18
+ <label class="template-center-field">
19
+ <span class="gen-ai-filter-field-label">Search</span>
20
+ <el-input v-model="keyword" clearable class="template-center-field__input" />
21
+ </label>
22
+
23
+ <button type="button"
24
+ class="template-center-toolbar-btn gen-ai-action-btn template-center-toolbar-btn--primary"
25
+ @click="handleRefresh">
26
+ Refresh
27
+ </button>
28
+ </div>
29
+ </div>
30
+ </section>
31
+
32
+ <el-table :data="paginatedTemplates" class="template-center-table gen-ai-template-table-header" table-layout="fixed"
33
+ @row-click="handleRowClick">
34
+ <el-table-column label="模板名稱" width="140" class-name="template-col-d1">
35
+ <template #default="{ row }">
36
+ <div class="template-center-cell-body template-center-cell-body--name">
37
+ <span class="template-center-name">{{ row.name }}</span>
38
+ </div>
39
+ </template>
40
+ </el-table-column>
41
+
42
+ <el-table-column label="模板描述" min-width="300" class-name="template-col-d2">
43
+ <template #default="{ row }">
44
+ <div class="template-center-cell-divider">
45
+ <p class="template-center-desc">{{ row.description }}</p>
46
+ </div>
47
+ </template>
48
+ </el-table-column>
49
+
50
+ <el-table-column label="章節結構" min-width="420" class-name="template-col-d3">
51
+ <template #default="{ row }">
52
+ <div class="template-center-cell-divider template-center-cell-divider--chapters">
53
+ <div class="template-center-chapters-wrap" :style="chapterWrapStyle(row.chapters)">
54
+ <div v-for="cols in [splitChapterColumns(row.chapters)]" :key="row.id" class="template-center-chapters">
55
+ <ul class="template-center-chapters-col">
56
+ <ChapterTitleScroll v-for="(chapter, index) in cols.left" :key="`l-${row.id}-${index}`"
57
+ :title="chapter" @click.stop />
58
+ </ul>
59
+ <ul class="template-center-chapters-col">
60
+ <ChapterTitleScroll v-for="(chapter, index) in cols.right" :key="`r-${row.id}-${index}`"
61
+ :title="chapter" @click.stop />
62
+ <li v-if="cols.hasMore" class="template-center-chapters-ellipsis" @click.stop>
63
+ <button type="button" class="template-center-chapters-ellipsis-btn" title="查看全部章節"
64
+ @click.stop.prevent="openChapterDialog(row, $event)">
65
+ ...
66
+ </button>
67
+ </li>
68
+ </ul>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </template>
73
+ </el-table-column>
74
+
75
+ <el-table-column label="模板作者" width="250" class-name="template-col-d4 template-col-author">
76
+ <template #default="{ row }">
77
+ <div class="template-center-cell-divider">
78
+ <div class="template-center-author">
79
+ <div>作者:{{ row.author }}</div>
80
+ <div>審批:{{ row.approver }}</div>
81
+ </div>
82
+ </div>
83
+ </template>
84
+ </el-table-column>
85
+
86
+ <el-table-column label="最後更新時間" width="168" class-name="template-col-d5 template-col-updated">
87
+ <template #default="{ row }">
88
+ <div
89
+ class="template-center-cell-divider template-center-cell-divider--updated template-center-cell-divider--d5">
90
+ <span class="template-center-updated">{{ row.updatedAt }}</span>
91
+ </div>
92
+ </template>
93
+ </el-table-column>
94
+ </el-table>
95
+
96
+ <div class="gen-ai-pagination">
97
+ <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :page-sizes="[5, 10, 20]"
98
+ layout="prev, pager, next, sizes, ->, jumper, total" :total="filteredTemplates.length" background />
99
+ </div>
100
+
101
+ <el-dialog v-model="chapterDialogVisible" width="60%" append-to-body :z-index="10000" :show-close="false"
102
+ modal-class="template-center-chapter-overlay" class="template-center-chapter-dialog"
103
+ header-class="template-center-chapter-dialog__header">
104
+ <template #header="{ close, titleId, titleClass }">
105
+ <span :id="titleId" :class="['template-center-chapter-dialog__title', titleClass]">章節結構</span>
106
+ <button type="button" class="template-center-chapter-dialog__close" aria-label="關閉" @click="close">×</button>
107
+ </template>
108
+ <ul class="template-center-chapters template-center-chapters--dialog">
109
+ <li v-for="(chapter, index) in chapterDialogChapters" :key="`dlg-${index}`">{{ chapter }}</li>
110
+ </ul>
111
+ </el-dialog>
112
+ </section>
113
+ </template>
114
+
115
+ <script lang="ts">
116
+ import {
117
+ MOCK_TEMPLATES,
118
+ fetchReportTemplateList,
119
+ type ReportTemplateCard,
120
+ type TemplateItem,
121
+ } from '../report-template-data'
122
+
123
+ export type { ReportTemplateCard, TemplateItem }
124
+ export {
125
+ MOCK_TEMPLATES,
126
+ fetchReportTemplateList,
127
+ MOCK_REPORT_TEMPLATES,
128
+ resolveReportTemplateById,
129
+ } from '../report-template-data'
130
+
131
+ export const CHAPTER_DISPLAY_MAX = 14
132
+ export const CHAPTER_FIRST_COL_COUNT = 7
133
+ export const CHAPTER_LINE_HEIGHT = 22
134
+ export const CHAPTER_ROW_GAP = 4
135
+
136
+ export interface ChapterColumns {
137
+ left: string[]
138
+ right: string[]
139
+ hasMore: boolean
140
+ }
141
+
142
+ export function splitChapterColumns(chapters: string[]): ChapterColumns {
143
+ const visible =
144
+ chapters.length > CHAPTER_DISPLAY_MAX ? chapters.slice(0, CHAPTER_DISPLAY_MAX - 1) : chapters
145
+
146
+ return {
147
+ left: visible.slice(0, CHAPTER_FIRST_COL_COUNT),
148
+ right: visible.slice(CHAPTER_FIRST_COL_COUNT),
149
+ hasMore: chapters.length > CHAPTER_DISPLAY_MAX,
150
+ }
151
+ }
152
+
153
+ function chapterColumnRowCount(columns: ChapterColumns) {
154
+ return Math.max(columns.left.length, columns.right.length + (columns.hasMore ? 1 : 0))
155
+ }
156
+
157
+ function chapterBlockHeight(rowCount: number) {
158
+ if (rowCount <= 0) return 0
159
+ return rowCount * CHAPTER_LINE_HEIGHT + Math.max(0, rowCount - 1) * CHAPTER_ROW_GAP
160
+ }
161
+
162
+ export function chapterWrapStyle(chapters: string[]) {
163
+ const rowCount = chapterColumnRowCount(splitChapterColumns(chapters))
164
+ const contentHeight = chapterBlockHeight(rowCount)
165
+ return { height: `${contentHeight}px` }
166
+ }
167
+ </script>
168
+
169
+ <script setup lang="ts">
170
+ import { ElMessage } from 'element-plus'
171
+ import { computed, onMounted, ref, watch } from 'vue'
172
+ import ChapterTitleScroll from './ChapterTitleScroll.vue'
173
+
174
+ const unitOptions = ['風險管理部', '授信審批部', '合規部', '公司金融部']
175
+
176
+ const unitFilter = ref('')
177
+ const keyword = ref('')
178
+ const currentPage = ref(1)
179
+ const pageSize = ref(5)
180
+ const templates = ref<TemplateItem[]>([...MOCK_TEMPLATES])
181
+
182
+ const chapterDialogVisible = ref(false)
183
+ const chapterDialogChapters = ref<string[]>([])
184
+
185
+ const emit = defineEmits<{
186
+ select: [template: ReportTemplateCard]
187
+ }>()
188
+
189
+ function isTemplateList(data: unknown) {
190
+ return Array.isArray(data) && data.length > 0 && typeof data[0]?.id === 'string'
191
+ }
192
+
193
+ async function loadTemplates() {
194
+ const data = await fetchReportTemplateList({
195
+ unit: unitFilter.value || undefined,
196
+ keyword: keyword.value.trim() || undefined,
197
+ })
198
+ if (isTemplateList(data)) {
199
+ templates.value = data as TemplateItem[]
200
+ }
201
+ }
202
+
203
+ const filteredTemplates = computed(() => {
204
+ const kw = keyword.value.trim().toLowerCase()
205
+ return templates.value.filter((item) => {
206
+ const unitOk = !unitFilter.value || item.unit === unitFilter.value
207
+ const keywordOk =
208
+ !kw ||
209
+ item.name.toLowerCase().includes(kw) ||
210
+ item.description.toLowerCase().includes(kw) ||
211
+ item.author.toLowerCase().includes(kw)
212
+ return unitOk && keywordOk
213
+ })
214
+ })
215
+
216
+ const paginatedTemplates = computed(() => {
217
+ const start = (currentPage.value - 1) * pageSize.value
218
+ return filteredTemplates.value.slice(start, start + pageSize.value)
219
+ })
220
+
221
+ function toReportTemplateCard(item: TemplateItem): ReportTemplateCard {
222
+ return {
223
+ id: item.id,
224
+ name: item.name,
225
+ description: item.description,
226
+ chapters: item.chapters,
227
+ author: item.author,
228
+ updatedAt: item.updatedAt,
229
+ }
230
+ }
231
+
232
+ function shouldIgnoreRowClick(target: HTMLElement | null) {
233
+ if (!target) return false
234
+ return Boolean(
235
+ target.closest(
236
+ '.template-center-chapters-ellipsis-btn, .template-center-chapters-ellipsis, .chapter-title-scroll',
237
+ ),
238
+ )
239
+ }
240
+
241
+ function handleRowClick(row: TemplateItem, _column: unknown, event: MouseEvent) {
242
+ const target = event.target as HTMLElement | null
243
+ if (shouldIgnoreRowClick(target)) return
244
+ emit('select', toReportTemplateCard(row))
245
+ }
246
+
247
+ function openChapterDialog(row: TemplateItem, event?: Event) {
248
+ event?.stopPropagation()
249
+ chapterDialogChapters.value = row.chapters
250
+ chapterDialogVisible.value = true
251
+ }
252
+
253
+ function handleRefresh() {
254
+ keyword.value = ''
255
+ unitFilter.value = ''
256
+ void loadTemplates()
257
+ ElMessage.success('已重新整理')
258
+ }
259
+
260
+ watch([keyword, unitFilter], () => {
261
+ currentPage.value = 1
262
+ })
263
+
264
+ watch(filteredTemplates, (list) => {
265
+ const maxPage = Math.max(1, Math.ceil(list.length / pageSize.value))
266
+ if (currentPage.value > maxPage) currentPage.value = maxPage
267
+ })
268
+
269
+ onMounted(() => {
270
+ void loadTemplates()
271
+ })
272
+ </script>
273
+
274
+ <style scoped>
275
+ .report-template-picker {
276
+ display: flex;
277
+ flex-direction: column;
278
+ gap: 0;
279
+ min-height: 0;
280
+ }
281
+ </style>
282
+
283
+ <style>
284
+ /* 與 model-manager 模板中心列表視覺一致 */
285
+ .report-template-picker {
286
+ --template-col-d1: 140px;
287
+ --template-col-d4: 250px;
288
+ --template-col-d5: 168px;
289
+ --gen-ai-fs-hero: clamp(26px, calc(32 * 100vw / 1920), 32px);
290
+ --gen-ai-fw-bold: 700;
291
+ --gen-ai-fs-xs: clamp(11px, calc(12 * 100vw / 1920), 12px);
292
+ --gen-ai-fs-sm: clamp(12px, calc(13 * 100vw / 1920), 13px);
293
+ --gen-ai-fs-base: clamp(13px, calc(14 * 100vw / 1920), 14px);
294
+ --gen-ai-fs-md: clamp(14px, calc(16 * 100vw / 1920), 16px);
295
+ --gen-ai-fs-xl: clamp(18px, calc(20 * 100vw / 1920), 20px);
296
+ --gen-ai-fs-chapter: clamp(12px, calc(14 * 100vw / 1920), 14px);
297
+ --gen-ai-lh-chapter: clamp(18px, calc(22 * 100vw / 1920), 22px);
298
+ --gen-ai-lh-normal: 1.6;
299
+ --gen-ai-lh-relaxed: 1.7;
300
+ --gen-ai-fw-black: 900;
301
+ --gen-ai-el-table-header-fs: 14px;
302
+ --gen-ai-el-table-header-color: #303133;
303
+ --gen-ai-el-table-row-fs: 14px;
304
+ --gen-ai-el-table-row-color: #606266;
305
+ --report-accent: #c53355;
306
+ --report-accent-soft: #fdf0f2;
307
+ font-size: var(--gen-ai-fs-base);
308
+ line-height: var(--gen-ai-lh-normal);
309
+ color: #2d3139;
310
+ }
311
+
312
+ .report-template-picker .template-center-hero {
313
+ text-align: center;
314
+ margin-bottom: 28px;
315
+ }
316
+
317
+ .report-template-picker .template-center-hero__title {
318
+ margin: 0 0 10px;
319
+ font-size: var(--gen-ai-fs-hero);
320
+ font-weight: var(--gen-ai-fw-bold);
321
+ color: #1a1a1a;
322
+ }
323
+
324
+ .report-template-picker .template-center-hero__desc {
325
+ margin: 0;
326
+ }
327
+
328
+ .report-template-picker .gen-ai-page-hero-desc {
329
+ font-size: 16px;
330
+ font-weight: 600;
331
+ line-height: 1.7;
332
+ color: #666;
333
+ }
334
+
335
+ .report-template-picker .gen-ai-filter-field-label {
336
+ font-size: 14px;
337
+ color: #606266;
338
+ font-weight: 500;
339
+ font-family: Arial, sans-serif;
340
+ white-space: nowrap;
341
+ }
342
+
343
+ .report-template-picker .template-center-toolbar-btn {
344
+ display: inline-flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ gap: 6px;
348
+ box-sizing: border-box;
349
+ height: 32px;
350
+ min-width: 120px;
351
+ padding: 0 14px;
352
+ border-radius: 4px;
353
+ line-height: 1;
354
+ white-space: nowrap;
355
+ cursor: pointer;
356
+ transition: all 0.2s ease;
357
+ font-size: 15px;
358
+ font-family: Arial, sans-serif;
359
+ font-weight: 400;
360
+ }
361
+
362
+ .report-template-picker .template-center-toolbar-btn--primary {
363
+ border: 1px solid var(--report-accent);
364
+ background: var(--report-accent);
365
+ color: #fff;
366
+ }
367
+
368
+ .report-template-picker .template-center-toolbar-btn--primary:hover:not(:disabled) {
369
+ background: #fff;
370
+ border-color: var(--report-accent);
371
+ color: var(--report-accent);
372
+ }
373
+
374
+ .report-template-picker .template-center-toolbar {
375
+ display: flex;
376
+ flex-direction: column;
377
+ align-items: stretch;
378
+ gap: 12px;
379
+ margin-bottom: 20px;
380
+ }
381
+
382
+ .report-template-picker .template-center-toolbar__controls {
383
+ display: flex;
384
+ align-items: center;
385
+ width: 100%;
386
+ }
387
+
388
+ .report-template-picker .template-center-toolbar__right {
389
+ display: flex;
390
+ align-items: center;
391
+ justify-content: flex-end;
392
+ gap: 12px;
393
+ flex-wrap: wrap;
394
+ margin-left: auto;
395
+ }
396
+
397
+ .report-template-picker .template-center-field {
398
+ display: inline-flex;
399
+ align-items: center;
400
+ gap: 8px;
401
+ margin: 0;
402
+ }
403
+
404
+ .report-template-picker .template-center-field__select {
405
+ width: 180px;
406
+ }
407
+
408
+ .report-template-picker .template-center-field__input {
409
+ width: 270px;
410
+ }
411
+
412
+ .report-template-picker .gen-ai-pagination {
413
+ margin-top: 8px;
414
+ }
415
+
416
+ .report-template-picker .gen-ai-pagination .el-pagination {
417
+ justify-content: flex-end;
418
+ flex-wrap: wrap;
419
+ gap: 8px 0;
420
+ font-weight: 400;
421
+ }
422
+
423
+ .report-template-picker .gen-ai-pagination .el-pagination.is-background .btn-prev,
424
+ .report-template-picker .gen-ai-pagination .el-pagination.is-background .btn-next,
425
+ .report-template-picker .gen-ai-pagination .el-pagination.is-background .el-pager li {
426
+ background-color: #fff;
427
+ border: 1px solid #dcdfe6;
428
+ color: #606266;
429
+ font-weight: 400;
430
+ min-width: 32px;
431
+ height: 32px;
432
+ line-height: 30px;
433
+ border-radius: 4px;
434
+ }
435
+
436
+ .report-template-picker .gen-ai-pagination .el-pagination.is-background .el-pager li.is-active {
437
+ background-color: var(--report-accent);
438
+ border-color: var(--report-accent);
439
+ color: #fff;
440
+ }
441
+
442
+ .report-template-picker .template-center-table.gen-ai-template-table-header .el-table__header th.el-table__cell,
443
+ .report-template-picker .template-center-table.gen-ai-template-table-header .el-table__header th.el-table__cell .cell {
444
+ font-size: var(--gen-ai-el-table-header-fs);
445
+ font-weight: 600;
446
+ color: var(--gen-ai-el-table-header-color);
447
+ }
448
+
449
+ .report-template-picker .template-center-table.gen-ai-template-table-header .el-table__body tr.el-table__row,
450
+ .report-template-picker .template-center-table.gen-ai-template-table-header .el-table__body td.el-table__cell,
451
+ .report-template-picker .template-center-table.gen-ai-template-table-header .el-table__body td.el-table__cell .cell,
452
+ .report-template-picker .template-center-table.gen-ai-template-table-header .template-center-name,
453
+ .report-template-picker .template-center-table.gen-ai-template-table-header .template-center-desc,
454
+ .report-template-picker .template-center-table.gen-ai-template-table-header .template-center-updated,
455
+ .report-template-picker .template-center-table.gen-ai-template-table-header .template-center-chapters-col,
456
+ .report-template-picker .template-center-table.gen-ai-template-table-header .chapter-title-scroll,
457
+ .report-template-picker .template-center-table.gen-ai-template-table-header .chapter-title-scroll .chapter-title-scroll__text {
458
+ font-size: var(--gen-ai-el-table-row-fs);
459
+ color: var(--gen-ai-el-table-row-color);
460
+ }
461
+
462
+ .report-template-picker .template-center-table {
463
+ width: 100%;
464
+ --el-table-border-color: transparent;
465
+ background: transparent;
466
+ overflow: visible;
467
+ }
468
+
469
+ .report-template-picker .template-center-table .el-table__inner-wrapper,
470
+ .report-template-picker .template-center-table .el-table__body-wrapper,
471
+ .report-template-picker .template-center-table .el-table__header-wrapper,
472
+ .report-template-picker .template-center-table .el-scrollbar__wrap,
473
+ .report-template-picker .template-center-table .el-scrollbar__view,
474
+ .report-template-picker .template-center-table .el-table__body,
475
+ .report-template-picker .template-center-table .el-table__body tbody,
476
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row {
477
+ overflow: visible !important;
478
+ }
479
+
480
+ .report-template-picker .template-center-table .el-table__inner-wrapper::before {
481
+ display: none;
482
+ }
483
+
484
+ .report-template-picker .template-center-table .el-table__header th.el-table__cell {
485
+ border-bottom: none;
486
+ background: transparent;
487
+ padding: 0 16px 12px;
488
+ vertical-align: bottom;
489
+ color: #303133;
490
+ }
491
+
492
+ .report-template-picker .template-center-table .el-table__header th.el-table__cell .cell {
493
+ padding: 0;
494
+ }
495
+
496
+ .report-template-picker .template-center-table .el-table__header th.el-table__cell + th.el-table__cell .cell {
497
+ position: relative;
498
+ padding-left: 16px;
499
+ }
500
+
501
+ .report-template-picker .template-center-table .el-table__body-wrapper .el-table__body {
502
+ border-collapse: separate;
503
+ border-spacing: 0 14px;
504
+ }
505
+
506
+ .report-template-picker .template-center-table .el-table__body td.el-table__cell {
507
+ vertical-align: top;
508
+ height: 1px;
509
+ padding: 20px 16px;
510
+ border-bottom: none;
511
+ background: #fff;
512
+ transition: background-color 0.2s ease;
513
+ }
514
+
515
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row {
516
+ background: #fff;
517
+ border-radius: 8px;
518
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06);
519
+ cursor: pointer;
520
+ transition-property: box-shadow;
521
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
522
+ transition-duration: 0.15s;
523
+ }
524
+
525
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row:hover {
526
+ box-shadow:
527
+ 0 4px 6px -1px rgb(0 0 0 / 0.1),
528
+ 0 2px 4px -2px rgb(0 0 0 / 0.1);
529
+ }
530
+
531
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row:hover > td.el-table__cell {
532
+ background-color: #fff !important;
533
+ }
534
+
535
+ .report-template-picker .template-center-table .el-table__body-wrapper .cell {
536
+ padding: 0;
537
+ }
538
+
539
+ .report-template-picker .template-center-table .el-table__body td.el-table__cell:not(:first-child) > .cell {
540
+ position: relative;
541
+ height: 100%;
542
+ box-sizing: border-box;
543
+ }
544
+
545
+ .report-template-picker .template-center-table .el-table__body td.el-table__cell:not(:first-child) > .cell::before {
546
+ content: '';
547
+ position: absolute;
548
+ left: 0;
549
+ top: 0;
550
+ bottom: 0;
551
+ width: 1px;
552
+ background: #f0f2f5;
553
+ }
554
+
555
+ .report-template-picker .template-center-cell-body,
556
+ .report-template-picker .template-center-cell-divider {
557
+ position: relative;
558
+ box-sizing: border-box;
559
+ }
560
+
561
+ .report-template-picker .template-center-cell-divider {
562
+ width: 100%;
563
+ padding-left: 16px;
564
+ }
565
+
566
+ .report-template-picker .template-center-cell-divider--chapters {
567
+ height: auto;
568
+ }
569
+
570
+ .report-template-picker .template-center-cell-divider--updated {
571
+ overflow: visible;
572
+ }
573
+
574
+ .report-template-picker .template-center-cell-divider--d5 {
575
+ padding-left: 0;
576
+ }
577
+
578
+ .report-template-picker .template-center-table .el-table__header th.template-col-d5.el-table__cell,
579
+ .report-template-picker .template-center-table .el-table__body td.template-col-d5.el-table__cell {
580
+ width: var(--template-col-d5);
581
+ max-width: var(--template-col-d5);
582
+ overflow: visible;
583
+ }
584
+
585
+ .report-template-picker .template-center-table .el-table__header th.template-col-d5 .cell,
586
+ .report-template-picker .template-center-table .el-table__body td.template-col-d5 .cell {
587
+ padding-left: 16px;
588
+ padding-right: 16px;
589
+ white-space: nowrap;
590
+ overflow: visible;
591
+ text-align: left;
592
+ }
593
+
594
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row td.template-col-d5.el-table__cell:last-child > .cell {
595
+ display: block;
596
+ justify-content: flex-start;
597
+ }
598
+
599
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row td.el-table__cell:first-child {
600
+ overflow: visible !important;
601
+ border-radius: 8px 0 0 8px;
602
+ border: 1px solid #ebeef5;
603
+ border-right: none;
604
+ }
605
+
606
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row td.el-table__cell:last-child {
607
+ border-radius: 0 8px 8px 0;
608
+ border: 1px solid #ebeef5;
609
+ border-left: none;
610
+ }
611
+
612
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row td.el-table__cell:not(:first-child):not(:last-child) {
613
+ border-top: 1px solid #ebeef5;
614
+ border-bottom: 1px solid #ebeef5;
615
+ }
616
+
617
+ .report-template-picker .template-center-name {
618
+ display: block;
619
+ }
620
+
621
+ .report-template-picker .template-center-updated {
622
+ display: block;
623
+ line-height: var(--gen-ai-lh-normal);
624
+ white-space: nowrap;
625
+ }
626
+
627
+ .report-template-picker .template-center-desc {
628
+ margin: 0;
629
+ line-height: var(--gen-ai-lh-relaxed);
630
+ white-space: normal;
631
+ }
632
+
633
+ .report-template-picker .template-center-chapters-wrap {
634
+ position: relative;
635
+ box-sizing: border-box;
636
+ overflow: hidden;
637
+ }
638
+
639
+ .report-template-picker .template-center-chapters {
640
+ display: flex;
641
+ align-items: flex-start;
642
+ gap: 20px;
643
+ box-sizing: border-box;
644
+ height: 100%;
645
+ }
646
+
647
+ .report-template-picker .template-center-chapters-col {
648
+ flex: 1;
649
+ min-width: 0;
650
+ margin: 0;
651
+ padding: 0;
652
+ list-style: none;
653
+ }
654
+
655
+ .report-template-picker .template-center-chapters-col > li + li,
656
+ .report-template-picker .chapter-title-scroll + li,
657
+ .report-template-picker .chapter-title-scroll + .chapter-title-scroll {
658
+ margin-top: 4px;
659
+ }
660
+
661
+ .report-template-picker .chapter-title-scroll.is-truncatable {
662
+ cursor: pointer;
663
+ }
664
+
665
+ .report-template-picker .chapter-title-scroll.is-truncatable.is-dragging {
666
+ cursor: grabbing;
667
+ }
668
+
669
+ .report-template-picker .chapter-title-scroll__ellipsis {
670
+ pointer-events: auto;
671
+ cursor: pointer;
672
+ }
673
+
674
+ .report-template-picker .template-center-table .el-table__body tr.el-table__row:hover .chapter-title-scroll__ellipsis {
675
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, #fff 45%);
676
+ }
677
+
678
+ .report-template-picker .template-center-chapters-ellipsis {
679
+ list-style: none;
680
+ }
681
+
682
+ .report-template-picker .template-center-chapters-ellipsis-btn {
683
+ padding: 0;
684
+ border: none;
685
+ background: transparent;
686
+ color: #c53355;
687
+ font-size: var(--gen-ai-fs-xl);
688
+ font-weight: var(--gen-ai-fw-black);
689
+ height: var(--gen-ai-lh-chapter);
690
+ line-height: var(--gen-ai-lh-chapter);
691
+ letter-spacing: 0.05em;
692
+ cursor: pointer;
693
+ }
694
+
695
+ .report-template-picker .template-center-chapters-ellipsis-btn:hover {
696
+ color: #a82d48;
697
+ text-decoration: underline;
698
+ }
699
+
700
+ .report-template-picker .template-center-author {
701
+ font-size: var(--gen-ai-fs-sm);
702
+ line-height: var(--gen-ai-lh-relaxed);
703
+ color: #606266;
704
+ }
705
+
706
+ .report-template-picker .template-center-author > div {
707
+ white-space: normal;
708
+ word-break: break-word;
709
+ }
710
+
711
+ .template-center-chapter-overlay {
712
+ overflow: auto;
713
+ }
714
+
715
+ .template-center-chapters--dialog {
716
+ display: grid;
717
+ grid-template-columns: repeat(3, minmax(0, 1fr));
718
+ gap: 8px 28px;
719
+ margin: 0;
720
+ padding: 0;
721
+ list-style: none;
722
+ }
723
+
724
+ .template-center-chapters--dialog > li {
725
+ white-space: normal;
726
+ overflow: visible;
727
+ }
728
+
729
+ .template-center-chapter-dialog.el-dialog {
730
+ --el-dialog-padding-primary: 0;
731
+ width: 60%;
732
+ max-width: 80%;
733
+ max-height: 70%;
734
+ margin-top: 5%;
735
+ margin-left: 21%;
736
+ margin-right: auto;
737
+ border-radius: 4px;
738
+ overflow: hidden;
739
+ display: flex;
740
+ flex-direction: column;
741
+ }
742
+
743
+ .template-center-chapter-dialog .el-dialog__header,
744
+ .template-center-chapter-dialog__header {
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: space-between;
748
+ gap: 16px;
749
+ margin: 0;
750
+ padding: 14px 16px 14px 20px;
751
+ background: #4a5f7a;
752
+ flex-shrink: 0;
753
+ }
754
+
755
+ .template-center-chapter-dialog__title,
756
+ .template-center-chapter-dialog .el-dialog__title {
757
+ flex: 1;
758
+ min-width: 0;
759
+ color: #fff;
760
+ font-size: clamp(14px, calc(16 * 100vw / 1920), 16px);
761
+ font-weight: 600;
762
+ line-height: 1.4;
763
+ }
764
+
765
+ .template-center-chapter-dialog__close {
766
+ flex-shrink: 0;
767
+ width: 32px;
768
+ height: 32px;
769
+ margin: 0;
770
+ padding: 0;
771
+ border: none;
772
+ background: transparent;
773
+ color: #fff;
774
+ font-size: clamp(20px, calc(24 * 100vw / 1920), 24px);
775
+ font-weight: 400;
776
+ line-height: 1;
777
+ cursor: pointer;
778
+ display: inline-flex;
779
+ align-items: center;
780
+ justify-content: center;
781
+ }
782
+
783
+ .template-center-chapter-dialog__close:hover {
784
+ color: rgba(255, 255, 255, 0.85);
785
+ }
786
+
787
+ .template-center-chapter-dialog__close:focus-visible {
788
+ outline: 2px solid rgba(255, 255, 255, 0.8);
789
+ outline-offset: 2px;
790
+ }
791
+
792
+ .template-center-chapter-dialog .el-dialog__body {
793
+ flex: 1;
794
+ min-height: 60vh;
795
+ padding: 24px 20px;
796
+ background: #fff;
797
+ color: #606266;
798
+ font-size: clamp(12px, calc(14 * 100vw / 1920), 14px);
799
+ line-height: 1.6;
800
+ overflow-y: auto;
801
+ }
802
+ </style>