fdb2 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/.vscodeignore +45 -0
  2. package/README.md +24 -85
  3. package/dist/package.json +115 -0
  4. package/dist/pnpm-lock.yaml +7447 -0
  5. package/dist/public/explorer.css +244 -111
  6. package/dist/public/explorer.js +518 -275
  7. package/dist/scripts/preinstall.js +112 -0
  8. package/dist/server/index.d.ts.map +1 -1
  9. package/dist/server/index.js +4 -9
  10. package/dist/server/index.js.map +1 -1
  11. package/dist/server/index.ts +5 -10
  12. package/dist/server/service/connection.service.d.ts.map +1 -1
  13. package/dist/server/service/connection.service.js +1 -0
  14. package/dist/server/service/connection.service.js.map +1 -1
  15. package/dist/server/service/connection.service.ts +1 -0
  16. package/dist/server/service/database/base.service.d.ts +4 -0
  17. package/dist/server/service/database/base.service.d.ts.map +1 -1
  18. package/dist/server/service/database/base.service.js +3 -3
  19. package/dist/server/service/database/base.service.js.map +1 -1
  20. package/dist/server/service/database/base.service.ts +8 -3
  21. package/dist/server/service/database/cockroachdb.service.d.ts +5 -0
  22. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  23. package/dist/server/service/database/cockroachdb.service.js +112 -0
  24. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  25. package/dist/server/service/database/cockroachdb.service.ts +123 -0
  26. package/dist/server/service/database/database.service.d.ts +4 -0
  27. package/dist/server/service/database/database.service.d.ts.map +1 -1
  28. package/dist/server/service/database/database.service.js +8 -0
  29. package/dist/server/service/database/database.service.js.map +1 -1
  30. package/dist/server/service/database/database.service.ts +9 -0
  31. package/dist/server/service/database/mongodb.service.d.ts +6 -0
  32. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  33. package/dist/server/service/database/mongodb.service.js +8 -0
  34. package/dist/server/service/database/mongodb.service.js.map +1 -1
  35. package/dist/server/service/database/mongodb.service.ts +9 -0
  36. package/dist/server/service/database/mssql.service.d.ts +4 -0
  37. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  38. package/dist/server/service/database/mssql.service.js +105 -0
  39. package/dist/server/service/database/mssql.service.js.map +1 -1
  40. package/dist/server/service/database/mssql.service.ts +118 -0
  41. package/dist/server/service/database/mysql.service.d.ts +4 -0
  42. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  43. package/dist/server/service/database/mysql.service.js +116 -0
  44. package/dist/server/service/database/mysql.service.js.map +1 -1
  45. package/dist/server/service/database/mysql.service.ts +130 -0
  46. package/dist/server/service/database/oracle.service.d.ts +4 -0
  47. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  48. package/dist/server/service/database/oracle.service.js +114 -0
  49. package/dist/server/service/database/oracle.service.js.map +1 -1
  50. package/dist/server/service/database/oracle.service.ts +128 -0
  51. package/dist/server/service/database/postgres.service.d.ts +4 -0
  52. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  53. package/dist/server/service/database/postgres.service.js +120 -0
  54. package/dist/server/service/database/postgres.service.js.map +1 -1
  55. package/dist/server/service/database/postgres.service.ts +131 -0
  56. package/dist/server/service/database/sap.service.d.ts +4 -0
  57. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  58. package/dist/server/service/database/sap.service.js +107 -0
  59. package/dist/server/service/database/sap.service.js.map +1 -1
  60. package/dist/server/service/database/sap.service.ts +120 -0
  61. package/dist/server/service/database/sqlite.service.d.ts +5 -0
  62. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  63. package/dist/server/service/database/sqlite.service.js +133 -0
  64. package/dist/server/service/database/sqlite.service.js.map +1 -1
  65. package/dist/server/service/database/sqlite.service.ts +150 -0
  66. package/package.json +18 -9
  67. package/packages/vscode/.vscodeignore +44 -0
  68. package/packages/vscode/README.md +62 -0
  69. package/packages/vscode/out/database-services/base.service.js +236 -0
  70. package/packages/vscode/out/database-services/base.service.js.map +1 -0
  71. package/packages/vscode/out/database-services/cockroachdb.service.js +634 -0
  72. package/packages/vscode/out/database-services/cockroachdb.service.js.map +1 -0
  73. package/packages/vscode/out/database-services/connection.service.js +346 -0
  74. package/packages/vscode/out/database-services/connection.service.js.map +1 -0
  75. package/packages/vscode/out/database-services/database.service.js +571 -0
  76. package/packages/vscode/out/database-services/database.service.js.map +1 -0
  77. package/packages/vscode/out/database-services/index.js +18 -0
  78. package/packages/vscode/out/database-services/index.js.map +1 -0
  79. package/packages/vscode/out/database-services/model/connection.entity.js +11 -0
  80. package/packages/vscode/out/database-services/model/connection.entity.js.map +1 -0
  81. package/packages/vscode/out/database-services/model/database.entity.js +35 -0
  82. package/packages/vscode/out/database-services/model/database.entity.js.map +1 -0
  83. package/packages/vscode/out/database-services/mongodb.service.js +458 -0
  84. package/packages/vscode/out/database-services/mongodb.service.js.map +1 -0
  85. package/packages/vscode/out/database-services/mssql.service.js +694 -0
  86. package/packages/vscode/out/database-services/mssql.service.js.map +1 -0
  87. package/packages/vscode/out/database-services/mysql.service.js +735 -0
  88. package/packages/vscode/out/database-services/mysql.service.js.map +1 -0
  89. package/packages/vscode/out/database-services/oracle.service.js +787 -0
  90. package/packages/vscode/out/database-services/oracle.service.js.map +1 -0
  91. package/packages/vscode/out/database-services/postgres.service.js +696 -0
  92. package/packages/vscode/out/database-services/postgres.service.js.map +1 -0
  93. package/packages/vscode/out/database-services/sap.service.js +695 -0
  94. package/packages/vscode/out/database-services/sap.service.js.map +1 -0
  95. package/packages/vscode/out/database-services/sqlite.service.js +532 -0
  96. package/packages/vscode/out/database-services/sqlite.service.js.map +1 -0
  97. package/packages/vscode/out/extension.js +93 -0
  98. package/packages/vscode/out/extension.js.map +1 -0
  99. package/packages/vscode/out/provider/DatabaseTreeProvider.js +159 -0
  100. package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +1 -0
  101. package/packages/vscode/out/provider/WebViewProvider.js +259 -0
  102. package/packages/vscode/out/provider/WebViewProvider.js.map +1 -0
  103. package/packages/vscode/out/service/ConnectionManager.js +105 -0
  104. package/packages/vscode/out/service/ConnectionManager.js.map +1 -0
  105. package/packages/vscode/out/service/DatabaseServiceBridge.js +395 -0
  106. package/packages/vscode/out/service/DatabaseServiceBridge.js.map +1 -0
  107. package/packages/vscode/out/typings/connection.js +3 -0
  108. package/packages/vscode/out/typings/connection.js.map +1 -0
  109. package/packages/vscode/package.json +142 -0
  110. package/packages/vscode/resources/icon.svg +5 -0
  111. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +6529 -0
  112. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +1 -0
  113. package/packages/vscode/resources/webview/connection.css +69 -0
  114. package/packages/vscode/resources/webview/connection.js +228 -0
  115. package/packages/vscode/resources/webview/connection.js.map +1 -0
  116. package/packages/vscode/resources/webview/database.css +259 -0
  117. package/packages/vscode/resources/webview/database.js +275 -0
  118. package/packages/vscode/resources/webview/database.js.map +1 -0
  119. package/packages/vscode/resources/webview/favicon.ico +0 -0
  120. package/packages/vscode/resources/webview/index.html +9 -0
  121. package/packages/vscode/resources/webview/modules/header.tpl +14 -0
  122. package/packages/vscode/resources/webview/modules/initial_state.tpl +55 -0
  123. package/packages/vscode/resources/webview/query.css +162 -0
  124. package/packages/vscode/resources/webview/query.js +198 -0
  125. package/packages/vscode/resources/webview/query.js.map +1 -0
  126. package/packages/vscode/src/database-services/base.service.js.map +1 -0
  127. package/packages/vscode/src/database-services/base.service.ts +363 -0
  128. package/packages/vscode/src/database-services/cockroachdb.service.js.map +1 -0
  129. package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -0
  130. package/packages/vscode/src/database-services/connection.service.ts +341 -0
  131. package/packages/vscode/src/database-services/database.service.ts +630 -0
  132. package/packages/vscode/src/database-services/index.ts +7 -0
  133. package/packages/vscode/src/database-services/model/connection.entity.js +11 -0
  134. package/packages/vscode/src/database-services/model/connection.entity.js.map +1 -0
  135. package/packages/vscode/src/database-services/model/connection.entity.ts +66 -0
  136. package/packages/vscode/src/database-services/model/database.entity.js +35 -0
  137. package/packages/vscode/src/database-services/model/database.entity.js.map +1 -0
  138. package/packages/vscode/src/database-services/model/database.entity.ts +246 -0
  139. package/packages/vscode/src/database-services/mongodb.service.js.map +1 -0
  140. package/packages/vscode/src/database-services/mongodb.service.ts +454 -0
  141. package/packages/vscode/src/database-services/mssql.service.js.map +1 -0
  142. package/packages/vscode/src/database-services/mssql.service.ts +723 -0
  143. package/packages/vscode/src/database-services/mysql.service.js.map +1 -0
  144. package/packages/vscode/src/database-services/mysql.service.ts +761 -0
  145. package/packages/vscode/src/database-services/oracle.service.js.map +1 -0
  146. package/packages/vscode/src/database-services/oracle.service.ts +832 -0
  147. package/packages/vscode/src/database-services/postgres.service.js.map +1 -0
  148. package/packages/vscode/src/database-services/postgres.service.ts +741 -0
  149. package/packages/vscode/src/database-services/sap.service.js.map +1 -0
  150. package/packages/vscode/src/database-services/sap.service.ts +713 -0
  151. package/packages/vscode/src/database-services/sqlite.service.js.map +1 -0
  152. package/packages/vscode/src/database-services/sqlite.service.ts +559 -0
  153. package/packages/vscode/src/extension.ts +76 -0
  154. package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -0
  155. package/packages/vscode/src/provider/WebViewProvider.ts +277 -0
  156. package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -0
  157. package/packages/vscode/src/typings/connection.ts +90 -0
  158. package/packages/vscode/tsconfig.json +21 -0
  159. package/public/fdb2.png +0 -0
  160. package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
  161. package/server/index.ts +5 -10
  162. package/server/model/connection.entity.js +11 -0
  163. package/server/model/connection.entity.js.map +1 -0
  164. package/server/model/database.entity.js +35 -0
  165. package/server/model/database.entity.js.map +1 -0
  166. package/server/service/connection.service.ts +1 -0
  167. package/server/service/database/base.service.ts +8 -3
  168. package/server/service/database/cockroachdb.service.ts +123 -0
  169. package/server/service/database/database.service.ts +9 -0
  170. package/server/service/database/mongodb.service.ts +9 -0
  171. package/server/service/database/mssql.service.ts +118 -0
  172. package/server/service/database/mysql.service.ts +130 -0
  173. package/server/service/database/oracle.service.ts +128 -0
  174. package/server/service/database/postgres.service.ts +131 -0
  175. package/server/service/database/sap.service.ts +120 -0
  176. package/server/service/database/sqlite.service.ts +150 -0
  177. package/server/tsconfig.json +20 -0
  178. package/src/components/connection-editor/index.vue +0 -1
  179. package/src/platform/database/components/db-tools.vue +414 -174
  180. package/src/platform/database/components/table-detail.vue +1 -0
  181. package/src/platform/database/components/table-editor.vue +245 -18
  182. package/src/platform/vscode/bridge.ts +121 -0
  183. package/src/platform/vscode/components/ConnectionPanel.vue +272 -0
  184. package/src/platform/vscode/components/DatabasePanel.vue +532 -0
  185. package/src/platform/vscode/components/QueryPanel.vue +371 -0
  186. package/src/platform/vscode/entry/connection.ts +13 -0
  187. package/src/platform/vscode/entry/database.ts +13 -0
  188. package/src/platform/vscode/entry/query.ts +13 -0
  189. package/src/platform/vscode/index.ts +5 -0
  190. package/src/service/database.ts +2 -6
  191. package/vite.config.ts +46 -6
  192. package/vite.config.vscode.ts +47 -0
@@ -0,0 +1,532 @@
1
+ <template>
2
+ <div class="database-panel">
3
+ <div class="panel-header">
4
+ <h1 class="panel-title">数据库管理</h1>
5
+ <div class="panel-actions">
6
+ <button @click="handleAddConnection" class="btn btn-secondary">添加连接</button>
7
+ </div>
8
+ </div>
9
+
10
+ <div style="margin-bottom: 20px;">
11
+ <select v-model="selectedConnectionId" class="connection-selector" @change="handleConnectionChange">
12
+ <option value="">选择数据库连接</option>
13
+ <option v-for="conn in connections" :key="conn.id" :value="conn.id">
14
+ {{ conn.name }} ({{ conn.host }}:{{ conn.port }})
15
+ </option>
16
+ </select>
17
+ </div>
18
+
19
+ <div id="contentArea">
20
+ <div v-if="loading" class="loading">
21
+ <div class="spinner"></div>
22
+ <div>加载中...</div>
23
+ </div>
24
+ <div v-else-if="!selectedConnectionId" class="empty-state">
25
+ <div class="empty-icon">🗄️</div>
26
+ <div class="empty-title">未选择连接</div>
27
+ <div class="empty-text">请从下拉列表中选择一个数据库连接</div>
28
+ </div>
29
+ <div v-else>
30
+ <div class="tabs">
31
+ <button
32
+ v-for="tab in tabs"
33
+ :key="tab.id"
34
+ :class="['tab', { active: currentTab === tab.id }]"
35
+ @click="currentTab = tab.id"
36
+ >
37
+ {{ tab.name }}
38
+ </button>
39
+ </div>
40
+
41
+ <div v-show="currentTab === 'overview'" class="tab-content active">
42
+ <h3 class="section-title">数据库概览</h3>
43
+ <div class="database-grid">
44
+ <div
45
+ v-for="db in databases"
46
+ :key="db.name"
47
+ class="database-card"
48
+ @click="selectDatabase(db)"
49
+ >
50
+ <div class="database-header">
51
+ <div class="database-icon">🗄️</div>
52
+ <div class="database-name">{{ db.name }}</div>
53
+ </div>
54
+ <div class="database-info">
55
+ <span class="database-stat">📊 {{ db.tables }} 表</span>
56
+ <span class="database-stat">💾 {{ db.size }}</span>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+
62
+ <div v-show="currentTab === 'databases'" class="tab-content">
63
+ <h3 class="section-title">数据库列表</h3>
64
+ <div class="database-grid">
65
+ <div
66
+ v-for="db in databases"
67
+ :key="db.name"
68
+ class="database-card"
69
+ @click="selectDatabase(db)"
70
+ >
71
+ <div class="database-header">
72
+ <div class="database-icon">🗄️</div>
73
+ <div class="database-name">{{ db.name }}</div>
74
+ </div>
75
+ <div class="database-info">
76
+ <span class="database-stat">📊 {{ db.tables }} 表</span>
77
+ <span class="database-stat">💾 {{ db.size }}</span>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ </div>
82
+
83
+ <div v-show="currentTab === 'tables'" class="tab-content">
84
+ <h3 class="section-title">表列表</h3>
85
+ <div class="table-list">
86
+ <div
87
+ v-for="table in tables"
88
+ :key="table.name"
89
+ class="table-item"
90
+ >
91
+ <div class="table-icon">{{ table.type === 'table' ? '📋' : '👁️' }}</div>
92
+ <div class="table-info">
93
+ <div class="table-name">{{ table.name }}</div>
94
+ <div v-if="table.comment" class="table-comment">{{ table.comment }}</div>
95
+ <div v-if="table.rows !== null" class="table-meta">
96
+ <span>{{ table.rows.toLocaleString() }} 行</span>
97
+ <span>{{ table.engine || '' }}</span>
98
+ <span>{{ table.size || '' }}</span>
99
+ </div>
100
+ </div>
101
+ <span :class="['table-type', table.type]">{{ table.type === 'table' ? 'TABLE' : 'VIEW' }}</span>
102
+ <div class="table-actions">
103
+ <button class="action-btn" @click.stop="handleViewData(table)">数据</button>
104
+ <button class="action-btn" @click.stop="handleViewStructure(table)">结构</button>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </template>
113
+
114
+ <script setup lang="ts">
115
+ import { ref, reactive, computed, onMounted } from 'vue';
116
+ import { getVSCodeBridge } from '../bridge';
117
+
118
+ const vscode = getVSCodeBridge();
119
+
120
+ const connections = ref<any[]>([]);
121
+ const selectedConnectionId = ref('');
122
+ const databases = ref<any[]>([]);
123
+ const tables = ref<any[]>([]);
124
+ const loading = ref(false);
125
+ const currentTab = ref('overview');
126
+
127
+ const selectedConnection = computed(() => {
128
+ return connections.value.find(c => c.id === selectedConnectionId.value);
129
+ });
130
+
131
+ const tabs = [
132
+ { id: 'overview', name: '概览' },
133
+ { id: 'databases', name: '数据库' },
134
+ { id: 'tables', name: '表' }
135
+ ];
136
+
137
+ onMounted(() => {
138
+ // 请求连接列表
139
+ vscode.postMessage({ command: 'getConnections' });
140
+
141
+ // 监听来自扩展的消息
142
+ vscode.onMessage((message: any) => {
143
+ if (message.command === 'connections') {
144
+ connections.value = message.data;
145
+ } else if (message.command === 'selectConnection') {
146
+ selectConnection(message.data);
147
+ } else if (message.command === 'databases') {
148
+ databases.value = message.data;
149
+ loading.value = false;
150
+ } else if (message.command === 'tables') {
151
+ tables.value = message.data;
152
+ loading.value = false;
153
+ } else if (message.command === 'error') {
154
+ handleError(message.data);
155
+ }
156
+ });
157
+ });
158
+
159
+ function handleAddConnection() {
160
+ vscode.postMessage({ command: 'addConnection' });
161
+ }
162
+
163
+ function handleConnectionChange() {
164
+ if (selectedConnectionId.value) {
165
+ const connection = connections.value.find(c => c.id === selectedConnectionId.value);
166
+ selectConnection(connection);
167
+ } else {
168
+ databases.value = [];
169
+ tables.value = [];
170
+ }
171
+ }
172
+
173
+ function selectConnection(connection: any) {
174
+ if (!connection) return;
175
+
176
+ selectedConnectionId.value = connection.id;
177
+ loading.value = true;
178
+
179
+ // 请求数据库列表
180
+ vscode.postMessage({
181
+ command: 'getDatabases',
182
+ data: { connectionId: connection.id }
183
+ });
184
+ }
185
+
186
+ function selectDatabase(database: any) {
187
+ loading.value = true;
188
+ currentTab.value = 'tables';
189
+
190
+ // 请求表列表
191
+ vscode.postMessage({
192
+ command: 'getTables',
193
+ data: {
194
+ connectionId: selectedConnectionId.value,
195
+ databaseName: database.name
196
+ }
197
+ });
198
+ }
199
+
200
+ function handleViewData(table: any) {
201
+ vscode.postMessage({
202
+ command: 'openTableData',
203
+ data: {
204
+ connectionId: selectedConnectionId.value,
205
+ tableName: table.name
206
+ }
207
+ });
208
+ }
209
+
210
+ function handleViewStructure(table: any) {
211
+ vscode.postMessage({
212
+ command: 'openTableStructure',
213
+ data: {
214
+ connectionId: selectedConnectionId.value,
215
+ tableName: table.name
216
+ }
217
+ });
218
+ }
219
+
220
+ function handleError(error: string) {
221
+ loading.value = false;
222
+ console.error('Error:', error);
223
+ alert(`操作失败: ${error}`);
224
+ }
225
+ </script>
226
+
227
+ <style scoped>
228
+ .database-panel {
229
+ padding: 16px;
230
+ height: 100vh;
231
+ overflow: auto;
232
+ }
233
+
234
+ .panel-header {
235
+ display: flex;
236
+ justify-content: space-between;
237
+ align-items: center;
238
+ margin-bottom: 20px;
239
+ padding-bottom: 16px;
240
+ border-bottom: 1px solid var(--vscode-panel-border);
241
+ }
242
+
243
+ .panel-title {
244
+ font-size: 18px;
245
+ font-weight: 600;
246
+ margin: 0;
247
+ color: var(--vscode-foreground);
248
+ }
249
+
250
+ .panel-actions {
251
+ display: flex;
252
+ gap: 8px;
253
+ }
254
+
255
+ .connection-selector {
256
+ width: 300px;
257
+ padding: 6px 10px;
258
+ border: 1px solid var(--vscode-input-border);
259
+ background-color: var(--vscode-input-background);
260
+ color: var(--vscode-input-foreground);
261
+ border-radius: 4px;
262
+ font-size: 13px;
263
+ }
264
+
265
+ .btn {
266
+ padding: 6px 14px;
267
+ border: none;
268
+ border-radius: 4px;
269
+ font-size: 13px;
270
+ cursor: pointer;
271
+ transition: background-color 0.2s;
272
+ }
273
+
274
+ .btn-primary {
275
+ background-color: var(--vscode-button-background);
276
+ color: var(--vscode-button-foreground);
277
+ }
278
+
279
+ .btn-primary:hover {
280
+ background-color: var(--vscode-button-hoverBackground);
281
+ }
282
+
283
+ .btn-secondary {
284
+ background-color: var(--vscode-button-secondaryBackground);
285
+ color: var(--vscode-button-secondaryForeground);
286
+ }
287
+
288
+ .btn-secondary:hover {
289
+ background-color: var(--vscode-button-secondaryHoverBackground);
290
+ }
291
+
292
+ .database-grid {
293
+ display: grid;
294
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
295
+ gap: 16px;
296
+ }
297
+
298
+ .database-card {
299
+ padding: 16px;
300
+ background-color: var(--vscode-editor-background);
301
+ border: 1px solid var(--vscode-panel-border);
302
+ border-radius: 8px;
303
+ cursor: pointer;
304
+ transition: all 0.2s;
305
+ }
306
+
307
+ .database-card:hover {
308
+ border-color: var(--vscode-focusBorder);
309
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
310
+ transform: translateY(-2px);
311
+ }
312
+
313
+ .database-header {
314
+ display: flex;
315
+ align-items: center;
316
+ gap: 12px;
317
+ margin-bottom: 12px;
318
+ }
319
+
320
+ .database-icon {
321
+ font-size: 28px;
322
+ color: var(--vscode-textLink-foreground);
323
+ }
324
+
325
+ .database-name {
326
+ flex: 1;
327
+ font-size: 16px;
328
+ font-weight: 600;
329
+ color: var(--vscode-foreground);
330
+ }
331
+
332
+ .database-info {
333
+ display: flex;
334
+ gap: 16px;
335
+ font-size: 12px;
336
+ color: var(--vscode-descriptionForeground);
337
+ }
338
+
339
+ .database-stat {
340
+ display: flex;
341
+ align-items: center;
342
+ gap: 4px;
343
+ }
344
+
345
+ .section-title {
346
+ font-size: 16px;
347
+ font-weight: 600;
348
+ margin: 24px 0 16px 0;
349
+ padding-bottom: 8px;
350
+ border-bottom: 1px solid var(--vscode-panel-border);
351
+ color: var(--vscode-foreground);
352
+ }
353
+
354
+ .tabs {
355
+ display: flex;
356
+ gap: 4px;
357
+ margin-bottom: 16px;
358
+ border-bottom: 1px solid var(--vscode-panel-border);
359
+ }
360
+
361
+ .tab {
362
+ padding: 8px 16px;
363
+ border: none;
364
+ background-color: transparent;
365
+ color: var(--vscode-foreground);
366
+ font-size: 13px;
367
+ cursor: pointer;
368
+ border-bottom: 2px solid transparent;
369
+ transition: all 0.2s;
370
+ }
371
+
372
+ .tab:hover {
373
+ background-color: var(--vscode-list-hoverBackground);
374
+ }
375
+
376
+ .tab.active {
377
+ border-bottom-color: var(--vscode-focusBorder);
378
+ color: var(--vscode-textLink-foreground);
379
+ }
380
+
381
+ .tab-content {
382
+ display: none;
383
+ }
384
+
385
+ .tab-content.active {
386
+ display: block;
387
+ }
388
+
389
+ .table-list {
390
+ display: flex;
391
+ flex-direction: column;
392
+ gap: 4px;
393
+ }
394
+
395
+ .table-item {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 12px;
399
+ padding: 12px;
400
+ border-radius: 6px;
401
+ cursor: pointer;
402
+ transition: background-color 0.2s;
403
+ }
404
+
405
+ .table-item:hover {
406
+ background-color: var(--vscode-list-hoverBackground);
407
+ }
408
+
409
+ .table-icon {
410
+ font-size: 20px;
411
+ color: var(--vscode-textLink-foreground);
412
+ width: 24px;
413
+ text-align: center;
414
+ }
415
+
416
+ .table-info {
417
+ flex: 1;
418
+ }
419
+
420
+ .table-name {
421
+ font-size: 14px;
422
+ font-weight: 500;
423
+ margin-bottom: 2px;
424
+ color: var(--vscode-foreground);
425
+ }
426
+
427
+ .table-comment {
428
+ font-size: 12px;
429
+ color: var(--vscode-descriptionForeground);
430
+ }
431
+
432
+ .table-meta {
433
+ display: flex;
434
+ align-items: center;
435
+ gap: 12px;
436
+ font-size: 12px;
437
+ color: var(--vscode-descriptionForeground);
438
+ margin-top: 4px;
439
+ }
440
+
441
+ .table-type {
442
+ padding: 2px 8px;
443
+ border-radius: 12px;
444
+ background-color: var(--vscode-badge-background);
445
+ font-weight: 500;
446
+ font-size: 12px;
447
+ }
448
+
449
+ .table-type.table {
450
+ background-color: var(--vscode-badge-background);
451
+ }
452
+
453
+ .table-type.view {
454
+ background-color: var(--vscode-gitDecorationModifiedResourceForeground);
455
+ color: white;
456
+ }
457
+
458
+ .table-actions {
459
+ display: flex;
460
+ gap: 8px;
461
+ opacity: 0;
462
+ transition: opacity 0.2s;
463
+ }
464
+
465
+ .table-item:hover .table-actions {
466
+ opacity: 1;
467
+ }
468
+
469
+ .action-btn {
470
+ padding: 4px 8px;
471
+ font-size: 12px;
472
+ background-color: var(--vscode-button-secondaryBackground);
473
+ color: var(--vscode-button-secondaryForeground);
474
+ border: none;
475
+ border-radius: 4px;
476
+ cursor: pointer;
477
+ }
478
+
479
+ .action-btn:hover {
480
+ background-color: var(--vscode-button-secondaryHoverBackground);
481
+ }
482
+
483
+ .empty-state {
484
+ display: flex;
485
+ flex-direction: column;
486
+ align-items: center;
487
+ justify-content: center;
488
+ padding: 80px 20px;
489
+ text-align: center;
490
+ }
491
+
492
+ .empty-icon {
493
+ font-size: 64px;
494
+ margin-bottom: 16px;
495
+ opacity: 0.3;
496
+ }
497
+
498
+ .empty-title {
499
+ font-size: 16px;
500
+ font-weight: 600;
501
+ margin-bottom: 8px;
502
+ color: var(--vscode-foreground);
503
+ }
504
+
505
+ .empty-text {
506
+ font-size: 14px;
507
+ color: var(--vscode-descriptionForeground);
508
+ }
509
+
510
+ .loading {
511
+ display: flex;
512
+ flex-direction: column;
513
+ align-items: center;
514
+ justify-content: center;
515
+ padding: 40px;
516
+ }
517
+
518
+ .spinner {
519
+ width: 32px;
520
+ height: 32px;
521
+ border: 3px solid var(--vscode-progressBar-background);
522
+ border-top-color: var(--vscode-progressBar-foreground);
523
+ border-radius: 50%;
524
+ animation: spin 0.6s linear infinite;
525
+ }
526
+
527
+ @keyframes spin {
528
+ to {
529
+ transform: rotate(360deg);
530
+ }
531
+ }
532
+ </style>