@lijian-ui/dsh-file-manager 0.2.2 → 0.2.4

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 (101) hide show
  1. package/LICENSE +38 -38
  2. package/README.i18n.yaml +6 -6
  3. package/README.md +66 -66
  4. package/README.zh.md +66 -66
  5. package/cordis.patch.yml +13 -13
  6. package/lib/client.js +27354 -355
  7. package/lib/client.js.map +1 -1
  8. package/lib/index.js +474 -42
  9. package/lib/tsconfig.client.tsbuildinfo +1 -1
  10. package/lib/tsconfig.host.tsbuildinfo +1 -1
  11. package/lib/types/client/file-source.d.ts +10 -0
  12. package/lib/types/client/file-source.d.ts.map +1 -1
  13. package/lib/types/client/fileType.d.ts +19 -4
  14. package/lib/types/client/fileType.d.ts.map +1 -1
  15. package/lib/types/client/index.d.ts +0 -1
  16. package/lib/types/client/index.d.ts.map +1 -1
  17. package/lib/types/client/locales.d.ts +3 -0
  18. package/lib/types/client/locales.d.ts.map +1 -1
  19. package/lib/types/client/mount.d.ts +1 -1
  20. package/lib/types/client/mount.d.ts.map +1 -1
  21. package/lib/types/client/picker/FilePickerModal.d.ts +8 -6
  22. package/lib/types/client/picker/FilePickerModal.d.ts.map +1 -1
  23. package/lib/types/client/preview/PreviewPanel.d.ts +2 -1
  24. package/lib/types/client/preview/PreviewPanel.d.ts.map +1 -1
  25. package/lib/types/client/preview/PreviewToolbar.d.ts +3 -1
  26. package/lib/types/client/preview/PreviewToolbar.d.ts.map +1 -1
  27. package/lib/types/client/preview/content.d.ts +3 -1
  28. package/lib/types/client/preview/content.d.ts.map +1 -1
  29. package/lib/types/client/preview/office.d.ts +23 -0
  30. package/lib/types/client/preview/office.d.ts.map +1 -0
  31. package/lib/types/client/reference.d.ts +23 -10
  32. package/lib/types/client/reference.d.ts.map +1 -1
  33. package/lib/types/client/store.d.ts.map +1 -1
  34. package/lib/types/host/fs-service.d.ts.map +1 -1
  35. package/lib/types/host/office-preview.d.ts +13 -0
  36. package/lib/types/host/office-preview.d.ts.map +1 -0
  37. package/lib/types/host/routes.d.ts.map +1 -1
  38. package/lib/types/index.d.ts.map +1 -1
  39. package/package.json +19 -4
  40. package/src/client/DockItem.tsx +1 -1
  41. package/src/client/FileManagerSettingsCard.tsx +117 -117
  42. package/src/client/PluginSettingsCard.tsx +337 -337
  43. package/src/client/chat/file-ref.ts +144 -144
  44. package/src/client/chat/mermaid-chat.tsx +102 -102
  45. package/src/client/chat/placeholder-hint.tsx +46 -46
  46. package/src/client/components/ExplorerPanel.tsx +534 -534
  47. package/src/client/components/FileIcon.tsx +46 -46
  48. package/src/client/components/ScmPanel.tsx +480 -480
  49. package/src/client/components/a11y.ts +20 -20
  50. package/src/client/components/icons.tsx +274 -274
  51. package/src/client/components/overlay.tsx +225 -225
  52. package/src/client/drag/DragFileInlay.tsx +89 -89
  53. package/src/client/drag/file-drag.ts +67 -67
  54. package/src/client/drag.ts +154 -154
  55. package/src/client/file-source.ts +34 -0
  56. package/src/client/fileType.ts +32 -5
  57. package/src/client/hooks/useResizableSplit.ts +91 -91
  58. package/src/client/hooks/useStore.ts +15 -15
  59. package/src/client/index.ts +45 -17
  60. package/src/client/layout.ts +523 -523
  61. package/src/client/locales.ts +6 -0
  62. package/src/client/maximize.ts +34 -34
  63. package/src/client/mount.tsx +2 -1
  64. package/src/client/persist.ts +194 -194
  65. package/src/client/picker/FilePickerModal.tsx +526 -507
  66. package/src/client/picker/file-picker.ts +86 -86
  67. package/src/client/preview/PreviewPanel.tsx +8 -1
  68. package/src/client/preview/PreviewTabs.tsx +159 -159
  69. package/src/client/preview/PreviewToolbar.tsx +3 -2
  70. package/src/client/preview/content.tsx +7 -2
  71. package/src/client/preview/markdown.ts +351 -351
  72. package/src/client/preview/mermaid.ts +274 -274
  73. package/src/client/preview/office.tsx +321 -0
  74. package/src/client/reference.ts +62 -8
  75. package/src/client/settings-card.module.css +316 -316
  76. package/src/client/settings-form.ts +451 -451
  77. package/src/client/store.ts +17 -12
  78. package/src/client/styles/drag.module.css +30 -30
  79. package/src/client/styles/explorer.module.css +371 -371
  80. package/src/client/styles/picker.module.css +344 -344
  81. package/src/client/styles/preview.module.css +18 -11
  82. package/src/client/styles/scm.module.css +380 -380
  83. package/src/client/styles/tokens.module.css +376 -367
  84. package/src/core/types.ts +162 -162
  85. package/src/host/fs-service.ts +7 -1
  86. package/src/host/gate.ts +73 -73
  87. package/src/host/git-runner.ts +116 -116
  88. package/src/host/git-service.ts +395 -395
  89. package/src/host/loopback.ts +63 -63
  90. package/src/host/office-preview.ts +399 -0
  91. package/src/host/poll-guard.ts +109 -109
  92. package/src/host/routes.ts +72 -1
  93. package/src/index.ts +3 -1
  94. package/src/mount-once.ts +48 -48
  95. package/lib/types/client/chat/AttachedFilesDock.d.ts +0 -51
  96. package/lib/types/client/chat/AttachedFilesDock.d.ts.map +0 -1
  97. package/lib/types/client/floating.d.ts +0 -27
  98. package/lib/types/client/floating.d.ts.map +0 -1
  99. package/lib/types/client/mention.d.ts +0 -44
  100. package/lib/types/client/mention.d.ts.map +0 -1
  101. package/src/client/styles/chip.module.css +0 -38
@@ -1,371 +1,371 @@
1
- /**
2
- * Explorer column styles — FileManager measured values (tree row 34px, tab bar
3
- * 37px, 12px baseline with 8px row padding so content lands at 20px).
4
- */
5
-
6
- /* The Files/Changes tab bar: 28px buttons + 4px vertical padding + 1px border. */
7
- .tabBar {
8
- position: relative;
9
- /* Above third-party skin fixed decoration layers (z-index ~20) so the tab
10
- bar buttons and the collapse chevron stay clickable (issue #169). Low
11
- enough to stay below overlays/dialogs (1000+). */
12
- z-index: 30;
13
- display: flex;
14
- align-items: center;
15
- gap: 4px;
16
- padding: 4px 8px 4px 12px;
17
- flex-shrink: 0;
18
- border-bottom: 1px solid var(--aion-bg-3);
19
- background: var(--aion-bg-1);
20
- }
21
-
22
- .tabBtn {
23
- height: 28px;
24
- padding: 0 8px;
25
- border: none;
26
- border-radius: 2px;
27
- background: transparent;
28
- color: var(--aion-text-secondary);
29
- font-size: 13px;
30
- font-family: var(--aion-font-sans);
31
- cursor: pointer;
32
- transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
33
- white-space: nowrap;
34
- }
35
-
36
- .tabBtn:hover {
37
- background: var(--aion-fill-2);
38
- }
39
-
40
- .tabBtn:active {
41
- background: var(--aion-bg-active);
42
- }
43
-
44
- .tabBtn:focus-visible {
45
- outline: 2px solid var(--aion-primary);
46
- outline-offset: 2px;
47
- }
48
-
49
- .tabBtnActive {
50
- height: 28px;
51
- padding: 0 8px;
52
- border: none;
53
- border-radius: 2px;
54
- background: var(--aion-bg-2);
55
- color: var(--aion-text-primary);
56
- font-size: 13px;
57
- font-family: var(--aion-font-sans);
58
- cursor: pointer;
59
- transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
60
- white-space: nowrap;
61
- font-weight: 500;
62
- }
63
-
64
- .tabBtnActive:active {
65
- background: var(--aion-bg-active);
66
- }
67
-
68
- .tabBtnActive:focus-visible {
69
- outline: 2px solid var(--aion-primary);
70
- outline-offset: 2px;
71
- }
72
-
73
- /* The in-flow tab-bar icon button (maximize/restore, issue #315). */
74
- .tabIconBtn {
75
- display: flex;
76
- align-items: center;
77
- justify-content: center;
78
- width: 24px;
79
- height: 24px;
80
- margin-right: 4px;
81
- border: none;
82
- border-radius: 4px;
83
- background: transparent;
84
- color: var(--aion-text-secondary);
85
- cursor: pointer;
86
- transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
87
- }
88
-
89
- .tabIconBtn:hover {
90
- background: var(--aion-bg-3);
91
- color: var(--aion-text-primary);
92
- }
93
-
94
- .tabIconBtn:active {
95
- background: var(--aion-bg-active);
96
- }
97
-
98
- .tabIconBtn:focus-visible {
99
- outline: 2px solid var(--aion-primary);
100
- outline-offset: 2px;
101
- }
102
-
103
- /* The persistent filename search area. */
104
- .searchArea {
105
- flex-shrink: 0;
106
- padding: 8px 8px 4px 12px;
107
- }
108
-
109
- .searchBox {
110
- display: flex;
111
- align-items: center;
112
- gap: 6px;
113
- height: 28px;
114
- padding: 0 8px;
115
- border-radius: 2px;
116
- background: var(--aion-bg-base);
117
- border: 1px solid transparent;
118
- transition: border-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
119
- }
120
-
121
- .searchBoxFocus {
122
- border-color: var(--aion-primary);
123
- }
124
-
125
- /* The inner input is focusable; mirror its focus ring onto the box. */
126
- .searchBox:focus-within {
127
- box-shadow: 0 0 0 2px transparent, 0 0 0 4px var(--aion-primary);
128
- }
129
-
130
- .searchIcon {
131
- display: flex;
132
- align-items: center;
133
- color: var(--aion-text-secondary);
134
- flex-shrink: 0;
135
- }
136
-
137
- .searchInput {
138
- flex: 1;
139
- min-width: 0;
140
- height: 100%;
141
- border: none;
142
- outline: none;
143
- background: transparent;
144
- color: var(--aion-text-primary);
145
- font-size: 13px;
146
- font-family: var(--aion-font-sans);
147
- }
148
-
149
- .searchInput::placeholder {
150
- color: var(--aion-text-tertiary);
151
- }
152
-
153
- .searchClear {
154
- display: none;
155
- align-items: center;
156
- justify-content: center;
157
- width: 16px;
158
- height: 16px;
159
- border: none;
160
- border-radius: 2px;
161
- background: transparent;
162
- color: var(--aion-text-tertiary);
163
- cursor: pointer;
164
- padding: 0;
165
- }
166
-
167
- .searchClear:hover {
168
- color: var(--aion-text-primary);
169
- background: var(--aion-fill-2);
170
- }
171
-
172
- .searchClear:active {
173
- background: var(--aion-bg-active);
174
- }
175
-
176
- .searchClear:focus-visible {
177
- outline: 2px solid var(--aion-primary);
178
- outline-offset: 2px;
179
- }
180
-
181
- .searchAreaFocus .searchClear {
182
- display: flex;
183
- }
184
-
185
- /* Scroll region shared by tree and results. */
186
- .scrollArea {
187
- flex: 1;
188
- min-height: 0;
189
- overflow-y: auto;
190
- overflow-x: hidden;
191
- }
192
-
193
- /* The file tree. Rows: 34px, full-row hover/selected, 8px padding (the
194
- container adds the 12px baseline). */
195
- .tree {
196
- padding: 2px 0 8px 12px;
197
- user-select: none;
198
- }
199
-
200
- .treeRow {
201
- display: flex;
202
- align-items: center;
203
- gap: 4px;
204
- height: 34px;
205
- padding-right: 8px;
206
- cursor: pointer;
207
- border-radius: 0;
208
- transition: background-color 0.12s ease;
209
- white-space: nowrap;
210
- min-width: 0;
211
- }
212
-
213
- .treeRow:hover {
214
- background-color: var(--aion-fill-2);
215
- }
216
-
217
- .treeRow:active {
218
- background-color: var(--aion-bg-active);
219
- }
220
-
221
- .treeRowDragging {
222
- cursor: grabbing;
223
- opacity: 0.55;
224
- }
225
-
226
- .treeRow:focus-visible {
227
- box-shadow: inset 0 0 0 2px var(--aion-primary);
228
- }
229
-
230
- .treeRowSelected,
231
- .treeRowSelected:hover {
232
- background-color: var(--aion-fill-3);
233
- }
234
-
235
- .treeArrow {
236
- display: flex;
237
- align-items: center;
238
- justify-content: center;
239
- width: 14px;
240
- height: 14px;
241
- color: var(--aion-text-tertiary);
242
- flex-shrink: 0;
243
- transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);
244
- }
245
-
246
- .treeArrowOpen {
247
- transform: rotate(90deg);
248
- }
249
-
250
- .treeArrowEmpty {
251
- visibility: hidden;
252
- }
253
-
254
- .treeName {
255
- overflow: hidden;
256
- text-overflow: ellipsis;
257
- font-size: 13px;
258
- color: var(--aion-text-primary);
259
- }
260
-
261
- /* The row '@' button: hidden until the row is hovered/focused, inserts a
262
- @<rel-path> reference into the composer draft (issue #312). */
263
- .refBtn {
264
- display: none;
265
- align-items: center;
266
- justify-content: center;
267
- width: 20px;
268
- height: 20px;
269
- margin-left: 4px;
270
- padding: 0;
271
- border: none;
272
- border-radius: 4px;
273
- background: transparent;
274
- color: var(--aion-text-tertiary);
275
- font-size: 13px;
276
- line-height: 1;
277
- cursor: pointer;
278
- flex-shrink: 0;
279
- transition: background-color 0.12s ease, color 0.12s ease;
280
- }
281
-
282
- .treeRow:hover .refBtn,
283
- .refBtn:focus-visible {
284
- display: flex;
285
- }
286
-
287
- .refBtn:hover {
288
- background: var(--aion-bg-3);
289
- color: var(--aion-primary);
290
- }
291
-
292
- .refBtn:active {
293
- background: var(--aion-bg-active);
294
- }
295
-
296
- .refBtn:focus-visible {
297
- outline: 2px solid var(--aion-primary);
298
- outline-offset: 1px;
299
- }
300
-
301
- .treeRowSelected .treeName {
302
- color: var(--aion-text-primary);
303
- }
304
-
305
- .treeMeta {
306
- margin-left: auto;
307
- font-size: 11px;
308
- color: var(--aion-text-tertiary);
309
- flex-shrink: 0;
310
- padding-right: 4px;
311
- }
312
-
313
- /* Search results (flat stream). */
314
- .resultRow {
315
- display: flex;
316
- align-items: center;
317
- gap: 6px;
318
- height: 30px;
319
- padding: 0 8px 0 12px;
320
- cursor: pointer;
321
- white-space: nowrap;
322
- transition: background-color 0.12s ease;
323
- }
324
-
325
- .resultRow:hover {
326
- background-color: var(--aion-fill-2);
327
- }
328
-
329
- .resultRow:active {
330
- background-color: var(--aion-bg-active);
331
- }
332
-
333
- .resultRow:focus-visible {
334
- box-shadow: inset 0 0 0 2px var(--aion-primary);
335
- }
336
-
337
- .resultName {
338
- overflow: hidden;
339
- text-overflow: ellipsis;
340
- font-size: 13px;
341
- color: var(--aion-text-primary);
342
- }
343
-
344
- .resultPath {
345
- overflow: hidden;
346
- text-overflow: ellipsis;
347
- font-size: 11px;
348
- color: var(--aion-text-tertiary);
349
- flex-shrink: 1;
350
- min-width: 0;
351
- }
352
-
353
- .resultMeta {
354
- font-size: 11px;
355
- color: var(--aion-text-tertiary);
356
- flex-shrink: 0;
357
- }
358
-
359
- .searchStatus {
360
- padding: 12px;
361
- font-size: 12px;
362
- color: var(--aion-text-tertiary);
363
- }
364
-
365
- /* Empty tree state. */
366
- .emptyState {
367
- padding: 24px 16px;
368
- font-size: 12px;
369
- color: var(--aion-text-tertiary);
370
- text-align: center;
371
- }
1
+ /**
2
+ * Explorer column styles — FileManager measured values (tree row 34px, tab bar
3
+ * 37px, 12px baseline with 8px row padding so content lands at 20px).
4
+ */
5
+
6
+ /* The Files/Changes tab bar: 28px buttons + 4px vertical padding + 1px border. */
7
+ .tabBar {
8
+ position: relative;
9
+ /* Above third-party skin fixed decoration layers (z-index ~20) so the tab
10
+ bar buttons and the collapse chevron stay clickable (issue #169). Low
11
+ enough to stay below overlays/dialogs (1000+). */
12
+ z-index: 30;
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 4px;
16
+ padding: 4px 8px 4px 12px;
17
+ flex-shrink: 0;
18
+ border-bottom: 1px solid var(--aion-bg-3);
19
+ background: var(--aion-bg-1);
20
+ }
21
+
22
+ .tabBtn {
23
+ height: 28px;
24
+ padding: 0 8px;
25
+ border: none;
26
+ border-radius: 2px;
27
+ background: transparent;
28
+ color: var(--aion-text-secondary);
29
+ font-size: 13px;
30
+ font-family: var(--aion-font-sans);
31
+ cursor: pointer;
32
+ transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
33
+ white-space: nowrap;
34
+ }
35
+
36
+ .tabBtn:hover {
37
+ background: var(--aion-fill-2);
38
+ }
39
+
40
+ .tabBtn:active {
41
+ background: var(--aion-bg-active);
42
+ }
43
+
44
+ .tabBtn:focus-visible {
45
+ outline: 2px solid var(--aion-primary);
46
+ outline-offset: 2px;
47
+ }
48
+
49
+ .tabBtnActive {
50
+ height: 28px;
51
+ padding: 0 8px;
52
+ border: none;
53
+ border-radius: 2px;
54
+ background: var(--aion-bg-2);
55
+ color: var(--aion-text-primary);
56
+ font-size: 13px;
57
+ font-family: var(--aion-font-sans);
58
+ cursor: pointer;
59
+ transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
60
+ white-space: nowrap;
61
+ font-weight: 500;
62
+ }
63
+
64
+ .tabBtnActive:active {
65
+ background: var(--aion-bg-active);
66
+ }
67
+
68
+ .tabBtnActive:focus-visible {
69
+ outline: 2px solid var(--aion-primary);
70
+ outline-offset: 2px;
71
+ }
72
+
73
+ /* The in-flow tab-bar icon button (maximize/restore, issue #315). */
74
+ .tabIconBtn {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ width: 24px;
79
+ height: 24px;
80
+ margin-right: 4px;
81
+ border: none;
82
+ border-radius: 4px;
83
+ background: transparent;
84
+ color: var(--aion-text-secondary);
85
+ cursor: pointer;
86
+ transition: background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
87
+ }
88
+
89
+ .tabIconBtn:hover {
90
+ background: var(--aion-bg-3);
91
+ color: var(--aion-text-primary);
92
+ }
93
+
94
+ .tabIconBtn:active {
95
+ background: var(--aion-bg-active);
96
+ }
97
+
98
+ .tabIconBtn:focus-visible {
99
+ outline: 2px solid var(--aion-primary);
100
+ outline-offset: 2px;
101
+ }
102
+
103
+ /* The persistent filename search area. */
104
+ .searchArea {
105
+ flex-shrink: 0;
106
+ padding: 8px 8px 4px 12px;
107
+ }
108
+
109
+ .searchBox {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: 6px;
113
+ height: 28px;
114
+ padding: 0 8px;
115
+ border-radius: 2px;
116
+ background: var(--aion-bg-base);
117
+ border: 1px solid transparent;
118
+ transition: border-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
119
+ }
120
+
121
+ .searchBoxFocus {
122
+ border-color: var(--aion-primary);
123
+ }
124
+
125
+ /* The inner input is focusable; mirror its focus ring onto the box. */
126
+ .searchBox:focus-within {
127
+ box-shadow: 0 0 0 2px transparent, 0 0 0 4px var(--aion-primary);
128
+ }
129
+
130
+ .searchIcon {
131
+ display: flex;
132
+ align-items: center;
133
+ color: var(--aion-text-secondary);
134
+ flex-shrink: 0;
135
+ }
136
+
137
+ .searchInput {
138
+ flex: 1;
139
+ min-width: 0;
140
+ height: 100%;
141
+ border: none;
142
+ outline: none;
143
+ background: transparent;
144
+ color: var(--aion-text-primary);
145
+ font-size: 13px;
146
+ font-family: var(--aion-font-sans);
147
+ }
148
+
149
+ .searchInput::placeholder {
150
+ color: var(--aion-text-tertiary);
151
+ }
152
+
153
+ .searchClear {
154
+ display: none;
155
+ align-items: center;
156
+ justify-content: center;
157
+ width: 16px;
158
+ height: 16px;
159
+ border: none;
160
+ border-radius: 2px;
161
+ background: transparent;
162
+ color: var(--aion-text-tertiary);
163
+ cursor: pointer;
164
+ padding: 0;
165
+ }
166
+
167
+ .searchClear:hover {
168
+ color: var(--aion-text-primary);
169
+ background: var(--aion-fill-2);
170
+ }
171
+
172
+ .searchClear:active {
173
+ background: var(--aion-bg-active);
174
+ }
175
+
176
+ .searchClear:focus-visible {
177
+ outline: 2px solid var(--aion-primary);
178
+ outline-offset: 2px;
179
+ }
180
+
181
+ .searchAreaFocus .searchClear {
182
+ display: flex;
183
+ }
184
+
185
+ /* Scroll region shared by tree and results. */
186
+ .scrollArea {
187
+ flex: 1;
188
+ min-height: 0;
189
+ overflow-y: auto;
190
+ overflow-x: hidden;
191
+ }
192
+
193
+ /* The file tree. Rows: 34px, full-row hover/selected, 8px padding (the
194
+ container adds the 12px baseline). */
195
+ .tree {
196
+ padding: 2px 0 8px 12px;
197
+ user-select: none;
198
+ }
199
+
200
+ .treeRow {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 4px;
204
+ height: 34px;
205
+ padding-right: 8px;
206
+ cursor: pointer;
207
+ border-radius: 0;
208
+ transition: background-color 0.12s ease;
209
+ white-space: nowrap;
210
+ min-width: 0;
211
+ }
212
+
213
+ .treeRow:hover {
214
+ background-color: var(--aion-fill-2);
215
+ }
216
+
217
+ .treeRow:active {
218
+ background-color: var(--aion-bg-active);
219
+ }
220
+
221
+ .treeRowDragging {
222
+ cursor: grabbing;
223
+ opacity: 0.55;
224
+ }
225
+
226
+ .treeRow:focus-visible {
227
+ box-shadow: inset 0 0 0 2px var(--aion-primary);
228
+ }
229
+
230
+ .treeRowSelected,
231
+ .treeRowSelected:hover {
232
+ background-color: var(--aion-fill-3);
233
+ }
234
+
235
+ .treeArrow {
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ width: 14px;
240
+ height: 14px;
241
+ color: var(--aion-text-tertiary);
242
+ flex-shrink: 0;
243
+ transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);
244
+ }
245
+
246
+ .treeArrowOpen {
247
+ transform: rotate(90deg);
248
+ }
249
+
250
+ .treeArrowEmpty {
251
+ visibility: hidden;
252
+ }
253
+
254
+ .treeName {
255
+ overflow: hidden;
256
+ text-overflow: ellipsis;
257
+ font-size: 13px;
258
+ color: var(--aion-text-primary);
259
+ }
260
+
261
+ /* The row '@' button: hidden until the row is hovered/focused, inserts a
262
+ @<rel-path> reference into the composer draft (issue #312). */
263
+ .refBtn {
264
+ display: none;
265
+ align-items: center;
266
+ justify-content: center;
267
+ width: 20px;
268
+ height: 20px;
269
+ margin-left: 4px;
270
+ padding: 0;
271
+ border: none;
272
+ border-radius: 4px;
273
+ background: transparent;
274
+ color: var(--aion-text-tertiary);
275
+ font-size: 13px;
276
+ line-height: 1;
277
+ cursor: pointer;
278
+ flex-shrink: 0;
279
+ transition: background-color 0.12s ease, color 0.12s ease;
280
+ }
281
+
282
+ .treeRow:hover .refBtn,
283
+ .refBtn:focus-visible {
284
+ display: flex;
285
+ }
286
+
287
+ .refBtn:hover {
288
+ background: var(--aion-bg-3);
289
+ color: var(--aion-primary);
290
+ }
291
+
292
+ .refBtn:active {
293
+ background: var(--aion-bg-active);
294
+ }
295
+
296
+ .refBtn:focus-visible {
297
+ outline: 2px solid var(--aion-primary);
298
+ outline-offset: 1px;
299
+ }
300
+
301
+ .treeRowSelected .treeName {
302
+ color: var(--aion-text-primary);
303
+ }
304
+
305
+ .treeMeta {
306
+ margin-left: auto;
307
+ font-size: 11px;
308
+ color: var(--aion-text-tertiary);
309
+ flex-shrink: 0;
310
+ padding-right: 4px;
311
+ }
312
+
313
+ /* Search results (flat stream). */
314
+ .resultRow {
315
+ display: flex;
316
+ align-items: center;
317
+ gap: 6px;
318
+ height: 30px;
319
+ padding: 0 8px 0 12px;
320
+ cursor: pointer;
321
+ white-space: nowrap;
322
+ transition: background-color 0.12s ease;
323
+ }
324
+
325
+ .resultRow:hover {
326
+ background-color: var(--aion-fill-2);
327
+ }
328
+
329
+ .resultRow:active {
330
+ background-color: var(--aion-bg-active);
331
+ }
332
+
333
+ .resultRow:focus-visible {
334
+ box-shadow: inset 0 0 0 2px var(--aion-primary);
335
+ }
336
+
337
+ .resultName {
338
+ overflow: hidden;
339
+ text-overflow: ellipsis;
340
+ font-size: 13px;
341
+ color: var(--aion-text-primary);
342
+ }
343
+
344
+ .resultPath {
345
+ overflow: hidden;
346
+ text-overflow: ellipsis;
347
+ font-size: 11px;
348
+ color: var(--aion-text-tertiary);
349
+ flex-shrink: 1;
350
+ min-width: 0;
351
+ }
352
+
353
+ .resultMeta {
354
+ font-size: 11px;
355
+ color: var(--aion-text-tertiary);
356
+ flex-shrink: 0;
357
+ }
358
+
359
+ .searchStatus {
360
+ padding: 12px;
361
+ font-size: 12px;
362
+ color: var(--aion-text-tertiary);
363
+ }
364
+
365
+ /* Empty tree state. */
366
+ .emptyState {
367
+ padding: 24px 16px;
368
+ font-size: 12px;
369
+ color: var(--aion-text-tertiary);
370
+ text-align: center;
371
+ }