fdb2 1.0.33 → 1.0.35

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 (40) hide show
  1. package/README.md +4 -2
  2. package/dist/public/explorer.css +152 -272
  3. package/dist/public/explorer.js +354 -465
  4. package/dist/public/index.js +3 -1
  5. package/dist/public/layout.css +265 -54
  6. package/dist/public/layout.js +184 -19
  7. package/dist/public/vue.js +1 -1
  8. package/dist/server/core/db-api.js +5 -0
  9. package/dist/server/core/db-api.js.map +1 -1
  10. package/dist/server/core/db-api.ts +5 -0
  11. package/dist/server/core/dialect.d.ts +1 -1
  12. package/dist/server/core/dialect.d.ts.map +1 -1
  13. package/dist/server/core/dialect.js +21 -1
  14. package/dist/server/core/dialect.js.map +1 -1
  15. package/dist/server/core/dialect.ts +23 -2
  16. package/dist/server/service/connection.service.d.ts.map +1 -1
  17. package/dist/server/service/connection.service.js +17 -1
  18. package/dist/server/service/connection.service.js.map +1 -1
  19. package/dist/server/service/connection.service.ts +17 -1
  20. package/dist/server/service/database/clickhouse-connection.d.ts +44 -0
  21. package/dist/server/service/database/clickhouse-connection.d.ts.map +1 -0
  22. package/dist/server/service/database/clickhouse-connection.js +210 -0
  23. package/dist/server/service/database/clickhouse-connection.js.map +1 -0
  24. package/dist/server/service/database/clickhouse-connection.ts +182 -0
  25. package/dist/server/service/database/clickhouse.service.d.ts +138 -0
  26. package/dist/server/service/database/clickhouse.service.d.ts.map +1 -0
  27. package/dist/server/service/database/clickhouse.service.js +794 -0
  28. package/dist/server/service/database/clickhouse.service.js.map +1 -0
  29. package/dist/server/service/database/clickhouse.service.ts +853 -0
  30. package/dist/server/service/database/database.service.d.ts +42 -0
  31. package/dist/server/service/database/database.service.d.ts.map +1 -1
  32. package/dist/server/service/database/database.service.js +37 -0
  33. package/dist/server/service/database/database.service.js.map +1 -1
  34. package/dist/server/service/database/database.service.ts +37 -0
  35. package/dist/server/service/database/index.d.ts +1 -0
  36. package/dist/server/service/database/index.d.ts.map +1 -1
  37. package/dist/server/service/database/index.js +3 -1
  38. package/dist/server/service/database/index.js.map +1 -1
  39. package/dist/server/service/database/index.ts +1 -0
  40. package/package.json +1 -4
@@ -1,6 +1,6 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./layout.js","./rolldown-runtime.js","./vue.js","./layout.css","./explorer.js","./explorer.css","./vconsole.min.js"])))=>i.map(i=>d[i]);
2
2
  import { a as __toESM, n as __esmMin, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime.js";
3
- import { $ as reactive, A as getCurrentInstance, B as renderSlot, C as createCommentVNode, D as createTextVNode, F as onBeforeUnmount, H as resolveDynamicComponent, I as onMounted, K as effectScope, L as onUnmounted, N as inject, O as createVNode, P as nextTick, Q as onScopeDispose, R as openBlock, S as createBlock, U as watch, V as resolveComponent, X as isRef, Y as isReactive, Z as markRaw, a as init_vue_router, at as normalizeClass, b as computed, c as createI18n, d as init_vue_runtime_esm_bundler, et as ref, f as createApp, i as createWebHistory, j as hasInjectionContext, k as defineComponent, l as init_vue_i18n, n as useTitle, nt as toRefs, ot as normalizeStyle, q as getCurrentScope, r as createRouter, rt as unref, st as toDisplayString, t as init_core, tt as toRaw, u as useI18n, v as withModifiers, w as createElementBlock, x as createBaseVNode, y as Fragment, z as renderList } from "./vue.js";
3
+ import { $ as onScopeDispose, A as defineComponent, B as renderList, C as createBlock, F as nextTick, H as resolveComponent, I as onBeforeUnmount, J as getCurrentScope, L as onMounted, M as hasInjectionContext, O as createTextVNode, P as inject, Q as markRaw, R as onUnmounted, S as createBaseVNode, T as createElementBlock, U as resolveDynamicComponent, V as renderSlot, W as watch, X as isReactive, Z as isRef, a as init_vue_router, b as Fragment, c as createI18n, ct as toDisplayString, d as init_vue_runtime_esm_bundler, et as reactive, i as createWebHistory, it as unref, j as getCurrentInstance, k as createVNode, l as init_vue_i18n, n as useTitle, nt as toRaw, ot as normalizeClass, p as createApp, q as effectScope, r as createRouter, rt as toRefs, st as normalizeStyle, t as init_core, tt as ref, u as useI18n, w as createCommentVNode, x as computed, y as withModifiers, z as openBlock } from "./vue.js";
4
4
  import { i as init_bootstrap, n as init_bootstrap_esm, r as init_bootstrap_icons, t as Modal } from "./bootstrap.js";
5
5
  //#region \0vite/modulepreload-polyfill.js
6
6
  (function polyfill() {
@@ -4767,6 +4767,7 @@ var init_zh_CN = __esmMin((() => {
4767
4767
  tip: "提示",
4768
4768
  confirmTitle: "确认"
4769
4769
  },
4770
+ app: { version: "当前版本" },
4770
4771
  nav: {
4771
4772
  databaseManagement: "数据库管理",
4772
4773
  databaseHome: "数据库管理首页",
@@ -5516,6 +5517,7 @@ var init_en_US = __esmMin((() => {
5516
5517
  tip: "Tip",
5517
5518
  confirmTitle: "Confirm"
5518
5519
  },
5520
+ app: { version: "Current Version" },
5519
5521
  nav: {
5520
5522
  databaseManagement: "Database Management",
5521
5523
  databaseHome: "Database Home",
@@ -24,8 +24,128 @@
24
24
  letter-spacing: 0.05em;
25
25
  }
26
26
 
27
+ .about-page[data-v-ca1c586e] {
28
+ padding: 2rem;
29
+ max-width: 800px;
30
+ margin: 0 auto;
31
+ }
32
+ .about-header[data-v-ca1c586e] {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 1rem;
36
+ margin-bottom: 2rem;
37
+ padding-bottom: 1rem;
38
+ border-bottom: 1px solid #e2e8f0;
39
+ }
40
+ .about-logo[data-v-ca1c586e] {
41
+ width: 60px;
42
+ height: 60px;
43
+ border-radius: 12px;
44
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ color: white;
49
+ font-size: 2rem;
50
+ }
51
+ .about-title h2[data-v-ca1c586e] {
52
+ margin: 0;
53
+ font-size: 2rem;
54
+ font-weight: 700;
55
+ color: #1e293b;
56
+ }
57
+ .about-title p[data-v-ca1c586e] {
58
+ margin: 0.25rem 0 0 0;
59
+ color: #64748b;
60
+ font-size: 1.125rem;
61
+ }
62
+ .about-content[data-v-ca1c586e] {
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: 2rem;
66
+ }
67
+ .about-section[data-v-ca1c586e] {
68
+ background: white;
69
+ padding: 1.5rem;
70
+ border-radius: 12px;
71
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
72
+ }
73
+ .about-section h3[data-v-ca1c586e] {
74
+ margin: 0 0 1rem 0;
75
+ font-size: 1.25rem;
76
+ font-weight: 600;
77
+ color: #1e293b;
78
+ }
79
+ .about-section p[data-v-ca1c586e] {
80
+ margin: 0 0 1rem 0;
81
+ color: #64748b;
82
+ line-height: 1.6;
83
+ }
84
+ .feature-list[data-v-ca1c586e] {
85
+ list-style: none;
86
+ padding: 0;
87
+ margin: 0;
88
+ }
89
+ .feature-list li[data-v-ca1c586e] {
90
+ display: flex;
91
+ align-items: flex-start;
92
+ gap: 0.75rem;
93
+ margin-bottom: 0.75rem;
94
+ color: #64748b;
95
+ }
96
+ .feature-list li i[data-v-ca1c586e] {
97
+ color: #10b981;
98
+ margin-top: 0.25rem;
99
+ flex-shrink: 0;
100
+ }
101
+ .database-types[data-v-ca1c586e] {
102
+ display: grid;
103
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
104
+ gap: 0.5rem;
105
+ }
106
+ .db-type[data-v-ca1c586e] {
107
+ display: flex;
108
+ justify-content: space-between;
109
+ align-items: center;
110
+ padding: 0.5rem;
111
+ background: #f8fafc;
112
+ border-radius: 6px;
113
+ }
114
+ .db-name[data-v-ca1c586e] {
115
+ font-weight: 500;
116
+ color: #374151;
117
+ }
118
+ .db-port[data-v-ca1c586e] {
119
+ color: #6b7280;
120
+ font-size: 0.875rem;
121
+ }
122
+ .about-links[data-v-ca1c586e] {
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 0.75rem;
126
+ }
127
+ .about-link[data-v-ca1c586e] {
128
+ display: flex;
129
+ align-items: center;
130
+ gap: 0.75rem;
131
+ padding: 0.75rem;
132
+ background: #f8fafc;
133
+ border-radius: 8px;
134
+ color: #667eea;
135
+ text-decoration: none;
136
+ font-weight: 500;
137
+ transition: all 0.3s ease;
138
+ }
139
+ .about-link[data-v-ca1c586e]:hover {
140
+ background: #e0e7ff;
141
+ transform: translateX(4px);
142
+ }
143
+ .about-link i[data-v-ca1c586e] {
144
+ flex-shrink: 0;
145
+ }
146
+
27
147
  /* 顶部工具栏 */
28
- .top-toolbar[data-v-9b6e6db7] {
148
+ .top-toolbar[data-v-a4581861] {
29
149
  display: flex;
30
150
  align-items: center;
31
151
  justify-content: space-between;
@@ -37,11 +157,11 @@
37
157
  top: 0;
38
158
  z-index: 1030;
39
159
  }
40
- .toolbar-left[data-v-9b6e6db7] {
160
+ .toolbar-left[data-v-a4581861] {
41
161
  display: flex;
42
162
  align-items: center;
43
163
  }
44
- .brand-link[data-v-9b6e6db7] {
164
+ .brand-link[data-v-a4581861] {
45
165
  display: flex;
46
166
  align-items: center;
47
167
  gap: 0.75rem;
@@ -49,10 +169,10 @@
49
169
  color: #1e293b;
50
170
  transition: all 0.3s ease;
51
171
  }
52
- .brand-link[data-v-9b6e6db7]:hover {
172
+ .brand-link[data-v-a4581861]:hover {
53
173
  color: #667eea;
54
174
  }
55
- .brand-icon[data-v-9b6e6db7] {
175
+ .brand-icon[data-v-a4581861] {
56
176
  width: 36px;
57
177
  height: 36px;
58
178
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -63,19 +183,34 @@
63
183
  color: white;
64
184
  font-size: 1.2rem;
65
185
  }
66
- .brand-name[data-v-9b6e6db7] {
186
+ .brand-name[data-v-a4581861] {
67
187
  font-size: 1.15rem;
68
188
  font-weight: 700;
69
189
  letter-spacing: -0.025em;
70
190
  }
71
- .toolbar-right[data-v-9b6e6db7] {
191
+ .toolbar-right[data-v-a4581861] {
72
192
  display: flex;
73
193
  align-items: center;
74
194
  gap: 0.5rem;
75
195
  }
76
196
 
197
+ /* 版本号徽标 */
198
+ .app-version[data-v-a4581861] {
199
+ font-size: 0.78rem;
200
+ font-weight: 600;
201
+ line-height: 1;
202
+ color: #64748b;
203
+ background: #f1f5f9;
204
+ border: 1px solid #e2e8f0;
205
+ padding: 0.28rem 0.6rem;
206
+ border-radius: 999px;
207
+ letter-spacing: 0.02em;
208
+ cursor: default;
209
+ user-select: none;
210
+ }
211
+
77
212
  /* 主布局样式 */
78
- .database-layout[data-v-9b6e6db7] {
213
+ .database-layout[data-v-a4581861] {
79
214
  height: 100vh;
80
215
  display: flex;
81
216
  flex-direction: column;
@@ -83,7 +218,7 @@
83
218
  }
84
219
 
85
220
  /* 现代导航栏样式 */
86
- .navbar-modern[data-v-9b6e6db7] {
221
+ .navbar-modern[data-v-a4581861] {
87
222
  background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
88
223
  border-bottom: 1px solid #cbd5e1;
89
224
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
@@ -95,10 +230,10 @@
95
230
  }
96
231
 
97
232
  /* 品牌区域 */
98
- .navbar-brand-wrapper[data-v-9b6e6db7] {
233
+ .navbar-brand-wrapper[data-v-a4581861] {
99
234
  margin-right: 2rem;
100
235
  }
101
- .navbar-brand-modern[data-v-9b6e6db7] {
236
+ .navbar-brand-modern[data-v-a4581861] {
102
237
  display: flex;
103
238
  align-items: center;
104
239
  gap: 1rem;
@@ -106,11 +241,11 @@
106
241
  color: #1e293b;
107
242
  transition: all 0.3s ease;
108
243
  }
109
- .navbar-brand-modern[data-v-9b6e6db7]:hover {
244
+ .navbar-brand-modern[data-v-a4581861]:hover {
110
245
  color: #667eea;
111
246
  transform: translateX(2px);
112
247
  }
113
- .brand-icon[data-v-9b6e6db7] {
248
+ .brand-icon[data-v-a4581861] {
114
249
  width: 45px;
115
250
  height: 45px;
116
251
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -123,22 +258,22 @@
123
258
  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
124
259
  transition: all 0.3s ease;
125
260
  }
126
- .brand-icon[data-v-9b6e6db7]:hover {
261
+ .brand-icon[data-v-a4581861]:hover {
127
262
  transform: rotate(5deg) scale(1.05);
128
263
  box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);
129
264
  }
130
- .brand-text[data-v-9b6e6db7] {
265
+ .brand-text[data-v-a4581861] {
131
266
  display: flex;
132
267
  flex-direction: column;
133
268
  gap: 2px;
134
269
  }
135
- .brand-name[data-v-9b6e6db7] {
270
+ .brand-name[data-v-a4581861] {
136
271
  font-size: 1.25rem;
137
272
  font-weight: 700;
138
273
  color: #1e293b;
139
274
  letter-spacing: -0.025em;
140
275
  }
141
- .brand-subtitle[data-v-9b6e6db7] {
276
+ .brand-subtitle[data-v-a4581861] {
142
277
  font-size: 0.75rem;
143
278
  color: #334155;
144
279
  font-weight: 500;
@@ -147,7 +282,7 @@
147
282
  }
148
283
 
149
284
  /* 移动端切换按钮 */
150
- .navbar-toggler-modern[data-v-9b6e6db7] {
285
+ .navbar-toggler-modern[data-v-a4581861] {
151
286
  background: none;
152
287
  border: none;
153
288
  padding: 0.5rem;
@@ -156,7 +291,7 @@
156
291
  flex-direction: column;
157
292
  gap: 4px;
158
293
  }
159
- .navbar-toggler-line[data-v-9b6e6db7] {
294
+ .navbar-toggler-line[data-v-a4581861] {
160
295
  width: 25px;
161
296
  height: 3px;
162
297
  background: linear-gradient(90deg, #667eea, #764ba2);
@@ -165,20 +300,20 @@
165
300
  }
166
301
 
167
302
  /* 导航折叠区域 */
168
- .navbar-collapse-modern[data-v-9b6e6db7] {
303
+ .navbar-collapse-modern[data-v-a4581861] {
169
304
  background: transparent;
170
305
  }
171
306
 
172
307
  /* 主导航样式 */
173
- .navbar-nav-modern[data-v-9b6e6db7] {
308
+ .navbar-nav-modern[data-v-a4581861] {
174
309
  display: flex;
175
310
  align-items: center;
176
311
  gap: 0.5rem;
177
312
  }
178
- .nav-item-modern[data-v-9b6e6db7] {
313
+ .nav-item-modern[data-v-a4581861] {
179
314
  position: relative;
180
315
  }
181
- .nav-link-modern[data-v-9b6e6db7] {
316
+ .nav-link-modern[data-v-a4581861] {
182
317
  display: flex;
183
318
  align-items: center;
184
319
  gap: 0.75rem;
@@ -191,29 +326,29 @@
191
326
  position: relative;
192
327
  overflow: hidden;
193
328
  }
194
- .nav-link-modern[data-v-9b6e6db7]:hover {
329
+ .nav-link-modern[data-v-a4581861]:hover {
195
330
  background: rgba(102, 126, 234, 0.1);
196
331
  color: #667eea;
197
332
  transform: translateY(-1px);
198
333
  }
199
- .nav-link-modern.active[data-v-9b6e6db7] {
334
+ .nav-link-modern.active[data-v-a4581861] {
200
335
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
201
336
  color: white;
202
337
  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
203
338
  }
204
- .nav-icon[data-v-9b6e6db7] {
339
+ .nav-icon[data-v-a4581861] {
205
340
  font-size: 1.25rem;
206
341
  display: flex;
207
342
  align-items: center;
208
343
  justify-content: center;
209
344
  min-width: 24px;
210
345
  }
211
- .nav-text[data-v-9b6e6db7] {
346
+ .nav-text[data-v-a4581861] {
212
347
  font-size: 0.95rem;
213
348
  font-weight: 600;
214
349
  letter-spacing: 0.025em;
215
350
  }
216
- .nav-indicator[data-v-9b6e6db7] {
351
+ .nav-indicator[data-v-a4581861] {
217
352
  position: absolute;
218
353
  bottom: 0;
219
354
  left: 50%;
@@ -225,16 +360,16 @@
225
360
  opacity: 0;
226
361
  transition: all 0.3s ease;
227
362
  }
228
- .nav-link-modern.active .nav-indicator[data-v-9b6e6db7] {
363
+ .nav-link-modern.active .nav-indicator[data-v-a4581861] {
229
364
  opacity: 1;
230
365
  }
231
366
 
232
367
  /* 用户菜单样式 */
233
- .nav-icon-only[data-v-9b6e6db7] {
368
+ .nav-icon-only[data-v-a4581861] {
234
369
  padding: 0.75rem;
235
370
  min-width: auto;
236
371
  }
237
- .notification-dot[data-v-9b6e6db7] {
372
+ .notification-dot[data-v-a4581861] {
238
373
  position: absolute;
239
374
  top: 8px;
240
375
  right: 8px;
@@ -243,9 +378,9 @@
243
378
  background: #ef4444;
244
379
  border-radius: 50%;
245
380
  border: 2px solid white;
246
- animation: pulse-9b6e6db7 2s ease-in-out infinite;
381
+ animation: pulse-a4581861 2s ease-in-out infinite;
247
382
  }
248
- .user-menu-toggle[data-v-9b6e6db7] {
383
+ .user-menu-toggle[data-v-a4581861] {
249
384
  display: flex;
250
385
  align-items: center;
251
386
  gap: 0.75rem;
@@ -253,10 +388,10 @@
253
388
  border-radius: 12px;
254
389
  transition: all 0.3s ease;
255
390
  }
256
- .user-menu-toggle[data-v-9b6e6db7]:hover {
391
+ .user-menu-toggle[data-v-a4581861]:hover {
257
392
  background: rgba(102, 126, 234, 0.1);
258
393
  }
259
- .user-avatar[data-v-9b6e6db7] {
394
+ .user-avatar[data-v-a4581861] {
260
395
  width: 40px;
261
396
  height: 40px;
262
397
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -268,33 +403,33 @@
268
403
  font-size: 1.25rem;
269
404
  box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
270
405
  }
271
- .user-info[data-v-9b6e6db7] {
406
+ .user-info[data-v-a4581861] {
272
407
  display: flex;
273
408
  flex-direction: column;
274
409
  gap: 2px;
275
410
  }
276
- .user-name[data-v-9b6e6db7] {
411
+ .user-name[data-v-a4581861] {
277
412
  font-size: 0.9rem;
278
413
  font-weight: 600;
279
414
  color: #1e293b;
280
415
  }
281
- .user-role[data-v-9b6e6db7] {
416
+ .user-role[data-v-a4581861] {
282
417
  font-size: 0.75rem;
283
418
  color: #334155;
284
419
  font-weight: 500;
285
420
  }
286
- .dropdown-arrow[data-v-9b6e6db7] {
421
+ .dropdown-arrow[data-v-a4581861] {
287
422
  color: #475569;
288
423
  font-size: 0.75rem;
289
424
  transition: all 0.3s ease;
290
425
  }
291
- .user-menu-toggle:hover .dropdown-arrow[data-v-9b6e6db7] {
426
+ .user-menu-toggle:hover .dropdown-arrow[data-v-a4581861] {
292
427
  color: #667eea;
293
428
  transform: translateY(1px);
294
429
  }
295
430
 
296
431
  /* 现代下拉菜单样式 */
297
- .dropdown-menu-modern[data-v-9b6e6db7] {
432
+ .dropdown-menu-modern[data-v-a4581861] {
298
433
  background: white;
299
434
  border: 1px solid #cbd5e1;
300
435
  border-radius: 16px;
@@ -304,7 +439,7 @@
304
439
  backdrop-filter: blur(10px);
305
440
  margin-top: 0.75rem;
306
441
  }
307
- .dropdown-header[data-v-9b6e6db7] {
442
+ .dropdown-header[data-v-a4581861] {
308
443
  padding: 0.5rem 0.75rem;
309
444
  font-size: 0.75rem;
310
445
  font-weight: 700;
@@ -314,7 +449,7 @@
314
449
  border-bottom: 1px solid #f1f5f9;
315
450
  margin-bottom: 0.5rem;
316
451
  }
317
- .dropdown-item-modern[data-v-9b6e6db7] {
452
+ .dropdown-item-modern[data-v-a4581861] {
318
453
  display: flex;
319
454
  align-items: center;
320
455
  gap: 0.75rem;
@@ -325,44 +460,44 @@
325
460
  transition: all 0.2s ease;
326
461
  margin-bottom: 2px;
327
462
  }
328
- .dropdown-item-modern[data-v-9b6e6db7]:hover {
463
+ .dropdown-item-modern[data-v-a4581861]:hover {
329
464
  background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
330
465
  color: #667eea;
331
466
  transform: translateX(4px);
332
467
  }
333
- .dropdown-item-modern.text-danger[data-v-9b6e6db7]:hover {
468
+ .dropdown-item-modern.text-danger[data-v-a4581861]:hover {
334
469
  background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
335
470
  color: #dc2626;
336
471
  }
337
- .dropdown-item-content[data-v-9b6e6db7] {
472
+ .dropdown-item-content[data-v-a4581861] {
338
473
  display: flex;
339
474
  flex-direction: column;
340
475
  gap: 2px;
341
476
  }
342
- .dropdown-item-title[data-v-9b6e6db7] {
477
+ .dropdown-item-title[data-v-a4581861] {
343
478
  font-size: 0.9rem;
344
479
  font-weight: 600;
345
480
  color: inherit;
346
481
  }
347
- .dropdown-item-desc[data-v-9b6e6db7] {
482
+ .dropdown-item-desc[data-v-a4581861] {
348
483
  font-size: 0.75rem;
349
484
  color: #475569;
350
485
  }
351
- .dropdown-divider-modern[data-v-9b6e6db7] {
486
+ .dropdown-divider-modern[data-v-a4581861] {
352
487
  margin: 0.75rem -0.75rem;
353
488
  border: none;
354
489
  border-top: 1px solid #e2e8f0;
355
490
  }
356
491
 
357
492
  /* 主要内容区域 */
358
- .main-content-modern[data-v-9b6e6db7] {
493
+ .main-content-modern[data-v-a4581861] {
359
494
  flex: 1;
360
495
  display: flex;
361
496
  flex-direction: column;
362
497
  background: transparent;
363
498
  overflow: hidden;
364
499
  }
365
- .content-wrapper[data-v-9b6e6db7] {
500
+ .content-wrapper[data-v-a4581861] {
366
501
  flex: 1;
367
502
  background: rgba(255, 255, 255, 0.3);
368
503
  backdrop-filter: blur(8px);
@@ -373,7 +508,7 @@
373
508
 
374
509
 
375
510
  /* 动画效果 */
376
- @keyframes pulse-9b6e6db7 {
511
+ @keyframes pulse-a4581861 {
377
512
  0%, 100% { opacity: 1; transform: scale(1);
378
513
  }
379
514
  50% { opacity: 0.6; transform: scale(1.2);
@@ -382,12 +517,88 @@
382
517
 
383
518
  /* 响应式设计 */
384
519
  @media (max-width: 768px) {
385
- .content-wrapper[data-v-9b6e6db7] {
520
+ .content-wrapper[data-v-a4581861] {
386
521
  padding: 0.5rem;
387
522
  }
388
523
  }
389
524
  @media (max-width: 480px) {
390
- .content-wrapper[data-v-9b6e6db7] {
525
+ .content-wrapper[data-v-a4581861] {
391
526
  padding: 0.25rem;
392
527
  }
393
528
  }
529
+
530
+ /* 关于工具触发按钮 */
531
+ .about-trigger[data-v-a4581861] {
532
+ display: flex;
533
+ align-items: center;
534
+ gap: 0.35rem;
535
+ padding: 0.4rem 0.75rem;
536
+ border-radius: 8px;
537
+ cursor: pointer;
538
+ color: #64748b;
539
+ font-size: 0.85rem;
540
+ font-weight: 600;
541
+ transition: all 0.3s ease;
542
+ user-select: none;
543
+ border: 1px solid #cbd5e1;
544
+ background: rgba(255, 255, 255, 0.8);
545
+ }
546
+ .about-trigger[data-v-a4581861]:hover {
547
+ background: rgba(102, 126, 234, 0.1);
548
+ color: #667eea;
549
+ border-color: #667eea;
550
+ transform: translateY(-1px);
551
+ }
552
+
553
+ /* 关于工具弹窗 */
554
+ .about-modal-overlay[data-v-a4581861] {
555
+ position: fixed;
556
+ inset: 0;
557
+ background: rgba(15, 23, 42, 0.45);
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: center;
561
+ z-index: 2000;
562
+ padding: 1.5rem;
563
+ backdrop-filter: blur(4px);
564
+ }
565
+ .about-modal[data-v-a4581861] {
566
+ position: relative;
567
+ width: 100%;
568
+ max-width: 860px;
569
+ max-height: 90vh;
570
+ overflow-y: auto;
571
+ background: #ffffff;
572
+ border-radius: 16px;
573
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.25);
574
+ }
575
+ .about-modal-close[data-v-a4581861] {
576
+ position: absolute;
577
+ top: 1rem;
578
+ right: 1rem;
579
+ z-index: 2;
580
+ width: 34px;
581
+ height: 34px;
582
+ display: flex;
583
+ align-items: center;
584
+ justify-content: center;
585
+ border: 1px solid #cbd5e1;
586
+ border-radius: 8px;
587
+ background: #ffffff;
588
+ color: #64748b;
589
+ cursor: pointer;
590
+ transition: all 0.2s ease;
591
+ }
592
+ .about-modal-close[data-v-a4581861]:hover {
593
+ background: #f1f5f9;
594
+ color: #667eea;
595
+ border-color: #667eea;
596
+ }
597
+ .about-fade-enter-active[data-v-a4581861],
598
+ .about-fade-leave-active[data-v-a4581861] {
599
+ transition: opacity 0.25s ease;
600
+ }
601
+ .about-fade-enter-from[data-v-a4581861],
602
+ .about-fade-leave-to[data-v-a4581861] {
603
+ opacity: 0;
604
+ }