aegon-lv97 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 (78) hide show
  1. package/gen-ai/build-report/chartStreamRefs.ts +227 -0
  2. package/gen-ai/build-report/coherence-check/index.vue +559 -0
  3. package/gen-ai/build-report/components/ReportChapterWorkspace.vue +4571 -0
  4. package/gen-ai/build-report/components/ReportConfigPanel.vue +727 -0
  5. package/gen-ai/build-report/components/ReportGenerateSettingsPanel.vue +2361 -0
  6. package/gen-ai/build-report/components/ReportGeneratingPanel.vue +1765 -0
  7. package/gen-ai/build-report/components/ReportPromptPanel.vue +625 -0
  8. package/gen-ai/build-report/components/ReportSourceFileSummary.vue +665 -0
  9. package/gen-ai/build-report/components/ReportSourcesPanel.vue +1327 -0
  10. package/gen-ai/build-report/components/ReportTemplateDetail.vue +191 -0
  11. package/gen-ai/build-report/components/ReportTemplateEditorFormPanel.vue +667 -0
  12. package/gen-ai/build-report/components/ReportTemplatePicker.vue +302 -0
  13. package/gen-ai/build-report/components/ReportWorkflowSidebar.vue +148 -0
  14. package/gen-ai/build-report/components/paramsSetting.vue +886 -0
  15. package/gen-ai/build-report/components/reportEdit.vue +2283 -0
  16. package/gen-ai/build-report/index.vue +856 -0
  17. package/gen-ai/build-report/report-domain.ts +1133 -0
  18. package/gen-ai/build-report/report-template-data.ts +295 -0
  19. package/gen-ai/build-report/useReportWorkflow.ts +1386 -0
  20. package/gen-ai/common/assets/NotoSans-SC.woff2 +0 -0
  21. package/gen-ai/common/assets/NotoSans-TC.woff2 +0 -0
  22. package/gen-ai/common/assets/NotoSans.woff2 +0 -0
  23. package/gen-ai/common/assets/fonts.css +278 -0
  24. package/gen-ai/common/assets/pagination.css +163 -0
  25. package/gen-ai/common/directives/btnLoading.ts +455 -0
  26. package/gen-ai/common/directives/debounce.ts +98 -0
  27. package/gen-ai/common/directives/index.ts +30 -0
  28. package/gen-ai/common/en.md +417 -0
  29. package/gen-ai/common/index.ts +36 -0
  30. package/gen-ai/common/types/component-expose.ts +9 -0
  31. package/gen-ai/common/utils/api-res-status.ts +7 -0
  32. package/gen-ai/common/utils/navigation.ts +59 -0
  33. package/gen-ai/common/utils/remote-request.ts +45 -0
  34. package/gen-ai/common/utils/scroll.ts +577 -0
  35. package/gen-ai/components/AIExport/docx-export.ts +950 -0
  36. package/gen-ai/components/AIExport/docxExport.ts +2566 -0
  37. package/gen-ai/components/AIExport/index.ts +52 -0
  38. package/gen-ai/components/AIExport/parseMarkdownHtml.ts +653 -0
  39. package/gen-ai/components/CapsuleScrollbar.vue +149 -0
  40. package/gen-ai/components/ChapterTitleScroll.vue +468 -0
  41. package/gen-ai/components/EntryHeroNavCards.vue +379 -0
  42. package/gen-ai/components/GenAiPagination.vue +52 -0
  43. package/gen-ai/components/ModelCard.vue +1114 -0
  44. package/gen-ai/components/Preview/FilePreviewPage.vue +949 -0
  45. package/gen-ai/components/Preview/PreviewCapsuleScroll.vue +205 -0
  46. package/gen-ai/components/Preview/PreviewOutlineTree.vue +148 -0
  47. package/gen-ai/components/Preview/index.ts +11 -0
  48. package/gen-ai/components/Preview/preview.ts +724 -0
  49. package/gen-ai/components/PromptField.vue +505 -0
  50. package/gen-ai/components/RecentReportsTable.vue +974 -0
  51. package/gen-ai/components/ReportCollapsibleSection.vue +172 -0
  52. package/gen-ai/components/ReportHistoryList.vue +637 -0
  53. package/gen-ai/components/ReportSectionConfirmPopover.vue +251 -0
  54. package/gen-ai/components/editor/ChapterTiptapEditor.vue +3718 -0
  55. package/gen-ai/components/editor/StructureBlockView.vue +441 -0
  56. package/gen-ai/components/editor/TiptapToolbar.vue +1036 -0
  57. package/gen-ai/components/editor/TypewriterDocEditor.vue +422 -0
  58. package/gen-ai/components/editor/_StructureOrgNode.vue +326 -0
  59. package/gen-ai/components/editor/index.ts +28 -0
  60. package/gen-ai/components/editor/parseMarkdownHtml.ts +754 -0
  61. package/gen-ai/components/editor/reviewCitationTip.ts +163 -0
  62. package/gen-ai/gen-entry/api/index.ts +32 -0
  63. package/gen-ai/gen-entry/index.vue +287 -0
  64. package/gen-ai/gen-entry/types/index.ts +4 -0
  65. package/gen-ai/i.mark +2 -0
  66. package/gen-ai/management-center/index.vue +1815 -0
  67. package/gen-ai/management-center/mockData.ts +248 -0
  68. package/gen-ai/management-center/types/index.ts +37 -0
  69. package/gen-ai/model-manager/TemplateEditorFormPanel.vue +661 -0
  70. package/gen-ai/model-manager/api/index.ts +32 -0
  71. package/gen-ai/model-manager/api/mockApi.ts +33 -0
  72. package/gen-ai/model-manager/index.vue +1583 -0
  73. package/gen-ai/model-manager/mockData.ts +177 -0
  74. package/gen-ai/model-manager/template-detail-shared.ts +154 -0
  75. package/gen-ai/model-manager/template-editor.vue +345 -0
  76. package/gen-ai/model-manager/types/index.ts +40 -0
  77. package/gen-ai/model-manager/utils.ts +25 -0
  78. package/package.json +12 -0
@@ -0,0 +1,205 @@
1
+ <template>
2
+ <el-scrollbar ref="scrollRef" class="preview-capsule-scroll" :always="true">
3
+ <slot />
4
+ </el-scrollbar>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { ElScrollbar } from 'element-plus'
9
+ import { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
10
+
11
+ defineOptions({ name: 'PreviewCapsuleScroll' })
12
+
13
+ /** 正文區同款:8×比例高(最短 50)、#999、全圓角 */
14
+ const THUMB_MIN_PX = 50
15
+ const THUMB_W = 8
16
+
17
+ const scrollRef = ref<InstanceType<typeof ElScrollbar> | null>(null)
18
+
19
+ let thumbObserver: MutationObserver | null = null
20
+ let resizeObserver: ResizeObserver | null = null
21
+ let wrapEl: HTMLElement | null = null
22
+ let onScroll: (() => void) | null = null
23
+
24
+ function getRoot() {
25
+ return scrollRef.value?.$el as HTMLElement | undefined
26
+ }
27
+
28
+ function hideNativeScrollbar(wrap: HTMLElement) {
29
+ wrap.style.setProperty('scrollbar-width', 'none', 'important')
30
+ wrap.style.setProperty('-ms-overflow-style', 'none', 'important')
31
+ wrap.setAttribute('data-preview-capsule-wrap', '1')
32
+ }
33
+
34
+ function lockThumb() {
35
+ thumbObserver?.disconnect()
36
+ resizeObserver?.disconnect()
37
+ if (wrapEl && onScroll) wrapEl.removeEventListener('scroll', onScroll)
38
+ thumbObserver = null
39
+ resizeObserver = null
40
+ wrapEl = null
41
+ onScroll = null
42
+
43
+ const root = getRoot()
44
+ if (!root) return
45
+
46
+ const wrap = root.querySelector('.el-scrollbar__wrap') as HTMLElement | null
47
+ const bar = root.querySelector('.el-scrollbar__bar.is-vertical') as HTMLElement | null
48
+ const thumb = bar?.querySelector('.el-scrollbar__thumb') as HTMLElement | null
49
+ if (!wrap || !bar || !thumb) return
50
+
51
+ hideNativeScrollbar(wrap)
52
+ root.style.setProperty('height', '100%', 'important')
53
+ root.style.setProperty('max-height', '100%', 'important')
54
+ wrap.style.setProperty('height', '100%', 'important')
55
+ wrap.style.setProperty('max-height', '100%', 'important')
56
+ wrap.style.setProperty('overflow-x', 'hidden', 'important')
57
+ wrap.style.setProperty('overflow-y', 'scroll', 'important')
58
+
59
+ let applying = false
60
+ const apply = () => {
61
+ if (applying) return
62
+ applying = true
63
+
64
+ const clientH = wrap.clientHeight
65
+ const scrollH = wrap.scrollHeight
66
+ const trackH = Math.max(0, clientH)
67
+ const needsScroll = scrollH > clientH + 1
68
+
69
+ bar.style.cssText = [
70
+ `display:${needsScroll ? 'block' : 'none'} !important`,
71
+ `opacity:${needsScroll ? '1' : '0'} !important`,
72
+ `width:${THUMB_W}px !important`,
73
+ 'right:2px !important',
74
+ 'top:2px !important',
75
+ 'bottom:2px !important',
76
+ 'left:auto !important',
77
+ 'height:auto !important',
78
+ 'background:transparent !important',
79
+ 'border-radius:9999px !important',
80
+ 'z-index:20 !important',
81
+ ].join(';')
82
+
83
+ if (!needsScroll || trackH <= 0) {
84
+ applying = false
85
+ return
86
+ }
87
+
88
+ const proportional = Math.floor(trackH * (clientH / scrollH))
89
+ const thumbH = Math.min(trackH, Math.max(THUMB_MIN_PX, proportional))
90
+ const maxScroll = scrollH - clientH
91
+ const maxOffset = Math.max(0, trackH - thumbH)
92
+ const y = maxScroll > 0 ? (wrap.scrollTop / maxScroll) * maxOffset : 0
93
+
94
+ thumb.style.cssText = [
95
+ 'display:block !important',
96
+ `width:${THUMB_W}px !important`,
97
+ 'left:0 !important',
98
+ 'right:auto !important',
99
+ `height:${thumbH}px !important`,
100
+ `min-height:${thumbH}px !important`,
101
+ `max-height:${thumbH}px !important`,
102
+ 'border-radius:9999px !important',
103
+ 'background-color:#999 !important',
104
+ 'opacity:1 !important',
105
+ 'cursor:pointer !important',
106
+ `transform:translateY(${y}px)`,
107
+ ].join(';')
108
+
109
+ applying = false
110
+ }
111
+
112
+ apply()
113
+ onScroll = () => apply()
114
+ wrap.addEventListener('scroll', onScroll, { passive: true })
115
+ wrapEl = wrap
116
+ thumbObserver = new MutationObserver(() => apply())
117
+ thumbObserver.observe(thumb, { attributes: true, attributeFilter: ['style'] })
118
+ thumbObserver.observe(bar, { attributes: true, attributeFilter: ['style'] })
119
+ resizeObserver = new ResizeObserver(() => apply())
120
+ resizeObserver.observe(wrap)
121
+ resizeObserver.observe(root)
122
+ }
123
+
124
+ function refresh() {
125
+ void nextTick(() => {
126
+ lockThumb()
127
+ requestAnimationFrame(() => lockThumb())
128
+ })
129
+ }
130
+
131
+ onMounted(() => refresh())
132
+ onBeforeUnmount(() => {
133
+ thumbObserver?.disconnect()
134
+ resizeObserver?.disconnect()
135
+ if (wrapEl && onScroll) wrapEl.removeEventListener('scroll', onScroll)
136
+ thumbObserver = null
137
+ resizeObserver = null
138
+ wrapEl = null
139
+ onScroll = null
140
+ })
141
+
142
+ watch(
143
+ () => scrollRef.value,
144
+ () => refresh()
145
+ )
146
+
147
+ defineExpose({
148
+ refresh,
149
+ getWrap: () => getRoot()?.querySelector('.el-scrollbar__wrap') as HTMLElement | null,
150
+ getRoot,
151
+ })
152
+ </script>
153
+
154
+ <style>
155
+ /* 隱藏原生條,只留膠囊(目錄 / 正文同一套) */
156
+ .preview-capsule-scroll.el-scrollbar {
157
+ height: 100% !important;
158
+ max-height: 100% !important;
159
+ width: 100% !important;
160
+ }
161
+
162
+ .preview-capsule-scroll .el-scrollbar__wrap,
163
+ [data-preview-capsule-wrap='1'] {
164
+ height: 100% !important;
165
+ max-height: 100% !important;
166
+ overflow-x: hidden !important;
167
+ overflow-y: scroll !important;
168
+ scrollbar-width: none !important;
169
+ -ms-overflow-style: none !important;
170
+ }
171
+
172
+ .preview-capsule-scroll .el-scrollbar__wrap::-webkit-scrollbar,
173
+ [data-preview-capsule-wrap='1']::-webkit-scrollbar {
174
+ width: 0 !important;
175
+ height: 0 !important;
176
+ display: none !important;
177
+ background: transparent !important;
178
+ }
179
+
180
+ .preview-capsule-scroll .el-scrollbar__bar.is-horizontal {
181
+ display: none !important;
182
+ }
183
+
184
+ .preview-capsule-scroll .el-scrollbar__bar.is-vertical {
185
+ width: 8px !important;
186
+ right: 2px !important;
187
+ top: 2px !important;
188
+ bottom: 2px !important;
189
+ opacity: 1 !important;
190
+ background: transparent !important;
191
+ border-radius: 9999px !important;
192
+ z-index: 20 !important;
193
+ }
194
+
195
+ .preview-capsule-scroll .el-scrollbar__bar.is-vertical .el-scrollbar__thumb {
196
+ width: 8px !important;
197
+ border-radius: 9999px !important;
198
+ background-color: #999 !important;
199
+ opacity: 1 !important;
200
+ }
201
+
202
+ .preview-capsule-scroll .el-scrollbar__bar.is-vertical .el-scrollbar__thumb:hover {
203
+ background-color: #777 !important;
204
+ }
205
+ </style>
@@ -0,0 +1,148 @@
1
+ <!-- Aug25preview -->
2
+ <template>
3
+ <ul class="file-preview-page__outline-list">
4
+ <li v-for="item in items" :key="item.id" class="file-preview-page__outline-item">
5
+ <div
6
+ class="file-preview-page__outline-row"
7
+ :class="[`is-level-${item.level}`, { 'is-active': activeId === item.id }]"
8
+ >
9
+ <button
10
+ type="button"
11
+ class="file-preview-page__outline-link"
12
+ @click="emit('select', item.id)"
13
+ >
14
+ {{ item.title }}
15
+ </button>
16
+ <button
17
+ v-if="item.children?.length"
18
+ type="button"
19
+ class="file-preview-page__outline-chevron"
20
+ :aria-label="expandedIds.has(item.id) ? '收起' : '展開'"
21
+ @click.stop="emit('toggle', item.id)"
22
+ >
23
+ <el-icon :size="14">
24
+ <ArrowUpBold v-if="expandedIds.has(item.id)" />
25
+ <ArrowDownBold v-else />
26
+ </el-icon>
27
+ </button>
28
+ <span v-else class="file-preview-page__outline-chevron-placeholder" />
29
+ </div>
30
+ <PreviewOutlineTree
31
+ v-if="item.children?.length && expandedIds.has(item.id)"
32
+ :items="item.children"
33
+ :expanded-ids="expandedIds"
34
+ :active-id="activeId"
35
+ @toggle="emit('toggle', $event)"
36
+ @select="emit('select', $event)"
37
+ />
38
+ </li>
39
+ </ul>
40
+ </template>
41
+
42
+ <script setup lang="ts">
43
+ //Aug25preview
44
+ import { ArrowDownBold, ArrowUpBold } from '@element-plus/icons-vue'
45
+ import { ElIcon } from 'element-plus'
46
+ import type { PreviewOutlineItem } from './preview'
47
+
48
+ defineOptions({ name: 'PreviewOutlineTree' })
49
+
50
+ defineProps<{
51
+ items: PreviewOutlineItem[]
52
+ expandedIds: Set<string>
53
+ activeId?: string
54
+ }>()
55
+
56
+ const emit = defineEmits<{
57
+ toggle: [id: string]
58
+ select: [id: string]
59
+ }>()
60
+ //Aug25preview
61
+ </script>
62
+
63
+ <style scoped>
64
+ .file-preview-page__outline-list {
65
+ list-style: none;
66
+ margin: 0;
67
+ padding: 0;
68
+ font-family: var(--gen-ai-font-family, 'Noto Sans', 'Noto Sans TC', sans-serif);
69
+ font-size: 16px;
70
+ font-weight: 500;
71
+ color: #303133;
72
+ }
73
+
74
+ .file-preview-page__outline-row {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 4px;
78
+ border-radius: 4px;
79
+ /* 箭頭與側欄滾動條分開,避免重疊 */
80
+ padding-right: 4px;
81
+ box-sizing: border-box;
82
+ }
83
+
84
+ .file-preview-page__outline-row.is-active {
85
+ background: #e8e8e8;
86
+ }
87
+
88
+ .file-preview-page__outline-row:hover {
89
+ background: #ededed;
90
+ }
91
+
92
+ .file-preview-page__outline-chevron,
93
+ .file-preview-page__outline-link,
94
+ .file-preview-page__outline-chevron-placeholder {
95
+ border: none;
96
+ background: transparent;
97
+ font-family: inherit;
98
+ color: inherit;
99
+ cursor: pointer;
100
+ }
101
+
102
+ .file-preview-page__outline-chevron,
103
+ .file-preview-page__outline-chevron-placeholder {
104
+ width: 22px;
105
+ height: 22px;
106
+ flex-shrink: 0;
107
+ display: inline-flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ color: #303133;
111
+ }
112
+
113
+ .file-preview-page__outline-link {
114
+ flex: 1;
115
+ min-width: 0;
116
+ padding: 6px 4px 6px 0;
117
+ text-align: left;
118
+ font-family: var(--gen-ai-font-family, 'Noto Sans', 'Noto Sans TC', sans-serif);
119
+ font-size: 16px;
120
+ font-weight: 500;
121
+ color: #303133;
122
+ line-height: 1.4;
123
+ word-break: break-word;
124
+ }
125
+
126
+ /* 選中二級大綱後字體加粗 */
127
+ .file-preview-page__outline-row.is-level-2.is-active .file-preview-page__outline-link {
128
+ font-weight: 700;
129
+ }
130
+
131
+ .file-preview-page__outline-row.is-level-2 .file-preview-page__outline-link,
132
+ .file-preview-page__outline-row.is-level-3 .file-preview-page__outline-link {
133
+ padding-left: 4px;
134
+ }
135
+
136
+ .file-preview-page__outline-row.is-level-2 {
137
+ padding-left: 12px;
138
+ }
139
+
140
+ .file-preview-page__outline-row.is-level-3 {
141
+ padding-left: 24px;
142
+ }
143
+
144
+ .file-preview-page__outline-row.is-level-4 {
145
+ padding-left: 36px;
146
+ }
147
+ </style>
148
+ <!-- Aug25preview -->
@@ -0,0 +1,11 @@
1
+ /**
2
+ * GEN-AI 檔案預覽
3
+ * - FilePreviewPage.vue — 預覽頁(路由入口)
4
+ * - PreviewOutlineTree.vue — 左側大綱樹
5
+ * - PreviewCapsuleScroll.vue — 目錄/正文共用膠囊滾動條(UI 必須一致)
6
+ * - preview.ts — 打開預覽、Blob 緩存、大綱、mammoth、docx-preview
7
+ */
8
+ export { default as FilePreviewPage } from './FilePreviewPage.vue'
9
+ export * from './preview'
10
+ export { default as PreviewCapsuleScroll } from './PreviewCapsuleScroll.vue'
11
+ export { default as PreviewOutlineTree } from './PreviewOutlineTree.vue'