trackops 2.0.3 → 2.0.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 (45) hide show
  1. package/README.md +238 -0
  2. package/lib/init.js +2 -2
  3. package/lib/locale.js +41 -17
  4. package/lib/opera-bootstrap.js +68 -7
  5. package/lib/opera.js +10 -2
  6. package/lib/registry.js +18 -0
  7. package/lib/server.js +312 -207
  8. package/locales/en.json +4 -0
  9. package/locales/es.json +4 -0
  10. package/package.json +1 -1
  11. package/skills/trackops/locales/en/references/activation.md +15 -0
  12. package/skills/trackops/locales/en/references/troubleshooting.md +12 -0
  13. package/skills/trackops/references/activation.md +15 -0
  14. package/skills/trackops/references/troubleshooting.md +12 -0
  15. package/skills/trackops/skill.json +2 -2
  16. package/ui/css/base.css +19 -1
  17. package/ui/css/charts.css +106 -8
  18. package/ui/css/components.css +554 -17
  19. package/ui/css/onboarding.css +133 -0
  20. package/ui/css/panels.css +345 -406
  21. package/ui/css/terminal.css +125 -0
  22. package/ui/css/timeline.css +58 -0
  23. package/ui/css/tokens.css +170 -113
  24. package/ui/index.html +3 -0
  25. package/ui/js/api.js +49 -13
  26. package/ui/js/app.js +28 -32
  27. package/ui/js/charts.js +526 -0
  28. package/ui/js/filters.js +247 -0
  29. package/ui/js/icons.js +82 -57
  30. package/ui/js/keyboard.js +229 -0
  31. package/ui/js/onboarding.js +33 -42
  32. package/ui/js/router.js +20 -3
  33. package/ui/js/views/board.js +84 -114
  34. package/ui/js/views/dashboard.js +870 -0
  35. package/ui/js/views/projects.js +745 -0
  36. package/ui/js/views/scrum.js +476 -0
  37. package/ui/js/views/settings.js +197 -247
  38. package/ui/js/views/sidebar.js +37 -31
  39. package/ui/js/views/tasks.js +218 -101
  40. package/ui/js/views/timeline.js +265 -0
  41. package/ui/js/views/topbar.js +94 -107
  42. package/ui/app.js +0 -950
  43. package/ui/js/views/insights.js +0 -340
  44. package/ui/js/views/overview.js +0 -369
  45. package/ui/styles.css +0 -688
package/ui/css/panels.css CHANGED
@@ -2,282 +2,447 @@
2
2
  PANELS — Sidebar, Topbar, Modals, Flash, Kanban
3
3
  ═══════════════════════════════════════════════════════ */
4
4
 
5
- /* ───────────────────────────────────
6
- SIDEBAR
7
- ─────────────────────────────────── */
5
+ /* ── Sidebar ── */
8
6
  .sidebar {
7
+ position: fixed;
8
+ top: 0;
9
+ left: 0;
10
+ width: var(--sidebar-width-collapsed);
11
+ height: 100dvh;
12
+ background: var(--glass-bg-strong);
13
+ backdrop-filter: blur(var(--glass-blur-lg));
14
+ -webkit-backdrop-filter: blur(var(--glass-blur-lg));
15
+ border-right: 1px solid var(--glass-border);
9
16
  display: flex;
10
17
  flex-direction: column;
11
- height: 100%;
12
- background: var(--surface-1);
13
- border-right: 1px solid var(--border);
14
- padding: var(--space-5) 0;
15
- gap: 0;
18
+ padding: var(--space-3) 0;
19
+ z-index: var(--z-sidebar);
20
+ transition: width var(--duration-slow) var(--ease-out);
21
+ overflow: hidden;
22
+ }
23
+ .sidebar:hover,
24
+ .sidebar:focus-within {
25
+ width: var(--sidebar-width-expanded);
16
26
  }
17
27
 
18
- /* Logo */
28
+ /* ── Logo ── */
19
29
  .sidebar-logo {
20
30
  display: flex;
21
31
  align-items: center;
22
32
  gap: var(--space-3);
23
- padding: 0 var(--space-5) var(--space-5);
24
- border-bottom: 1px solid var(--border);
33
+ padding: var(--space-2) var(--space-4);
25
34
  margin-bottom: var(--space-4);
26
35
  text-decoration: none;
27
36
  color: var(--text-primary);
37
+ white-space: nowrap;
38
+ overflow: hidden;
39
+ min-height: 44px;
28
40
  }
29
- .sidebar-logo:hover { color: var(--text-primary); }
30
-
31
41
  .sidebar-logo-icon {
42
+ flex-shrink: 0;
32
43
  width: 36px;
33
44
  height: 36px;
34
- background: linear-gradient(135deg, var(--accent), #4F46E5);
35
- border-radius: var(--radius-md);
36
45
  display: flex;
37
46
  align-items: center;
38
47
  justify-content: center;
39
- flex-shrink: 0;
48
+ background: linear-gradient(135deg, #3B82F6 0%, #60A5FA 100%);
49
+ border-radius: var(--radius-md);
50
+ color: #fff;
40
51
  box-shadow: var(--shadow-accent);
41
52
  }
42
53
  .sidebar-logo-name {
43
54
  font-family: var(--font-heading);
44
- font-weight: 800;
45
55
  font-size: var(--text-lg);
46
- letter-spacing: -0.03em;
47
- color: var(--text-primary);
48
- }
49
-
50
- /* Secciones */
51
- .sidebar-section {
52
- padding: 0 var(--space-3);
53
- flex: 1;
54
- overflow-y: auto;
56
+ font-weight: 700;
57
+ opacity: 0;
58
+ transform: translateX(-8px);
59
+ transition: opacity var(--duration-base) var(--ease-out),
60
+ transform var(--duration-base) var(--ease-out);
55
61
  }
56
- .sidebar-section + .sidebar-section {
57
- border-top: 1px solid var(--border);
58
- padding-top: var(--space-4);
59
- margin-top: var(--space-4);
62
+ .sidebar:hover .sidebar-logo-name,
63
+ .sidebar:focus-within .sidebar-logo-name {
64
+ opacity: 1;
65
+ transform: translateX(0);
60
66
  }
61
67
 
68
+ /* ── Section Label ── */
62
69
  .sidebar-section-label {
63
70
  font-size: var(--text-xs);
64
- font-weight: 700;
65
- letter-spacing: 0.12em;
66
- text-transform: uppercase;
71
+ font-weight: 600;
67
72
  color: var(--text-muted);
68
- padding: 0 var(--space-3) var(--space-2);
73
+ text-transform: uppercase;
74
+ letter-spacing: 0.08em;
75
+ padding: var(--space-1) var(--space-4);
76
+ white-space: nowrap;
77
+ opacity: 0;
78
+ transition: opacity var(--duration-base) var(--ease-out);
79
+ }
80
+ .sidebar:hover .sidebar-section-label,
81
+ .sidebar:focus-within .sidebar-section-label {
82
+ opacity: 1;
69
83
  }
70
84
 
71
- /* Nav items */
72
- .sidebar-nav { display: flex; flex-direction: column; gap: var(--space-1); }
85
+ /* ── Sidebar Section ── */
86
+ .sidebar-section {
87
+ flex: 1;
88
+ overflow-y: auto;
89
+ overflow-x: hidden;
90
+ }
73
91
 
92
+ /* ── Nav Items ── */
93
+ .sidebar-nav {
94
+ list-style: none;
95
+ padding: 0;
96
+ margin: 0;
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: 2px;
100
+ }
74
101
  .nav-item {
75
102
  display: flex;
76
103
  align-items: center;
77
104
  gap: var(--space-3);
78
- padding: 0.55rem var(--space-3);
79
- border-radius: var(--radius-md);
105
+ width: 100%;
106
+ padding: var(--space-2) var(--space-4);
107
+ border: none;
108
+ background: transparent;
109
+ color: var(--text-secondary);
110
+ font-family: var(--font-ui);
80
111
  font-size: var(--text-sm);
81
112
  font-weight: 500;
82
- color: var(--text-secondary);
83
113
  cursor: pointer;
84
- border: 1px solid transparent;
85
- text-decoration: none;
86
- transition:
87
- background var(--duration-fast) var(--ease-out),
88
- color var(--duration-fast) var(--ease-out),
89
- border-color var(--duration-fast) var(--ease-out);
90
- position: relative;
91
- user-select: none;
114
+ border-radius: 0;
115
+ transition: background var(--duration-fast) var(--ease-out),
116
+ color var(--duration-fast) var(--ease-out);
117
+ white-space: nowrap;
118
+ overflow: hidden;
92
119
  min-height: 40px;
120
+ position: relative;
93
121
  }
94
122
  .nav-item:hover {
95
- background: var(--surface-3);
123
+ background: rgba(255, 255, 255, 0.04);
96
124
  color: var(--text-primary);
97
125
  }
98
126
  .nav-item.is-active {
127
+ color: var(--accent);
99
128
  background: var(--accent-light);
100
- color: var(--text-accent);
101
- border-color: var(--border-accent);
102
- font-weight: 700;
129
+ }
130
+ .nav-item.is-active::before {
131
+ content: '';
132
+ position: absolute;
133
+ left: 0;
134
+ top: 50%;
135
+ transform: translateY(-50%);
136
+ width: 3px;
137
+ height: 24px;
138
+ background: var(--accent);
139
+ border-radius: 0 3px 3px 0;
103
140
  }
104
141
  .nav-item-icon {
105
142
  flex-shrink: 0;
106
- width: 18px;
107
- height: 18px;
108
- opacity: 0.7;
109
- }
110
- .nav-item.is-active .nav-item-icon { opacity: 1; }
111
-
112
- .nav-item-label { flex: 1; min-width: 0; }
113
- .nav-item-badge {
114
- display: inline-flex;
143
+ width: 20px;
144
+ height: 20px;
145
+ display: flex;
115
146
  align-items: center;
116
147
  justify-content: center;
148
+ margin-left: 6px;
149
+ }
150
+ .nav-item-label {
151
+ opacity: 0;
152
+ transform: translateX(-8px);
153
+ transition: opacity var(--duration-base) var(--ease-out),
154
+ transform var(--duration-base) var(--ease-out);
155
+ }
156
+ .sidebar:hover .nav-item-label,
157
+ .sidebar:focus-within .nav-item-label {
158
+ opacity: 1;
159
+ transform: translateX(0);
160
+ }
161
+ .nav-item-badge {
162
+ margin-left: auto;
117
163
  min-width: 20px;
118
164
  height: 20px;
119
- padding: 0 5px;
120
- font-size: 0.65rem;
121
- font-weight: 800;
165
+ padding: 0 6px;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ font-size: 11px;
170
+ font-weight: 700;
171
+ background: var(--accent-light);
172
+ color: var(--accent);
122
173
  border-radius: var(--radius-full);
123
- background: var(--accent);
124
- color: white;
174
+ opacity: 0;
175
+ transition: opacity var(--duration-base) var(--ease-out);
176
+ }
177
+ .sidebar:hover .nav-item-badge,
178
+ .sidebar:focus-within .nav-item-badge {
179
+ opacity: 1;
180
+ }
181
+ .nav-item-badge.danger {
182
+ background: var(--danger-light);
183
+ color: var(--danger);
125
184
  }
126
- .nav-item-badge.danger { background: var(--danger); }
127
185
 
128
- /* Sidebar footer */
186
+ /* ── Sidebar Footer ── */
129
187
  .sidebar-footer {
130
- padding: var(--space-4) var(--space-3) 0;
131
- border-top: 1px solid var(--border);
132
188
  margin-top: auto;
133
- flex-shrink: 0;
189
+ padding-top: var(--space-3);
190
+ border-top: 1px solid var(--border);
134
191
  display: flex;
135
192
  flex-direction: column;
136
- gap: var(--space-1);
193
+ gap: 2px;
137
194
  }
138
195
 
139
- /* ───────────────────────────────────
140
- TOPBAR
141
- ─────────────────────────────────── */
196
+ /* ── Tooltip for collapsed state ── */
197
+ .nav-item[data-tooltip]::after {
198
+ content: attr(data-tooltip);
199
+ position: absolute;
200
+ left: calc(var(--sidebar-width-collapsed) + 8px);
201
+ top: 50%;
202
+ transform: translateY(-50%);
203
+ padding: 4px 10px;
204
+ background: var(--gray-800);
205
+ color: var(--text-primary);
206
+ font-size: var(--text-xs);
207
+ font-weight: 600;
208
+ border-radius: var(--radius-sm);
209
+ white-space: nowrap;
210
+ pointer-events: none;
211
+ opacity: 0;
212
+ transition: opacity var(--duration-fast) var(--ease-out);
213
+ z-index: 100;
214
+ box-shadow: var(--shadow-md);
215
+ }
216
+ .nav-item[data-tooltip]:hover::after {
217
+ opacity: 1;
218
+ }
219
+ .sidebar:hover .nav-item[data-tooltip]::after,
220
+ .sidebar:focus-within .nav-item[data-tooltip]::after {
221
+ opacity: 0;
222
+ pointer-events: none;
223
+ }
224
+
225
+ /* ── Topbar ── */
142
226
  .topbar {
143
- height: var(--topbar-height);
144
- background: rgba(10, 15, 30, 0.85);
145
- backdrop-filter: blur(20px);
146
- -webkit-backdrop-filter: blur(20px);
147
- border-bottom: 1px solid var(--border);
148
227
  display: flex;
149
228
  align-items: center;
150
- padding: 0 var(--content-pad);
151
229
  gap: var(--space-4);
230
+ height: var(--topbar-height);
231
+ padding: 0 var(--content-pad);
232
+ background: var(--glass-bg);
233
+ backdrop-filter: blur(var(--glass-blur));
234
+ -webkit-backdrop-filter: blur(var(--glass-blur));
235
+ border-bottom: 1px solid var(--glass-border);
236
+ position: sticky;
237
+ top: 0;
238
+ z-index: var(--z-topbar);
152
239
  }
153
240
 
154
- .topbar-search {
155
- flex: 1;
156
- max-width: 380px;
157
- }
158
-
159
- .topbar-right {
241
+ /* ── Active project name ── */
242
+ .topbar-project-name {
160
243
  display: flex;
161
244
  align-items: center;
162
- gap: var(--space-3);
163
- margin-left: auto;
245
+ gap: var(--space-2);
246
+ padding: 0.3rem 0.7rem;
247
+ font-size: var(--text-sm);
248
+ font-weight: 600;
249
+ color: var(--text-secondary);
250
+ white-space: nowrap;
251
+ overflow: hidden;
252
+ text-overflow: ellipsis;
253
+ max-width: 220px;
254
+ }
255
+ .topbar-project-icon {
256
+ display: flex;
257
+ color: var(--accent);
258
+ flex-shrink: 0;
259
+ }
260
+ .topbar-project-label {
261
+ overflow: hidden;
262
+ text-overflow: ellipsis;
164
263
  }
165
264
 
166
- .topbar-project-selector {
265
+ /* ── Locale selector ── */
266
+ .topbar-locale {
267
+ position: relative;
268
+ }
269
+ .locale-dropdown {
270
+ position: absolute;
271
+ top: calc(100% + var(--space-2));
272
+ right: 0;
273
+ min-width: 120px;
274
+ background: var(--glass-bg-strong);
275
+ backdrop-filter: blur(var(--glass-blur-lg));
276
+ -webkit-backdrop-filter: blur(var(--glass-blur-lg));
277
+ border: 1px solid var(--glass-border);
278
+ border-radius: var(--radius-md);
279
+ box-shadow: var(--shadow-lg);
280
+ padding: var(--space-1);
281
+ z-index: var(--z-panel);
167
282
  display: flex;
168
- align-items: center;
169
- gap: var(--space-2);
283
+ flex-direction: column;
284
+ }
285
+ .locale-dropdown.is-hidden { display: none; }
286
+ .locale-option {
287
+ padding: 0.4rem 0.75rem;
288
+ font-size: var(--text-sm);
289
+ font-weight: 500;
290
+ color: var(--text-secondary);
291
+ border-radius: var(--radius-sm);
292
+ text-align: left;
293
+ transition: background var(--duration-fast), color var(--duration-fast);
294
+ }
295
+ .locale-option:hover {
296
+ background: var(--surface-4);
297
+ color: var(--text-primary);
298
+ }
299
+ .locale-option.is-active {
300
+ color: var(--accent);
301
+ font-weight: 700;
170
302
  }
171
303
 
172
- .project-select-wrapper {
304
+ /* ── Search ── */
305
+ .topbar-search {
306
+ flex: 1;
307
+ max-width: 400px;
308
+ }
309
+ .search-wrapper {
173
310
  position: relative;
311
+ display: flex;
312
+ align-items: center;
174
313
  }
175
- .project-select-wrapper select {
176
- min-width: 220px;
177
- background-color: var(--surface-2);
314
+ .search-wrapper .search-icon {
315
+ position: absolute;
316
+ left: 12px;
317
+ color: var(--text-muted);
318
+ display: flex;
319
+ pointer-events: none;
320
+ }
321
+ .search-wrapper input {
322
+ width: 100%;
323
+ padding: 0.45rem 0.85rem 0.45rem 2.2rem;
324
+ background: var(--glass-bg-subtle);
325
+ backdrop-filter: blur(var(--glass-blur-sm));
326
+ -webkit-backdrop-filter: blur(var(--glass-blur-sm));
327
+ border: 1px solid var(--glass-border);
328
+ border-radius: var(--radius-full);
329
+ color: var(--text-primary);
330
+ font-family: var(--font-ui);
178
331
  font-size: var(--text-sm);
179
- height: 36px;
180
- padding: 0 2.5rem 0 0.85rem;
332
+ transition: border-color var(--duration-fast) var(--ease-out),
333
+ background var(--duration-fast) var(--ease-out);
334
+ }
335
+ .search-wrapper input:focus {
336
+ outline: none;
337
+ border-color: var(--accent);
338
+ background: var(--glass-bg);
339
+ box-shadow: 0 0 0 3px var(--accent-light);
340
+ }
341
+ .search-wrapper input::placeholder {
342
+ color: var(--text-muted);
181
343
  }
182
- .locale-select-wrapper select {
183
- min-width: 110px;
344
+ .search-kbd {
345
+ position: absolute;
346
+ right: 10px;
347
+ font-size: 10px;
348
+ font-family: var(--font-mono);
349
+ color: var(--text-muted);
350
+ background: var(--surface-4);
351
+ padding: 2px 6px;
352
+ border-radius: var(--radius-xs);
353
+ border: 1px solid var(--border);
184
354
  }
185
355
 
186
- .repo-badge {
356
+ /* ── Right section ── */
357
+ .topbar-right {
358
+ display: flex;
359
+ align-items: center;
360
+ gap: var(--space-2);
361
+ margin-left: auto;
362
+ }
363
+
364
+ /* ── Timer badge ── */
365
+ .topbar-timer {
187
366
  display: flex;
188
367
  align-items: center;
189
368
  gap: var(--space-2);
190
- padding: 0.3rem 0.75rem;
369
+ padding: 0.3rem 0.7rem;
370
+ background: var(--glass-bg-subtle);
371
+ border: 1px solid var(--glass-border);
191
372
  border-radius: var(--radius-full);
373
+ font-family: var(--font-mono);
192
374
  font-size: var(--text-xs);
193
- font-weight: 600;
194
- border: 1px solid transparent;
195
- white-space: nowrap;
375
+ color: var(--text-secondary);
196
376
  }
197
- .repo-badge.clean {
198
- background: var(--success-light);
199
- border-color: rgba(16,185,129,0.2);
200
- color: var(--success);
377
+ .topbar-timer-dot {
378
+ width: 6px;
379
+ height: 6px;
380
+ border-radius: 50%;
381
+ background: var(--accent-green);
382
+ animation: pulse 2s infinite;
201
383
  }
202
- .repo-badge.dirty {
203
- background: var(--warning-light);
204
- border-color: rgba(245,158,11,0.2);
205
- color: var(--warning);
384
+
385
+ /* ── Repo badge ── */
386
+ .repo-badge {
387
+ display: flex;
388
+ align-items: center;
389
+ gap: var(--space-1);
390
+ padding: 0.2rem 0.6rem;
391
+ font-size: var(--text-xs);
392
+ color: var(--text-secondary);
393
+ background: var(--glass-bg-subtle);
394
+ border: 1px solid var(--glass-border);
395
+ border-radius: var(--radius-full);
206
396
  }
207
397
  .repo-badge-dot {
208
398
  width: 6px;
209
399
  height: 6px;
210
400
  border-radius: 50%;
211
- flex-shrink: 0;
212
401
  }
213
- .clean .repo-badge-dot { background: var(--success); animation: pulse 2s infinite; }
214
- .dirty .repo-badge-dot { background: var(--warning); }
402
+ .repo-badge.clean .repo-badge-dot { background: var(--accent-green); }
403
+ .repo-badge.dirty .repo-badge-dot { background: var(--accent-yellow); }
215
404
 
216
- /* Hamburger (mobile) */
405
+ /* ── Hamburger (mobile) ── */
217
406
  .topbar-hamburger {
218
407
  display: none;
219
408
  flex-direction: column;
220
409
  gap: 5px;
221
- padding: var(--space-2);
222
- border-radius: var(--radius-sm);
410
+ padding: 8px;
411
+ background: none;
412
+ border: none;
223
413
  cursor: pointer;
224
- border: 1px solid var(--border);
225
- background: var(--surface-2);
226
414
  }
227
415
  .topbar-hamburger span {
228
- display: block;
229
- width: 18px;
416
+ width: 20px;
230
417
  height: 2px;
231
418
  background: var(--text-primary);
232
419
  border-radius: 2px;
233
- transition: transform var(--duration-base) var(--ease-out), opacity var(--duration-base);
420
+ transition: transform var(--duration-fast);
234
421
  }
235
422
 
236
423
  @media (max-width: 1024px) {
237
- .topbar-hamburger { display: flex; }
238
- }
239
-
240
- /* ───────────────────────────────────
241
- TIME TRACKER WIDGET (en topbar)
242
- ─────────────────────────────────── */
243
- .topbar-timer {
244
- display: flex;
245
- align-items: center;
246
- gap: var(--space-2);
247
- padding: 0.3rem 0.85rem;
248
- background: var(--surface-2);
249
- border: 1px solid var(--border);
250
- border-radius: var(--radius-full);
251
- font-family: var(--font-mono);
252
- font-size: var(--text-sm);
253
- font-weight: 700;
254
- color: var(--text-primary);
255
- letter-spacing: 0.04em;
256
- }
257
- .topbar-timer.is-running {
258
- border-color: var(--border-accent);
259
- background: var(--accent-light);
260
- color: var(--text-accent);
261
- }
262
- .topbar-timer-dot {
263
- width: 6px;
264
- height: 6px;
265
- border-radius: 50%;
266
- background: var(--text-muted);
267
- flex-shrink: 0;
268
- }
269
- .topbar-timer.is-running .topbar-timer-dot {
270
- background: var(--accent);
271
- animation: pulse 1s infinite;
424
+ .sidebar {
425
+ transform: translateX(-100%);
426
+ width: var(--sidebar-width-expanded) !important;
427
+ }
428
+ .sidebar.is-open {
429
+ transform: translateX(0);
430
+ }
431
+ .topbar-hamburger {
432
+ display: flex;
433
+ }
272
434
  }
273
435
 
274
436
  /* ───────────────────────────────────
275
437
  PANEL SECTION (contenedores de vistas)
276
438
  ─────────────────────────────────── */
277
439
  .panel {
278
- background: var(--surface-2);
279
- border: 1px solid var(--border);
440
+ background: var(--glass-bg);
441
+ backdrop-filter: blur(var(--glass-blur));
442
+ -webkit-backdrop-filter: blur(var(--glass-blur));
443
+ border: 1px solid var(--glass-border);
280
444
  border-radius: var(--radius-xl);
445
+ box-shadow: var(--glass-shadow), var(--glass-inner);
281
446
  overflow: hidden;
282
447
  }
283
448
 
@@ -316,8 +481,10 @@
316
481
  }
317
482
 
318
483
  .board-column {
319
- background: var(--surface-1);
320
- border: 1px solid var(--border);
484
+ background: var(--glass-bg-subtle);
485
+ backdrop-filter: blur(var(--glass-blur-sm));
486
+ -webkit-backdrop-filter: blur(var(--glass-blur-sm));
487
+ border: 1px solid var(--glass-border);
321
488
  border-radius: var(--radius-lg);
322
489
  padding: var(--space-3);
323
490
  min-height: 400px;
@@ -370,52 +537,7 @@
370
537
 
371
538
  .board-column-body { display: flex; flex-direction: column; gap: var(--space-2); }
372
539
 
373
- /* ───────────────────────────────────
374
- TERMINAL SURFACE
375
- ─────────────────────────────────── */
376
- .terminal-surface {
377
- background: #060a14;
378
- border: 1px solid rgba(255,255,255,0.05);
379
- border-radius: var(--radius-lg);
380
- overflow: hidden;
381
- }
382
- .terminal-header {
383
- display: flex;
384
- align-items: center;
385
- justify-content: space-between;
386
- padding: var(--space-2) var(--space-4);
387
- background: rgba(255,255,255,0.03);
388
- border-bottom: 1px solid rgba(255,255,255,0.04);
389
- gap: var(--space-3);
390
- }
391
- .terminal-dots { display: flex; gap: var(--space-2); align-items: center; }
392
- .terminal-dots span {
393
- width: 10px; height: 10px;
394
- border-radius: 50%;
395
- }
396
- .terminal-dots span:nth-child(1) { background: #EF4444; }
397
- .terminal-dots span:nth-child(2) { background: #F59E0B; }
398
- .terminal-dots span:nth-child(3) { background: #10B981; }
399
- .terminal-title {
400
- font-family: var(--font-mono);
401
- font-size: var(--text-xs);
402
- color: var(--text-muted);
403
- flex: 1;
404
- text-align: center;
405
- }
406
- .terminal-output {
407
- margin: 0;
408
- padding: var(--space-5);
409
- font-family: var(--font-mono);
410
- font-size: var(--text-xs);
411
- line-height: 1.7;
412
- color: #94D4BC;
413
- min-height: 280px;
414
- max-height: 460px;
415
- overflow-y: auto;
416
- white-space: pre-wrap;
417
- word-break: break-all;
418
- }
540
+ /* Terminal styles moved to terminal.css */
419
541
 
420
542
  /* ───────────────────────────────────
421
543
  FLASH / TOAST
@@ -436,8 +558,10 @@
436
558
  .flash {
437
559
  padding: var(--space-4) var(--space-5);
438
560
  border-radius: var(--radius-lg);
439
- background: var(--surface-2);
440
- border: 1px solid var(--border-strong);
561
+ background: var(--glass-bg-strong);
562
+ backdrop-filter: blur(var(--glass-blur-lg));
563
+ -webkit-backdrop-filter: blur(var(--glass-blur-lg));
564
+ border: 1px solid var(--glass-border);
441
565
  box-shadow: var(--shadow-lg);
442
566
  color: var(--text-primary);
443
567
  font-size: var(--text-sm);
@@ -447,7 +571,6 @@
447
571
  gap: var(--space-3);
448
572
  pointer-events: all;
449
573
  animation: slideInRight var(--duration-slow) var(--ease-out) both;
450
- backdrop-filter: blur(20px);
451
574
  }
452
575
  .flash.flash-success { border-color: rgba(16,185,129,0.3); }
453
576
  .flash.flash-error { background: rgba(239,68,68,0.15); border-color: rgba(239,68,68,0.3); }
@@ -472,8 +595,10 @@
472
595
  .modal-overlay.is-hidden { display: none; }
473
596
 
474
597
  .modal {
475
- background: var(--surface-2);
476
- border: 1px solid var(--border-strong);
598
+ background: var(--glass-bg-strong);
599
+ backdrop-filter: blur(var(--glass-blur-lg));
600
+ -webkit-backdrop-filter: blur(var(--glass-blur-lg));
601
+ border: 1px solid var(--glass-border);
477
602
  border-radius: var(--radius-xl);
478
603
  width: 100%;
479
604
  max-width: 540px;
@@ -510,210 +635,24 @@
510
635
  }
511
636
  .modal-close:hover { background: var(--surface-4); color: var(--text-primary); }
512
637
 
513
- /* ───────────────────────────────────
514
- CONSOLE LOGS PANEL
515
- ─────────────────────────────────── */
516
- .console-panel {
517
- position: fixed;
518
- bottom: 0;
519
- left: var(--sidebar-width);
520
- right: 0;
521
- z-index: var(--z-panel);
522
- background: #060a14;
523
- border-top: 1px solid var(--border);
524
- transition: transform var(--duration-slow) var(--ease-out);
525
- transform: translateY(100%);
526
- }
527
- .console-panel.is-open {
528
- transform: translateY(0);
529
- }
530
- .console-panel-header {
531
- display: flex;
532
- align-items: center;
533
- justify-content: space-between;
534
- padding: var(--space-2) var(--space-4);
535
- border-bottom: 1px solid rgba(255,255,255,0.04);
536
- background: rgba(255,255,255,0.02);
537
- }
538
- .console-panel-title {
539
- font-family: var(--font-mono);
540
- font-size: var(--text-xs);
541
- color: var(--text-muted);
542
- display: flex;
543
- align-items: center;
544
- gap: var(--space-2);
545
- }
546
- .console-panel-actions {
547
- display: flex;
548
- gap: var(--space-2);
549
- }
550
- .console-logs {
551
- overflow-y: auto;
552
- max-height: 220px;
553
- padding: var(--space-2) 0;
554
- }
555
- .console-log-entry {
556
- display: grid;
557
- grid-template-columns: auto auto 1fr;
558
- gap: var(--space-3);
559
- align-items: start;
560
- padding: var(--space-1) var(--space-4);
561
- font-family: var(--font-mono);
562
- font-size: var(--text-xs);
563
- line-height: 1.6;
564
- border-bottom: 1px solid rgba(255,255,255,0.02);
565
- }
566
- .console-log-entry:hover { background: rgba(255,255,255,0.02); }
567
- .console-log-time { color: var(--text-muted); white-space: nowrap; }
568
- .log-level { font-weight: 700; white-space: nowrap; }
569
- .log-error { color: var(--danger); }
570
- .log-warn { color: var(--warning); }
571
- .log-info { color: var(--info); }
572
- .log-debug { color: var(--text-muted); }
573
- .console-log-msg { color: var(--text-secondary); word-break: break-all; }
574
-
575
- /* ───────────────────────────────────
576
- ONBOARDING SPOTLIGHT (Tour)
577
- ─────────────────────────────────── */
578
- .onboarding-spotlight {
579
- /* Los estilos inline de position, inset, box-shadow se inyectan por JS */
580
- background: transparent;
581
- z-index: var(--z-onboard);
582
- pointer-events: none;
583
- }
584
- .onboarding-spotlight.is-hidden { display: none; }
585
-
586
- .onboarding-ring {
587
- box-sizing: border-box;
588
- }
589
-
590
- @keyframes ob-ring-pulse {
591
- 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(99,102,241,0.7); opacity: 1; }
592
- 70% { transform: scale(1); box-shadow: 0 0 0 10px rgba(99,102,241,0); opacity: 0; }
593
- 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(99,102,241,0); opacity: 0; }
594
- }
595
-
596
- .onboarding-tooltip {
597
- /* Los estilos inline de position y transform se inyectan por JS */
598
- background: var(--surface-2);
599
- border: 1px solid var(--border-accent);
600
- border-radius: var(--radius-xl);
601
- padding: var(--space-6);
602
- box-shadow: var(--shadow-xl);
603
- opacity: 0;
604
- transition: opacity var(--duration-base) var(--ease-out);
605
- pointer-events: all;
606
- color: var(--text-primary);
607
- }
608
- .onboarding-tooltip.is-hidden { display: none; pointer-events: none; }
609
- .ob-enter {
610
- animation: ob-enter-anim var(--duration-base) var(--ease-out) forwards;
611
- }
612
- @keyframes ob-enter-anim {
613
- from { opacity: 0; transform: translateY(8px) scale(0.98); }
614
- to { opacity: 1; transform: translateY(0) scale(1); }
615
- }
638
+ /* Console logs panel styles moved to terminal.css */
616
639
 
617
- /* ── Flechas (Bocadillo) ── */
618
- .onboarding-tooltip::after {
619
- content: '';
620
- position: absolute;
621
- width: 0;
622
- height: 0;
623
- border-style: solid;
624
- }
625
- /* Flecha apuntando hacia arriba (cuando el tooltip está bottom) */
626
- .onboarding-tooltip[data-pos="bottom"]::after {
627
- top: -10px;
628
- left: 50%;
629
- margin-left: -10px;
630
- border-width: 0 10px 10px 10px;
631
- border-color: transparent transparent var(--surface-2) transparent;
632
- }
633
- /* Flecha apuntando hacia abajo (cuando el tooltip está top) */
634
- .onboarding-tooltip[data-pos="top"]::after {
635
- bottom: -10px;
636
- left: 50%;
637
- margin-left: -10px;
638
- border-width: 10px 10px 0 10px;
639
- border-color: var(--surface-2) transparent transparent transparent;
640
- }
641
- /* Flecha apuntando hacia la izquierda (cuando el tooltip está right) */
642
- .onboarding-tooltip[data-pos="right"]::after {
643
- left: -10px;
644
- top: 50%;
645
- margin-top: -10px;
646
- border-width: 10px 10px 10px 0;
647
- border-color: transparent var(--surface-2) transparent transparent;
648
- }
649
- /* Flecha apuntando hacia la derecha (cuando el tooltip está left) */
650
- .onboarding-tooltip[data-pos="left"]::after {
651
- right: -10px;
652
- top: 50%;
653
- margin-top: -10px;
654
- border-width: 10px 0 10px 10px;
655
- border-color: transparent transparent transparent var(--surface-2);
656
- }
657
-
658
- .ob-step-label {
659
- font-size: var(--text-xs);
660
- font-weight: 700;
661
- color: var(--accent);
662
- letter-spacing: 0.08em;
663
- text-transform: uppercase;
664
- margin-bottom: var(--space-3);
665
- }
666
- .ob-title {
667
- font-size: var(--text-lg);
668
- font-weight: 800;
669
- margin-bottom: var(--space-2);
670
- }
671
- .ob-desc {
672
- font-size: var(--text-sm);
673
- color: var(--text-secondary);
674
- line-height: 1.6;
675
- margin-bottom: var(--space-5);
676
- }
677
- .ob-nav {
678
- display: flex;
679
- align-items: center;
680
- justify-content: space-between;
681
- flex-wrap: wrap;
682
- gap: var(--space-4);
683
- }
684
- .ob-dots {
685
- display: flex;
686
- gap: var(--space-2);
687
- flex-wrap: wrap;
688
- }
689
- .ob-dot {
690
- width: 6px; height: 6px;
691
- border-radius: 50%;
692
- background: var(--border-strong);
693
- transition: background var(--duration-base);
694
- }
695
- .ob-dot.is-active {
696
- background: var(--accent);
697
- width: 18px;
698
- border-radius: var(--radius-full);
699
- }
700
- .ob-actions {
701
- display: flex;
702
- gap: var(--space-2);
703
- flex-wrap: wrap;
704
- }
640
+ /* Onboarding styles moved to onboarding.css */
705
641
 
706
642
 
707
643
  /* ───────────────────────────────────
708
644
  TIME TRACKER (widget grande)
709
645
  ─────────────────────────────────── */
710
646
  .time-tracker-card {
711
- background: linear-gradient(135deg, var(--navy-90) 0%, var(--surface-1) 100%);
712
- border: 1px solid var(--border-accent);
647
+ background: var(--glass-bg);
648
+ backdrop-filter: blur(var(--glass-blur));
649
+ -webkit-backdrop-filter: blur(var(--glass-blur));
650
+ border: 1px solid var(--glass-border);
713
651
  border-radius: var(--radius-xl);
714
652
  padding: var(--space-5);
715
653
  position: relative;
716
654
  overflow: hidden;
655
+ box-shadow: var(--glass-shadow), var(--glass-inner);
717
656
  }
718
657
  .time-tracker-card::before {
719
658
  content: '';