elspais 0.9.1__py3-none-any.whl → 0.11.0__py3-none-any.whl

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 (75) hide show
  1. elspais/cli.py +123 -1
  2. elspais/commands/changed.py +160 -0
  3. elspais/commands/hash_cmd.py +72 -26
  4. elspais/commands/reformat_cmd.py +458 -0
  5. elspais/commands/trace.py +157 -3
  6. elspais/commands/validate.py +81 -18
  7. elspais/core/git.py +352 -0
  8. elspais/core/models.py +2 -0
  9. elspais/core/parser.py +68 -24
  10. elspais/reformat/__init__.py +50 -0
  11. elspais/reformat/detector.py +119 -0
  12. elspais/reformat/hierarchy.py +246 -0
  13. elspais/reformat/line_breaks.py +220 -0
  14. elspais/reformat/prompts.py +123 -0
  15. elspais/reformat/transformer.py +264 -0
  16. elspais/sponsors/__init__.py +432 -0
  17. elspais/trace_view/__init__.py +54 -0
  18. elspais/trace_view/coverage.py +183 -0
  19. elspais/trace_view/generators/__init__.py +12 -0
  20. elspais/trace_view/generators/base.py +329 -0
  21. elspais/trace_view/generators/csv.py +122 -0
  22. elspais/trace_view/generators/markdown.py +175 -0
  23. elspais/trace_view/html/__init__.py +31 -0
  24. elspais/trace_view/html/generator.py +1006 -0
  25. elspais/trace_view/html/templates/base.html +283 -0
  26. elspais/trace_view/html/templates/components/code_viewer_modal.html +14 -0
  27. elspais/trace_view/html/templates/components/file_picker_modal.html +20 -0
  28. elspais/trace_view/html/templates/components/legend_modal.html +69 -0
  29. elspais/trace_view/html/templates/components/review_panel.html +118 -0
  30. elspais/trace_view/html/templates/partials/review/help/help-panel.json +244 -0
  31. elspais/trace_view/html/templates/partials/review/help/onboarding.json +77 -0
  32. elspais/trace_view/html/templates/partials/review/help/tooltips.json +237 -0
  33. elspais/trace_view/html/templates/partials/review/review-comments.js +928 -0
  34. elspais/trace_view/html/templates/partials/review/review-data.js +961 -0
  35. elspais/trace_view/html/templates/partials/review/review-help.js +679 -0
  36. elspais/trace_view/html/templates/partials/review/review-init.js +177 -0
  37. elspais/trace_view/html/templates/partials/review/review-line-numbers.js +429 -0
  38. elspais/trace_view/html/templates/partials/review/review-packages.js +1029 -0
  39. elspais/trace_view/html/templates/partials/review/review-position.js +540 -0
  40. elspais/trace_view/html/templates/partials/review/review-resize.js +115 -0
  41. elspais/trace_view/html/templates/partials/review/review-status.js +659 -0
  42. elspais/trace_view/html/templates/partials/review/review-sync.js +992 -0
  43. elspais/trace_view/html/templates/partials/review-styles.css +2238 -0
  44. elspais/trace_view/html/templates/partials/scripts.js +1741 -0
  45. elspais/trace_view/html/templates/partials/styles.css +1756 -0
  46. elspais/trace_view/models.py +353 -0
  47. elspais/trace_view/review/__init__.py +60 -0
  48. elspais/trace_view/review/branches.py +1149 -0
  49. elspais/trace_view/review/models.py +1205 -0
  50. elspais/trace_view/review/position.py +609 -0
  51. elspais/trace_view/review/server.py +1056 -0
  52. elspais/trace_view/review/status.py +470 -0
  53. elspais/trace_view/review/storage.py +1367 -0
  54. elspais/trace_view/scanning.py +213 -0
  55. elspais/trace_view/specs/README.md +84 -0
  56. elspais/trace_view/specs/tv-d00001-template-architecture.md +36 -0
  57. elspais/trace_view/specs/tv-d00002-css-extraction.md +37 -0
  58. elspais/trace_view/specs/tv-d00003-js-extraction.md +43 -0
  59. elspais/trace_view/specs/tv-d00004-build-embedding.md +40 -0
  60. elspais/trace_view/specs/tv-d00005-test-format.md +78 -0
  61. elspais/trace_view/specs/tv-d00010-review-data-models.md +33 -0
  62. elspais/trace_view/specs/tv-d00011-review-storage.md +33 -0
  63. elspais/trace_view/specs/tv-d00012-position-resolution.md +33 -0
  64. elspais/trace_view/specs/tv-d00013-git-branches.md +31 -0
  65. elspais/trace_view/specs/tv-d00014-review-api-server.md +31 -0
  66. elspais/trace_view/specs/tv-d00015-status-modifier.md +27 -0
  67. elspais/trace_view/specs/tv-d00016-js-integration.md +33 -0
  68. elspais/trace_view/specs/tv-p00001-html-generator.md +33 -0
  69. elspais/trace_view/specs/tv-p00002-review-system.md +29 -0
  70. {elspais-0.9.1.dist-info → elspais-0.11.0.dist-info}/METADATA +78 -26
  71. elspais-0.11.0.dist-info/RECORD +101 -0
  72. elspais-0.9.1.dist-info/RECORD +0 -38
  73. {elspais-0.9.1.dist-info → elspais-0.11.0.dist-info}/WHEEL +0 -0
  74. {elspais-0.9.1.dist-info → elspais-0.11.0.dist-info}/entry_points.txt +0 -0
  75. {elspais-0.9.1.dist-info → elspais-0.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1756 @@
1
+ /**
2
+ * TraceView Interactive Traceability Matrix Styles
3
+ *
4
+ * This stylesheet contains all CSS for the trace-view HTML report.
5
+ * Organized by component for maintainability.
6
+ *
7
+ * IMPLEMENTS REQUIREMENTS:
8
+ * REQ-tv-d00002: CSS Extraction
9
+ */
10
+
11
+ /* ==========================================================================
12
+ Base Layout
13
+ ========================================================================== */
14
+
15
+ body {
16
+ font-family: 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
17
+ font-size: 13px;
18
+ line-height: 1.4;
19
+ margin: 0;
20
+ padding: 0;
21
+ background: #f8f9fa;
22
+ height: 100vh;
23
+ overflow: hidden;
24
+ }
25
+
26
+ .app-layout {
27
+ display: flex;
28
+ height: 100vh;
29
+ overflow: hidden;
30
+ }
31
+
32
+ .main-content {
33
+ flex: 1;
34
+ overflow-y: auto;
35
+ padding: 15px;
36
+ min-width: 0;
37
+ }
38
+
39
+ .container {
40
+ max-width: 1400px;
41
+ margin: 0 auto;
42
+ background: white;
43
+ padding: 20px;
44
+ border-radius: 6px;
45
+ box-shadow: 0 1px 3px rgba(0,0,0,0.08);
46
+ }
47
+
48
+ /* ==========================================================================
49
+ Typography
50
+ ========================================================================== */
51
+
52
+ h1 {
53
+ font-size: 20px;
54
+ font-weight: 600;
55
+ color: #2c3e50;
56
+ border-bottom: 2px solid #0066cc;
57
+ padding-bottom: 8px;
58
+ margin: 0 0 15px 0;
59
+ }
60
+
61
+ h2 {
62
+ font-size: 16px;
63
+ font-weight: 600;
64
+ color: #34495e;
65
+ margin: 20px 0 10px 0;
66
+ }
67
+
68
+ /* ==========================================================================
69
+ Title Bar
70
+ ========================================================================== */
71
+
72
+ .title-bar {
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 20px;
76
+ padding: 10px 0;
77
+ border-bottom: 2px solid #0066cc;
78
+ margin-bottom: 10px;
79
+ }
80
+
81
+ .title-bar h1 {
82
+ font-size: 18px;
83
+ font-weight: 600;
84
+ color: #2c3e50;
85
+ margin: 0;
86
+ border: none;
87
+ padding: 0;
88
+ }
89
+
90
+ .version-badge {
91
+ font-size: 10px;
92
+ color: #6c757d;
93
+ background: #e9ecef;
94
+ padding: 2px 6px;
95
+ border-radius: 3px;
96
+ font-family: monospace;
97
+ }
98
+
99
+ .stats-badges {
100
+ display: flex;
101
+ gap: 10px;
102
+ margin-right: auto;
103
+ }
104
+
105
+ .stat-badge {
106
+ padding: 4px 10px;
107
+ border-radius: 4px;
108
+ font-size: 12px;
109
+ font-weight: 600;
110
+ color: white;
111
+ }
112
+
113
+ .stat-badge.prd { background: #0066cc; }
114
+ .stat-badge.ops { background: #fd7e14; }
115
+ .stat-badge.dev { background: #28a745; }
116
+
117
+ /* Clickable stat badges */
118
+ .stat-badge {
119
+ cursor: pointer;
120
+ transition: transform 0.1s, box-shadow 0.1s, opacity 0.1s;
121
+ }
122
+
123
+ .stat-badge:hover {
124
+ transform: scale(1.05);
125
+ box-shadow: 0 2px 6px rgba(0,0,0,0.25);
126
+ }
127
+
128
+ .stat-badge.active {
129
+ box-shadow: inset 0 2px 4px rgba(0,0,0,0.3);
130
+ transform: scale(0.98);
131
+ }
132
+
133
+ /* Hidden state for toggle filters - hollow button (visible through) */
134
+ .stat-badge.filter-hidden {
135
+ background: transparent !important;
136
+ border: 2px solid currentColor;
137
+ color: #6c757d;
138
+ }
139
+
140
+ .stat-badge.prd.filter-hidden { border-color: #0066cc; color: #0066cc; }
141
+ .stat-badge.ops.filter-hidden { border-color: #fd7e14; color: #fd7e14; }
142
+ .stat-badge.dev.filter-hidden { border-color: #28a745; color: #28a745; }
143
+ .stat-badge.repo-badge.filter-hidden { border-color: #6c757d; color: #6c757d; }
144
+
145
+ /* Repo badges (CORE, CAL, TTN, etc.) - default purple */
146
+ .stat-badge.repo-badge {
147
+ background: #6f42c1;
148
+ }
149
+
150
+ .stat-badge-separator {
151
+ color: #6c757d;
152
+ font-weight: bold;
153
+ display: flex;
154
+ align-items: center;
155
+ }
156
+
157
+ /* Files badge - teal color for implementation files */
158
+ .stat-badge.files-badge {
159
+ background: #20c997;
160
+ }
161
+
162
+ .stat-badge.files-badge.filter-hidden {
163
+ border-color: #20c997;
164
+ color: #20c997;
165
+ }
166
+
167
+ /* ==========================================================================
168
+ Buttons
169
+ ========================================================================== */
170
+
171
+ .btn {
172
+ padding: 6px 12px;
173
+ border: none;
174
+ border-radius: 3px;
175
+ background: #0066cc;
176
+ color: white;
177
+ cursor: pointer;
178
+ font-size: 12px;
179
+ font-weight: 500;
180
+ transition: background 0.15s;
181
+ }
182
+
183
+ .btn:hover {
184
+ background: #0052a3;
185
+ }
186
+
187
+ .btn-secondary {
188
+ background: #6c757d;
189
+ }
190
+
191
+ .btn-secondary:hover {
192
+ background: #5a6268;
193
+ }
194
+
195
+ .btn-secondary.active {
196
+ background: #0066cc;
197
+ }
198
+
199
+ .btn-secondary.active:hover {
200
+ background: #0052a3;
201
+ }
202
+
203
+ .btn-legend {
204
+ background: #6c757d;
205
+ font-size: 12px;
206
+ }
207
+
208
+ .btn-legend:hover {
209
+ background: #5a6268;
210
+ }
211
+
212
+ /* Toggle buttons */
213
+ .toggle-btn {
214
+ background: white;
215
+ color: #495057;
216
+ border: 1px solid #28a745;
217
+ }
218
+
219
+ .toggle-btn:hover {
220
+ background: #e8f5e9;
221
+ }
222
+
223
+ .toggle-btn.active {
224
+ background: #28a745;
225
+ color: white;
226
+ border: 1px solid #28a745;
227
+ }
228
+
229
+ /* Edit Mode button - blue theme */
230
+ #btnEditMode {
231
+ border: 1px solid #007bff;
232
+ }
233
+
234
+ #btnEditMode:hover {
235
+ background: #e3f2fd;
236
+ }
237
+
238
+ #btnEditMode.active {
239
+ background: #007bff;
240
+ color: white;
241
+ border: 1px solid #007bff;
242
+ }
243
+
244
+ /* ==========================================================================
245
+ Controls & Filters
246
+ ========================================================================== */
247
+
248
+ .controls {
249
+ margin: 15px 0;
250
+ padding: 10px;
251
+ background: #e9ecef;
252
+ border-radius: 4px;
253
+ display: flex;
254
+ gap: 8px;
255
+ align-items: center;
256
+ }
257
+
258
+ .filter-controls {
259
+ margin: 15px 0;
260
+ padding: 10px;
261
+ background: #f8f9fa;
262
+ border-radius: 4px;
263
+ display: flex;
264
+ gap: 10px;
265
+ align-items: center;
266
+ }
267
+
268
+ .filter-stats {
269
+ margin-left: auto;
270
+ font-size: 11px;
271
+ color: #6c757d;
272
+ font-weight: 500;
273
+ }
274
+
275
+ .checkbox-label {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 4px;
279
+ font-size: 12px;
280
+ color: #495057;
281
+ cursor: pointer;
282
+ padding: 6px 10px;
283
+ background: #e9ecef;
284
+ border-radius: 3px;
285
+ }
286
+
287
+ .checkbox-label:hover {
288
+ background: #dee2e6;
289
+ }
290
+
291
+ .checkbox-label input {
292
+ cursor: pointer;
293
+ }
294
+
295
+ /* View Toggle */
296
+ .view-toggle {
297
+ display: flex;
298
+ gap: 0;
299
+ margin-right: 15px;
300
+ border-radius: 4px;
301
+ overflow: hidden;
302
+ }
303
+
304
+ .view-btn {
305
+ border-radius: 0;
306
+ border: 1px solid #0066cc;
307
+ background: white;
308
+ color: #0066cc;
309
+ }
310
+
311
+ .view-btn:first-child {
312
+ border-radius: 4px 0 0 4px;
313
+ }
314
+
315
+ .view-btn:last-child {
316
+ border-radius: 0 4px 4px 0;
317
+ border-left: none;
318
+ }
319
+
320
+ .view-btn.active {
321
+ background: #0066cc;
322
+ color: white;
323
+ }
324
+
325
+ .view-btn:hover:not(.active) {
326
+ background: #e6f0ff;
327
+ }
328
+
329
+ /* Filter Header */
330
+ .filter-header {
331
+ display: grid;
332
+ grid-template-columns: 110px minmax(100px, 1fr) 45px 90px 35px 50px 180px 110px;
333
+ align-items: center;
334
+ gap: 6px;
335
+ padding: 8px 10px 8px 42px;
336
+ background: #e9ecef;
337
+ border-bottom: 2px solid #dee2e6;
338
+ margin-bottom: 8px;
339
+ position: sticky;
340
+ top: 0;
341
+ z-index: 10;
342
+ min-width: 700px;
343
+ }
344
+
345
+ .filter-column {
346
+ display: flex;
347
+ flex-direction: column;
348
+ gap: 4px;
349
+ }
350
+
351
+ .filter-column-multi .filter-row {
352
+ display: flex;
353
+ gap: 4px;
354
+ }
355
+
356
+ .filter-column-multi .filter-row select {
357
+ flex: 1;
358
+ min-width: 0;
359
+ }
360
+
361
+ .filter-label {
362
+ font-size: 10px;
363
+ font-weight: 600;
364
+ color: #495057;
365
+ text-transform: uppercase;
366
+ letter-spacing: 0.5px;
367
+ }
368
+
369
+ .filter-column input, .filter-column select {
370
+ padding: 3px 6px;
371
+ border: 1px solid #ced4da;
372
+ border-radius: 2px;
373
+ font-size: 11px;
374
+ background: white;
375
+ width: 100%;
376
+ box-sizing: border-box;
377
+ }
378
+
379
+ .filter-column input::placeholder {
380
+ color: #adb5bd;
381
+ font-size: 10px;
382
+ }
383
+
384
+ /* ==========================================================================
385
+ Requirement Tree
386
+ ========================================================================== */
387
+
388
+ .req-tree {
389
+ margin: 15px 0;
390
+ overflow-x: auto;
391
+ }
392
+
393
+ .req-item {
394
+ margin: 2px 0;
395
+ background: #ffffff;
396
+ border-left: 3px solid #28a745;
397
+ overflow: hidden;
398
+ }
399
+
400
+ .req-item.prd { border-left-color: #0066cc; }
401
+ .req-item.ops { border-left-color: #fd7e14; }
402
+ .req-item.dev { border-left-color: #28a745; }
403
+ .req-item.deprecated { opacity: 0.6; }
404
+
405
+ .req-header-container {
406
+ padding: 6px 10px;
407
+ cursor: pointer;
408
+ user-select: none;
409
+ display: flex;
410
+ align-items: center;
411
+ gap: 8px;
412
+ }
413
+
414
+ .req-header-container:hover {
415
+ background: #f8f9fa;
416
+ }
417
+
418
+ /* Indentation based on hierarchy level */
419
+ .req-item[data-indent="0"] .req-header-container { padding-left: 10px; }
420
+ .req-item[data-indent="1"] .req-header-container { padding-left: 30px; }
421
+ .req-item[data-indent="2"] .req-header-container { padding-left: 50px; }
422
+ .req-item[data-indent="3"] .req-header-container { padding-left: 70px; }
423
+ .req-item[data-indent="4"] .req-header-container { padding-left: 90px; }
424
+ .req-item[data-indent="5"] .req-header-container { padding-left: 110px; }
425
+ .req-item[data-indent="6"] .req-header-container,
426
+ .req-item[data-indent="7"] .req-header-container,
427
+ .req-item[data-indent="8"] .req-header-container,
428
+ .req-item[data-indent="9"] .req-header-container { padding-left: 110px; }
429
+
430
+ .collapse-icon {
431
+ font-size: 10px;
432
+ color: #6c757d;
433
+ transition: transform 0.15s;
434
+ flex-shrink: 0;
435
+ width: 12px;
436
+ text-align: center;
437
+ }
438
+
439
+ .collapse-icon.collapsed {
440
+ transform: rotate(-90deg);
441
+ }
442
+
443
+ .req-content {
444
+ flex: 1;
445
+ display: grid;
446
+ grid-template-columns: 110px minmax(100px, 1fr) 45px 90px 35px 50px 180px 110px;
447
+ align-items: start;
448
+ gap: 6px;
449
+ min-width: 700px;
450
+ }
451
+
452
+ .req-id {
453
+ font-weight: 600;
454
+ color: #0066cc;
455
+ font-size: 12px;
456
+ font-family: 'Consolas', 'Monaco', monospace;
457
+ flex-shrink: 0;
458
+ }
459
+
460
+ /* Conflict marker (asterisk) for conflicting requirements */
461
+ .conflict-marker {
462
+ color: #dc3545;
463
+ font-weight: bold;
464
+ font-size: 14px;
465
+ margin-left: 1px;
466
+ }
467
+
468
+ .req-header {
469
+ font-weight: 500;
470
+ color: #2c3e50;
471
+ font-size: 13px;
472
+ /* Allow titles to wrap on narrow windows */
473
+ word-wrap: break-word;
474
+ overflow-wrap: break-word;
475
+ min-width: 0;
476
+ }
477
+
478
+ .req-level {
479
+ font-size: 11px;
480
+ color: #7f8c8d;
481
+ text-align: center;
482
+ }
483
+
484
+ .req-badges {
485
+ display: flex;
486
+ gap: 4px;
487
+ align-items: center;
488
+ }
489
+
490
+ .req-status {
491
+ font-size: 11px;
492
+ color: #7f8c8d;
493
+ text-align: center;
494
+ }
495
+
496
+ .req-location {
497
+ font-size: 11px;
498
+ color: #7f8c8d;
499
+ overflow: hidden;
500
+ text-overflow: ellipsis;
501
+ white-space: nowrap;
502
+ }
503
+
504
+ .req-coverage {
505
+ min-width: 30px;
506
+ max-width: 40px;
507
+ text-align: center;
508
+ font-size: 14px;
509
+ }
510
+
511
+ /* Implementation files */
512
+ .req-item.impl-file {
513
+ border-left: 3px solid #6c757d;
514
+ background: #f8f9fa;
515
+ }
516
+
517
+ .req-item.impl-file .req-header-container {
518
+ cursor: default;
519
+ }
520
+
521
+ .req-item.impl-file .req-header-container:hover {
522
+ background: #f0f0f0;
523
+ }
524
+
525
+ /* Collapsed items */
526
+ .req-item.collapsed-by-parent {
527
+ display: none;
528
+ }
529
+
530
+ /* View modes */
531
+ .req-tree.flat-view .req-item .req-header-container {
532
+ padding-left: 10px !important;
533
+ }
534
+
535
+ .req-tree.hierarchy-view .req-item:not([data-is-root="true"]) {
536
+ display: none;
537
+ }
538
+
539
+ .req-tree.hierarchy-view .req-item[data-is-root="true"] {
540
+ display: block;
541
+ }
542
+
543
+ .req-tree.hierarchy-view .req-item.hierarchy-visible {
544
+ display: block;
545
+ }
546
+
547
+ .req-tree.hierarchy-view .req-item.hierarchy-visible.collapsed-by-parent {
548
+ display: none;
549
+ }
550
+
551
+ .req-item.filtered-out {
552
+ display: none !important;
553
+ }
554
+
555
+ /* ==========================================================================
556
+ Status Badges
557
+ ========================================================================== */
558
+
559
+ .status-badge {
560
+ display: inline-block;
561
+ padding: 2px 6px;
562
+ border-radius: 2px;
563
+ font-size: 10px;
564
+ font-weight: 600;
565
+ text-transform: uppercase;
566
+ letter-spacing: 0.3px;
567
+ }
568
+
569
+ .status-active { background: #d4edda; color: #155724; }
570
+ .status-draft { background: #fff3cd; color: #856404; }
571
+ .status-deprecated { background: #f8d7da; color: #721c24; }
572
+
573
+ .status-suffix {
574
+ font-weight: bold;
575
+ font-size: 12px;
576
+ margin-left: 1px;
577
+ cursor: help;
578
+ }
579
+
580
+ .status-new { color: #28a745; }
581
+ .status-modified { color: #fd7e14; }
582
+ .status-moved { color: #6f42c1; }
583
+ .status-moved-modified { color: #6f42c1; }
584
+ .status-pending-move { color: #007bff; }
585
+
586
+ /* Test badges */
587
+ .test-badge {
588
+ display: inline-block;
589
+ padding: 2px 6px;
590
+ border-radius: 2px;
591
+ font-size: 10px;
592
+ font-weight: 600;
593
+ }
594
+
595
+ .test-passed { background: #d4edda; color: #155724; }
596
+ .test-failed { background: #f8d7da; color: #721c24; }
597
+ .test-not-tested { background: #fff3cd; color: #856404; }
598
+ .test-error { background: #f5c2c7; color: #842029; }
599
+ .test-skipped { background: #e2e3e5; color: #41464b; }
600
+
601
+ .coverage-badge {
602
+ display: inline-block;
603
+ font-size: 14px;
604
+ cursor: help;
605
+ }
606
+
607
+ /* ==========================================================================
608
+ Issue Indicators
609
+ ========================================================================== */
610
+
611
+ .roadmap-icon {
612
+ margin-left: 4px;
613
+ font-size: 12px;
614
+ opacity: 0.8;
615
+ }
616
+
617
+ .conflict-icon {
618
+ margin-right: 4px;
619
+ font-size: 14px;
620
+ color: #dc3545;
621
+ }
622
+
623
+ .conflict-item {
624
+ background-color: rgba(220, 53, 69, 0.1) !important;
625
+ border-left: 3px solid #dc3545 !important;
626
+ }
627
+
628
+ .conflict-item:hover {
629
+ background-color: rgba(220, 53, 69, 0.15) !important;
630
+ }
631
+
632
+ .cycle-icon {
633
+ margin-right: 4px;
634
+ font-size: 14px;
635
+ color: #fd7e14;
636
+ }
637
+
638
+ .cycle-item {
639
+ background-color: rgba(253, 126, 20, 0.1) !important;
640
+ border-left: 3px solid #fd7e14 !important;
641
+ }
642
+
643
+ .cycle-item:hover {
644
+ background-color: rgba(253, 126, 20, 0.15) !important;
645
+ }
646
+
647
+ /* ==========================================================================
648
+ Edit Mode
649
+ ========================================================================== */
650
+
651
+ .edit-mode-panel {
652
+ background: #fff3cd;
653
+ border: 1px solid #ffc107;
654
+ border-radius: 4px;
655
+ padding: 15px;
656
+ margin: 10px 0;
657
+ }
658
+
659
+ .edit-mode-header {
660
+ display: flex;
661
+ justify-content: space-between;
662
+ align-items: center;
663
+ margin-bottom: 10px;
664
+ }
665
+
666
+ .edit-mode-title {
667
+ font-size: 14px;
668
+ }
669
+
670
+ .edit-mode-actions {
671
+ display: flex;
672
+ gap: 10px;
673
+ }
674
+
675
+ .pending-moves-list {
676
+ max-height: 200px;
677
+ overflow-y: auto;
678
+ font-size: 12px;
679
+ }
680
+
681
+ .pending-move-item {
682
+ padding: 5px 10px;
683
+ background: white;
684
+ border-radius: 3px;
685
+ margin: 3px 0;
686
+ display: flex;
687
+ justify-content: space-between;
688
+ align-items: center;
689
+ }
690
+
691
+ .edit-actions {
692
+ display: none;
693
+ }
694
+
695
+ body.edit-mode-active .edit-actions {
696
+ display: flex;
697
+ flex-direction: column;
698
+ gap: 2px;
699
+ }
700
+
701
+ .edit-btn {
702
+ padding: 2px 6px;
703
+ font-size: 10px;
704
+ cursor: pointer;
705
+ border: 1px solid #ccc;
706
+ border-radius: 3px;
707
+ background: white;
708
+ white-space: nowrap;
709
+ }
710
+
711
+ .edit-btn:hover {
712
+ background: #e9ecef;
713
+ }
714
+
715
+ .edit-btn.to-roadmap {
716
+ border-color: #fd7e14;
717
+ color: #fd7e14;
718
+ }
719
+
720
+ .edit-btn.from-roadmap {
721
+ border-color: #28a745;
722
+ color: #28a745;
723
+ }
724
+
725
+ .edit-btn.move-file {
726
+ border-color: #007bff;
727
+ color: #007bff;
728
+ }
729
+
730
+ .edit-mode-column {
731
+ display: none;
732
+ }
733
+
734
+ body.edit-mode-active .edit-mode-column {
735
+ display: block;
736
+ }
737
+
738
+ .req-destination {
739
+ min-width: 100px;
740
+ max-width: 150px;
741
+ font-size: 11px;
742
+ padding: 2px 6px;
743
+ }
744
+
745
+ .req-destination:not(:empty) {
746
+ background: #e8f4fd;
747
+ border-radius: 4px;
748
+ color: #0366d6;
749
+ font-weight: 500;
750
+ }
751
+
752
+ .req-destination.to-roadmap {
753
+ background: #fff3cd;
754
+ color: #856404;
755
+ }
756
+
757
+ .req-destination.from-roadmap {
758
+ background: #d4edda;
759
+ color: #155724;
760
+ }
761
+
762
+ .dest-text {
763
+ font-size: 11px;
764
+ color: #666;
765
+ white-space: nowrap;
766
+ }
767
+
768
+ /* Panel/card edit buttons */
769
+ .req-card-actions {
770
+ display: flex !important;
771
+ flex-direction: row;
772
+ gap: 8px;
773
+ margin: 8px 0;
774
+ }
775
+
776
+ .panel-edit-btn {
777
+ font-size: 11px;
778
+ padding: 4px 8px;
779
+ }
780
+
781
+ /* ==========================================================================
782
+ VS Code Link
783
+ ========================================================================== */
784
+
785
+ .vscode-link {
786
+ font-size: 16px;
787
+ color: #007acc;
788
+ text-decoration: none;
789
+ margin-left: 6px;
790
+ }
791
+
792
+ .vscode-link:hover {
793
+ color: #005a9e;
794
+ }
795
+
796
+ /* ==========================================================================
797
+ Legend
798
+ ========================================================================== */
799
+
800
+ .level-legend {
801
+ display: flex;
802
+ gap: 15px;
803
+ margin: 15px 0;
804
+ padding: 8px 12px;
805
+ background: #f8f9fa;
806
+ border-radius: 4px;
807
+ font-size: 12px;
808
+ }
809
+
810
+ .legend-item {
811
+ display: flex;
812
+ align-items: center;
813
+ gap: 6px;
814
+ }
815
+
816
+ .legend-color {
817
+ width: 16px;
818
+ height: 16px;
819
+ border-radius: 2px;
820
+ }
821
+
822
+ .legend-color.prd { background: #0066cc; }
823
+ .legend-color.ops { background: #fd7e14; }
824
+ .legend-color.dev { background: #28a745; }
825
+
826
+ /* ==========================================================================
827
+ Side Panel (REQ-tv-d00002-B: _generate_side_panel_css)
828
+ ========================================================================== */
829
+
830
+ .side-panel {
831
+ width: 400px;
832
+ min-width: 250px;
833
+ max-width: 70vw;
834
+ height: 100vh;
835
+ background: white;
836
+ border-left: 2px solid #dee2e6;
837
+ box-shadow: -2px 0 8px rgba(0,0,0,0.1);
838
+ display: flex;
839
+ flex-direction: column;
840
+ flex-shrink: 0;
841
+ }
842
+
843
+ .side-panel.hidden {
844
+ display: none;
845
+ }
846
+
847
+ .resize-handle {
848
+ position: absolute;
849
+ left: -4px;
850
+ top: 0;
851
+ width: 8px;
852
+ height: 100%;
853
+ cursor: col-resize;
854
+ background: transparent;
855
+ z-index: 10;
856
+ }
857
+
858
+ .resize-handle:hover,
859
+ .resize-handle.dragging {
860
+ background: rgba(0, 102, 204, 0.3);
861
+ }
862
+
863
+ .panel-header {
864
+ padding: 15px;
865
+ background: #f8f9fa;
866
+ border-bottom: 1px solid #dee2e6;
867
+ display: flex;
868
+ justify-content: space-between;
869
+ align-items: center;
870
+ font-weight: 600;
871
+ font-size: 14px;
872
+ }
873
+
874
+ .panel-header button {
875
+ padding: 4px 8px;
876
+ font-size: 11px;
877
+ border: none;
878
+ background: #dc3545;
879
+ color: white;
880
+ border-radius: 3px;
881
+ cursor: pointer;
882
+ }
883
+
884
+ .panel-header button:hover {
885
+ background: #c82333;
886
+ }
887
+
888
+ #req-card-stack {
889
+ flex: 1;
890
+ overflow-y: auto;
891
+ padding: 10px;
892
+ }
893
+
894
+ .req-card {
895
+ background: #f8f9fa;
896
+ border: 1px solid #dee2e6;
897
+ border-radius: 4px;
898
+ margin-bottom: 10px;
899
+ overflow: hidden;
900
+ }
901
+
902
+ .req-card-header {
903
+ background: #e9ecef;
904
+ padding: 10px 12px;
905
+ display: flex;
906
+ justify-content: space-between;
907
+ align-items: center;
908
+ border-bottom: 1px solid #dee2e6;
909
+ }
910
+
911
+ .req-card-title {
912
+ font-weight: 600;
913
+ font-size: 12px;
914
+ color: #2c3e50;
915
+ }
916
+
917
+ .close-btn {
918
+ background: none;
919
+ border: none;
920
+ font-size: 20px;
921
+ color: #6c757d;
922
+ cursor: pointer;
923
+ padding: 0;
924
+ width: 24px;
925
+ height: 24px;
926
+ line-height: 20px;
927
+ }
928
+
929
+ .close-btn:hover {
930
+ color: #dc3545;
931
+ }
932
+
933
+ .req-card-body {
934
+ padding: 12px;
935
+ }
936
+
937
+ .req-card-meta {
938
+ display: flex;
939
+ gap: 6px;
940
+ margin-bottom: 10px;
941
+ flex-wrap: wrap;
942
+ }
943
+
944
+ .req-card-meta .badge {
945
+ display: inline-block;
946
+ padding: 2px 6px;
947
+ background: #0066cc;
948
+ color: white;
949
+ border-radius: 3px;
950
+ font-size: 10px;
951
+ font-weight: 600;
952
+ }
953
+
954
+ .req-card-meta .file-ref {
955
+ font-size: 10px;
956
+ color: #6c757d;
957
+ font-family: 'Consolas', 'Monaco', monospace;
958
+ }
959
+
960
+ .file-ref-link {
961
+ font-size: 10px;
962
+ color: #0066cc;
963
+ font-family: 'Consolas', 'Monaco', monospace;
964
+ text-decoration: none;
965
+ }
966
+
967
+ .file-ref-link:hover {
968
+ text-decoration: underline;
969
+ }
970
+
971
+ .req-card-implements {
972
+ font-size: 11px;
973
+ color: #6c757d;
974
+ margin-bottom: 10px;
975
+ padding: 6px 8px;
976
+ background: #f8f9fa;
977
+ border-radius: 3px;
978
+ }
979
+
980
+ .req-card-implements .implements-link {
981
+ color: #0066cc;
982
+ text-decoration: none;
983
+ }
984
+
985
+ .req-card-implements .implements-link:hover {
986
+ text-decoration: underline;
987
+ }
988
+
989
+ .req-card-content {
990
+ font-size: 13px;
991
+ line-height: 1.6;
992
+ }
993
+
994
+ .req-body {
995
+ margin-bottom: 10px;
996
+ }
997
+
998
+ .req-rationale {
999
+ padding: 8px;
1000
+ background: #fff3cd;
1001
+ border-left: 3px solid #ffc107;
1002
+ font-size: 12px;
1003
+ }
1004
+
1005
+ /* ==========================================================================
1006
+ Line-numbered content (REQ panel)
1007
+ ========================================================================== */
1008
+
1009
+ .rs-lined-content {
1010
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
1011
+ }
1012
+
1013
+ .rs-section-label {
1014
+ margin: 0 0 8px 0;
1015
+ padding: 0;
1016
+ font-size: 11px;
1017
+ font-weight: 600;
1018
+ color: #666;
1019
+ text-transform: uppercase;
1020
+ letter-spacing: 0.5px;
1021
+ }
1022
+
1023
+ .req-body-section {
1024
+ margin-bottom: 16px;
1025
+ }
1026
+
1027
+ .req-rationale-section {
1028
+ margin-top: 16px;
1029
+ padding-top: 12px;
1030
+ border-top: 1px solid #eee;
1031
+ }
1032
+
1033
+ /* Table-based layout for line numbers */
1034
+ .rs-lines-table {
1035
+ display: table;
1036
+ width: 100%;
1037
+ border-collapse: collapse;
1038
+ font-size: 13px;
1039
+ line-height: 1.5;
1040
+ background: #fafafa;
1041
+ border-radius: 4px;
1042
+ overflow: hidden;
1043
+ }
1044
+
1045
+ .rs-line-row {
1046
+ display: table-row;
1047
+ }
1048
+
1049
+ .rs-line-row:hover {
1050
+ background: rgba(0, 102, 204, 0.05);
1051
+ }
1052
+
1053
+ .rs-line-number {
1054
+ display: table-cell;
1055
+ padding: 2px 8px 2px 6px;
1056
+ text-align: right;
1057
+ color: #999;
1058
+ background: #e9ecef;
1059
+ border-right: 1px solid #ddd;
1060
+ user-select: none;
1061
+ vertical-align: top;
1062
+ min-width: 32px;
1063
+ width: 32px;
1064
+ font-family: 'Consolas', 'Monaco', monospace;
1065
+ font-size: 11px;
1066
+ }
1067
+
1068
+ .rs-line-text {
1069
+ display: table-cell;
1070
+ padding: 2px 10px;
1071
+ vertical-align: top;
1072
+ word-break: break-word;
1073
+ white-space: pre-wrap;
1074
+ }
1075
+
1076
+ /* Markdown formatting within line text */
1077
+ .rs-line-text strong {
1078
+ font-weight: 700;
1079
+ }
1080
+
1081
+ .rs-line-text em {
1082
+ font-style: italic;
1083
+ }
1084
+
1085
+ .rs-line-text code {
1086
+ background: rgba(0, 0, 0, 0.06);
1087
+ padding: 0.1em 0.3em;
1088
+ border-radius: 3px;
1089
+ font-family: 'Consolas', 'Monaco', monospace;
1090
+ font-size: 0.9em;
1091
+ }
1092
+
1093
+ .rs-line-text .md-heading {
1094
+ font-weight: 700;
1095
+ color: #333;
1096
+ }
1097
+
1098
+ .rs-line-text .md-h1 { font-size: 1.3em; }
1099
+ .rs-line-text .md-h2 { font-size: 1.2em; }
1100
+ .rs-line-text .md-h3 { font-size: 1.1em; }
1101
+ .rs-line-text .md-h4,
1102
+ .rs-line-text .md-h5,
1103
+ .rs-line-text .md-h6 { font-size: 1em; }
1104
+
1105
+ .rs-line-text .md-list-item {
1106
+ display: inline-block;
1107
+ width: 100%;
1108
+ padding-left: 2em;
1109
+ text-indent: -2em;
1110
+ box-sizing: border-box;
1111
+ vertical-align: top;
1112
+ white-space: normal;
1113
+ }
1114
+
1115
+ /* Markdown content styling */
1116
+ .markdown-body p {
1117
+ margin: 0 0 10px 0;
1118
+ }
1119
+
1120
+ .markdown-body ul, .markdown-body ol {
1121
+ margin: 0 0 10px 0;
1122
+ padding-left: 20px;
1123
+ }
1124
+
1125
+ .markdown-body li {
1126
+ margin: 4px 0;
1127
+ }
1128
+
1129
+ .markdown-body code {
1130
+ background: #f4f4f4;
1131
+ padding: 2px 5px;
1132
+ border-radius: 3px;
1133
+ font-family: 'Consolas', 'Monaco', monospace;
1134
+ font-size: 12px;
1135
+ }
1136
+
1137
+ .markdown-body pre {
1138
+ background: #2d2d2d;
1139
+ color: #ccc;
1140
+ padding: 10px;
1141
+ border-radius: 4px;
1142
+ overflow-x: auto;
1143
+ margin: 10px 0;
1144
+ }
1145
+
1146
+ .markdown-body pre code {
1147
+ background: none;
1148
+ padding: 0;
1149
+ color: inherit;
1150
+ }
1151
+
1152
+ .markdown-body strong {
1153
+ font-weight: 600;
1154
+ }
1155
+
1156
+ .markdown-body em {
1157
+ font-style: italic;
1158
+ }
1159
+
1160
+ .markdown-body h1, .markdown-body h2, .markdown-body h3 {
1161
+ margin: 15px 0 10px 0;
1162
+ font-weight: 600;
1163
+ }
1164
+
1165
+ .markdown-body h1 { font-size: 18px; }
1166
+ .markdown-body h2 { font-size: 16px; }
1167
+ .markdown-body h3 { font-size: 14px; }
1168
+
1169
+ .markdown-body blockquote {
1170
+ margin: 10px 0;
1171
+ padding: 8px 12px;
1172
+ border-left: 3px solid #dee2e6;
1173
+ background: #f8f9fa;
1174
+ color: #6c757d;
1175
+ }
1176
+
1177
+ .markdown-body a {
1178
+ color: #0066cc;
1179
+ text-decoration: none;
1180
+ }
1181
+
1182
+ .markdown-body a:hover {
1183
+ text-decoration: underline;
1184
+ }
1185
+
1186
+ .markdown-body table {
1187
+ border-collapse: collapse;
1188
+ margin: 10px 0;
1189
+ width: 100%;
1190
+ }
1191
+
1192
+ .markdown-body th, .markdown-body td {
1193
+ border: 1px solid #dee2e6;
1194
+ padding: 6px 10px;
1195
+ text-align: left;
1196
+ }
1197
+
1198
+ .markdown-body th {
1199
+ background: #f8f9fa;
1200
+ font-weight: 600;
1201
+ }
1202
+
1203
+ /* ==========================================================================
1204
+ Code Viewer Modal (REQ-tv-d00002-B: _generate_code_viewer_css)
1205
+ ========================================================================== */
1206
+
1207
+ .code-viewer-modal {
1208
+ position: fixed;
1209
+ top: 0;
1210
+ left: 0;
1211
+ width: 100%;
1212
+ height: 100%;
1213
+ background: rgba(0,0,0,0.7);
1214
+ z-index: 2000;
1215
+ display: flex;
1216
+ justify-content: center;
1217
+ align-items: center;
1218
+ }
1219
+
1220
+ .code-viewer-modal.hidden {
1221
+ display: none;
1222
+ }
1223
+
1224
+ .code-viewer-container {
1225
+ width: 85%;
1226
+ height: 85%;
1227
+ background: #1e1e1e;
1228
+ border-radius: 8px;
1229
+ display: flex;
1230
+ flex-direction: column;
1231
+ overflow: hidden;
1232
+ box-shadow: 0 4px 20px rgba(0,0,0,0.5);
1233
+ }
1234
+
1235
+ .code-viewer-header {
1236
+ background: #333;
1237
+ padding: 12px 16px;
1238
+ display: flex;
1239
+ justify-content: space-between;
1240
+ align-items: center;
1241
+ border-bottom: 1px solid #444;
1242
+ }
1243
+
1244
+ .code-viewer-title {
1245
+ color: #e0e0e0;
1246
+ font-family: 'Consolas', 'Monaco', monospace;
1247
+ font-size: 14px;
1248
+ }
1249
+
1250
+ .code-viewer-line {
1251
+ color: #888;
1252
+ font-size: 12px;
1253
+ margin-left: 15px;
1254
+ }
1255
+
1256
+ .code-viewer-close {
1257
+ background: #dc3545;
1258
+ border: none;
1259
+ color: white;
1260
+ padding: 6px 12px;
1261
+ border-radius: 4px;
1262
+ cursor: pointer;
1263
+ font-size: 12px;
1264
+ }
1265
+
1266
+ .code-viewer-close:hover {
1267
+ background: #c82333;
1268
+ }
1269
+
1270
+ .code-viewer-body {
1271
+ flex: 1;
1272
+ overflow: auto;
1273
+ background: #1e1e1e;
1274
+ }
1275
+
1276
+ .code-table {
1277
+ border-collapse: collapse;
1278
+ width: 100%;
1279
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
1280
+ font-size: 13px;
1281
+ line-height: 1.5;
1282
+ }
1283
+
1284
+ .code-table tr {
1285
+ background: #1e1e1e;
1286
+ }
1287
+
1288
+ .code-table tr.highlighted-line {
1289
+ background: #3a3a00 !important;
1290
+ }
1291
+
1292
+ .code-table tr.highlighted-line .line-num {
1293
+ background: #5a5a00;
1294
+ color: #fff;
1295
+ }
1296
+
1297
+ .line-num {
1298
+ text-align: right;
1299
+ padding: 0 12px;
1300
+ color: #606060;
1301
+ background: #252526;
1302
+ user-select: none;
1303
+ min-width: 50px;
1304
+ border-right: 1px solid #333;
1305
+ vertical-align: top;
1306
+ }
1307
+
1308
+ .line-code {
1309
+ padding: 0 16px;
1310
+ white-space: pre;
1311
+ color: #d4d4d4;
1312
+ }
1313
+
1314
+ .line-code pre {
1315
+ margin: 0;
1316
+ padding: 0;
1317
+ }
1318
+
1319
+ .line-code code {
1320
+ font-family: inherit;
1321
+ background: transparent !important;
1322
+ padding: 0 !important;
1323
+ }
1324
+
1325
+ .code-viewer-body .loading {
1326
+ color: #888;
1327
+ padding: 20px;
1328
+ text-align: center;
1329
+ }
1330
+
1331
+ .code-viewer-body .error {
1332
+ color: #ff6b6b;
1333
+ padding: 20px;
1334
+ text-align: center;
1335
+ }
1336
+
1337
+ /* Markdown rendering in code viewer */
1338
+ .code-viewer-body.markdown-mode {
1339
+ background: #ffffff;
1340
+ }
1341
+
1342
+ .markdown-viewer {
1343
+ padding: 20px 30px;
1344
+ color: #333;
1345
+ max-width: 900px;
1346
+ margin: 0 auto;
1347
+ }
1348
+
1349
+ .markdown-viewer h1 {
1350
+ font-size: 24px;
1351
+ border-bottom: 2px solid #0066cc;
1352
+ padding-bottom: 8px;
1353
+ margin-top: 30px;
1354
+ }
1355
+
1356
+ .markdown-viewer h2 {
1357
+ font-size: 20px;
1358
+ margin-top: 25px;
1359
+ color: #2c3e50;
1360
+ }
1361
+
1362
+ .markdown-viewer h3 {
1363
+ font-size: 16px;
1364
+ margin-top: 20px;
1365
+ color: #34495e;
1366
+ }
1367
+
1368
+ .markdown-viewer p {
1369
+ margin: 12px 0;
1370
+ line-height: 1.7;
1371
+ }
1372
+
1373
+ .markdown-viewer ul, .markdown-viewer ol {
1374
+ margin: 12px 0;
1375
+ padding-left: 25px;
1376
+ }
1377
+
1378
+ .markdown-viewer li {
1379
+ margin: 6px 0;
1380
+ line-height: 1.6;
1381
+ }
1382
+
1383
+ .markdown-viewer code {
1384
+ background: #f4f4f4;
1385
+ padding: 2px 6px;
1386
+ border-radius: 3px;
1387
+ font-family: 'Consolas', 'Monaco', monospace;
1388
+ font-size: 13px;
1389
+ }
1390
+
1391
+ .markdown-viewer pre {
1392
+ background: #2d2d2d;
1393
+ color: #ccc;
1394
+ padding: 15px;
1395
+ border-radius: 6px;
1396
+ overflow-x: auto;
1397
+ margin: 15px 0;
1398
+ }
1399
+
1400
+ .markdown-viewer pre code {
1401
+ background: none;
1402
+ padding: 0;
1403
+ color: inherit;
1404
+ }
1405
+
1406
+ .markdown-viewer blockquote {
1407
+ margin: 15px 0;
1408
+ padding: 10px 15px;
1409
+ border-left: 4px solid #0066cc;
1410
+ background: #f8f9fa;
1411
+ color: #555;
1412
+ }
1413
+
1414
+ .markdown-viewer table {
1415
+ border-collapse: collapse;
1416
+ margin: 15px 0;
1417
+ width: 100%;
1418
+ }
1419
+
1420
+ .markdown-viewer th, .markdown-viewer td {
1421
+ border: 1px solid #dee2e6;
1422
+ padding: 8px 12px;
1423
+ text-align: left;
1424
+ }
1425
+
1426
+ .markdown-viewer th {
1427
+ background: #f8f9fa;
1428
+ font-weight: 600;
1429
+ }
1430
+
1431
+ .markdown-viewer strong {
1432
+ font-weight: 600;
1433
+ }
1434
+
1435
+ .markdown-viewer a {
1436
+ color: #0066cc;
1437
+ }
1438
+
1439
+ .markdown-viewer hr {
1440
+ border: none;
1441
+ border-top: 1px solid #dee2e6;
1442
+ margin: 20px 0;
1443
+ }
1444
+
1445
+ .markdown-viewer .highlight-target {
1446
+ background: #fff3cd;
1447
+ animation: highlight-fade 2s ease-out;
1448
+ }
1449
+
1450
+ @keyframes highlight-fade {
1451
+ 0% { background: #fff3cd; }
1452
+ 100% { background: transparent; }
1453
+ }
1454
+
1455
+ /* ==========================================================================
1456
+ Legend Modal (REQ-tv-d00002-B: _generate_legend_modal_css)
1457
+ ========================================================================== */
1458
+
1459
+ .legend-modal {
1460
+ position: fixed;
1461
+ top: 0;
1462
+ left: 0;
1463
+ right: 0;
1464
+ bottom: 0;
1465
+ background: rgba(0,0,0,0.5);
1466
+ z-index: 2000;
1467
+ display: flex;
1468
+ align-items: center;
1469
+ justify-content: center;
1470
+ }
1471
+
1472
+ .legend-modal.hidden {
1473
+ display: none;
1474
+ }
1475
+
1476
+ .legend-modal-container {
1477
+ background: white;
1478
+ border-radius: 8px;
1479
+ max-width: 600px;
1480
+ width: 90%;
1481
+ max-height: 80vh;
1482
+ overflow: auto;
1483
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
1484
+ }
1485
+
1486
+ .legend-modal-header {
1487
+ display: flex;
1488
+ justify-content: space-between;
1489
+ align-items: center;
1490
+ padding: 15px 20px;
1491
+ border-bottom: 1px solid #dee2e6;
1492
+ }
1493
+
1494
+ .legend-modal-header h2 {
1495
+ margin: 0;
1496
+ font-size: 16px;
1497
+ }
1498
+
1499
+ .legend-modal-close {
1500
+ background: none;
1501
+ border: none;
1502
+ font-size: 24px;
1503
+ cursor: pointer;
1504
+ color: #666;
1505
+ padding: 0 5px;
1506
+ }
1507
+
1508
+ .legend-modal-close:hover {
1509
+ color: #000;
1510
+ }
1511
+
1512
+ .legend-modal-body {
1513
+ padding: 20px;
1514
+ }
1515
+
1516
+ .legend-grid {
1517
+ display: grid;
1518
+ grid-template-columns: 1fr 1fr;
1519
+ gap: 20px;
1520
+ }
1521
+
1522
+ .legend-section h3 {
1523
+ font-size: 13px;
1524
+ margin: 0 0 10px 0;
1525
+ color: #495057;
1526
+ }
1527
+
1528
+ .legend-section ul {
1529
+ list-style: none;
1530
+ padding: 0;
1531
+ margin: 0;
1532
+ font-size: 12px;
1533
+ }
1534
+
1535
+ .legend-section li {
1536
+ margin: 6px 0;
1537
+ display: flex;
1538
+ align-items: center;
1539
+ gap: 8px;
1540
+ }
1541
+
1542
+ /* ==========================================================================
1543
+ File Picker Modal (REQ-tv-d00002-B: _generate_file_picker_modal_css)
1544
+ ========================================================================== */
1545
+
1546
+ .file-picker-modal {
1547
+ position: fixed;
1548
+ top: 0;
1549
+ left: 0;
1550
+ right: 0;
1551
+ bottom: 0;
1552
+ background: rgba(0,0,0,0.5);
1553
+ z-index: 2000;
1554
+ display: flex;
1555
+ align-items: center;
1556
+ justify-content: center;
1557
+ }
1558
+
1559
+ .file-picker-modal.hidden {
1560
+ display: none;
1561
+ }
1562
+
1563
+ .file-picker-container {
1564
+ background: white;
1565
+ border-radius: 8px;
1566
+ max-width: 500px;
1567
+ width: 90%;
1568
+ max-height: 80vh;
1569
+ display: flex;
1570
+ flex-direction: column;
1571
+ box-shadow: 0 4px 20px rgba(0,0,0,0.3);
1572
+ }
1573
+
1574
+ .file-picker-header {
1575
+ display: flex;
1576
+ justify-content: space-between;
1577
+ align-items: center;
1578
+ padding: 15px 20px;
1579
+ border-bottom: 1px solid #dee2e6;
1580
+ }
1581
+
1582
+ .file-picker-header h2 {
1583
+ margin: 0;
1584
+ font-size: 18px;
1585
+ }
1586
+
1587
+ .file-picker-close {
1588
+ background: none;
1589
+ border: none;
1590
+ font-size: 24px;
1591
+ cursor: pointer;
1592
+ color: #666;
1593
+ padding: 0 5px;
1594
+ }
1595
+
1596
+ .file-picker-close:hover {
1597
+ color: #333;
1598
+ }
1599
+
1600
+ .file-picker-body {
1601
+ padding: 20px;
1602
+ overflow-y: auto;
1603
+ }
1604
+
1605
+ .file-picker-input-row {
1606
+ display: flex;
1607
+ gap: 10px;
1608
+ margin-bottom: 10px;
1609
+ }
1610
+
1611
+ .file-picker-input-row input {
1612
+ flex: 1;
1613
+ padding: 8px 12px;
1614
+ border: 1px solid #ced4da;
1615
+ border-radius: 4px;
1616
+ font-size: 14px;
1617
+ }
1618
+
1619
+ .file-picker-input-row input:focus {
1620
+ outline: none;
1621
+ border-color: #007bff;
1622
+ box-shadow: 0 0 0 2px rgba(0,123,255,0.25);
1623
+ }
1624
+
1625
+ .file-picker-error {
1626
+ color: #dc3545;
1627
+ font-size: 12px;
1628
+ margin-bottom: 10px;
1629
+ padding: 5px 10px;
1630
+ background: #fff5f5;
1631
+ border-radius: 3px;
1632
+ }
1633
+
1634
+ .file-picker-hint {
1635
+ font-size: 12px;
1636
+ color: #666;
1637
+ margin-bottom: 10px;
1638
+ }
1639
+
1640
+ .file-picker-list {
1641
+ max-height: 300px;
1642
+ overflow-y: auto;
1643
+ border: 1px solid #dee2e6;
1644
+ border-radius: 4px;
1645
+ }
1646
+
1647
+ .file-picker-item {
1648
+ padding: 8px 12px;
1649
+ cursor: pointer;
1650
+ font-family: 'Consolas', 'Monaco', monospace;
1651
+ font-size: 13px;
1652
+ border-bottom: 1px solid #eee;
1653
+ }
1654
+
1655
+ .file-picker-item:last-child {
1656
+ border-bottom: none;
1657
+ }
1658
+
1659
+ .file-picker-item:hover {
1660
+ background: #e3f2fd;
1661
+ }
1662
+
1663
+ .file-picker-empty {
1664
+ padding: 15px;
1665
+ color: #666;
1666
+ text-align: center;
1667
+ font-style: italic;
1668
+ }
1669
+
1670
+ /* ==========================================================================
1671
+ Toast Notifications
1672
+ ========================================================================== */
1673
+
1674
+ .toast-container {
1675
+ position: fixed;
1676
+ top: 20px;
1677
+ right: 20px;
1678
+ z-index: 10000;
1679
+ display: flex;
1680
+ flex-direction: column;
1681
+ gap: 10px;
1682
+ }
1683
+
1684
+ .toast {
1685
+ padding: 12px 20px;
1686
+ border-radius: 6px;
1687
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1688
+ font-size: 14px;
1689
+ max-width: 350px;
1690
+ opacity: 0;
1691
+ transform: translateX(100%);
1692
+ transition: all 0.3s ease;
1693
+ }
1694
+
1695
+ .toast.show {
1696
+ opacity: 1;
1697
+ transform: translateX(0);
1698
+ }
1699
+
1700
+ .toast-success {
1701
+ background: #d4edda;
1702
+ color: #155724;
1703
+ border: 1px solid #c3e6cb;
1704
+ }
1705
+
1706
+ .toast-error {
1707
+ background: #f8d7da;
1708
+ color: #721c24;
1709
+ border: 1px solid #f5c6cb;
1710
+ }
1711
+
1712
+ .toast-warning {
1713
+ background: #fff3cd;
1714
+ color: #856404;
1715
+ border: 1px solid #ffeeba;
1716
+ }
1717
+
1718
+ .toast-info {
1719
+ background: #d1ecf1;
1720
+ color: #0c5460;
1721
+ border: 1px solid #bee5eb;
1722
+ }
1723
+
1724
+ /* ==========================================================================
1725
+ Moved Indicator
1726
+ ========================================================================== */
1727
+
1728
+ .moved-indicator {
1729
+ display: inline-block;
1730
+ margin-left: 4px;
1731
+ cursor: help;
1732
+ font-size: 12px;
1733
+ }
1734
+
1735
+ /* Style requirement nodes that have been moved */
1736
+ .req-node.moved .req-label {
1737
+ font-style: italic;
1738
+ }
1739
+
1740
+ .req-node.moved::after {
1741
+ content: ' (moved)';
1742
+ font-size: 10px;
1743
+ color: #6c757d;
1744
+ font-style: italic;
1745
+ }
1746
+
1747
+ /* Moved file info in Requirements panel */
1748
+ .req-card-file.file-moved {
1749
+ color: #28a745;
1750
+ }
1751
+
1752
+ .moved-from {
1753
+ font-size: 11px;
1754
+ color: #6c757d;
1755
+ font-style: italic;
1756
+ }