trackops 1.0.0 → 1.0.1

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.
@@ -0,0 +1,570 @@
1
+ /* ═══════════════════════════════════════════════════════
2
+ COMPONENTS — Botones, Cards, Badges, Forms
3
+ ═══════════════════════════════════════════════════════ */
4
+
5
+ /* ───────────────────────────────────
6
+ BOTONES
7
+ ─────────────────────────────────── */
8
+ .btn {
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ gap: var(--space-2);
13
+ font-weight: 600;
14
+ font-size: var(--text-sm);
15
+ border-radius: var(--radius-full);
16
+ padding: 0.6rem 1.25rem;
17
+ border: 1px solid transparent;
18
+ transition:
19
+ background var(--duration-base) var(--ease-out),
20
+ box-shadow var(--duration-base) var(--ease-out),
21
+ transform var(--duration-fast) var(--ease-out),
22
+ border-color var(--duration-base) var(--ease-out);
23
+ letter-spacing: 0.01em;
24
+ cursor: pointer;
25
+ white-space: nowrap;
26
+ min-height: 36px;
27
+ line-height: 1;
28
+ }
29
+
30
+ .btn:active { transform: translateY(1px); }
31
+
32
+ /* Primary */
33
+ .btn-primary {
34
+ background: linear-gradient(135deg, var(--accent) 0%, #4F46E5 100%);
35
+ color: white;
36
+ box-shadow: var(--shadow-accent);
37
+ }
38
+ .btn-primary:hover {
39
+ transform: translateY(-1px);
40
+ box-shadow: 0 12px 32px rgba(99,102,241,0.35);
41
+ }
42
+
43
+ /* Ghost */
44
+ .btn-ghost {
45
+ background: var(--surface-4);
46
+ color: var(--text-secondary);
47
+ border-color: var(--border);
48
+ }
49
+ .btn-ghost:hover {
50
+ background: var(--surface-3);
51
+ color: var(--text-primary);
52
+ border-color: var(--border-strong);
53
+ }
54
+
55
+ /* Danger */
56
+ .btn-danger {
57
+ background: var(--danger-light);
58
+ color: var(--danger);
59
+ border-color: rgba(239,68,68,0.2);
60
+ }
61
+ .btn-danger:hover {
62
+ background: var(--danger);
63
+ color: white;
64
+ }
65
+
66
+ /* Success */
67
+ .btn-success {
68
+ background: var(--success-light);
69
+ color: var(--success);
70
+ border-color: rgba(16,185,129,0.2);
71
+ }
72
+ .btn-success:hover {
73
+ background: var(--success);
74
+ color: white;
75
+ }
76
+
77
+ /* Icon button */
78
+ .btn-icon {
79
+ padding: var(--space-2);
80
+ min-height: 36px;
81
+ min-width: 36px;
82
+ border-radius: var(--radius-md);
83
+ }
84
+
85
+ /* Small */
86
+ .btn-sm {
87
+ padding: 0.4rem 0.85rem;
88
+ font-size: var(--text-xs);
89
+ min-height: 28px;
90
+ }
91
+
92
+ /* Chip / pill */
93
+ .chip {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ gap: var(--space-1);
97
+ padding: 0.25rem 0.75rem;
98
+ font-size: var(--text-xs);
99
+ font-weight: 600;
100
+ border-radius: var(--radius-full);
101
+ border: 1px solid var(--border);
102
+ background: var(--surface-4);
103
+ color: var(--text-secondary);
104
+ cursor: pointer;
105
+ transition:
106
+ background var(--duration-fast) var(--ease-out),
107
+ border-color var(--duration-fast) var(--ease-out),
108
+ color var(--duration-fast) var(--ease-out);
109
+ }
110
+ .chip:hover {
111
+ background: var(--surface-3);
112
+ border-color: var(--border-strong);
113
+ color: var(--text-primary);
114
+ }
115
+ .chip.is-active {
116
+ background: var(--accent-light);
117
+ border-color: var(--border-accent);
118
+ color: var(--text-accent);
119
+ }
120
+
121
+ /* ───────────────────────────────────
122
+ BADGES / TAGS
123
+ ─────────────────────────────────── */
124
+ .badge {
125
+ display: inline-flex;
126
+ align-items: center;
127
+ gap: var(--space-1);
128
+ padding: 0.2rem 0.6rem;
129
+ font-size: var(--text-xs);
130
+ font-weight: 700;
131
+ border-radius: var(--radius-full);
132
+ white-space: nowrap;
133
+ letter-spacing: 0.04em;
134
+ }
135
+
136
+ .badge-accent { background: var(--accent-light); color: var(--text-accent); border: 1px solid rgba(99,102,241,0.2); }
137
+ .badge-success { background: var(--success-light); color: var(--success); border: 1px solid rgba(16,185,129,0.2); }
138
+ .badge-warning { background: var(--warning-light); color: var(--warning); border: 1px solid rgba(245,158,11,0.2); }
139
+ .badge-danger { background: var(--danger-light); color: var(--danger); border: 1px solid rgba(239,68,68,0.2); }
140
+ .badge-muted { background: var(--surface-3); color: var(--text-muted); border: 1px solid var(--border); }
141
+ .badge-info { background: var(--info-light); color: var(--info); border: 1px solid rgba(59,130,246,0.2); }
142
+
143
+ /* Priority badges */
144
+ .badge-p0 { background: rgba(239,68,68,0.12); color: var(--p0); border: 1px solid rgba(239,68,68,0.2); }
145
+ .badge-p1 { background: rgba(245,158,11,0.12); color: var(--p1); border: 1px solid rgba(245,158,11,0.2); }
146
+ .badge-p2 { background: var(--accent-light); color: var(--accent); border: 1px solid rgba(99,102,241,0.2); }
147
+ .badge-p3 { background: var(--surface-3); color: var(--text-muted); border: 1px solid var(--border); }
148
+
149
+ /* Status badges */
150
+ .status-pending { background: rgba(245,158,11,0.1); color: var(--warning); border: 1px solid rgba(245,158,11,0.15); }
151
+ .status-in_progress { background: var(--info-light); color: var(--info); border: 1px solid rgba(59,130,246,0.2); }
152
+ .status-in_review { background: var(--accent-light); color: var(--text-accent); border: 1px solid rgba(99,102,241,0.2); }
153
+ .status-blocked { background: var(--danger-light); color: var(--danger); border: 1px solid rgba(239,68,68,0.2); }
154
+ .status-completed { background: var(--success-light); color: var(--success); border: 1px solid rgba(16,185,129,0.2); }
155
+ .status-cancelled { background: var(--surface-3); color: var(--text-muted); border: 1px solid var(--border); }
156
+
157
+ /* ───────────────────────────────────
158
+ CARDS
159
+ ─────────────────────────────────── */
160
+ .card {
161
+ background: var(--surface-2);
162
+ border: 1px solid var(--border);
163
+ border-radius: var(--radius-lg);
164
+ transition:
165
+ border-color var(--duration-base) var(--ease-out),
166
+ box-shadow var(--duration-base) var(--ease-out),
167
+ background var(--duration-base) var(--ease-out);
168
+ }
169
+ .card:hover { border-color: var(--border-strong); }
170
+
171
+ .card-body { padding: var(--space-5); }
172
+ .card-sm .card-body { padding: var(--space-4); }
173
+ .card-lg .card-body { padding: var(--space-6); }
174
+
175
+ /* KPI metric card */
176
+ .kpi-card {
177
+ background: var(--surface-2);
178
+ border: 1px solid var(--border);
179
+ border-radius: var(--radius-lg);
180
+ padding: var(--space-5);
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: var(--space-2);
184
+ position: relative;
185
+ overflow: hidden;
186
+ transition:
187
+ border-color var(--duration-base) var(--ease-out),
188
+ box-shadow var(--duration-base) var(--ease-out);
189
+ }
190
+ .kpi-card::before {
191
+ content: '';
192
+ position: absolute;
193
+ top: 0; left: 0; right: 0;
194
+ height: 2px;
195
+ background: linear-gradient(90deg, var(--accent), transparent);
196
+ opacity: 0;
197
+ transition: opacity var(--duration-base) var(--ease-out);
198
+ }
199
+ .kpi-card:hover { border-color: var(--border-strong); box-shadow: var(--shadow-md); }
200
+ .kpi-card:hover::before { opacity: 1; }
201
+
202
+ .kpi-card.kpi-accent { border-top: 2px solid var(--accent); }
203
+ .kpi-card.kpi-success { border-top: 2px solid var(--success); }
204
+ .kpi-card.kpi-warning { border-top: 2px solid var(--warning); }
205
+ .kpi-card.kpi-danger { border-top: 2px solid var(--danger); }
206
+
207
+ .kpi-header {
208
+ display: flex;
209
+ align-items: center;
210
+ justify-content: space-between;
211
+ }
212
+
213
+ .kpi-title {
214
+ font-size: var(--text-xs);
215
+ font-weight: 700;
216
+ letter-spacing: 0.08em;
217
+ text-transform: uppercase;
218
+ color: var(--text-muted);
219
+ }
220
+
221
+ .kpi-icon {
222
+ width: 32px;
223
+ height: 32px;
224
+ border-radius: var(--radius-sm);
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: center;
228
+ }
229
+ .kpi-icon.accent { background: var(--accent-light); color: var(--accent); }
230
+ .kpi-icon.success { background: var(--success-light); color: var(--success); }
231
+ .kpi-icon.warning { background: var(--warning-light); color: var(--warning); }
232
+ .kpi-icon.danger { background: var(--danger-light); color: var(--danger); }
233
+
234
+ .kpi-value {
235
+ font-family: var(--font-heading);
236
+ font-size: var(--text-3xl);
237
+ font-weight: 800;
238
+ letter-spacing: -0.04em;
239
+ line-height: 1;
240
+ color: var(--text-primary);
241
+ }
242
+
243
+ .kpi-sub {
244
+ font-size: var(--text-xs);
245
+ color: var(--text-muted);
246
+ }
247
+
248
+ .kpi-trend {
249
+ display: inline-flex;
250
+ align-items: center;
251
+ gap: var(--space-1);
252
+ font-size: var(--text-xs);
253
+ font-weight: 600;
254
+ }
255
+ .kpi-trend.up { color: var(--success); }
256
+ .kpi-trend.down { color: var(--danger); }
257
+
258
+ /* Task card (kanban) */
259
+ .task-card {
260
+ background: var(--surface-2);
261
+ border: 1px solid var(--border);
262
+ border-radius: var(--radius-md);
263
+ padding: var(--space-4);
264
+ text-align: left;
265
+ width: 100%;
266
+ cursor: pointer;
267
+ transition:
268
+ border-color var(--duration-fast) var(--ease-out),
269
+ box-shadow var(--duration-fast) var(--ease-out),
270
+ background var(--duration-fast) var(--ease-out),
271
+ transform var(--duration-fast) var(--ease-out);
272
+ position: relative;
273
+ }
274
+ .task-card:hover {
275
+ border-color: var(--border-strong);
276
+ box-shadow: var(--shadow-sm);
277
+ transform: translateY(-1px);
278
+ }
279
+ .task-card.is-selected {
280
+ border-color: var(--border-accent);
281
+ background: linear-gradient(135deg, rgba(99,102,241,0.06) 0%, var(--surface-2) 100%);
282
+ box-shadow: var(--shadow-accent);
283
+ }
284
+ .task-card[data-status="blocked"] {
285
+ border-left: 3px solid var(--danger);
286
+ }
287
+ .task-card[data-status="completed"] {
288
+ opacity: 0.65;
289
+ }
290
+ .task-card[data-status="completed"]:hover {
291
+ opacity: 1;
292
+ }
293
+
294
+ .task-card-title {
295
+ font-size: var(--text-sm);
296
+ font-weight: 700;
297
+ color: var(--text-primary);
298
+ margin-bottom: var(--space-1);
299
+ display: -webkit-box;
300
+ -webkit-line-clamp: 2;
301
+ -webkit-box-orient: vertical;
302
+ overflow: hidden;
303
+ }
304
+ .task-card-id {
305
+ font-family: var(--font-mono);
306
+ font-size: 0.7rem;
307
+ color: var(--text-muted);
308
+ display: block;
309
+ margin-bottom: var(--space-2);
310
+ }
311
+ .task-card-summary {
312
+ font-size: var(--text-xs);
313
+ color: var(--text-secondary);
314
+ margin-bottom: var(--space-3);
315
+ display: -webkit-box;
316
+ -webkit-line-clamp: 2;
317
+ -webkit-box-orient: vertical;
318
+ overflow: hidden;
319
+ min-height: 2.4em;
320
+ }
321
+ .task-card-meta {
322
+ display: flex;
323
+ flex-wrap: wrap;
324
+ gap: var(--space-1);
325
+ }
326
+
327
+ /* Dragging state */
328
+ .task-card[draggable]:hover { cursor: grab; }
329
+ .task-card.is-dragging {
330
+ opacity: 0.4;
331
+ transform: rotate(2deg) scale(0.98);
332
+ }
333
+
334
+ /* ───────────────────────────────────
335
+ FORMS
336
+ ─────────────────────────────────── */
337
+ .field { display: flex; flex-direction: column; gap: var(--space-2); }
338
+
339
+ .field label {
340
+ font-size: var(--text-xs);
341
+ font-weight: 700;
342
+ letter-spacing: 0.06em;
343
+ text-transform: uppercase;
344
+ color: var(--text-muted);
345
+ }
346
+
347
+ input[type="text"],
348
+ input[type="search"],
349
+ input[type="email"],
350
+ textarea,
351
+ select {
352
+ width: 100%;
353
+ padding: 0.65rem 0.85rem;
354
+ font-size: var(--text-sm);
355
+ font-family: var(--font-ui);
356
+ color: var(--text-primary);
357
+ background: var(--surface-1);
358
+ border: 1px solid var(--border);
359
+ border-radius: var(--radius-md);
360
+ outline: none;
361
+ transition:
362
+ border-color var(--duration-fast) var(--ease-out),
363
+ box-shadow var(--duration-fast) var(--ease-out),
364
+ background var(--duration-fast) var(--ease-out);
365
+ min-height: 40px;
366
+ appearance: none;
367
+ -webkit-appearance: none;
368
+ }
369
+
370
+ input:hover, textarea:hover, select:hover {
371
+ border-color: var(--border-strong);
372
+ }
373
+
374
+ input:focus, textarea:focus, select:focus {
375
+ border-color: var(--accent);
376
+ box-shadow: 0 0 0 3px var(--accent-light);
377
+ }
378
+
379
+ textarea {
380
+ resize: vertical;
381
+ min-height: 80px;
382
+ line-height: 1.5;
383
+ }
384
+
385
+ select {
386
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%2394A3B8' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
387
+ background-repeat: no-repeat;
388
+ background-position: right 12px center;
389
+ padding-right: 36px;
390
+ }
391
+
392
+ /* Checkbox custom */
393
+ input[type="checkbox"] {
394
+ width: 18px;
395
+ height: 18px;
396
+ min-height: 18px;
397
+ min-width: 18px;
398
+ border-radius: var(--radius-xs);
399
+ border: 2px solid var(--border-strong);
400
+ background: var(--surface-1);
401
+ cursor: pointer;
402
+ accent-color: var(--accent);
403
+ }
404
+
405
+ .checkbox-field {
406
+ display: flex;
407
+ align-items: center;
408
+ gap: var(--space-3);
409
+ }
410
+ .checkbox-field label {
411
+ font-size: var(--text-sm);
412
+ font-weight: 500;
413
+ letter-spacing: 0;
414
+ text-transform: none;
415
+ color: var(--text-secondary);
416
+ cursor: pointer;
417
+ }
418
+
419
+ .field-row {
420
+ display: grid;
421
+ grid-template-columns: repeat(2, 1fr);
422
+ gap: var(--space-3);
423
+ }
424
+
425
+ .form-actions {
426
+ display: flex;
427
+ gap: var(--space-3);
428
+ padding-top: var(--space-2);
429
+ }
430
+
431
+ /* Search bar */
432
+ .search-wrapper {
433
+ position: relative;
434
+ display: flex;
435
+ align-items: center;
436
+ }
437
+ .search-wrapper .search-icon {
438
+ position: absolute;
439
+ left: var(--space-3);
440
+ color: var(--text-muted);
441
+ pointer-events: none;
442
+ flex-shrink: 0;
443
+ }
444
+ .search-wrapper input {
445
+ padding-left: 2.4rem;
446
+ }
447
+ .search-wrapper .search-kbd {
448
+ position: absolute;
449
+ right: var(--space-3);
450
+ font-family: var(--font-mono);
451
+ font-size: 0.65rem;
452
+ color: var(--text-muted);
453
+ background: var(--surface-3);
454
+ padding: 2px 6px;
455
+ border-radius: var(--radius-xs);
456
+ border: 1px solid var(--border);
457
+ pointer-events: none;
458
+ }
459
+
460
+ /* ───────────────────────────────────
461
+ EMPTY STATE
462
+ ─────────────────────────────────── */
463
+ .empty-state {
464
+ display: flex;
465
+ flex-direction: column;
466
+ align-items: center;
467
+ justify-content: center;
468
+ gap: var(--space-3);
469
+ padding: var(--space-10) var(--space-6);
470
+ text-align: center;
471
+ color: var(--text-muted);
472
+ font-size: var(--text-sm);
473
+ border: 1px dashed var(--border);
474
+ border-radius: var(--radius-lg);
475
+ }
476
+ .empty-state svg { opacity: 0.4; }
477
+
478
+ /* ───────────────────────────────────
479
+ INFO ROWS
480
+ ─────────────────────────────────── */
481
+ .info-row {
482
+ padding: var(--space-3) var(--space-4);
483
+ border-radius: var(--radius-md);
484
+ background: var(--surface-4);
485
+ border: 1px solid var(--border);
486
+ display: flex;
487
+ flex-direction: column;
488
+ gap: var(--space-1);
489
+ }
490
+ .info-row .label-sm { margin-bottom: var(--space-1); }
491
+ .info-row .value {
492
+ font-size: var(--text-sm);
493
+ font-weight: 500;
494
+ font-family: var(--font-mono);
495
+ color: var(--text-primary);
496
+ overflow: hidden;
497
+ text-overflow: ellipsis;
498
+ white-space: nowrap;
499
+ }
500
+
501
+ /* ───────────────────────────────────
502
+ SECTION HEADER (dentro de vistas)
503
+ ─────────────────────────────────── */
504
+ .section-header {
505
+ display: flex;
506
+ align-items: flex-start;
507
+ justify-content: space-between;
508
+ gap: var(--space-4);
509
+ margin-bottom: var(--space-5);
510
+ }
511
+ .section-header-left { display: flex; flex-direction: column; gap: var(--space-1); }
512
+ .section-header h2, .section-header h3 { margin: 0; }
513
+ .section-subtitle { font-size: var(--text-sm); color: var(--text-secondary); }
514
+
515
+ /* ───────────────────────────────────
516
+ STACK LIST
517
+ ─────────────────────────────────── */
518
+ .stack { display: flex; flex-direction: column; gap: var(--space-2); }
519
+ .stack-sm { gap: var(--space-2); }
520
+ .stack-md { gap: var(--space-3); }
521
+ .stack-lg { gap: var(--space-4); }
522
+
523
+ /* ───────────────────────────────────
524
+ GRID LAYOUTS COMUNES
525
+ ─────────────────────────────────── */
526
+ .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-4); }
527
+ .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-4); }
528
+ .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-4); }
529
+ .grid-split { display: grid; grid-template-columns: 1fr 380px; gap: var(--space-4); align-items: start; }
530
+
531
+ @media (max-width: 1280px) {
532
+ .grid-4 { grid-template-columns: repeat(2, 1fr); }
533
+ .grid-3 { grid-template-columns: repeat(2, 1fr); }
534
+ .grid-split { grid-template-columns: 1fr; }
535
+ }
536
+ @media (max-width: 768px) {
537
+ .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr; }
538
+ .field-row { grid-template-columns: 1fr; }
539
+ }
540
+
541
+ /* ───────────────────────────────────
542
+ SPINNER DE CARGA
543
+ ─────────────────────────────────── */
544
+ .spinner {
545
+ width: 20px; height: 20px;
546
+ border: 2px solid var(--border-strong);
547
+ border-top-color: var(--accent);
548
+ border-radius: 50%;
549
+ animation: spin 0.7s linear infinite;
550
+ }
551
+
552
+ /* ───────────────────────────────────
553
+ THEME TOGGLE BUTTON
554
+ ─────────────────────────────────── */
555
+ .theme-toggle {
556
+ position: relative;
557
+ overflow: hidden;
558
+ color: var(--text-secondary);
559
+ }
560
+ .theme-toggle:hover {
561
+ color: var(--accent);
562
+ background: var(--accent-light);
563
+ border-color: var(--border-accent);
564
+ }
565
+ .theme-toggle svg {
566
+ transition: transform var(--duration-slow) var(--ease-out), opacity var(--duration-base);
567
+ }
568
+ .theme-toggle:hover svg {
569
+ transform: rotate(20deg) scale(1.1);
570
+ }