elspais 0.11.1__py3-none-any.whl → 0.43.5__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 (148) hide show
  1. elspais/__init__.py +2 -11
  2. elspais/{sponsors/__init__.py → associates.py} +102 -58
  3. elspais/cli.py +395 -79
  4. elspais/commands/__init__.py +9 -3
  5. elspais/commands/analyze.py +121 -173
  6. elspais/commands/changed.py +15 -30
  7. elspais/commands/config_cmd.py +13 -16
  8. elspais/commands/edit.py +60 -44
  9. elspais/commands/example_cmd.py +319 -0
  10. elspais/commands/hash_cmd.py +167 -183
  11. elspais/commands/health.py +1177 -0
  12. elspais/commands/index.py +98 -114
  13. elspais/commands/init.py +103 -26
  14. elspais/commands/reformat_cmd.py +41 -444
  15. elspais/commands/rules_cmd.py +7 -3
  16. elspais/commands/trace.py +444 -321
  17. elspais/commands/validate.py +195 -415
  18. elspais/config/__init__.py +799 -5
  19. elspais/{core/content_rules.py → content_rules.py} +20 -3
  20. elspais/docs/cli/assertions.md +67 -0
  21. elspais/docs/cli/commands.md +304 -0
  22. elspais/docs/cli/config.md +262 -0
  23. elspais/docs/cli/format.md +66 -0
  24. elspais/docs/cli/git.md +45 -0
  25. elspais/docs/cli/health.md +190 -0
  26. elspais/docs/cli/hierarchy.md +60 -0
  27. elspais/docs/cli/ignore.md +72 -0
  28. elspais/docs/cli/mcp.md +245 -0
  29. elspais/docs/cli/quickstart.md +58 -0
  30. elspais/docs/cli/traceability.md +89 -0
  31. elspais/docs/cli/validation.md +96 -0
  32. elspais/graph/GraphNode.py +383 -0
  33. elspais/graph/__init__.py +40 -0
  34. elspais/graph/annotators.py +927 -0
  35. elspais/graph/builder.py +1886 -0
  36. elspais/graph/deserializer.py +248 -0
  37. elspais/graph/factory.py +284 -0
  38. elspais/graph/metrics.py +127 -0
  39. elspais/graph/mutations.py +161 -0
  40. elspais/graph/parsers/__init__.py +156 -0
  41. elspais/graph/parsers/code.py +213 -0
  42. elspais/graph/parsers/comments.py +112 -0
  43. elspais/graph/parsers/config_helpers.py +29 -0
  44. elspais/graph/parsers/heredocs.py +225 -0
  45. elspais/graph/parsers/journey.py +131 -0
  46. elspais/graph/parsers/remainder.py +79 -0
  47. elspais/graph/parsers/requirement.py +347 -0
  48. elspais/graph/parsers/results/__init__.py +6 -0
  49. elspais/graph/parsers/results/junit_xml.py +229 -0
  50. elspais/graph/parsers/results/pytest_json.py +313 -0
  51. elspais/graph/parsers/test.py +305 -0
  52. elspais/graph/relations.py +78 -0
  53. elspais/graph/serialize.py +216 -0
  54. elspais/html/__init__.py +8 -0
  55. elspais/html/generator.py +731 -0
  56. elspais/html/templates/trace_view.html.j2 +2151 -0
  57. elspais/mcp/__init__.py +47 -29
  58. elspais/mcp/__main__.py +5 -1
  59. elspais/mcp/file_mutations.py +138 -0
  60. elspais/mcp/server.py +2016 -247
  61. elspais/testing/__init__.py +4 -4
  62. elspais/testing/config.py +3 -0
  63. elspais/testing/mapper.py +1 -1
  64. elspais/testing/result_parser.py +25 -21
  65. elspais/testing/scanner.py +301 -12
  66. elspais/utilities/__init__.py +1 -0
  67. elspais/utilities/docs_loader.py +115 -0
  68. elspais/utilities/git.py +607 -0
  69. elspais/{core → utilities}/hasher.py +8 -22
  70. elspais/utilities/md_renderer.py +189 -0
  71. elspais/{core → utilities}/patterns.py +58 -57
  72. elspais/utilities/reference_config.py +626 -0
  73. elspais/validation/__init__.py +19 -0
  74. elspais/validation/format.py +264 -0
  75. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/METADATA +7 -4
  76. elspais-0.43.5.dist-info/RECORD +80 -0
  77. elspais/config/defaults.py +0 -173
  78. elspais/config/loader.py +0 -494
  79. elspais/core/__init__.py +0 -21
  80. elspais/core/git.py +0 -352
  81. elspais/core/models.py +0 -320
  82. elspais/core/parser.py +0 -640
  83. elspais/core/rules.py +0 -514
  84. elspais/mcp/context.py +0 -171
  85. elspais/mcp/serializers.py +0 -112
  86. elspais/reformat/__init__.py +0 -50
  87. elspais/reformat/detector.py +0 -119
  88. elspais/reformat/hierarchy.py +0 -246
  89. elspais/reformat/line_breaks.py +0 -220
  90. elspais/reformat/prompts.py +0 -123
  91. elspais/reformat/transformer.py +0 -264
  92. elspais/trace_view/__init__.py +0 -54
  93. elspais/trace_view/coverage.py +0 -183
  94. elspais/trace_view/generators/__init__.py +0 -12
  95. elspais/trace_view/generators/base.py +0 -329
  96. elspais/trace_view/generators/csv.py +0 -122
  97. elspais/trace_view/generators/markdown.py +0 -175
  98. elspais/trace_view/html/__init__.py +0 -31
  99. elspais/trace_view/html/generator.py +0 -1006
  100. elspais/trace_view/html/templates/base.html +0 -283
  101. elspais/trace_view/html/templates/components/code_viewer_modal.html +0 -14
  102. elspais/trace_view/html/templates/components/file_picker_modal.html +0 -20
  103. elspais/trace_view/html/templates/components/legend_modal.html +0 -69
  104. elspais/trace_view/html/templates/components/review_panel.html +0 -118
  105. elspais/trace_view/html/templates/partials/review/help/help-panel.json +0 -244
  106. elspais/trace_view/html/templates/partials/review/help/onboarding.json +0 -77
  107. elspais/trace_view/html/templates/partials/review/help/tooltips.json +0 -237
  108. elspais/trace_view/html/templates/partials/review/review-comments.js +0 -928
  109. elspais/trace_view/html/templates/partials/review/review-data.js +0 -961
  110. elspais/trace_view/html/templates/partials/review/review-help.js +0 -679
  111. elspais/trace_view/html/templates/partials/review/review-init.js +0 -177
  112. elspais/trace_view/html/templates/partials/review/review-line-numbers.js +0 -429
  113. elspais/trace_view/html/templates/partials/review/review-packages.js +0 -1029
  114. elspais/trace_view/html/templates/partials/review/review-position.js +0 -540
  115. elspais/trace_view/html/templates/partials/review/review-resize.js +0 -115
  116. elspais/trace_view/html/templates/partials/review/review-status.js +0 -659
  117. elspais/trace_view/html/templates/partials/review/review-sync.js +0 -992
  118. elspais/trace_view/html/templates/partials/review-styles.css +0 -2238
  119. elspais/trace_view/html/templates/partials/scripts.js +0 -1741
  120. elspais/trace_view/html/templates/partials/styles.css +0 -1756
  121. elspais/trace_view/models.py +0 -353
  122. elspais/trace_view/review/__init__.py +0 -60
  123. elspais/trace_view/review/branches.py +0 -1149
  124. elspais/trace_view/review/models.py +0 -1205
  125. elspais/trace_view/review/position.py +0 -609
  126. elspais/trace_view/review/server.py +0 -1056
  127. elspais/trace_view/review/status.py +0 -470
  128. elspais/trace_view/review/storage.py +0 -1367
  129. elspais/trace_view/scanning.py +0 -213
  130. elspais/trace_view/specs/README.md +0 -84
  131. elspais/trace_view/specs/tv-d00001-template-architecture.md +0 -36
  132. elspais/trace_view/specs/tv-d00002-css-extraction.md +0 -37
  133. elspais/trace_view/specs/tv-d00003-js-extraction.md +0 -43
  134. elspais/trace_view/specs/tv-d00004-build-embedding.md +0 -40
  135. elspais/trace_view/specs/tv-d00005-test-format.md +0 -78
  136. elspais/trace_view/specs/tv-d00010-review-data-models.md +0 -33
  137. elspais/trace_view/specs/tv-d00011-review-storage.md +0 -33
  138. elspais/trace_view/specs/tv-d00012-position-resolution.md +0 -33
  139. elspais/trace_view/specs/tv-d00013-git-branches.md +0 -31
  140. elspais/trace_view/specs/tv-d00014-review-api-server.md +0 -31
  141. elspais/trace_view/specs/tv-d00015-status-modifier.md +0 -27
  142. elspais/trace_view/specs/tv-d00016-js-integration.md +0 -33
  143. elspais/trace_view/specs/tv-p00001-html-generator.md +0 -33
  144. elspais/trace_view/specs/tv-p00002-review-system.md +0 -29
  145. elspais-0.11.1.dist-info/RECORD +0 -101
  146. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/WHEEL +0 -0
  147. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/entry_points.txt +0 -0
  148. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/licenses/LICENSE +0 -0
@@ -1,1756 +0,0 @@
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
- }