@walknpm/todo-cli 1.2.0 → 2.0.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.
@@ -0,0 +1,804 @@
1
+ /* style.css — modern responsive design for todo-cli web UI.
2
+ Zero dependencies. CSS custom properties for theming. */
3
+
4
+ /* ─── Theme Variables ────────────────────────────────────────────────────── */
5
+
6
+ :root {
7
+ --radius: 10px;
8
+ --radius-sm: 6px;
9
+ --transition: 0.2s ease;
10
+ --sidebar-width: 260px;
11
+ --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
12
+ --font-mono: "SF Mono", "Fira Code", "Fira Mono", Menlo, Consolas, monospace;
13
+ }
14
+
15
+ [data-theme="dark"] {
16
+ --bg: #0f1117;
17
+ --bg-elevated: #1a1d27;
18
+ --bg-hover: #232734;
19
+ --bg-input: #15171f;
20
+ --border: #2a2e3b;
21
+ --border-light: #1e2230;
22
+ --text: #e4e6ef;
23
+ --text-dim: #8b8fa3;
24
+ --text-faint: #5a5e6e;
25
+ --primary: #6366f1;
26
+ --primary-hover: #5558e0;
27
+ --primary-bg: rgba(99, 102, 241, 0.12);
28
+ --success: #22c55e;
29
+ --success-bg: rgba(34, 197, 94, 0.12);
30
+ --warning: #f59e0b;
31
+ --warning-bg: rgba(245, 158, 11, 0.12);
32
+ --danger: #ef4444;
33
+ --danger-bg: rgba(239, 68, 68, 0.12);
34
+ --info: #3b82f6;
35
+ --shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
36
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
37
+ --scrollbar: #2a2e3b;
38
+ --scrollbar-hover: #3a3e4b;
39
+ }
40
+
41
+ [data-theme="light"] {
42
+ --bg: #f5f6f8;
43
+ --bg-elevated: #ffffff;
44
+ --bg-hover: #f0f1f4;
45
+ --bg-input: #ffffff;
46
+ --border: #e0e2e8;
47
+ --border-light: #eceef2;
48
+ --text: #1a1d27;
49
+ --text-dim: #6b7080;
50
+ --text-faint: #a0a4b0;
51
+ --primary: #6366f1;
52
+ --primary-hover: #5558e0;
53
+ --primary-bg: rgba(99, 102, 241, 0.08);
54
+ --success: #16a34a;
55
+ --success-bg: rgba(22, 163, 74, 0.08);
56
+ --warning: #d97706;
57
+ --warning-bg: rgba(217, 119, 6, 0.08);
58
+ --danger: #dc2626;
59
+ --danger-bg: rgba(220, 38, 38, 0.08);
60
+ --info: #2563eb;
61
+ --shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
62
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06);
63
+ --scrollbar: #c5c7d0;
64
+ --scrollbar-hover: #a5a7b0;
65
+ }
66
+
67
+ /* ─── Reset & Base ────────────────────────────────────────────────────────── */
68
+
69
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
70
+
71
+ html, body { height: 100%; overflow: hidden; }
72
+
73
+ body {
74
+ font-family: var(--font);
75
+ background: var(--bg);
76
+ color: var(--text);
77
+ display: flex;
78
+ font-size: 14px;
79
+ line-height: 1.5;
80
+ -webkit-font-smoothing: antialiased;
81
+ }
82
+
83
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
84
+ ::-webkit-scrollbar-track { background: transparent; }
85
+ ::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 4px; }
86
+ ::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-hover); }
87
+
88
+ /* ─── Sidebar ────────────────────────────────────────────────────────────── */
89
+
90
+ #sidebar {
91
+ width: var(--sidebar-width);
92
+ background: var(--bg-elevated);
93
+ border-right: 1px solid var(--border);
94
+ display: flex;
95
+ flex-direction: column;
96
+ flex-shrink: 0;
97
+ z-index: 100;
98
+ transition: transform var(--transition);
99
+ }
100
+
101
+ .sidebar-header {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 10px;
105
+ padding: 18px 20px;
106
+ border-bottom: 1px solid var(--border-light);
107
+ }
108
+
109
+ .logo {
110
+ display: inline-flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ width: 32px;
114
+ height: 32px;
115
+ background: var(--primary);
116
+ color: white;
117
+ border-radius: var(--radius-sm);
118
+ font-size: 18px;
119
+ font-weight: 700;
120
+ }
121
+
122
+ .app-name { font-size: 18px; font-weight: 700; flex: 1; }
123
+
124
+ .sidebar-nav { padding: 12px 10px; display: flex; flex-direction: column; gap: 2px; }
125
+
126
+ .sidebar-section { padding: 8px 10px; border-top: 1px solid var(--border-light); }
127
+ .section-title {
128
+ font-size: 11px;
129
+ font-weight: 600;
130
+ text-transform: uppercase;
131
+ letter-spacing: 0.05em;
132
+ color: var(--text-faint);
133
+ padding: 12px 10px 6px;
134
+ }
135
+
136
+ .nav-item {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 10px;
140
+ padding: 9px 10px;
141
+ border: none;
142
+ background: none;
143
+ color: var(--text-dim);
144
+ border-radius: var(--radius-sm);
145
+ cursor: pointer;
146
+ font-size: 14px;
147
+ font-family: var(--font);
148
+ text-align: left;
149
+ width: 100%;
150
+ transition: all var(--transition);
151
+ }
152
+
153
+ .nav-item:hover { background: var(--bg-hover); color: var(--text); }
154
+ .nav-item.active { background: var(--primary-bg); color: var(--primary); font-weight: 600; }
155
+ .nav-item .icon { width: 18px; height: 18px; flex-shrink: 0; }
156
+ .nav-item span:not(.badge):not(.dot) { flex: 1; }
157
+
158
+ .badge {
159
+ display: inline-flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ min-width: 22px;
163
+ height: 20px;
164
+ padding: 0 6px;
165
+ background: var(--bg-hover);
166
+ color: var(--text-dim);
167
+ border-radius: 10px;
168
+ font-size: 11px;
169
+ font-weight: 600;
170
+ }
171
+
172
+ .dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
173
+ .dot-pending { background: var(--warning); }
174
+ .dot-done { background: var(--success); }
175
+ .dot-overdue { background: var(--danger); }
176
+ .dot-today { background: var(--info); }
177
+
178
+ .category-list { display: flex; flex-direction: column; gap: 2px; }
179
+
180
+ .sidebar-footer {
181
+ margin-top: auto;
182
+ padding: 12px 16px;
183
+ border-top: 1px solid var(--border-light);
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: space-between;
187
+ }
188
+
189
+ .version { font-size: 12px; color: var(--text-faint); font-family: var(--font-mono); }
190
+
191
+ /* ─── Main Content ───────────────────────────────────────────────────────── */
192
+
193
+ #main {
194
+ flex: 1;
195
+ display: flex;
196
+ flex-direction: column;
197
+ overflow: hidden;
198
+ min-width: 0;
199
+ }
200
+
201
+ #topbar {
202
+ display: flex;
203
+ align-items: center;
204
+ gap: 16px;
205
+ padding: 16px 24px;
206
+ border-bottom: 1px solid var(--border);
207
+ background: var(--bg-elevated);
208
+ flex-shrink: 0;
209
+ }
210
+
211
+ #page-title { font-size: 20px; font-weight: 700; flex: 1; }
212
+
213
+ .topbar-actions { display: flex; align-items: center; gap: 12px; }
214
+
215
+ .search-box {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 8px;
219
+ padding: 0 12px;
220
+ background: var(--bg-input);
221
+ border: 1px solid var(--border);
222
+ border-radius: var(--radius-sm);
223
+ height: 38px;
224
+ transition: border-color var(--transition);
225
+ }
226
+
227
+ .search-box:focus-within { border-color: var(--primary); }
228
+ .search-icon { width: 16px; height: 16px; color: var(--text-faint); }
229
+ #search-input {
230
+ border: none;
231
+ background: none;
232
+ color: var(--text);
233
+ font-size: 14px;
234
+ font-family: var(--font);
235
+ outline: none;
236
+ width: 200px;
237
+ }
238
+
239
+ #content { flex: 1; overflow-y: auto; padding: 24px; }
240
+
241
+ /* ─── Buttons ────────────────────────────────────────────────────────────── */
242
+
243
+ .btn {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ gap: 6px;
247
+ padding: 8px 16px;
248
+ border: none;
249
+ border-radius: var(--radius-sm);
250
+ font-size: 14px;
251
+ font-weight: 600;
252
+ font-family: var(--font);
253
+ cursor: pointer;
254
+ transition: all var(--transition);
255
+ white-space: nowrap;
256
+ }
257
+
258
+ .btn .icon { width: 16px; height: 16px; }
259
+
260
+ .btn-primary { background: var(--primary); color: white; }
261
+ .btn-primary:hover { background: var(--primary-hover); }
262
+
263
+ .btn-secondary { background: var(--bg-hover); color: var(--text); border: 1px solid var(--border); }
264
+ .btn-secondary:hover { background: var(--border); }
265
+
266
+ .btn-danger { background: var(--danger); color: white; }
267
+ .btn-danger:hover { filter: brightness(1.1); }
268
+
269
+ .btn-ghost { background: none; color: var(--text-dim); }
270
+ .btn-ghost:hover { background: var(--bg-hover); color: var(--text); }
271
+
272
+ .btn-sm { padding: 4px 10px; font-size: 12px; }
273
+
274
+ .icon-btn {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ justify-content: center;
278
+ width: 36px;
279
+ height: 36px;
280
+ border: none;
281
+ background: none;
282
+ color: var(--text-dim);
283
+ border-radius: var(--radius-sm);
284
+ cursor: pointer;
285
+ transition: all var(--transition);
286
+ }
287
+
288
+ .icon-btn:hover { background: var(--bg-hover); color: var(--text); }
289
+ .icon-btn .icon { width: 18px; height: 18px; }
290
+
291
+ /* ─── Dashboard ──────────────────────────────────────────────────────────── */
292
+
293
+ .stats-grid {
294
+ display: grid;
295
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
296
+ gap: 16px;
297
+ margin-bottom: 24px;
298
+ }
299
+
300
+ .stat-card {
301
+ background: var(--bg-elevated);
302
+ border: 1px solid var(--border);
303
+ border-radius: var(--radius);
304
+ padding: 20px;
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 16px;
308
+ transition: transform var(--transition), box-shadow var(--transition);
309
+ }
310
+
311
+ .stat-card:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
312
+
313
+ .stat-icon {
314
+ width: 48px;
315
+ height: 48px;
316
+ border-radius: var(--radius-sm);
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ font-size: 22px;
321
+ flex-shrink: 0;
322
+ }
323
+
324
+ .stat-icon.bg-primary { background: var(--primary-bg); color: var(--primary); }
325
+ .stat-icon.bg-success { background: var(--success-bg); color: var(--success); }
326
+ .stat-icon.bg-warning { background: var(--warning-bg); color: var(--warning); }
327
+ .stat-icon.bg-danger { background: var(--danger-bg); color: var(--danger); }
328
+ .stat-icon.bg-info { background: rgba(59,130,246,0.12); color: var(--info); }
329
+
330
+ .stat-info { flex: 1; }
331
+ .stat-value { font-size: 28px; font-weight: 700; line-height: 1; }
332
+ .stat-label { font-size: 13px; color: var(--text-dim); margin-top: 4px; }
333
+
334
+ .progress-bar {
335
+ height: 8px;
336
+ background: var(--bg-hover);
337
+ border-radius: 4px;
338
+ overflow: hidden;
339
+ margin-top: 8px;
340
+ }
341
+ .progress-fill {
342
+ height: 100%;
343
+ background: var(--primary);
344
+ border-radius: 4px;
345
+ transition: width 0.4s ease;
346
+ }
347
+
348
+ /* ─── Todo List View ─────────────────────────────────────────────────────── */
349
+
350
+ .filter-bar {
351
+ display: flex;
352
+ align-items: center;
353
+ gap: 8px;
354
+ margin-bottom: 16px;
355
+ flex-wrap: wrap;
356
+ }
357
+
358
+ .filter-chip {
359
+ display: inline-flex;
360
+ align-items: center;
361
+ gap: 4px;
362
+ padding: 5px 12px;
363
+ background: var(--bg-elevated);
364
+ border: 1px solid var(--border);
365
+ border-radius: 20px;
366
+ font-size: 13px;
367
+ cursor: pointer;
368
+ color: var(--text-dim);
369
+ transition: all var(--transition);
370
+ }
371
+
372
+ .filter-chip:hover { border-color: var(--primary); color: var(--text); }
373
+ .filter-chip.active { background: var(--primary-bg); border-color: var(--primary); color: var(--primary); }
374
+
375
+ .todo-list { display: flex; flex-direction: column; gap: 8px; }
376
+
377
+ .todo-item {
378
+ background: var(--bg-elevated);
379
+ border: 1px solid var(--border);
380
+ border-radius: var(--radius);
381
+ padding: 14px 16px;
382
+ display: flex;
383
+ align-items: flex-start;
384
+ gap: 12px;
385
+ transition: all var(--transition);
386
+ cursor: pointer;
387
+ }
388
+
389
+ .todo-item:hover { border-color: var(--primary); box-shadow: var(--shadow-sm); }
390
+ .todo-item.done { opacity: 0.6; }
391
+ .todo-item.pinned { border-left: 3px solid var(--primary); }
392
+
393
+ .todo-checkbox {
394
+ width: 20px;
395
+ height: 20px;
396
+ border: 2px solid var(--border);
397
+ border-radius: 6px;
398
+ cursor: pointer;
399
+ flex-shrink: 0;
400
+ margin-top: 2px;
401
+ display: flex;
402
+ align-items: center;
403
+ justify-content: center;
404
+ transition: all var(--transition);
405
+ }
406
+
407
+ .todo-checkbox:hover { border-color: var(--primary); }
408
+ .todo-checkbox.checked { background: var(--success); border-color: var(--success); color: white; }
409
+ .todo-checkbox.checked::after { content: "✓"; font-size: 14px; font-weight: 700; }
410
+
411
+ .todo-content { flex: 1; min-width: 0; }
412
+ .todo-title { font-size: 15px; font-weight: 500; }
413
+ .todo-item.done .todo-title { text-decoration: line-through; color: var(--text-dim); }
414
+
415
+ .todo-meta {
416
+ display: flex;
417
+ align-items: center;
418
+ gap: 8px;
419
+ margin-top: 6px;
420
+ flex-wrap: wrap;
421
+ }
422
+
423
+ .tag {
424
+ display: inline-flex;
425
+ align-items: center;
426
+ padding: 2px 8px;
427
+ background: var(--primary-bg);
428
+ color: var(--primary);
429
+ border-radius: 10px;
430
+ font-size: 11px;
431
+ font-weight: 600;
432
+ }
433
+
434
+ .priority-badge {
435
+ display: inline-flex;
436
+ align-items: center;
437
+ gap: 4px;
438
+ padding: 2px 8px;
439
+ border-radius: 10px;
440
+ font-size: 11px;
441
+ font-weight: 600;
442
+ }
443
+
444
+ .priority-high { background: var(--danger-bg); color: var(--danger); }
445
+ .priority-medium { background: var(--warning-bg); color: var(--warning); }
446
+ .priority-low { background: var(--success-bg); color: var(--success); }
447
+
448
+ .meta-item { font-size: 12px; color: var(--text-dim); display: inline-flex; align-items: center; gap: 3px; }
449
+ .meta-item.overdue { color: var(--danger); font-weight: 600; }
450
+ .meta-item.due-today { color: var(--warning); font-weight: 600; }
451
+
452
+ .todo-actions { display: flex; align-items: center; gap: 4px; flex-shrink: 0; opacity: 0; transition: opacity var(--transition); }
453
+ .todo-item:hover .todo-actions { opacity: 1; }
454
+
455
+ .todo-subtask-bar {
456
+ margin-top: 8px;
457
+ height: 4px;
458
+ background: var(--bg-hover);
459
+ border-radius: 2px;
460
+ overflow: hidden;
461
+ }
462
+ .todo-subtask-fill { height: 100%; background: var(--success); border-radius: 2px; transition: width 0.3s ease; }
463
+
464
+ /* ─── Kanban Board ───────────────────────────────────────────────────────── */
465
+
466
+ .kanban-board {
467
+ display: flex;
468
+ gap: 16px;
469
+ overflow-x: auto;
470
+ padding-bottom: 16px;
471
+ min-height: 400px;
472
+ }
473
+
474
+ .kanban-column {
475
+ flex: 1;
476
+ min-width: 280px;
477
+ background: var(--bg-elevated);
478
+ border: 1px solid var(--border);
479
+ border-radius: var(--radius);
480
+ display: flex;
481
+ flex-direction: column;
482
+ }
483
+
484
+ .kanban-column-header {
485
+ padding: 14px 16px;
486
+ border-bottom: 1px solid var(--border);
487
+ display: flex;
488
+ align-items: center;
489
+ justify-content: space-between;
490
+ font-weight: 600;
491
+ }
492
+
493
+ .kanban-column-body {
494
+ padding: 12px;
495
+ display: flex;
496
+ flex-direction: column;
497
+ gap: 8px;
498
+ overflow-y: auto;
499
+ flex: 1;
500
+ }
501
+
502
+ .kanban-card {
503
+ background: var(--bg);
504
+ border: 1px solid var(--border);
505
+ border-radius: var(--radius-sm);
506
+ padding: 12px;
507
+ cursor: grab;
508
+ transition: all var(--transition);
509
+ }
510
+
511
+ .kanban-card:hover { border-color: var(--primary); box-shadow: var(--shadow-sm); }
512
+ .kanban-card.dragging { opacity: 0.5; }
513
+ .kanban-card.drag-over { border-color: var(--primary); border-style: dashed; }
514
+
515
+ /* ─── Calendar View ──────────────────────────────────────────────────────── */
516
+
517
+ .calendar-header {
518
+ display: flex;
519
+ align-items: center;
520
+ justify-content: space-between;
521
+ margin-bottom: 16px;
522
+ }
523
+
524
+ .calendar-grid {
525
+ display: grid;
526
+ grid-template-columns: repeat(7, 1fr);
527
+ gap: 6px;
528
+ }
529
+
530
+ .calendar-day-header {
531
+ text-align: center;
532
+ font-size: 12px;
533
+ font-weight: 600;
534
+ color: var(--text-dim);
535
+ padding: 8px 0;
536
+ }
537
+
538
+ .calendar-day {
539
+ background: var(--bg-elevated);
540
+ border: 1px solid var(--border);
541
+ border-radius: var(--radius-sm);
542
+ min-height: 90px;
543
+ padding: 6px;
544
+ display: flex;
545
+ flex-direction: column;
546
+ gap: 4px;
547
+ }
548
+
549
+ .calendar-day.empty { background: none; border: none; }
550
+ .calendar-day.today { border-color: var(--primary); border-width: 2px; }
551
+ .calendar-day.other-month { opacity: 0.4; }
552
+
553
+ .calendar-day-num { font-size: 13px; font-weight: 600; color: var(--text-dim); }
554
+ .calendar-day.today .calendar-day-num { color: var(--primary); }
555
+
556
+ .calendar-event {
557
+ font-size: 11px;
558
+ padding: 2px 6px;
559
+ background: var(--primary-bg);
560
+ color: var(--primary);
561
+ border-radius: 4px;
562
+ cursor: pointer;
563
+ overflow: hidden;
564
+ text-overflow: ellipsis;
565
+ white-space: nowrap;
566
+ }
567
+
568
+ .calendar-event.high { background: var(--danger-bg); color: var(--danger); }
569
+ .calendar-event.medium { background: var(--warning-bg); color: var(--warning); }
570
+ .calendar-event.low { background: var(--success-bg); color: var(--success); }
571
+ .calendar-event.done { text-decoration: line-through; opacity: 0.6; }
572
+
573
+ /* ─── Timeline View ──────────────────────────────────────────────────────── */
574
+
575
+ .timeline { display: flex; flex-direction: column; gap: 0; }
576
+ .timeline-item { display: flex; gap: 16px; position: relative; padding-bottom: 24px; }
577
+ .timeline-line { width: 2px; background: var(--border); position: absolute; left: 15px; top: 32px; bottom: 0; }
578
+ .timeline-item:last-child .timeline-line { display: none; }
579
+ .timeline-dot {
580
+ width: 32px; height: 32px; border-radius: 50%;
581
+ display: flex; align-items: center; justify-content: center;
582
+ flex-shrink: 0; z-index: 1; font-size: 14px;
583
+ }
584
+ .timeline-content { flex: 1; background: var(--bg-elevated); border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 16px; }
585
+
586
+ /* ─── Modal ──────────────────────────────────────────────────────────────── */
587
+
588
+ .modal-overlay {
589
+ position: fixed;
590
+ inset: 0;
591
+ background: rgba(0, 0, 0, 0.5);
592
+ display: flex;
593
+ align-items: center;
594
+ justify-content: center;
595
+ z-index: 1000;
596
+ backdrop-filter: blur(4px);
597
+ }
598
+
599
+ .modal-overlay.hidden { display: none; }
600
+
601
+ .modal {
602
+ background: var(--bg-elevated);
603
+ border-radius: var(--radius);
604
+ width: 90%;
605
+ max-width: 560px;
606
+ max-height: 90vh;
607
+ overflow-y: auto;
608
+ box-shadow: var(--shadow);
609
+ }
610
+
611
+ .modal-lg { max-width: 720px; }
612
+
613
+ .modal-header {
614
+ display: flex;
615
+ align-items: center;
616
+ justify-content: space-between;
617
+ padding: 18px 24px;
618
+ border-bottom: 1px solid var(--border);
619
+ position: sticky;
620
+ top: 0;
621
+ background: var(--bg-elevated);
622
+ z-index: 1;
623
+ }
624
+
625
+ .modal-header h2 { font-size: 18px; font-weight: 700; }
626
+ .modal-body { padding: 24px; }
627
+ .modal-footer {
628
+ display: flex;
629
+ justify-content: flex-end;
630
+ gap: 10px;
631
+ margin-top: 20px;
632
+ padding-top: 16px;
633
+ border-top: 1px solid var(--border);
634
+ }
635
+ .modal-footer .btn-danger { margin-right: auto; }
636
+
637
+ /* ─── Forms ──────────────────────────────────────────────────────────────── */
638
+
639
+ .form-group { margin-bottom: 16px; }
640
+ .form-row { display: flex; gap: 16px; }
641
+ .form-row .form-group { flex: 1; }
642
+
643
+ .form-group label {
644
+ display: block;
645
+ font-size: 13px;
646
+ font-weight: 600;
647
+ margin-bottom: 6px;
648
+ color: var(--text-dim);
649
+ }
650
+
651
+ .required { color: var(--danger); }
652
+
653
+ .form-group input,
654
+ .form-group select,
655
+ .form-group textarea {
656
+ width: 100%;
657
+ padding: 9px 12px;
658
+ border: 1px solid var(--border);
659
+ border-radius: var(--radius-sm);
660
+ background: var(--bg-input);
661
+ color: var(--text);
662
+ font-size: 14px;
663
+ font-family: var(--font);
664
+ outline: none;
665
+ transition: border-color var(--transition);
666
+ }
667
+
668
+ .form-group input:focus,
669
+ .form-group select:focus,
670
+ .form-group textarea:focus { border-color: var(--primary); }
671
+ .form-group textarea { resize: vertical; min-height: 60px; }
672
+
673
+ .form-check { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; }
674
+ .form-check input { width: 18px; height: 18px; accent-color: var(--primary); }
675
+ .form-check label { margin: 0; font-size: 14px; }
676
+
677
+ /* ─── Detail View ────────────────────────────────────────────────────────── */
678
+
679
+ .detail-section { margin-bottom: 20px; }
680
+ .detail-section-title {
681
+ font-size: 12px;
682
+ font-weight: 600;
683
+ text-transform: uppercase;
684
+ letter-spacing: 0.05em;
685
+ color: var(--text-faint);
686
+ margin-bottom: 8px;
687
+ }
688
+
689
+ .detail-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
690
+ .detail-label { color: var(--text-dim); min-width: 100px; font-size: 13px; }
691
+ .detail-value { font-size: 14px; }
692
+
693
+ .subtask-item {
694
+ display: flex;
695
+ align-items: center;
696
+ gap: 8px;
697
+ padding: 8px 12px;
698
+ background: var(--bg);
699
+ border: 1px solid var(--border);
700
+ border-radius: var(--radius-sm);
701
+ margin-bottom: 6px;
702
+ }
703
+
704
+ .subtask-checkbox {
705
+ width: 18px; height: 18px;
706
+ border: 2px solid var(--border);
707
+ border-radius: 5px;
708
+ cursor: pointer;
709
+ display: flex; align-items: center; justify-content: center;
710
+ flex-shrink: 0;
711
+ transition: all var(--transition);
712
+ }
713
+ .subtask-checkbox.checked { background: var(--success); border-color: var(--success); color: white; }
714
+ .subtask-checkbox.checked::after { content: "✓"; font-size: 12px; font-weight: 700; }
715
+
716
+ .subtask-title { flex: 1; font-size: 13px; }
717
+ .subtask-item.done .subtask-title { text-decoration: line-through; color: var(--text-dim); }
718
+
719
+ /* ─── Toast ──────────────────────────────────────────────────────────────── */
720
+
721
+ #toast-container {
722
+ position: fixed;
723
+ bottom: 24px;
724
+ right: 24px;
725
+ z-index: 2000;
726
+ display: flex;
727
+ flex-direction: column;
728
+ gap: 8px;
729
+ }
730
+
731
+ .toast {
732
+ background: var(--bg-elevated);
733
+ border: 1px solid var(--border);
734
+ border-radius: var(--radius-sm);
735
+ padding: 12px 20px;
736
+ box-shadow: var(--shadow);
737
+ font-size: 14px;
738
+ display: flex;
739
+ align-items: center;
740
+ gap: 8px;
741
+ animation: slideIn 0.3s ease;
742
+ max-width: 360px;
743
+ }
744
+
745
+ .toast.success { border-left: 3px solid var(--success); }
746
+ .toast.error { border-left: 3px solid var(--danger); }
747
+ .toast.info { border-left: 3px solid var(--info); }
748
+
749
+ @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
750
+
751
+ /* ─── Floating Timer ─────────────────────────────────────────────────────── */
752
+
753
+ .floating-timer {
754
+ position: fixed;
755
+ bottom: 24px;
756
+ left: 50%;
757
+ transform: translateX(-50%);
758
+ background: var(--bg-elevated);
759
+ border: 1px solid var(--border);
760
+ border-radius: 24px;
761
+ padding: 8px 20px;
762
+ display: flex;
763
+ align-items: center;
764
+ gap: 12px;
765
+ box-shadow: var(--shadow);
766
+ z-index: 500;
767
+ }
768
+
769
+ .floating-timer.hidden { display: none; }
770
+ .timer-icon { font-size: 18px; }
771
+ #timer-time { font-family: var(--font-mono); font-weight: 700; font-size: 16px; color: var(--success); }
772
+ #timer-label { font-size: 13px; color: var(--text-dim); max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
773
+
774
+ /* ─── Empty State ────────────────────────────────────────────────────────── */
775
+
776
+ .empty-state {
777
+ text-align: center;
778
+ padding: 60px 20px;
779
+ color: var(--text-faint);
780
+ }
781
+ .empty-state-icon { font-size: 48px; margin-bottom: 16px; }
782
+ .empty-state-text { font-size: 16px; }
783
+
784
+ /* ─── Responsive ─────────────────────────────────────────────────────────── */
785
+
786
+ .mobile-only { display: none; }
787
+
788
+ @media (max-width: 768px) {
789
+ .mobile-only { display: inline-flex; }
790
+ #sidebar {
791
+ position: fixed;
792
+ top: 0; left: 0; bottom: 0;
793
+ transform: translateX(-100%);
794
+ box-shadow: var(--shadow);
795
+ }
796
+ #sidebar.open { transform: translateX(0); }
797
+ #search-input { width: 120px; }
798
+ .topbar-actions .btn span { display: none; }
799
+ .form-row { flex-direction: column; }
800
+ .stats-grid { grid-template-columns: 1fr 1fr; }
801
+ .calendar-grid { gap: 2px; }
802
+ .calendar-day { min-height: 60px; }
803
+ #content { padding: 16px; }
804
+ }