qy-better-lib 0.0.1

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 (185) hide show
  1. package/.vscode/extensions.json +3 -0
  2. package/LICENSE +24 -0
  3. package/README.md +2 -0
  4. package/index.html +13 -0
  5. package/package.json +37 -0
  6. package/packages/core/DOCUMENTATION.md +2681 -0
  7. package/packages/core/LICENSE +24 -0
  8. package/packages/core/package.json +67 -0
  9. package/packages/core/types/index.d.ts +39 -0
  10. package/packages/core/types/json.d.ts +4 -0
  11. package/packages/core/types/vue.shim.d.ts +5 -0
  12. package/packages/core/vitest.config.ts +15 -0
  13. package/packages/core/yarn.lock +1233 -0
  14. package/packages/hooks/DOCUMENTATION.md +634 -0
  15. package/packages/hooks/LICENSE +24 -0
  16. package/packages/hooks/__tests__/use-chart/index.test.ts +287 -0
  17. package/packages/hooks/__tests__/use-emit/index.test.ts +248 -0
  18. package/packages/hooks/__tests__/use-fullscreen/index.test.ts +162 -0
  19. package/packages/hooks/__tests__/use-image/index.test.ts +230 -0
  20. package/packages/hooks/__tests__/use-layout-flow/index.test.ts +382 -0
  21. package/packages/hooks/__tests__/use-mqtt/index.test.ts +392 -0
  22. package/packages/hooks/__tests__/use-print/index.test.ts +378 -0
  23. package/packages/hooks/__tests__/use-watermark/index.test.ts +277 -0
  24. package/packages/hooks/__tests__/use-websocket/index.test.ts +402 -0
  25. package/packages/hooks/package.json +104 -0
  26. package/packages/hooks/types/index.d.ts +1 -0
  27. package/packages/hooks/types/json.d.ts +4 -0
  28. package/packages/hooks/types/vue.shim.d.ts +5 -0
  29. package/packages/hooks/yarn.lock +1832 -0
  30. package/packages/lowcode/core/package.json +60 -0
  31. package/packages/lowcode/core/types/index.d.ts +1 -0
  32. package/packages/lowcode/core/types/json.d.ts +4 -0
  33. package/packages/lowcode/core/types/vue.shim.d.ts +5 -0
  34. package/packages/lowcode/core/vite.dist.min.config.js +40 -0
  35. package/packages/lowcode/core/vite.dist.min.config.js.map +1 -0
  36. package/packages/lowcode/core/vite.lib.config.js +74 -0
  37. package/packages/lowcode/core/vite.lib.config.js.map +1 -0
  38. package/packages/lowcode/core/yarn.lock +1132 -0
  39. package/packages/lowcode/mobile/package.json +63 -0
  40. package/packages/lowcode/mobile/types/index.d.ts +1 -0
  41. package/packages/lowcode/mobile/types/json.d.ts +4 -0
  42. package/packages/lowcode/mobile/types/vue.shim.d.ts +77 -0
  43. package/packages/lowcode/mobile/vite.config.js +11 -0
  44. package/packages/lowcode/mobile/vite.config.js.map +1 -0
  45. package/packages/lowcode/mobile/vite.dist.min.config.js +71 -0
  46. package/packages/lowcode/mobile/vite.dist.min.config.js.map +1 -0
  47. package/packages/lowcode/mobile/vite.lib.config.js +137 -0
  48. package/packages/lowcode/mobile/vite.lib.config.js.map +1 -0
  49. package/packages/lowcode/mobile/yarn.lock +3888 -0
  50. package/packages/lowcode/pc/package.json +64 -0
  51. package/packages/lowcode/pc/vite.config.js +11 -0
  52. package/packages/lowcode/pc/vite.config.js.map +1 -0
  53. package/packages/lowcode/pc/vite.dist.min.config.js +71 -0
  54. package/packages/lowcode/pc/vite.dist.min.config.js.map +1 -0
  55. package/packages/lowcode/pc/vite.lib.config.js +137 -0
  56. package/packages/lowcode/pc/vite.lib.config.js.map +1 -0
  57. package/packages/lowcode/pc/yarn.lock +4026 -0
  58. package/packages/pc_components/DOCUMENTATION.md +566 -0
  59. package/packages/pc_components/LICENSE +24 -0
  60. package/packages/pc_components/lib/commDialog/index.d.ts +3 -0
  61. package/packages/pc_components/lib/commDialog/index.js +8 -0
  62. package/packages/pc_components/lib/commDialog/src/index.vue.d.ts +102 -0
  63. package/packages/pc_components/lib/commDialog/src/index.vue.js +43 -0
  64. package/packages/pc_components/lib/commDialog/src/index.vue2.js +4 -0
  65. package/packages/pc_components/lib/commDialog/src/props.d.ts +49 -0
  66. package/packages/pc_components/lib/commDialog/src/props.js +48 -0
  67. package/packages/pc_components/lib/commDialog/src/type.d.ts +39 -0
  68. package/packages/pc_components/lib/commForm/index.d.ts +3 -0
  69. package/packages/pc_components/lib/commForm/index.js +8 -0
  70. package/packages/pc_components/lib/commForm/src/index.vue.d.ts +95 -0
  71. package/packages/pc_components/lib/commForm/src/index.vue.js +50 -0
  72. package/packages/pc_components/lib/commForm/src/index.vue2.js +4 -0
  73. package/packages/pc_components/lib/commForm/src/props.d.ts +49 -0
  74. package/packages/pc_components/lib/commForm/src/props.js +47 -0
  75. package/packages/pc_components/lib/commForm/src/type.d.ts +8 -0
  76. package/packages/pc_components/lib/contextMenu/index.d.ts +5 -0
  77. package/packages/pc_components/lib/contextMenu/index.js +8 -0
  78. package/packages/pc_components/lib/contextMenu/src/index.vue.d.ts +91 -0
  79. package/packages/pc_components/lib/contextMenu/src/index.vue.js +153 -0
  80. package/packages/pc_components/lib/contextMenu/src/index.vue2.js +4 -0
  81. package/packages/pc_components/lib/contextMenu/src/props.d.ts +32 -0
  82. package/packages/pc_components/lib/contextMenu/src/props.js +27 -0
  83. package/packages/pc_components/lib/contextMenu/src/type.d.ts +11 -0
  84. package/packages/pc_components/lib/describeView/index.d.ts +2 -0
  85. package/packages/pc_components/lib/describeView/index.js +7 -0
  86. package/packages/pc_components/lib/describeView/src/index.vue.d.ts +61 -0
  87. package/packages/pc_components/lib/describeView/src/index.vue.js +84 -0
  88. package/packages/pc_components/lib/describeView/src/index.vue2.js +4 -0
  89. package/packages/pc_components/lib/describeView/src/props.d.ts +35 -0
  90. package/packages/pc_components/lib/describeView/src/props.js +33 -0
  91. package/packages/pc_components/lib/describeView/src/type.d.ts +10 -0
  92. package/packages/pc_components/lib/index.d.ts +18 -0
  93. package/packages/pc_components/lib/index.js +40 -0
  94. package/packages/pc_components/lib/simpleVirtualList/index.d.ts +2 -0
  95. package/packages/pc_components/lib/simpleVirtualList/index.js +7 -0
  96. package/packages/pc_components/lib/simpleVirtualList/src/index.vue.d.ts +28 -0
  97. package/packages/pc_components/lib/simpleVirtualList/src/index.vue.js +101 -0
  98. package/packages/pc_components/lib/simpleVirtualList/src/index.vue2.js +4 -0
  99. package/packages/pc_components/lib/simpleVirtualList/src/type.d.ts +12 -0
  100. package/packages/pc_components/lib/styles/comm-form.scss +4 -0
  101. package/packages/pc_components/lib/styles/context-menu.scss +47 -0
  102. package/packages/pc_components/lib/styles/describe-view.scss +25 -0
  103. package/packages/pc_components/lib/styles/index.scss +6 -0
  104. package/packages/pc_components/lib/styles/simple-virtual-list.scss +25 -0
  105. package/packages/pc_components/lib/styles/table-extend.scss +100 -0
  106. package/packages/pc_components/lib/styles/text-button.scss +71 -0
  107. package/packages/pc_components/lib/tableExtend/index.d.ts +3 -0
  108. package/packages/pc_components/lib/tableExtend/index.js +7 -0
  109. package/packages/pc_components/lib/tableExtend/props.d.ts +130 -0
  110. package/packages/pc_components/lib/tableExtend/props.js +128 -0
  111. package/packages/pc_components/lib/tableExtend/src/colVisible.vue.d.ts +3 -0
  112. package/packages/pc_components/lib/tableExtend/src/colVisible.vue.js +128 -0
  113. package/packages/pc_components/lib/tableExtend/src/colVisible.vue2.js +4 -0
  114. package/packages/pc_components/lib/tableExtend/src/index.vue.d.ts +186 -0
  115. package/packages/pc_components/lib/tableExtend/src/index.vue.js +234 -0
  116. package/packages/pc_components/lib/tableExtend/src/index.vue2.js +4 -0
  117. package/packages/pc_components/lib/tableExtend/src/valueCol.vue.d.ts +24 -0
  118. package/packages/pc_components/lib/tableExtend/src/valueCol.vue.js +29 -0
  119. package/packages/pc_components/lib/tableExtend/src/valueCol.vue2.js +4 -0
  120. package/packages/pc_components/lib/tableExtend/type.d.ts +165 -0
  121. package/packages/pc_components/lib/tableExtend/type.js +9 -0
  122. package/packages/pc_components/lib/tableExtend/useTable.d.ts +27 -0
  123. package/packages/pc_components/lib/tableExtend/useTable.js +115 -0
  124. package/packages/pc_components/lib/textButton/index.d.ts +2 -0
  125. package/packages/pc_components/lib/textButton/index.js +7 -0
  126. package/packages/pc_components/lib/textButton/src/index.vue.d.ts +42 -0
  127. package/packages/pc_components/lib/textButton/src/index.vue.js +44 -0
  128. package/packages/pc_components/lib/textButton/src/index.vue2.js +4 -0
  129. package/packages/pc_components/lib/textButton/src/props.d.ts +23 -0
  130. package/packages/pc_components/lib/textButton/src/props.js +30 -0
  131. package/packages/pc_components/lib/textButton/src/type.d.ts +30 -0
  132. package/packages/pc_components/lib/utils/index.d.ts +77 -0
  133. package/packages/pc_components/lib/utils/index.js +124 -0
  134. package/packages/pc_components/package.json +73 -0
  135. package/packages/pc_components/types/index.d.ts +9 -0
  136. package/packages/pc_components/types/json.d.ts +4 -0
  137. package/packages/pc_components/types/vue.shim.d.ts +5 -0
  138. package/packages/pc_components/yarn.lock +1641 -0
  139. package/postcss.config.js +19 -0
  140. package/public/vite.svg +1 -0
  141. package/src/App.vue +37 -0
  142. package/src/api/index.ts +42 -0
  143. package/src/assets/vue.svg +1 -0
  144. package/src/document/core.md +2680 -0
  145. package/src/document/hooks.md +632 -0
  146. package/src/document/pc_components.md +566 -0
  147. package/src/locales/en.json +1 -0
  148. package/src/locales/zh-cn.json +1 -0
  149. package/src/main.ts +13 -0
  150. package/src/plugins/element-plus.ts +16 -0
  151. package/src/plugins/i18n.ts +17 -0
  152. package/src/plugins/index.ts +13 -0
  153. package/src/plugins/store.ts +12 -0
  154. package/src/router/index.ts +20 -0
  155. package/src/shared/chartType.ts +279 -0
  156. package/src/shared/const.ts +160 -0
  157. package/src/shared/lib.ts +129 -0
  158. package/src/shared/request.ts +255 -0
  159. package/src/shared/type.ts +48 -0
  160. package/src/shared/utils/date.ts +83 -0
  161. package/src/shared/utils/utils.ts +85 -0
  162. package/src/store/index.ts +22 -0
  163. package/src/store/modules/app.ts +17 -0
  164. package/src/store/modules/shared.ts +21 -0
  165. package/src/styles/index.scss +169 -0
  166. package/src/types/app.d.ts +23 -0
  167. package/src/types/echarts.d.ts +5 -0
  168. package/src/types/index.d.ts +1 -0
  169. package/src/types/json.d.ts +4 -0
  170. package/src/types/scss.d.ts +9 -0
  171. package/src/types/vue.shim.d.ts +5 -0
  172. package/src/views/docs/docs-content.vue +379 -0
  173. package/src/views/docs/docs-header.vue +130 -0
  174. package/src/views/docs/docs-sidebar.vue +76 -0
  175. package/src/views/docs/hooks.ts +600 -0
  176. package/src/views/docs/index.vue +30 -0
  177. package/src/views/docs/styles/docs-content.scss +106 -0
  178. package/src/views/docs/styles/docs-header.scss +20 -0
  179. package/src/views/docs/styles/docs-sidebar.scss +182 -0
  180. package/src/views/docs/styles/index.scss +14 -0
  181. package/src/views/docs/type.ts +101 -0
  182. package/src/views/index.vue +34 -0
  183. package/tsconfig.json +37 -0
  184. package/tsconfig.node.json +8 -0
  185. package/vite.config.ts +54 -0
@@ -0,0 +1,23 @@
1
+ import Vue from "vue";
2
+
3
+ declare global {
4
+ interface Window {}
5
+
6
+ interface ImportMetaEnv {
7
+ /** 接口默认入口 */
8
+ readonly VITE_DEFAULT_API: string;
9
+ // 根路径
10
+ readonly BASE_URL: string;
11
+ // 环境类型
12
+ readonly MODE: string;
13
+ }
14
+
15
+ interface ImportMeta {
16
+ readonly env: ImportMetaEnv;
17
+ glob<T = unknown>(
18
+ globPath: string | string[],
19
+ options?: any
20
+ ): Record<string, T>;
21
+ globEager<T = unknown>(globPath: string): Record<string, T>;
22
+ }
23
+ }
@@ -0,0 +1,5 @@
1
+ declare module 'echarts' {
2
+ const echarts: any;
3
+ export default echarts;
4
+ export = echarts;
5
+ }
@@ -0,0 +1 @@
1
+ declare type $TODO = any
@@ -0,0 +1,4 @@
1
+ declare module "*.json" {
2
+ const value: any;
3
+ export default value;
4
+ }
@@ -0,0 +1,9 @@
1
+ interface ICSSModuleExport {
2
+ [className: string]: string
3
+ }
4
+
5
+ declare const cssModuleExport: ICSSModuleExport
6
+
7
+ declare module '*.scss' {
8
+ export = cssModuleExport
9
+ }
@@ -0,0 +1,5 @@
1
+ declare module '*.vue' {
2
+ import { ComponentOptions } from 'vue'
3
+ const Component: ComponentOptions
4
+ export default Component
5
+ }
@@ -0,0 +1,379 @@
1
+ <script setup lang="ts">
2
+ import type { DocItem } from './type';
3
+ import { onMounted, onUnmounted, watch } from 'vue';
4
+ import { ElMessage } from 'element-plus';
5
+ import { on, off } from '@qy_better_lib/core';
6
+
7
+ const props = defineProps<{
8
+ /**
9
+ * 选中的文档
10
+ */
11
+ selectedDoc: DocItem | null;
12
+ /**
13
+ * 渲染后的内容
14
+ */
15
+ renderedContent: string;
16
+ }>();
17
+
18
+ /**
19
+ * 声明MutationObserver变量
20
+ */
21
+ let observer: any = null;
22
+
23
+ // 监听内容变化
24
+ watch(() => props.renderedContent, () => {
25
+ // 等待DOM更新
26
+ setTimeout(add_copy_buttons, 100);
27
+ });
28
+
29
+ // 组件挂载后添加复制按钮
30
+ onMounted(() => {
31
+ add_copy_buttons();
32
+
33
+ // 使用MutationObserver监听DOM变化
34
+ observer = new MutationObserver(() => {
35
+ add_copy_buttons();
36
+ });
37
+
38
+ const content_element = document.querySelector('.doc-content');
39
+ if (content_element && observer) {
40
+ observer.observe(content_element, {
41
+ childList: true,
42
+ subtree: true
43
+ });
44
+ }
45
+
46
+ // 监听卡片点击事件
47
+ on(window, 'card-click', handle_card_click);
48
+ });
49
+
50
+ // 组件卸载时停止观察
51
+ onUnmounted(() => {
52
+ if (observer) {
53
+ observer.disconnect();
54
+ observer = null;
55
+ }
56
+
57
+ // 移除卡片点击事件监听器
58
+ off(window, 'card-click', handle_card_click);
59
+ });
60
+
61
+ /**
62
+ * 复制到剪贴板
63
+ * @param text 要复制的文本
64
+ * @param id 按钮ID
65
+ */
66
+ function copy_to_clipboard(text: string, id: string) {
67
+ navigator.clipboard.writeText(text).then(() => {
68
+ ElMessage({
69
+ message: '已复制',
70
+ type: 'success',
71
+ duration: 2000
72
+ });
73
+ }).catch(err => {
74
+ console.error('复制失败:', err);
75
+ ElMessage({
76
+ message: '复制失败',
77
+ type: 'error',
78
+ duration: 2000
79
+ });
80
+ });
81
+ }
82
+
83
+ /**
84
+ * 为代码块添加复制按钮
85
+ */
86
+ function add_copy_buttons() {
87
+ const pre_elements = document.querySelectorAll('.doc-content pre');
88
+
89
+ pre_elements.forEach((pre, index) => {
90
+ // 避免重复添加
91
+ if (!pre.querySelector('.copy-btn')) {
92
+ const code_element = pre.querySelector('code');
93
+ if (code_element) {
94
+ const code_text = code_element.textContent || '';
95
+ const btn_id = `copy-btn-${index}-${Date.now()}`;
96
+
97
+ // 创建复制按钮
98
+ const copy_btn = document.createElement('button');
99
+ copy_btn.className = 'copy-btn';
100
+ copy_btn.id = btn_id;
101
+ copy_btn.textContent = '复制';
102
+ copy_btn.title = '复制代码到剪贴板';
103
+
104
+ // 添加点击事件
105
+ copy_btn.addEventListener('click', () => {
106
+ copy_to_clipboard(code_text, btn_id);
107
+ });
108
+
109
+ // 添加到pre元素
110
+ pre.appendChild(copy_btn);
111
+ }
112
+ }
113
+ });
114
+ }
115
+
116
+ /**
117
+ * 卡片点击事件处理函数
118
+ * @param event 自定义事件对象
119
+ */
120
+ function handle_card_click(event: any) {
121
+ const doc_id = event.detail?.id;
122
+ if (doc_id) {
123
+ // 触发自定义事件,通知父组件更新选中的文档
124
+ window.dispatchEvent(new CustomEvent('update-selected-doc', { detail: { id: doc_id } }));
125
+ }
126
+ }
127
+ </script>
128
+
129
+ <template>
130
+ <main class="docs-main">
131
+ <template v-if="selectedDoc" class="doc-detail">
132
+ <!-- 只对非功能概览文档显示标题 -->
133
+ <div v-if="selectedDoc.type !== 'overview'" class="doc-header">
134
+ <h2>{{ selectedDoc.name }}</h2>
135
+ </div>
136
+
137
+ <div class="doc-content">
138
+ <!-- 只对非功能概览文档显示详细说明标题 -->
139
+ <h3 v-if="selectedDoc.type !== 'overview'">详细说明</h3>
140
+ <div v-html="renderedContent"></div>
141
+ </div>
142
+ </template>
143
+ <div v-else class="doc-empty">
144
+ <div class="empty-content">
145
+ <p>请选择一个文档查看详情</p>
146
+ </div>
147
+ </div>
148
+ </main>
149
+ </template>
150
+
151
+ <style lang="scss" scoped>
152
+ @use './styles/docs-content.scss';
153
+ </style>
154
+
155
+ <style lang="scss">
156
+ pre {
157
+ background-color: var(--el-fill-color) !important;
158
+ border-radius: 8px !important;
159
+ padding: 16px !important;
160
+ margin: 20px 0 !important;
161
+ overflow-x: auto !important;
162
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace !important;
163
+ font-size: 14px !important;
164
+ line-height: 1.6 !important;
165
+ box-shadow: var(--el-box-shadow-dark) !important;
166
+ position: relative !important;
167
+ border: none !important;
168
+ }
169
+
170
+ // 复制按钮样式
171
+ .copy-btn {
172
+ position: absolute !important;
173
+ top: 8px !important;
174
+ right: 8px !important;
175
+ padding: 4px 12px !important;
176
+ background-color: var(--el-color-primary) !important;
177
+ color: white !important;
178
+ border: none !important;
179
+ border-radius: 4px !important;
180
+ font-size: 12px !important;
181
+ cursor: pointer !important;
182
+ transition: all 0.3s !important;
183
+ opacity: 0.7 !important;
184
+ z-index: 10 !important;
185
+
186
+ &:hover {
187
+ opacity: 1 !important;
188
+ background-color: var(--el-color-primary-light-3) !important;
189
+ }
190
+
191
+ &:active {
192
+ transform: translateY(1px) !important;
193
+ }
194
+ }
195
+
196
+ // 确保highlight.js的代码正确显示
197
+ .docs-main .doc-detail .doc-content pre code {
198
+ background-color: transparent !important;
199
+ padding: 0 !important;
200
+ color: var(--el-text-color-regular) !important;
201
+ display: block !important;
202
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace !important;
203
+ font-size: 14px !important;
204
+ line-height: 1.6 !important;
205
+ }
206
+
207
+ // 确保highlight.js的语法高亮样式生效
208
+ .docs-main .doc-detail .doc-content pre.hljs {
209
+ background: transparent !important;
210
+ padding: 0 !important;
211
+ }
212
+
213
+ // 美化内联代码
214
+ code {
215
+ background-color: var(--el-fill-color-light);
216
+ padding: 4px 8px;
217
+ border-radius: 3px;
218
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
219
+ font-size: 14px;
220
+ color: var(--el-color-danger);
221
+
222
+ &.language-typescript,
223
+ &.language-vue {
224
+ background-color: transparent;
225
+ padding: 0;
226
+ }
227
+ }
228
+
229
+ // 美化段落
230
+ p {
231
+ margin: 12px 0;
232
+ color: var(--el-text-color-secondary);
233
+ }
234
+
235
+ // 美化列表
236
+ ul,
237
+ ol {
238
+ margin: 12px 0;
239
+ padding-left: 24px;
240
+
241
+ li {
242
+ margin: 10px 0;
243
+ color: var(--el-text-color-secondary);
244
+ }
245
+ }
246
+
247
+ // 美化标题层级
248
+ h3:not(:first-child) {
249
+ margin: 48px 0 24px 0;
250
+ font-size: 20px;
251
+ font-weight: 700;
252
+ color: var(--el-text-color-primary);
253
+ padding-bottom: 12px;
254
+ border-bottom: 2px solid var(--el-border-color);
255
+ text-transform: capitalize;
256
+ }
257
+
258
+ h4 {
259
+ margin: 36px 0 18px 0;
260
+ font-size: 18px;
261
+ font-weight: 600;
262
+ color: var(--el-text-color-regular);
263
+ padding-left: 12px;
264
+ border-left: 4px solid var(--el-color-primary);
265
+ }
266
+
267
+ h5 {
268
+ padding: 16px 8px;
269
+ font-size: 16px;
270
+ font-weight: 600;
271
+ background-color: var(--el-fill-color-light);
272
+ padding-left: 16px;
273
+ position: relative;
274
+ display: flex;
275
+ align-items: center;
276
+ gap: 8px;
277
+ border-radius: 4px;
278
+
279
+ &::before {
280
+ content: '';
281
+ width: 8px;
282
+ height: 8px;
283
+ border-radius: 50%;
284
+ background-color: var(--el-color-success);
285
+ }
286
+ }
287
+
288
+ // 美化表格
289
+ table {
290
+ width: 100%;
291
+ border-collapse: collapse;
292
+ margin: 16px 0;
293
+ font-size: 14px;
294
+
295
+ th,
296
+ td {
297
+ padding: 12px;
298
+ text-align: left;
299
+ border-bottom: 1px solid var(--el-border-color);
300
+ color: var(--el-text-color-secondary);
301
+ }
302
+
303
+ th {
304
+ background-color: var(--el-fill-color);
305
+ font-weight: 600;
306
+ color: var(--el-text-color-primary);
307
+ }
308
+
309
+ tr:hover {
310
+ background-color: var(--el-fill-color-light);
311
+ }
312
+ }
313
+
314
+ // 美化链接
315
+ a {
316
+ color: var(--el-color-primary);
317
+ text-decoration: none;
318
+ transition: color 0.2s;
319
+
320
+ &:hover {
321
+ color: var(--el-color-primary-light-3);
322
+ text-decoration: underline;
323
+ }
324
+ }
325
+
326
+ // 美化引用
327
+ blockquote {
328
+ border-left: 4px solid var(--el-border-color);
329
+ margin: 16px 0;
330
+ padding: 12px 20px;
331
+ background-color: var(--el-fill-color);
332
+ color: var(--el-text-color-placeholder);
333
+ }
334
+
335
+ // 概览卡片样式
336
+ .overview-cards {
337
+ display: grid;
338
+ grid-template-columns: repeat(4, 1fr);
339
+ grid-auto-rows: min-content;
340
+ gap: 12px;
341
+ margin: 16px 0;
342
+ }
343
+
344
+ .overview-card {
345
+ flex: 0 0 calc(25% - 9px);
346
+ padding: 16px;
347
+ font-size: 14px;
348
+ color: var(--el-text-color-secondary);
349
+ border: 1px solid var(--el-border-color);
350
+ background-color: var(--el-fill-color);
351
+ border-radius: 4px;
352
+ transition: all 0.3s;
353
+ box-sizing: border-box;
354
+ display: flex;
355
+ flex-direction: column;
356
+ gap: 8px;
357
+ cursor: pointer;
358
+
359
+ &:hover {
360
+ background-color: var(--el-fill-color-light);
361
+ color: var(--el-color-primary);
362
+ border-color: var(--el-color-primary);
363
+ transform: translateY(-2px);
364
+ box-shadow: 0 4px 12px rgba(64, 158, 255, 0.15);
365
+ }
366
+
367
+ .card-name {
368
+ font-size: 18px;
369
+ font-weight: 500;
370
+ color: var(--el-text-color-primary);
371
+ }
372
+
373
+ .card-desc {
374
+ font-size: 14px;
375
+ color: var(--el-text-color-secondary);
376
+ line-height: 1.4;
377
+ }
378
+ }
379
+ </style>
@@ -0,0 +1,130 @@
1
+ <script setup lang="ts">
2
+ import type { ModuleData } from './type';
3
+
4
+ /**
5
+ * 搜索关键词
6
+ */
7
+ const search_query = defineModel<string>('searchQuery', {
8
+ default: ''
9
+ });
10
+
11
+ /**
12
+ * 树形数据
13
+ */
14
+ const props = defineProps<{
15
+ /**
16
+ * 树形数据
17
+ */
18
+ treeData: ModuleData[];
19
+ }>();
20
+
21
+ /**
22
+ * 搜索方法
23
+ */
24
+ const search = (query: string, callback: (data: Array<{
25
+ value: string;
26
+ label: string;
27
+ module: string;
28
+ id: string;
29
+ }>) => void) => {
30
+ // 从树形数据中提取搜索数据
31
+ const extract_search_data = (treeData: ModuleData[]): Array<{
32
+ value: string;
33
+ label: string;
34
+ module: string;
35
+ id: string;
36
+ }> => {
37
+ const data: Array<{
38
+ value: string;
39
+ label: string;
40
+ module: string;
41
+ id: string;
42
+ }> = [];
43
+
44
+ treeData.forEach(module => {
45
+ module.children.forEach(item => {
46
+ if (item.children && item.children.length > 0) {
47
+ // 处理有子菜单的项目
48
+ item.children.forEach(child => {
49
+ data.push({
50
+ value: child.label,
51
+ label: child.label + (child.description ? ` - ${child.description}` : ''),
52
+ module: module.label,
53
+ id: child.id
54
+ });
55
+ });
56
+ } else {
57
+ // 处理没有子菜单的项目
58
+ data.push({
59
+ value: item.label,
60
+ label: item.label + (item.description ? ` - ${item.description}` : ''),
61
+ module: module.label,
62
+ id: item.id
63
+ });
64
+ }
65
+ });
66
+ });
67
+
68
+ return data;
69
+ };
70
+
71
+ const search_data = extract_search_data(props.treeData);
72
+ const filtered_data = search_data.filter(item =>
73
+ item.value.toLowerCase().includes(query.toLowerCase()) ||
74
+ item.label.toLowerCase().includes(query.toLowerCase())
75
+ );
76
+
77
+ callback(filtered_data);
78
+ };
79
+
80
+ /**
81
+ * 选择建议项
82
+ */
83
+ const handle_select = (item: {
84
+ value: string;
85
+ label: string;
86
+ module: string;
87
+ id: string;
88
+ }) => {
89
+ search_query.value = item.value;
90
+ // 触发搜索事件,通知父组件
91
+ window.dispatchEvent(new CustomEvent('search-select', {
92
+ detail: { id: item.id }
93
+ }));
94
+ };
95
+ </script>
96
+
97
+ <template>
98
+ <header class="docs-header">
99
+ <h1>组件库使用文档</h1>
100
+ <div class="search-box">
101
+ <el-autocomplete style="width: 400px;" v-model="search_query" :fetch-suggestions="search" @select="handle_select"
102
+ placeholder="输入关键词搜索文档..." class="search-input" clearable />
103
+ </div>
104
+ </header>
105
+ </template>
106
+
107
+ <style lang="scss" scoped>
108
+ // Docs Header Styles
109
+ .docs-header {
110
+ background-color: var(--el-bg-color);
111
+ padding: 20px 40px;
112
+ box-shadow: var(--el-box-shadow-dark);
113
+ display: flex;
114
+ gap: 16px;
115
+
116
+ h1 {
117
+ margin: 0;
118
+ color: var(--el-color-primary);
119
+ font-size: 20px;
120
+ font-weight: 500;
121
+ align-self: flex-start;
122
+ }
123
+
124
+ .search-box {
125
+ flex: 1 0 0;
126
+ display: flex;
127
+ justify-content: center;
128
+ }
129
+ }
130
+ </style>
@@ -0,0 +1,76 @@
1
+ <script setup lang="ts">
2
+ import { ModuleChild, ModuleData } from './type';
3
+
4
+ defineProps<{
5
+ /**
6
+ * 树形数据
7
+ */
8
+ treeData: ModuleData[];
9
+ /**
10
+ * 选中的文档ID
11
+ */
12
+ selectedDocId: string | undefined;
13
+ /**
14
+ * 默认展开的菜单索引
15
+ */
16
+ defaultOpeneds?: string[];
17
+ }>();
18
+
19
+ const emit = defineEmits<{
20
+ /**
21
+ * 选择文档事件
22
+ */
23
+ (e: 'select', node: ModuleChild): void;
24
+ }>();
25
+
26
+ /**
27
+ * 处理节点点击
28
+ */
29
+ function handle_node_click(node: ModuleChild) {
30
+ emit('select', node);
31
+ }
32
+ </script>
33
+
34
+ <template>
35
+ <aside class="docs-sidebar">
36
+ <div class="sidebar-header">
37
+ <h2>文档列表</h2>
38
+ </div>
39
+ <div class="docs-list">
40
+ <el-menu :default-active="selectedDocId" :default-openeds="defaultOpeneds" unique-opened accordion>
41
+ <template v-for="module in treeData" :key="module.label">
42
+ <el-sub-menu :index="module.label">
43
+ <template #title>
44
+ <span>{{ module.label }}</span>
45
+ </template>
46
+ <template v-for="item in module.children" :key="item.id">
47
+ <el-sub-menu v-if="item.children && item.children.length > 0" :index="item.id">
48
+ <template #title>
49
+ <span>{{ item.label }}</span>
50
+ </template>
51
+ <el-menu-item :class="{ 'last-menu-item': child.description }" v-for="child in item.children"
52
+ :key="child.id" :index="child.id" @click="handle_node_click(child)">
53
+ <template #title>
54
+ <div class="menu-item-content">
55
+ <div class="menu-item-name">{{ child.label }}</div>
56
+ <div v-if="child.description" class="menu-item-desc">{{ child.description }}</div>
57
+ </div>
58
+ </template>
59
+ </el-menu-item>
60
+ </el-sub-menu>
61
+ <el-menu-item v-else :index="item.id" @click="handle_node_click(item)">
62
+ <template #title>
63
+ <span>{{ item.label }}</span>
64
+ </template>
65
+ </el-menu-item>
66
+ </template>
67
+ </el-sub-menu>
68
+ </template>
69
+ </el-menu>
70
+ </div>
71
+ </aside>
72
+ </template>
73
+
74
+ <style lang="scss" scoped>
75
+ @use './styles/docs-sidebar.scss';
76
+ </style>