pi-inspect 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +65 -3
  3. package/extensions/inspect.ts +54 -52
  4. package/lib/agent-dir.js +18 -0
  5. package/lib/app.js +144 -0
  6. package/lib/args.js +30 -0
  7. package/lib/editor.js +26 -0
  8. package/lib/snapshot.js +57 -79
  9. package/lib/watch.js +29 -0
  10. package/package.json +9 -8
  11. package/public/app.js +676 -591
  12. package/public/fonts/OFL-IBM-Plex.txt +93 -0
  13. package/public/fonts/OFL-Playfair-Display.txt +93 -0
  14. package/public/fonts/fonts.css +244 -0
  15. package/public/fonts/ibm-plex-mono-cyrillic-400.woff2 +0 -0
  16. package/public/fonts/ibm-plex-mono-cyrillic-500.woff2 +0 -0
  17. package/public/fonts/ibm-plex-mono-cyrillic-600.woff2 +0 -0
  18. package/public/fonts/ibm-plex-mono-cyrillic-ext-400.woff2 +0 -0
  19. package/public/fonts/ibm-plex-mono-cyrillic-ext-500.woff2 +0 -0
  20. package/public/fonts/ibm-plex-mono-cyrillic-ext-600.woff2 +0 -0
  21. package/public/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  22. package/public/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
  23. package/public/fonts/ibm-plex-mono-latin-600.woff2 +0 -0
  24. package/public/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  25. package/public/fonts/ibm-plex-mono-latin-ext-500.woff2 +0 -0
  26. package/public/fonts/ibm-plex-mono-latin-ext-600.woff2 +0 -0
  27. package/public/fonts/ibm-plex-mono-vietnamese-400.woff2 +0 -0
  28. package/public/fonts/ibm-plex-mono-vietnamese-500.woff2 +0 -0
  29. package/public/fonts/ibm-plex-mono-vietnamese-600.woff2 +0 -0
  30. package/public/fonts/playfair-display-cyrillic-400.woff2 +0 -0
  31. package/public/fonts/playfair-display-latin-400.woff2 +0 -0
  32. package/public/fonts/playfair-display-latin-ext-400.woff2 +0 -0
  33. package/public/fonts/playfair-display-vietnamese-400.woff2 +0 -0
  34. package/public/index.html +96 -75
  35. package/public/share.js +119 -0
  36. package/public/style.css +416 -1245
  37. package/public/sw.js +14 -20
  38. package/server.js +27 -198
  39. package/themes/pi-dark.json +0 -21
  40. package/themes/pi-light.json +0 -21
package/public/style.css CHANGED
@@ -1,5 +1,4 @@
1
- /* === VARIABLES (from cck) === */
2
-
1
+ /* Tokens follow the pi-kanban board's Ember theme, so a framed dashboard matches the board before its theme message arrives. */
3
2
  :root {
4
3
  --bg-deep: #101114;
5
4
  --bg-surface: #16181c;
@@ -12,61 +11,40 @@
12
11
  --text-muted: #7d808a;
13
12
  --accent: #e86f33;
14
13
  --accent-text: #f0a070;
15
- --accent-dim: rgba(232, 111, 51, 0.22);
16
- --accent-glow: rgba(232, 111, 51, 0.55);
17
14
  --success: #3ecf8e;
18
- --success-dim: rgba(62, 207, 142, 0.18);
19
15
  --warning: #f0b429;
20
- --warning-dim: rgba(240, 180, 41, 0.18);
21
- --error: #ef4444;
22
- --error-dim: rgba(239, 68, 68, 0.18);
23
- --team: #c4956a;
24
- --team-dim: rgba(196, 149, 106, 0.18);
25
- --plan: #86a886;
26
- --plan-dim: rgba(134, 168, 134, 0.18);
27
- --mono: 'IBM Plex Mono', monospace;
16
+ --error: #ef5350;
17
+ --md-code: #98c379;
18
+ --md-num: #d19a66;
19
+ --md-kw: #c678dd;
20
+ --mono: 'IBM Plex Mono', ui-monospace, monospace;
28
21
  --serif: 'Playfair Display', serif;
29
-
30
- --scope-user: #c4956a;
31
- --scope-user-dim: rgba(196, 149, 106, 0.18);
32
- --scope-project: #7ab5a0;
33
- --scope-project-dim: rgba(122, 181, 160, 0.18);
34
- --scope-local: #8a9bb5;
35
- --scope-local-dim: rgba(138, 155, 181, 0.18);
22
+ --radius: 8px;
23
+ --radius-sm: 6px;
24
+ --row-h: 34px;
25
+ color-scheme: dark;
36
26
  }
37
27
 
38
28
  body.light {
39
29
  --bg-deep: #e8e6e3;
40
- --bg-surface: #f4f3f1;
41
- --bg-elevated: #dddbd8;
30
+ --bg-surface: #efede9;
31
+ --bg-elevated: #fbfaf9;
42
32
  --bg-hover: #d2d0cc;
43
- --border: #a09b94;
33
+ --border: #cfcbc4;
44
34
  --text-primary: #0a0a0a;
45
- --text-secondary: #333333;
46
- --text-tertiary: #555555;
47
- --text-muted: #777777;
48
- --accent-text: #b85a20;
49
- --accent-dim: rgba(232, 111, 51, 0.18);
50
- --accent-glow: rgba(232, 111, 51, 0.5);
35
+ --text-secondary: #2c2c2c;
36
+ --text-tertiary: #565656;
37
+ --text-muted: #767676;
38
+ --accent-text: #a0501c;
51
39
  --success: #1a8a5a;
52
- --success-dim: rgba(26, 138, 90, 0.15);
53
40
  --warning: #b07d0a;
54
- --warning-dim: rgba(176, 125, 10, 0.15);
55
- --error: #c53030;
56
- --error-dim: rgba(197, 48, 48, 0.15);
57
- --plan: #5a7a5a;
58
- --plan-dim: rgba(90, 122, 90, 0.15);
59
-
60
- --scope-user: #8a7055;
61
- --scope-user-dim: rgba(138, 112, 85, 0.12);
62
- --scope-project: #4d8a72;
63
- --scope-project-dim: rgba(77, 138, 114, 0.15);
64
- --scope-local: #6b7d96;
65
- --scope-local-dim: rgba(107, 125, 150, 0.12);
41
+ --error: #c0392b;
42
+ --md-code: #50a14f;
43
+ --md-num: #986801;
44
+ --md-kw: #a626a4;
45
+ color-scheme: light;
66
46
  }
67
47
 
68
- /* === RESET === */
69
-
70
48
  * {
71
49
  box-sizing: border-box;
72
50
  margin: 0;
@@ -74,1414 +52,607 @@ body.light {
74
52
  }
75
53
 
76
54
  body {
55
+ --accent-dim: color-mix(in srgb, var(--accent) 18%, transparent);
56
+ --warning-dim: color-mix(in srgb, var(--warning) 16%, transparent);
57
+ --border-soft: color-mix(in srgb, var(--border) 60%, transparent);
77
58
  font-family: var(--mono);
78
59
  font-size: 13px;
60
+ line-height: 1.5;
79
61
  background: var(--bg-deep);
80
62
  color: var(--text-primary);
81
- line-height: 1.5;
82
63
  height: 100vh;
83
64
  display: flex;
84
65
  flex-direction: column;
85
66
  overflow: hidden;
86
67
  -webkit-font-smoothing: antialiased;
87
68
  }
69
+ body.resizing {
70
+ cursor: col-resize;
71
+ user-select: none;
72
+ }
88
73
 
89
- /* === SCROLLBAR === */
74
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
75
+ ::-webkit-scrollbar-track { background: transparent; }
76
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
77
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
90
78
 
91
- ::-webkit-scrollbar {
92
- width: 6px;
93
- height: 6px;
79
+ :focus-visible {
80
+ outline: 2px solid var(--accent);
81
+ outline-offset: 1px;
94
82
  }
95
- ::-webkit-scrollbar-track {
96
- background: transparent;
83
+
84
+ button, select, input {
85
+ font: inherit;
86
+ color: inherit;
97
87
  }
98
- ::-webkit-scrollbar-thumb {
99
- background: var(--border);
100
- border-radius: 3px;
88
+
89
+ kbd {
90
+ display: inline-block;
91
+ min-width: 18px;
92
+ padding: 0 4px;
93
+ border: 1px solid var(--border);
94
+ border-bottom-width: 2px;
95
+ border-radius: 4px;
96
+ background: var(--bg-elevated);
97
+ color: var(--text-tertiary);
98
+ font-family: var(--mono);
99
+ font-size: 10px;
100
+ line-height: 16px;
101
+ text-align: center;
102
+ white-space: nowrap;
101
103
  }
102
- ::-webkit-scrollbar-thumb:hover {
103
- background: var(--text-muted);
104
+
105
+ code {
106
+ font-family: var(--mono);
107
+ background: var(--bg-elevated);
108
+ border: 1px solid var(--border-soft);
109
+ border-radius: 4px;
110
+ padding: 0 4px;
111
+ color: var(--accent-text);
104
112
  }
105
113
 
106
- /* === TOPBAR === */
114
+ .spacer { flex: 1; }
115
+ .accent { color: var(--accent); }
116
+
117
+ /* Topbar */
107
118
 
108
119
  .topbar {
109
120
  display: flex;
110
121
  align-items: center;
111
- gap: 12px;
112
- padding: 10px 16px;
122
+ flex-wrap: wrap;
123
+ gap: 8px 10px;
124
+ padding: 8px 14px;
113
125
  background: var(--bg-surface);
114
- border-bottom: 1px solid var(--border);
126
+ border-bottom: 1px solid var(--border-soft);
115
127
  flex-shrink: 0;
116
- z-index: 10;
117
128
  }
118
129
 
119
130
  .topbar-logo {
120
131
  display: flex;
121
132
  align-items: center;
122
- gap: 10px;
133
+ gap: 8px;
134
+ margin-right: 4px;
123
135
  }
124
-
125
- .topbar-logo .logo-mark {
126
- width: 24px;
127
- height: 24px;
136
+ .logo-mark {
137
+ width: 22px;
138
+ height: 22px;
139
+ border-radius: var(--radius-sm);
128
140
  background: var(--accent);
129
- border-radius: 6px;
130
141
  display: flex;
131
142
  align-items: center;
132
143
  justify-content: center;
133
144
  }
134
-
135
- .topbar-logo .logo-mark svg {
136
- width: 14px;
137
- height: 14px;
138
- color: white;
139
- }
140
-
141
- .topbar-logo .logo-text {
145
+ .logo-mark svg { width: 13px; height: 13px; color: #fff; }
146
+ .logo-text {
142
147
  font-family: var(--serif);
143
148
  font-size: 17px;
144
149
  font-weight: 500;
145
150
  letter-spacing: -0.02em;
146
- }
147
-
148
- .accent {
149
- color: var(--accent);
150
- }
151
- .spacer {
152
- flex: 1;
151
+ white-space: nowrap;
153
152
  }
154
153
 
155
154
  .topbar-search {
156
155
  display: flex;
157
156
  align-items: center;
158
157
  gap: 6px;
158
+ height: 30px;
159
+ padding: 0 8px;
159
160
  background: var(--bg-elevated);
160
- border: 1px solid var(--border);
161
- border-radius: 6px;
162
- padding: 6px 10px;
163
- transition: border-color 0.15s ease;
164
- }
165
- .topbar-search:focus-within {
166
- border-color: var(--accent);
167
- }
168
- .topbar-search svg {
161
+ border: 1px solid var(--border-soft);
162
+ border-radius: var(--radius);
169
163
  color: var(--text-muted);
170
- flex-shrink: 0;
164
+ cursor: text;
171
165
  }
166
+ .topbar-search:focus-within { border-color: var(--accent); }
172
167
  .topbar-search input {
168
+ width: 200px;
173
169
  background: none;
174
170
  border: none;
175
- color: var(--text-primary);
176
- font-size: 12px;
177
- font-family: var(--mono);
178
171
  outline: none;
179
- width: 200px;
180
- }
181
- .topbar-search input::placeholder {
182
- color: var(--text-muted);
172
+ font-size: 12px;
173
+ color: var(--text-primary);
183
174
  }
175
+ .topbar-search input::placeholder { color: var(--text-muted); }
176
+ .topbar-search:focus-within kbd { visibility: hidden; }
184
177
 
185
178
  .topbar-select {
179
+ height: 30px;
180
+ max-width: 260px;
181
+ padding: 0 8px;
186
182
  background: var(--bg-elevated);
187
- border: 1px solid var(--border);
188
- border-radius: 6px;
183
+ border: 1px solid var(--border-soft);
184
+ border-radius: var(--radius);
189
185
  color: var(--text-secondary);
190
- font-family: var(--mono);
191
- font-size: 11px;
192
- padding: 4px 8px;
193
- outline: none;
186
+ font-size: 12px;
194
187
  cursor: pointer;
195
188
  }
196
- .topbar-select:focus {
197
- border-color: var(--accent);
198
- }
199
- .topbar-select option {
200
- background: var(--bg-surface);
201
- color: var(--text-primary);
202
- }
189
+ .topbar-select:focus-visible { outline: none; border-color: var(--accent); }
190
+ .topbar-select option { background: var(--bg-surface); color: var(--text-primary); }
203
191
 
204
192
  .topbar-project {
205
193
  display: flex;
206
194
  align-items: center;
207
195
  gap: 6px;
196
+ min-width: 0;
197
+ max-width: 320px;
208
198
  font-size: 11px;
209
199
  color: var(--text-tertiary);
210
- background: var(--bg-elevated);
211
- padding: 6px 10px;
212
- border-radius: 6px;
213
- cursor: pointer;
214
- border: 1px solid var(--border);
215
- max-width: 300px;
216
- transition: all 0.15s ease;
217
200
  }
218
- .topbar-project:hover {
219
- border-color: var(--accent);
220
- color: var(--text-secondary);
201
+ .topbar-project svg { flex-shrink: 0; color: var(--text-muted); }
202
+ .topbar-project span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; direction: rtl; text-align: left; }
203
+
204
+ .topbar-actions {
205
+ display: flex;
206
+ align-items: center;
207
+ gap: 2px;
221
208
  }
222
- .topbar-project svg {
223
- color: var(--text-muted);
224
- flex-shrink: 0;
209
+
210
+ .icon-btn {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ width: 30px;
215
+ height: 30px;
216
+ border: 1px solid transparent;
217
+ border-radius: var(--radius);
218
+ background: transparent;
219
+ color: var(--text-tertiary);
220
+ text-decoration: none;
221
+ cursor: pointer;
222
+ transition: background 0.12s, color 0.12s;
225
223
  }
226
- .topbar-project span {
227
- overflow: hidden;
228
- text-overflow: ellipsis;
224
+ .icon-btn svg { width: 15px; height: 15px; }
225
+ .icon-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
226
+ .icon-btn.loading svg { animation: spin 1s linear infinite; }
227
+
228
+ @keyframes spin { to { transform: rotate(360deg); } }
229
+
230
+ .btn {
231
+ height: 30px;
232
+ padding: 0 14px;
233
+ border: 1px solid var(--border);
234
+ border-radius: var(--radius);
235
+ background: var(--bg-elevated);
236
+ color: var(--text-secondary);
237
+ font-size: 12px;
238
+ cursor: pointer;
229
239
  white-space: nowrap;
230
240
  }
241
+ .btn:hover { border-color: var(--accent); color: var(--text-primary); }
242
+ .btn:disabled { opacity: 0.5; cursor: default; }
243
+ .btn-small { height: 26px; padding: 0 10px; font-size: 11px; }
244
+ .btn-danger { background: var(--error); border-color: var(--error); color: #fff; }
245
+ .btn-danger:hover { color: #fff; filter: brightness(1.1); border-color: var(--error); }
231
246
 
232
- .topbar-btn {
233
- display: flex;
234
- align-items: center;
235
- gap: 5px;
236
- padding: 6px 10px;
237
- border-radius: 6px;
247
+ .text-btn {
248
+ background: none;
249
+ border: none;
250
+ border-radius: 4px;
251
+ padding: 2px 6px;
238
252
  font-size: 11px;
239
- font-weight: 500;
253
+ color: var(--text-muted);
240
254
  cursor: pointer;
241
- border: 1px solid var(--border);
242
- background: var(--bg-elevated);
243
- color: var(--text-tertiary);
244
- font-family: var(--mono);
245
- transition: all 0.15s ease;
246
255
  white-space: nowrap;
247
- text-transform: uppercase;
248
- letter-spacing: 0.03em;
249
256
  }
250
- .topbar-btn:hover {
251
- border-color: var(--accent);
252
- color: var(--text-secondary);
257
+ .text-btn:hover { color: var(--accent-text); }
258
+
259
+ /* Kind chips */
260
+
261
+ .chipbar {
262
+ display: flex;
263
+ align-items: center;
264
+ gap: 8px;
265
+ padding: 6px 14px;
266
+ border-bottom: 1px solid var(--border-soft);
267
+ flex-shrink: 0;
253
268
  }
254
- .topbar-btn svg {
255
- color: var(--text-muted);
269
+ .chips {
270
+ display: flex;
271
+ flex-wrap: wrap;
272
+ gap: 6px;
256
273
  }
257
- .topbar-btn.loading svg {
258
- animation: spin 1s linear infinite;
274
+ .chip {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ gap: 6px;
278
+ height: 26px;
279
+ padding: 0 10px 0 4px;
280
+ border: 1px solid var(--border-soft);
281
+ border-radius: 999px;
282
+ background: transparent;
283
+ color: var(--text-tertiary);
284
+ font-size: 12px;
285
+ cursor: pointer;
259
286
  }
260
- @keyframes spin {
261
- from {
262
- transform: rotate(0deg);
263
- }
264
- to {
265
- transform: rotate(360deg);
266
- }
287
+ .chip kbd { border-radius: 999px; }
288
+ .chip:hover { color: var(--text-primary); border-color: var(--border); }
289
+ .chip.active {
290
+ background: var(--accent-dim);
291
+ border-color: var(--accent);
292
+ color: var(--text-primary);
267
293
  }
294
+ .chip.active kbd { border-color: var(--accent); color: var(--accent-text); }
295
+ .chip-count { color: var(--text-muted); font-size: 11px; }
268
296
 
269
- /* === MAIN LAYOUT === */
297
+ /* Layout */
270
298
 
271
299
  .main-layout {
272
300
  display: flex;
273
301
  flex: 1;
274
302
  min-height: 0;
275
- overflow: hidden;
276
303
  }
277
304
 
278
- /* === TREE PANEL === */
279
-
280
305
  .tree-panel {
281
- flex: 0 0 var(--sidebar-w, 60%);
306
+ flex: 0 0 58%;
307
+ min-width: 220px;
282
308
  display: flex;
283
309
  flex-direction: column;
284
- overflow: hidden;
285
- min-width: 200px;
286
310
  }
287
311
 
288
312
  .resize-handle {
289
313
  width: 4px;
290
314
  flex-shrink: 0;
291
315
  cursor: col-resize;
292
- background: transparent;
293
316
  transition: background 0.15s;
294
- position: relative;
295
- z-index: 1;
296
317
  }
297
318
  .resize-handle:hover,
298
- .resize-handle.is-dragging {
299
- background: var(--accent);
300
- }
301
-
302
- .tree-expand-toggle {
303
- padding: 4px 12px;
304
- font-size: 10px;
305
- color: var(--text-muted);
306
- cursor: pointer;
307
- text-transform: uppercase;
308
- letter-spacing: 0.5px;
309
- font-family: var(--mono);
310
- }
311
- .tree-expand-toggle:hover {
312
- color: var(--accent);
313
- }
319
+ .resize-handle.is-dragging { background: var(--accent); }
314
320
 
315
321
  .tree-container {
316
322
  flex: 1;
317
323
  min-height: 0;
318
324
  overflow-y: auto;
319
325
  overflow-x: hidden;
326
+ padding-bottom: 12px;
320
327
  }
328
+ .tree-container:focus-visible { outline: none; }
321
329
 
322
- .loading {
323
- display: flex;
324
- align-items: center;
325
- justify-content: center;
326
- height: 100%;
327
- color: var(--text-muted);
330
+ .empty-state {
331
+ max-width: 460px;
332
+ margin: 64px auto;
333
+ padding: 0 20px;
334
+ color: var(--text-tertiary);
328
335
  font-size: 12px;
336
+ line-height: 1.7;
337
+ text-align: center;
338
+ }
339
+ .empty-state strong {
340
+ display: block;
341
+ margin-bottom: 4px;
342
+ color: var(--text-primary);
343
+ font-weight: 600;
329
344
  }
330
345
 
331
- /* === TREE ROWS === */
346
+ /* Tree rows */
332
347
 
333
348
  .tree-row {
334
349
  display: flex;
335
350
  align-items: center;
336
- gap: 6px;
337
- padding: 7px 12px;
338
- font-size: 13px;
339
- cursor: pointer;
340
- transition: background 0.1s ease;
341
- min-height: 38px;
342
- flex-wrap: nowrap;
351
+ gap: 8px;
352
+ min-height: var(--row-h);
353
+ padding: 4px 14px;
343
354
  border-left: 2px solid transparent;
355
+ cursor: pointer;
356
+ white-space: nowrap;
357
+ scroll-margin: calc(var(--row-h) * 2) 0 8px;
344
358
  }
345
- .tree-row:hover {
346
- background: var(--bg-hover);
347
- }
359
+ .tree-row:hover { background: var(--bg-hover); }
360
+ .tree-row.level-2 { padding-left: 34px; }
361
+ .tree-row.level-3 { padding-left: 54px; }
348
362
  .tree-row.selected {
349
- background: var(--bg-hover);
363
+ background: var(--accent-dim);
350
364
  border-left-color: var(--accent);
351
365
  }
352
366
  .tree-row.focused {
353
- outline: 1px solid var(--accent);
354
- outline-offset: -1px;
355
- background: var(--bg-hover);
367
+ box-shadow: inset 0 0 0 1px var(--accent);
356
368
  }
357
- .tree-row.marketplace-row {
358
- background: var(--bg-surface);
359
- border-bottom: 1px solid var(--border);
369
+
370
+ .tree-group {
360
371
  position: sticky;
361
372
  top: 0;
362
373
  z-index: 3;
363
- font-size: 12px;
364
- text-transform: uppercase;
365
- letter-spacing: 0.04em;
366
- padding: 8px 12px;
367
- }
368
- /* Stacks under the group row (top:0); 38px matches .tree-row min-height. */
369
- .tree-row.marketplace-row.tree-subgroup {
370
- top: 38px;
371
- z-index: 2;
372
- }
373
- .tree-row.marketplace-row.virtual .tree-icon {
374
- color: var(--plan);
375
- }
376
- .tree-row.disabled .tree-label,
377
- .tree-row.disabled .tree-desc,
378
- .tree-row.disabled .tree-icon {
379
- opacity: 0.45;
380
- }
381
- .tree-row.disabled .tree-meta {
382
- color: var(--text-muted, #888);
383
- font-style: italic;
384
- opacity: 0.8;
385
- }
386
- .tree-badge.pending {
387
- display: inline-block;
388
- margin-left: 8px;
389
- padding: 1px 6px;
390
- border-radius: 4px;
391
- font-size: 10px;
374
+ background: var(--bg-deep);
375
+ border-bottom: 1px solid var(--border-soft);
392
376
  font-weight: 600;
393
- text-transform: uppercase;
394
- letter-spacing: 0.4px;
395
- background: rgba(255, 170, 60, 0.18);
396
- color: #c97a00;
397
- border: 1px solid rgba(201, 122, 0, 0.35);
398
- vertical-align: middle;
377
+ color: var(--text-primary);
399
378
  }
400
- .tree-row.pending .tree-icon {
401
- opacity: 0.7;
379
+ .tree-group:hover { background: var(--bg-hover); }
380
+ .tree-group.level-2 {
381
+ top: var(--row-h);
382
+ z-index: 2;
383
+ font-weight: 500;
384
+ font-size: 12px;
385
+ color: var(--text-secondary);
386
+ padding-left: 28px;
402
387
  }
403
388
 
404
- .tree-indent {
405
- flex-shrink: 0;
406
- }
407
389
  .tree-chevron {
408
- width: 16px;
409
- height: 16px;
410
390
  display: flex;
411
- align-items: center;
412
- justify-content: center;
391
+ width: 14px;
392
+ height: 14px;
413
393
  color: var(--text-muted);
414
- font-size: 9px;
415
- transition: transform 0.15s ease;
394
+ transition: transform 0.15s;
416
395
  flex-shrink: 0;
417
396
  }
418
- .tree-chevron.expanded {
419
- transform: rotate(90deg);
420
- }
397
+ .tree-chevron svg { width: 14px; height: 14px; }
398
+ .tree-group[aria-expanded='true'] .tree-chevron { transform: rotate(90deg); }
399
+
421
400
  .tree-icon {
422
- flex-shrink: 0;
423
- width: 18px;
424
401
  display: flex;
425
- align-items: center;
426
- justify-content: center;
427
- opacity: 0.45;
428
- }
429
- .tree-icon svg {
430
- width: 15px;
431
- height: 15px;
402
+ flex-shrink: 0;
403
+ color: var(--text-muted);
432
404
  }
405
+ .tree-icon svg { width: 15px; height: 15px; }
406
+ .tree-row.selected .tree-icon { color: var(--accent); }
407
+
433
408
  .tree-label {
434
409
  flex-shrink: 0;
435
- white-space: nowrap;
436
- text-overflow: ellipsis;
437
410
  color: var(--text-secondary);
438
411
  }
439
- .version {
440
- font-size: 11px;
441
- color: var(--accent);
442
- background: var(--accent-dim);
443
- padding: 1px 5px;
444
- border-radius: 3px;
445
- margin-left: 6px;
446
- font-family: var(--mono);
447
- letter-spacing: 0.02em;
448
- white-space: nowrap;
449
- flex-shrink: 0;
450
- }
451
- .tree-label .mkt-name {
452
- font-weight: 600;
453
- color: var(--text-primary);
454
- }
455
- .tree-subgroup-label {
412
+ .tree-group .tree-label { color: inherit; }
413
+ .tree-row.selected .tree-label { color: var(--text-primary); }
414
+
415
+ .tree-desc {
416
+ flex: 1 1 0;
417
+ min-width: 0;
418
+ margin-left: 8px;
419
+ overflow: hidden;
420
+ text-overflow: ellipsis;
456
421
  font-size: 11px;
457
422
  color: var(--text-muted);
458
- text-transform: uppercase;
459
- letter-spacing: 0.05em;
460
- }
461
- .tree-subgroup .mkt-name {
462
- font-size: 11px;
463
- font-weight: 600;
464
423
  }
465
- .tree-subgroup .tree-icon { width: 14px; height: 14px; }
466
- .tree-subgroup .tree-icon svg { width: 14px; height: 14px; }
467
424
  .tree-meta {
468
- font-size: 11px;
469
- color: var(--text, inherit);
470
425
  flex-shrink: 0;
471
- white-space: nowrap;
472
- opacity: 0.65;
473
- }
474
- .tree-desc {
475
426
  font-size: 11px;
427
+ color: var(--text-tertiary);
428
+ }
429
+
430
+ .tree-row.disabled .tree-label,
431
+ .tree-row.disabled .tree-desc,
432
+ .tree-row.disabled .tree-icon { opacity: 0.5; }
433
+
434
+ .tree-badge {
435
+ flex-shrink: 0;
436
+ padding: 0 6px;
437
+ border: 1px solid var(--border);
438
+ border-radius: 999px;
439
+ font-size: 10px;
476
440
  color: var(--text-muted);
477
- margin-left: 12px;
478
- white-space: nowrap;
479
- overflow: hidden;
480
- text-overflow: ellipsis;
481
- flex: 9 1 0;
482
- min-width: 0;
483
- opacity: 0.75;
441
+ }
442
+ .tree-badge.warn {
443
+ border-color: var(--warning);
444
+ background: var(--warning-dim);
445
+ color: var(--warning);
484
446
  }
485
447
 
486
- /* === SCOPE TOGGLE BOXES === */
448
+ /* Detail */
487
449
 
488
- .scope-toggles {
450
+ .detail-panel {
451
+ flex: 1;
452
+ min-width: 280px;
489
453
  display: flex;
490
- gap: 3px;
491
- flex-shrink: 0;
454
+ flex-direction: column;
455
+ background: var(--bg-surface);
456
+ border-left: 1px solid var(--border-soft);
457
+ overflow: hidden;
492
458
  }
493
- .scope-toggle {
494
- width: 20px;
495
- height: 16px;
496
- border-radius: 3px;
497
- font-size: 9px;
498
- font-weight: 700;
459
+
460
+ .detail-empty {
499
461
  display: flex;
462
+ flex-direction: column;
500
463
  align-items: center;
501
464
  justify-content: center;
502
- cursor: pointer;
503
- transition: all 0.15s ease;
504
- border: 1px solid;
505
- font-family: var(--mono);
506
- }
507
- .scope-toggle:hover {
508
- transform: scale(1.15);
465
+ gap: 10px;
466
+ height: 100%;
467
+ padding: 20px;
468
+ color: var(--text-muted);
469
+ font-size: 12px;
470
+ text-align: center;
509
471
  }
472
+ .detail-empty svg { width: 40px; height: 40px; opacity: 0.35; }
473
+ .detail-empty .hint { font-size: 11px; }
510
474
 
511
- .scope-toggle.user {
512
- border-color: rgba(196, 149, 106, 0.4);
513
- color: rgba(196, 149, 106, 0.5);
514
- }
515
- .scope-toggle.user.active {
516
- background: var(--scope-user-dim);
517
- color: var(--scope-user);
518
- border-color: var(--scope-user);
519
- }
520
- .scope-toggle.user.disabled {
521
- background: transparent;
522
- color: var(--scope-user);
523
- border-color: var(--scope-user);
524
- }
525
-
526
- .scope-toggle.project {
527
- border-color: rgba(122, 181, 160, 0.4);
528
- color: rgba(122, 181, 160, 0.5);
529
- }
530
- .scope-toggle.project.active {
531
- background: var(--scope-project-dim);
532
- color: var(--scope-project);
533
- border-color: var(--scope-project);
534
- }
535
- .scope-toggle.project.disabled {
536
- background: transparent;
537
- color: var(--scope-project);
538
- border-color: var(--scope-project);
539
- }
540
-
541
- .scope-toggle.local {
542
- border-color: rgba(138, 155, 181, 0.4);
543
- color: rgba(138, 155, 181, 0.5);
544
- }
545
- .scope-toggle.local.active {
546
- background: var(--scope-local-dim);
547
- color: var(--scope-local);
548
- border-color: var(--scope-local);
549
- }
550
- .scope-toggle.local.disabled {
551
- background: transparent;
552
- color: var(--scope-local);
553
- border-color: var(--scope-local);
554
- }
555
- .scope-toggle.disabled {
556
- text-decoration: line-through;
557
- text-decoration-thickness: 1px;
558
- opacity: 0.75;
559
- }
560
-
561
- /* Light theme: boost inactive scope contrast further */
562
- body.light .scope-toggle.user {
563
- border-color: rgba(138, 112, 85, 0.4);
564
- color: rgba(138, 112, 85, 0.5);
565
- }
566
- body.light .scope-toggle.project {
567
- border-color: rgba(77, 138, 114, 0.5);
568
- color: rgba(77, 138, 114, 0.6);
569
- }
570
- body.light .scope-toggle.local {
571
- border-color: rgba(107, 125, 150, 0.4);
572
- color: rgba(107, 125, 150, 0.5);
573
- }
574
-
575
- /* === BADGES === */
576
-
577
- .badge {
578
- padding: 1px 7px;
579
- border-radius: 4px;
580
- font-size: 10px;
581
- font-weight: 500;
582
- flex-shrink: 0;
583
- text-transform: uppercase;
584
- letter-spacing: 0.03em;
585
- }
586
- .badge-github {
587
- background: var(--accent-dim);
588
- color: var(--accent-text);
589
- display: inline-flex;
590
- align-items: center;
591
- gap: 3px;
592
- }
593
- .badge-directory {
594
- background: var(--warning-dim);
595
- color: var(--warning);
596
- }
597
- .badge-git {
598
- background: var(--team-dim);
599
- color: var(--team);
600
- }
601
- .badge-virtual {
602
- background: var(--plan-dim);
603
- color: var(--plan);
604
- }
605
-
606
- /* === UPDATE INDICATORS === */
607
-
608
- .update-indicator {
609
- color: var(--success);
610
- font-weight: 700;
611
- font-size: 12px;
612
- margin-left: 4px;
613
- }
614
-
615
- .update-badge {
616
- font-size: 10px;
617
- color: var(--success);
618
- background: var(--success-dim);
619
- padding: 1px 6px;
620
- border-radius: 3px;
621
- flex-shrink: 0;
622
- font-weight: 500;
623
- }
624
-
625
- .update-banner {
626
- display: flex;
627
- align-items: center;
628
- justify-content: space-between;
629
- gap: 12px;
630
- padding: 10px 12px;
631
- margin-bottom: 16px;
632
- background: var(--success-dim);
633
- border: 1px solid rgba(62, 207, 142, 0.3);
634
- border-radius: 6px;
635
- font-size: 12px;
636
- color: var(--success);
637
- }
638
-
639
- .badge-count {
640
- font-size: 10px;
641
- color: var(--text-muted);
642
- flex-shrink: 0;
643
- }
644
-
645
- .mkt-info-btn {
646
- background: none;
647
- border: none;
648
- outline: none;
649
- color: var(--text-muted);
650
- cursor: pointer;
651
- padding: 4px;
652
- margin-left: auto;
653
- border-radius: 4px;
654
- display: flex;
655
- align-items: center;
656
- flex-shrink: 0;
657
- }
658
- .mkt-info-btn:hover {
659
- color: var(--accent);
660
- }
661
-
662
- .detail-meta-grid {
663
- display: grid;
664
- grid-template-columns: auto 1fr;
665
- gap: 6px 12px;
666
- font-size: 12px;
667
- }
668
- .meta-label {
669
- color: var(--text-muted);
670
- white-space: nowrap;
671
- }
672
- .meta-value {
673
- color: var(--text-secondary);
674
- }
675
-
676
- .mkt-actions {
677
- display: flex;
678
- gap: 8px;
679
- }
680
-
681
- .mkt-plugin-item {
682
- display: flex;
683
- justify-content: space-between;
684
- padding: 5px 8px;
685
- font-size: 12px;
686
- color: var(--text-secondary);
687
- border-radius: 4px;
688
- cursor: pointer;
689
- transition: background 0.1s;
690
- }
691
- .mkt-plugin-item:hover {
692
- background: var(--bg-hover);
693
- }
694
-
695
- /* === TREE CHILDREN === */
696
-
697
- .tree-children {
698
- display: none;
699
- }
700
- .tree-children.open {
701
- display: block;
702
- }
703
-
704
- .tree-desc-inline {
705
- font-size: 12px;
706
- color: var(--text-tertiary);
707
- opacity: 1;
708
- white-space: nowrap;
709
- overflow: hidden;
710
- text-overflow: ellipsis;
711
- min-width: 0;
712
- flex: 1 1 0;
713
- }
714
-
715
- /* === COMPONENT ROWS === */
716
-
717
- .comp-row {
718
- display: flex;
719
- align-items: center;
720
- gap: 6px;
721
- padding: 3px 12px 3px 76px;
722
- font-size: 11px;
723
- color: var(--text-tertiary);
724
- min-height: 26px;
725
- }
726
- .comp-row:hover {
727
- background: var(--bg-hover);
728
- cursor: pointer;
729
- }
730
- .comp-icon {
731
- width: 16px;
732
- display: flex;
733
- align-items: center;
734
- justify-content: center;
735
- flex-shrink: 0;
736
- opacity: 0.5;
737
- }
738
- .comp-icon svg {
739
- width: 12px;
740
- height: 12px;
741
- }
742
- .comp-count {
743
- margin-left: auto;
744
- font-size: 10px;
745
- color: var(--text-muted);
746
- font-family: var(--mono);
747
- background: var(--bg-elevated);
748
- padding: 0 5px;
749
- border-radius: 3px;
750
- }
751
-
752
- /* === DETAIL PANEL === */
753
-
754
- .detail-panel {
755
- flex: 1;
756
- min-width: 300px;
757
- background: var(--bg-surface);
758
- border-left: 1px solid var(--border);
759
- display: flex;
760
- flex-direction: column;
761
- overflow: hidden;
762
- }
763
-
764
- .detail-empty {
765
- display: flex;
766
- flex-direction: column;
767
- align-items: center;
768
- justify-content: center;
769
- height: 100%;
770
- color: var(--text-muted);
771
- gap: 12px;
772
- font-size: 12px;
773
- }
774
-
775
- .detail-header {
776
- padding: 14px 16px;
777
- border-bottom: 1px solid var(--border);
778
- display: flex;
779
- align-items: center;
780
- justify-content: space-between;
781
- flex-shrink: 0;
782
- background-image: linear-gradient(to right, transparent, var(--border), transparent);
783
- background-size: 100% 1px;
784
- background-repeat: no-repeat;
785
- background-position: bottom;
786
- border-bottom: none;
787
- }
788
- .detail-header h3 {
789
- font-size: 14px;
790
- font-weight: 600;
791
- color: var(--text-primary);
792
- display: flex;
793
- align-items: center;
794
- gap: 8px;
795
- }
796
- .detail-header h3 svg {
797
- width: 16px;
798
- height: 16px;
799
- opacity: 0.5;
800
- }
801
- .detail-header h3 .version {
802
- font-size: 11px;
803
- font-weight: 400;
804
- }
805
- .detail-header-actions,
806
- .modal-header-actions {
807
- display: flex;
808
- align-items: center;
809
- gap: 4px;
810
- }
811
- .detail-close {
812
- background: transparent;
813
- border: 1px solid transparent;
814
- border-radius: 6px;
815
- color: var(--text-muted);
816
- cursor: pointer;
817
- font-size: 15px;
818
- padding: 4px 8px;
819
- transition: all 0.15s ease;
820
- }
821
- .detail-close:hover {
822
- background: var(--bg-hover);
823
- border-color: var(--border);
824
- color: var(--text-secondary);
825
- }
826
- .detail-action {
827
- background: transparent;
828
- border: 1px solid transparent;
829
- border-radius: 6px;
830
- color: var(--text-muted);
831
- cursor: pointer;
832
- padding: 4px 6px;
833
- display: inline-flex;
834
- align-items: center;
835
- transition: all 0.15s ease;
836
- }
837
- .detail-action svg { display: block; }
838
- .detail-action:hover {
839
- background: var(--bg-hover);
840
- color: var(--text-primary);
841
- }
842
-
843
- .detail-body {
844
- flex: 1;
845
- overflow-y: auto;
846
- padding: 16px;
847
- }
848
-
849
- .detail-section {
850
- margin-bottom: 20px;
851
- }
852
- .detail-section h4 {
853
- font-size: 10px;
854
- text-transform: uppercase;
855
- letter-spacing: 0.08em;
856
- color: var(--text-muted);
857
- margin-bottom: 8px;
858
- font-weight: 600;
859
- }
860
-
861
- .detail-desc {
862
- font-size: 12px;
863
- line-height: 1.6;
864
- color: var(--text-secondary);
865
- margin-bottom: 10px;
866
- }
867
-
868
- .detail-meta-row {
869
- display: flex;
870
- gap: 8px;
871
- align-items: center;
872
- flex-wrap: wrap;
873
- margin-bottom: 4px;
874
- }
875
- .detail-meta-item {
876
- font-size: 10px;
877
- color: var(--text-muted);
878
- text-transform: uppercase;
879
- letter-spacing: 0.03em;
880
- }
881
-
882
- .plugin-meta-bar {
883
- display: flex;
884
- align-items: center;
885
- gap: 6px;
886
- flex-wrap: wrap;
887
- margin-top: 8px;
888
- }
889
- .meta-tag {
890
- font-size: 9px;
891
- padding: 2px 8px;
892
- border-radius: 10px;
893
- border: 1px solid var(--border);
894
- color: var(--text-muted);
895
- letter-spacing: 0.02em;
896
- }
897
- .meta-chip {
898
- font-size: 10px;
899
- color: var(--text-muted);
900
- }
901
- .meta-link {
902
- font-size: 10px;
903
- color: var(--text-muted);
904
- text-decoration: none;
905
- overflow: hidden;
906
- text-overflow: ellipsis;
907
- white-space: nowrap;
908
- max-width: 260px;
909
- }
910
- .meta-link:hover {
911
- color: var(--accent);
912
- text-decoration: underline;
913
- }
914
-
915
- /* === SCOPE MATRIX === */
916
-
917
- .scope-matrix {
918
- display: flex;
919
- flex-direction: column;
920
- gap: 4px;
921
- }
922
- .scope-matrix-row {
923
- display: flex;
924
- align-items: center;
925
- gap: 10px;
926
- padding: 8px 10px;
927
- background: var(--bg-elevated);
928
- border-radius: 6px;
929
- font-size: 12px;
930
- border: 1px solid var(--border);
931
- transition: border-color 0.15s ease;
932
- }
933
- .scope-matrix-row:hover {
934
- border-color: var(--accent-dim);
935
- }
936
- .scope-matrix-label {
937
- width: 60px;
938
- font-weight: 700;
939
- font-size: 10px;
940
- text-transform: uppercase;
941
- letter-spacing: 0.05em;
942
- flex-shrink: 0;
943
- }
944
- .scope-matrix-label.user {
945
- color: var(--scope-user);
946
- }
947
- .scope-matrix-label.project {
948
- color: var(--scope-project);
949
- }
950
- .scope-matrix-label.local {
951
- color: var(--scope-local);
952
- }
953
- .scope-matrix-status {
954
- flex: 1;
955
- color: var(--text-tertiary);
956
- font-size: 11px;
957
- }
958
- .scope-matrix-actions {
959
- display: flex;
960
- gap: 4px;
961
- flex-shrink: 0;
962
- }
963
-
964
- /* === ACTION BUTTONS === */
965
-
966
- .action-btn {
967
- padding: 4px 10px;
968
- border-radius: 4px;
969
- font-size: 10px;
970
- font-weight: 500;
971
- cursor: pointer;
972
- border: 1px solid var(--border);
973
- background: var(--bg-elevated);
974
- color: var(--text-tertiary);
975
- font-family: var(--mono);
976
- transition: all 0.15s ease;
977
- white-space: nowrap;
978
- text-transform: uppercase;
979
- letter-spacing: 0.03em;
980
- }
981
- .action-btn:hover {
982
- border-color: var(--accent);
983
- color: var(--text-secondary);
984
- }
985
- .action-btn:disabled {
986
- opacity: 0.35;
987
- cursor: not-allowed;
988
- }
989
- .action-btn.primary {
990
- background: var(--accent);
991
- border-color: var(--accent);
992
- color: #fff;
993
- }
994
- .action-btn.primary:hover {
995
- background: var(--accent-glow);
996
- }
997
- .action-btn.danger {
998
- color: var(--error);
999
- }
1000
- .action-btn.danger:hover {
1001
- border-color: var(--error);
1002
- }
1003
-
1004
- /* === DETAIL COMPONENT ROWS === */
1005
-
1006
- .detail-comp-group {
1007
- margin-bottom: 8px;
1008
- }
1009
- .detail-comp-header {
1010
- display: flex;
1011
- align-items: center;
1012
- gap: 8px;
1013
- padding: 7px 10px;
1014
- border-radius: 6px 6px 0 0;
1015
- font-size: 12px;
1016
- font-weight: 600;
1017
- color: var(--text-secondary);
1018
- background: var(--bg-elevated);
1019
- border: 1px solid var(--border);
1020
- }
1021
- .detail-comp-header .count {
1022
- margin-left: auto;
1023
- color: var(--text-muted);
1024
- font-family: var(--mono);
1025
- font-size: 10px;
1026
- background: var(--bg-deep);
1027
- padding: 0 5px;
1028
- border-radius: 3px;
1029
- }
1030
- .detail-comp-items {
1031
- border: 1px solid var(--border);
1032
- border-top: none;
1033
- border-radius: 0 0 6px 6px;
1034
- overflow: hidden;
1035
- }
1036
- .detail-comp-item {
1037
- display: flex;
1038
- align-items: center;
1039
- gap: 8px;
1040
- padding: 5px 10px 5px 28px;
1041
- font-size: 12px;
1042
- color: var(--text-tertiary);
1043
- cursor: pointer;
1044
- transition: background 0.12s;
1045
- }
1046
- .detail-comp-item:hover {
1047
- background: var(--bg-hover);
1048
- color: var(--text-secondary);
1049
- }
1050
- .detail-comp-item .icon {
1051
- width: 14px;
475
+ .detail-header {
1052
476
  display: flex;
1053
477
  align-items: center;
1054
- opacity: 0.5;
478
+ gap: 8px;
479
+ padding: 10px 10px 10px 16px;
480
+ border-bottom: 1px solid var(--border-soft);
481
+ flex-shrink: 0;
1055
482
  }
1056
- .detail-comp-item .icon svg {
1057
- width: 12px;
1058
- height: 12px;
483
+ .detail-header h3 {
484
+ min-width: 0;
485
+ overflow: hidden;
486
+ text-overflow: ellipsis;
487
+ white-space: nowrap;
488
+ font-size: 14px;
489
+ font-weight: 600;
1059
490
  }
1060
- .detail-comp-item.disabled {
1061
- cursor: default;
1062
- opacity: 0.5;
491
+ .kind-tag {
492
+ flex-shrink: 0;
493
+ padding: 0 7px;
494
+ border-radius: 999px;
495
+ background: var(--accent-dim);
496
+ color: var(--accent-text);
497
+ font-size: 11px;
1063
498
  }
1064
- .detail-comp-item.disabled:hover {
1065
- background: none;
1066
- color: var(--text-tertiary);
499
+
500
+ .detail-body {
501
+ flex: 1;
502
+ overflow-y: auto;
503
+ padding: 16px;
1067
504
  }
1068
- .readme-comp-item {
1069
- display: flex;
1070
- align-items: center;
1071
- gap: 8px;
1072
- padding: 6px 10px;
1073
- font-size: 12px;
1074
- color: var(--accent);
1075
- cursor: pointer;
1076
- border: 1px dashed var(--border);
1077
- border-radius: 6px;
1078
- background: var(--bg-deep);
1079
- transition:
1080
- background 0.12s,
1081
- border-color 0.12s;
505
+ .detail-section { margin-bottom: 20px; }
506
+ .detail-section h4 {
1082
507
  margin-bottom: 8px;
508
+ font-size: 11px;
509
+ font-weight: 600;
510
+ color: var(--text-muted);
1083
511
  }
1084
- .readme-comp-item:hover {
1085
- background: var(--bg-hover);
1086
- border-color: var(--accent);
512
+ .detail-desc {
513
+ font-size: 12px;
514
+ line-height: 1.6;
515
+ color: var(--text-secondary);
1087
516
  }
1088
- .readme-comp-item svg {
1089
- width: 14px;
1090
- height: 14px;
1091
- opacity: 0.7;
517
+
518
+ .meta-grid {
519
+ display: grid;
520
+ grid-template-columns: auto 1fr;
521
+ gap: 4px 16px;
522
+ font-size: 12px;
1092
523
  }
524
+ .meta-grid dt { color: var(--text-muted); }
525
+ .meta-grid dd { color: var(--text-secondary); overflow-wrap: anywhere; }
1093
526
 
1094
- /* === TOAST === */
527
+ .code-view {
528
+ margin: 0;
529
+ padding: 12px 14px;
530
+ overflow: auto;
531
+ border: 1px solid var(--border-soft);
532
+ border-radius: var(--radius);
533
+ background: var(--bg-deep);
534
+ color: var(--text-secondary);
535
+ font-family: var(--mono);
536
+ font-size: 11px;
537
+ line-height: 1.6;
538
+ white-space: pre-wrap;
539
+ word-break: break-word;
540
+ }
541
+ .code-view code { all: unset; }
542
+ .code-view code.json { color: var(--text-primary); }
543
+ .code-view .md-h { color: var(--accent-text); font-weight: 600; }
544
+ .code-view .md-code { color: var(--md-code); }
545
+ .code-view .md-icode { color: var(--md-num); }
546
+ .code-view .md-bold { color: var(--text-primary); font-weight: 600; }
547
+ .code-view .md-bullet { color: var(--accent); }
548
+ .code-view .jk-key { color: var(--accent-text); }
549
+ .code-view .jk-str { color: var(--md-code); }
550
+ .code-view .jk-num { color: var(--md-num); }
551
+ .code-view .jk-bool,
552
+ .code-view .jk-null { color: var(--md-kw); }
553
+
554
+ /* Toasts */
1095
555
 
1096
556
  .toast-container {
1097
557
  position: fixed;
1098
- bottom: 16px;
1099
558
  right: 16px;
559
+ bottom: 16px;
1100
560
  z-index: 100;
561
+ display: flex;
562
+ flex-direction: column;
563
+ gap: 6px;
564
+ align-items: flex-end;
1101
565
  }
1102
-
1103
566
  .toast {
1104
- background: var(--bg-elevated);
1105
- border: 1px solid var(--border);
1106
- border-radius: 6px;
567
+ max-width: 420px;
1107
568
  padding: 8px 14px;
1108
- font-size: 11px;
569
+ border: 1px solid var(--border);
570
+ border-left: 3px solid var(--accent);
571
+ border-radius: var(--radius);
572
+ background: var(--bg-elevated);
1109
573
  color: var(--text-secondary);
1110
- animation: slideIn 0.2s ease;
1111
- }
1112
-
1113
- .toast.toast-success {
1114
- border-color: #2ea043;
1115
- color: #2ea043;
1116
- }
1117
-
1118
- .toast.toast-error {
1119
- border-color: #f85149;
1120
- color: #f85149;
1121
- }
1122
-
1123
- .toast.toast-info {
1124
- border-color: var(--accent);
1125
- color: var(--accent);
574
+ font-size: 12px;
575
+ box-shadow: 0 4px 16px rgb(0 0 0 / 0.18);
576
+ animation: slide-in 0.2s ease;
1126
577
  }
578
+ .toast-success { border-left-color: var(--success); }
579
+ .toast-error { border-left-color: var(--error); }
1127
580
 
1128
- @keyframes slideIn {
1129
- from {
1130
- opacity: 0;
1131
- transform: translateY(10px);
1132
- }
1133
- to {
1134
- opacity: 1;
1135
- transform: translateY(0);
1136
- }
1137
- }
581
+ @keyframes slide-in { from { opacity: 0; transform: translateY(8px); } }
1138
582
 
1139
- /* === MODAL === */
583
+ /* Modals */
1140
584
 
1141
585
  .modal-overlay {
1142
586
  position: fixed;
1143
587
  inset: 0;
1144
- background: rgba(0, 0, 0, 0.6);
588
+ z-index: 100;
1145
589
  display: none;
1146
590
  align-items: center;
1147
591
  justify-content: center;
1148
- z-index: 100;
1149
- }
1150
- .modal-overlay.open {
1151
- display: flex;
592
+ padding: 16px;
593
+ background: rgb(0 0 0 / 0.5);
1152
594
  }
595
+ .modal-overlay.open { display: flex; }
1153
596
  .modal {
1154
- background: var(--bg-surface);
597
+ width: 100%;
598
+ max-width: 520px;
599
+ max-height: 100%;
600
+ overflow: auto;
1155
601
  border: 1px solid var(--border);
1156
- border-radius: 8px;
1157
- box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
1158
- min-width: 360px;
1159
- max-width: 500px;
602
+ border-radius: var(--radius);
603
+ background: var(--bg-surface);
604
+ box-shadow: 0 12px 40px rgb(0 0 0 / 0.35);
1160
605
  }
606
+ .confirm-modal { max-width: 420px; }
1161
607
  .modal-header {
1162
608
  display: flex;
1163
609
  align-items: center;
1164
610
  justify-content: space-between;
1165
- padding: 14px 16px;
1166
- border-bottom: 1px solid var(--border);
1167
- }
1168
- .modal-header h3 {
1169
- font-size: 13px;
1170
- font-weight: 600;
1171
- }
1172
- .modal-action-btn {
1173
- background: none;
1174
- border: none;
1175
- color: var(--text-muted);
1176
- cursor: pointer;
1177
- padding: 4px;
1178
- display: flex;
1179
- align-items: center;
1180
- border-radius: 4px;
1181
- }
1182
- .modal-action-btn:hover {
1183
- color: var(--accent);
1184
- background: var(--hover);
1185
- }
1186
- .modal-action-btn.copy-success {
1187
- color: var(--success, #22c55e);
1188
- animation: copy-flash 0.3s ease;
1189
- }
1190
- @keyframes copy-flash {
1191
- 0% {
1192
- transform: scale(1);
1193
- }
1194
- 50% {
1195
- transform: scale(1.3);
1196
- }
1197
- 100% {
1198
- transform: scale(1);
1199
- }
1200
- }
1201
- .modal-close {
1202
- background: none;
1203
- border: none;
1204
- color: var(--text-muted);
1205
- cursor: pointer;
1206
- font-size: 16px;
1207
- padding: 4px;
1208
- display: flex;
1209
- align-items: center;
1210
- justify-content: center;
1211
- line-height: 1;
1212
- }
1213
- .modal-body {
1214
- padding: 16px;
1215
- }
1216
- .modal-body .scope-option {
1217
- display: flex;
1218
- align-items: center;
1219
- gap: 10px;
1220
- padding: 10px 12px;
1221
- margin-bottom: 6px;
1222
- border-radius: 6px;
1223
- border: 1px solid var(--border);
1224
- cursor: pointer;
1225
- transition: all 0.15s ease;
1226
- }
1227
- .modal-body .scope-option:hover {
1228
- border-color: var(--accent);
1229
- background: var(--bg-hover);
1230
- }
1231
- .modal-body .scope-option .dot {
1232
- width: 10px;
1233
- height: 10px;
1234
- border-radius: 3px;
1235
- flex-shrink: 0;
1236
- }
1237
- .modal-field {
1238
- margin-bottom: 16px;
1239
- }
1240
- .modal-field label {
1241
- display: block;
1242
- font-size: 10px;
1243
- text-transform: uppercase;
1244
- letter-spacing: 0.08em;
1245
- color: var(--text-muted);
1246
- margin-bottom: 6px;
1247
- font-weight: 600;
1248
- }
1249
- .modal-field input[type='text'] {
1250
- width: 100%;
1251
- padding: 8px 10px;
1252
- background: var(--bg-elevated);
1253
- border: 1px solid var(--border);
1254
- border-radius: 6px;
1255
- color: var(--text-primary);
1256
- font-family: var(--mono);
1257
- font-size: 12px;
1258
- outline: none;
1259
- transition: border-color 0.15s ease;
1260
- }
1261
- .modal-field input[type='text']:focus {
1262
- border-color: var(--accent);
1263
- }
1264
- .modal-field input[type='text']::placeholder {
1265
- color: var(--text-muted);
1266
- }
1267
- .modal-hint {
1268
- display: block;
1269
- font-size: 10px;
1270
- color: var(--text-muted);
1271
- margin-top: 4px;
611
+ padding: 12px 12px 12px 16px;
612
+ border-bottom: 1px solid var(--border-soft);
1272
613
  }
614
+ .modal-header h3 { font-size: 13px; font-weight: 600; }
615
+ .modal-body { padding: 16px; }
616
+ .modal-body p { font-size: 12px; color: var(--text-secondary); line-height: 1.6; }
1273
617
  .modal-actions {
1274
618
  display: flex;
1275
619
  justify-content: flex-end;
1276
- gap: 6px;
1277
- margin-top: 16px;
1278
- }
1279
-
1280
- /* === RECENT PROJECTS === */
1281
-
1282
- .recent-projects-label {
1283
- font-size: 11px;
1284
- color: var(--text-muted);
1285
- margin-bottom: 6px;
1286
- text-transform: uppercase;
1287
- letter-spacing: 0.5px;
1288
- }
1289
-
1290
- .recent-project-item {
1291
- display: flex;
1292
- align-items: center;
1293
620
  gap: 8px;
1294
- padding: 6px 8px;
1295
- border-radius: 4px;
1296
- cursor: pointer;
1297
- font-size: 13px;
1298
- color: var(--text-secondary);
1299
- font-family: var(--font-mono);
1300
- }
1301
-
1302
- .recent-project-item:hover {
1303
- background: var(--hover-bg);
1304
- color: var(--text-primary);
1305
- }
1306
-
1307
- .recent-project-remove {
1308
- margin-left: auto;
1309
- opacity: 0;
1310
- background: none;
1311
- border: none;
1312
- color: var(--text-muted);
1313
- cursor: pointer;
1314
- font-size: 14px;
1315
- padding: 0 4px;
1316
- }
1317
-
1318
- .recent-project-item:hover .recent-project-remove {
1319
- opacity: 1;
1320
- }
1321
-
1322
- .recent-project-remove:hover {
1323
- color: var(--danger);
621
+ margin-top: 16px;
1324
622
  }
1325
623
 
1326
- /* === HELP MODAL === */
1327
-
1328
- .help-modal {
1329
- min-width: 420px;
1330
- max-width: 520px;
1331
- }
1332
624
  .help-sections {
1333
625
  display: grid;
1334
- gap: 16px;
626
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
627
+ gap: 16px 24px;
1335
628
  }
1336
629
  .help-section h4 {
1337
- margin: 0 0 8px;
1338
- font-size: 10px;
1339
- text-transform: uppercase;
1340
- letter-spacing: 0.08em;
1341
- color: var(--text-muted);
1342
- font-weight: 600;
1343
- }
1344
- .help-section table {
1345
- width: 100%;
1346
- font-size: 12px;
1347
- border-collapse: collapse;
1348
- }
1349
- .help-section td {
1350
- padding: 4px 0;
1351
- }
1352
- .help-section td:first-child {
1353
- color: var(--text-secondary);
1354
- white-space: nowrap;
1355
- width: 130px;
1356
- }
1357
- .help-section td:last-child {
1358
- color: var(--text-tertiary);
1359
- }
1360
-
1361
- kbd {
1362
- background: var(--bg-hover);
1363
- border: 1px solid var(--border);
1364
- padding: 2px 6px;
1365
- border-radius: 4px;
1366
- font-family: var(--mono);
1367
- font-size: 11px;
1368
- color: var(--text-secondary);
1369
- white-space: nowrap;
1370
- }
1371
-
1372
- /* === CONTENT MODAL === */
1373
-
1374
- .content-modal {
1375
- min-width: unset;
1376
- max-width: unset;
1377
- width: 70vw;
1378
- height: 70vh;
1379
- display: flex;
1380
- flex-direction: column;
1381
- }
1382
- .content-modal-body {
1383
- display: flex;
1384
- flex: 1;
1385
- overflow: hidden;
1386
- }
1387
- .content-tree {
1388
- width: 220px;
1389
- min-width: 180px;
1390
- border-right: 1px solid var(--border);
1391
- overflow-y: auto;
1392
- padding: 8px 0;
1393
- }
1394
- .content-tree-item {
1395
- display: flex;
1396
- align-items: center;
1397
- gap: 6px;
1398
- padding: 4px 12px;
1399
- font-size: 11px;
1400
- color: var(--text-tertiary);
1401
- cursor: pointer;
1402
- white-space: nowrap;
1403
- transition: background 0.1s ease;
1404
- }
1405
- .content-tree-item:hover {
1406
- background: var(--bg-hover);
1407
- color: var(--text-secondary);
1408
- }
1409
- .content-tree-item.active {
1410
- background: var(--bg-hover);
1411
- color: var(--accent);
1412
- }
1413
- .content-tree-item .icon {
1414
- width: 16px;
1415
- display: flex;
1416
- align-items: center;
1417
- flex-shrink: 0;
1418
- opacity: 0.5;
1419
- }
1420
- .content-tree-item .icon svg {
1421
- width: 12px;
1422
- height: 12px;
1423
- }
1424
- .content-viewer {
1425
- flex: 1;
1426
- display: flex;
1427
- flex-direction: column;
1428
- overflow: hidden;
1429
- }
1430
- .content-viewer-path {
1431
- padding: 6px 12px;
1432
- font-size: 10px;
1433
- color: var(--text-muted);
1434
- border-bottom: 1px solid var(--border);
1435
- font-family: var(--mono);
1436
- flex-shrink: 0;
1437
- }
1438
- .content-viewer-code {
1439
- flex: 1;
1440
- margin: 0;
1441
- padding: 12px 16px;
1442
- overflow: auto;
1443
- font-family: var(--mono);
630
+ margin-bottom: 6px;
1444
631
  font-size: 11px;
1445
- line-height: 1.6;
1446
- color: var(--text-secondary);
1447
- background: var(--bg-deep);
1448
- white-space: pre-wrap;
1449
- word-break: break-word;
1450
- }
1451
- .content-viewer-code code {
1452
- font-family: inherit;
1453
- font-size: inherit;
1454
- background: none;
1455
- }
1456
- .content-viewer-code .hljs {
1457
- background: transparent;
1458
- padding: 0;
1459
- }
1460
- .content-viewer-code .hl-frontmatter {
632
+ font-weight: 600;
1461
633
  color: var(--text-muted);
1462
- opacity: 0.6;
1463
- }
1464
- .content-viewer-code code.json { color: var(--text-primary); }
1465
- .content-viewer-code code.md .md-h { color: var(--accent); font-weight: 600; }
1466
- .content-viewer-code code.md .md-code { color: #98c379; }
1467
- .content-viewer-code code.md .md-icode { color: #d19a66; }
1468
- .content-viewer-code code.md .md-bold { color: var(--text-primary); font-weight: 600; }
1469
- .content-viewer-code code.md .md-bullet { color: var(--accent); }
1470
- body.light .content-viewer-code code.md .md-code { color: #50a14f; }
1471
- body.light .content-viewer-code code.md .md-icode { color: #986801; }
1472
- .content-viewer-code .jk-key { color: var(--accent); }
1473
- .content-viewer-code .jk-str { color: #98c379; }
1474
- .content-viewer-code .jk-num { color: #d19a66; }
1475
- .content-viewer-code .jk-bool { color: #c678dd; }
1476
- .content-viewer-code .jk-null { color: #c678dd; opacity: 0.8; }
1477
- body.light .content-viewer-code .jk-str { color: #50a14f; }
1478
- body.light .content-viewer-code .jk-num { color: #986801; }
1479
- body.light .content-viewer-code .jk-bool { color: #a626a4; }
1480
- body.light .content-viewer-code .jk-null { color: #a626a4; }
1481
-
1482
- .detail-comp-group.view-only {
1483
- opacity: 0.55;
1484
634
  }
1485
- .detail-comp-group.view-only:hover {
1486
- opacity: 0.85;
635
+ .help-section table { width: 100%; border-collapse: collapse; font-size: 12px; }
636
+ .help-section td { padding: 3px 0; vertical-align: top; }
637
+ .help-section td:first-child { width: 84px; white-space: nowrap; }
638
+ .help-section td:last-child { color: var(--text-secondary); }
639
+
640
+ /* Modes */
641
+
642
+ body.embedded #themeBtn,
643
+ body.embedded #githubLink,
644
+ body.embedded .standalone-only,
645
+ body.static-mode #sessionSelect,
646
+ body.static-mode #cleanupSessionsBtn,
647
+ body.static-mode #refreshBtn { display: none; }
648
+
649
+ @media (max-width: 760px) {
650
+ .topbar-search { flex: 1 1 160px; }
651
+ .topbar-search input { width: 100%; }
652
+ .topbar-project { display: none; }
653
+ .main-layout { flex-direction: column; }
654
+ .tree-panel { flex: 1 1 55% !important; min-width: 0; min-height: 0; }
655
+ .resize-handle { display: none; }
656
+ .detail-panel { flex: 1 1 45%; min-width: 0; min-height: 0; border-left: none; border-top: 1px solid var(--border-soft); }
657
+ .tree-desc { display: none; }
1487
658
  }