@vibeflow-tools/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +141 -0
  2. package/dist/chunk-43MUGU6Z.js +67 -0
  3. package/dist/chunk-4Y62J4KR.js +438 -0
  4. package/dist/chunk-6ABTC7IA.js +482 -0
  5. package/dist/chunk-7K2VHAWF.js +569 -0
  6. package/dist/chunk-F57OXWVU.js +33 -0
  7. package/dist/chunk-I2OSZY66.js +803 -0
  8. package/dist/chunk-JKC6MUZ4.js +558 -0
  9. package/dist/chunk-KJ5LYG6A.js +2 -0
  10. package/dist/chunk-KKBXVPTJ.js +2 -0
  11. package/dist/chunk-LK3IGDR6.js +438 -0
  12. package/dist/chunk-MKOKIWTN.js +569 -0
  13. package/dist/chunk-MW4OS3IK.js +438 -0
  14. package/dist/chunk-NRPOXSY6.js +568 -0
  15. package/dist/chunk-NUM3G22J.js +569 -0
  16. package/dist/chunk-O564QSMS.js +569 -0
  17. package/dist/chunk-OAGEPYIT.js +535 -0
  18. package/dist/chunk-PHBHAIHA.js +33 -0
  19. package/dist/chunk-PK737AKV.js +560 -0
  20. package/dist/chunk-TWAAPROG.js +822 -0
  21. package/dist/chunk-XF2CNPE4.js +803 -0
  22. package/dist/cli/chunk-43MUGU6Z.js +67 -0
  23. package/dist/cli/chunk-4Y62J4KR.js +438 -0
  24. package/dist/cli/chunk-6ABTC7IA.js +482 -0
  25. package/dist/cli/chunk-7K2VHAWF.js +569 -0
  26. package/dist/cli/chunk-F57OXWVU.js +33 -0
  27. package/dist/cli/chunk-I2OSZY66.js +803 -0
  28. package/dist/cli/chunk-JKC6MUZ4.js +558 -0
  29. package/dist/cli/chunk-KJ5LYG6A.js +2 -0
  30. package/dist/cli/chunk-KKBXVPTJ.js +2 -0
  31. package/dist/cli/chunk-LK3IGDR6.js +438 -0
  32. package/dist/cli/chunk-MKOKIWTN.js +569 -0
  33. package/dist/cli/chunk-MW4OS3IK.js +438 -0
  34. package/dist/cli/chunk-NRPOXSY6.js +568 -0
  35. package/dist/cli/chunk-NUM3G22J.js +569 -0
  36. package/dist/cli/chunk-O564QSMS.js +569 -0
  37. package/dist/cli/chunk-OAGEPYIT.js +535 -0
  38. package/dist/cli/chunk-PHBHAIHA.js +33 -0
  39. package/dist/cli/chunk-PK737AKV.js +560 -0
  40. package/dist/cli/chunk-TWAAPROG.js +822 -0
  41. package/dist/cli/chunk-XF2CNPE4.js +803 -0
  42. package/dist/cli/files-27OYPA7W.js +20 -0
  43. package/dist/cli/files-2TK74THO.js +22 -0
  44. package/dist/cli/files-7275M2PW.js +20 -0
  45. package/dist/cli/files-D3YPV7QT.js +20 -0
  46. package/dist/cli/files-FER4UZ4X.js +22 -0
  47. package/dist/cli/files-H4FRDKJV.js +22 -0
  48. package/dist/cli/files-IJZVMROA.js +22 -0
  49. package/dist/cli/files-KH3UEFN7.js +20 -0
  50. package/dist/cli/files-LTDT5ZFT.js +22 -0
  51. package/dist/cli/files-OYO6A6MZ.js +22 -0
  52. package/dist/cli/files-R6QHQBH4.js +22 -0
  53. package/dist/cli/files-UCALOYWZ.js +22 -0
  54. package/dist/cli/files-UWZP7P6B.js +2 -0
  55. package/dist/cli/files-VIDLQM7Y.js +20 -0
  56. package/dist/cli/files-X2RDLF3W.js +22 -0
  57. package/dist/cli/files-XVDNOAZB.js +22 -0
  58. package/dist/cli/index.d.ts +2 -0
  59. package/dist/cli/index.js +29252 -0
  60. package/dist/cli/workspace-KGOQ67YV.js +2 -0
  61. package/dist/cli/workspace-NB6BACZA.js +12 -0
  62. package/dist/cli/workspace-X2NGGGTQ.js +12 -0
  63. package/dist/cli/workspace-X4QXECQQ.js +12 -0
  64. package/dist/client/kanban-browser.js +96 -0
  65. package/dist/client/kanban.css +2 -0
  66. package/dist/client/overlay-browser.js +1635 -0
  67. package/dist/files-27OYPA7W.js +20 -0
  68. package/dist/files-2TK74THO.js +22 -0
  69. package/dist/files-7275M2PW.js +20 -0
  70. package/dist/files-D3YPV7QT.js +20 -0
  71. package/dist/files-FER4UZ4X.js +22 -0
  72. package/dist/files-H4FRDKJV.js +22 -0
  73. package/dist/files-IJZVMROA.js +22 -0
  74. package/dist/files-KH3UEFN7.js +20 -0
  75. package/dist/files-LTDT5ZFT.js +22 -0
  76. package/dist/files-OYO6A6MZ.js +22 -0
  77. package/dist/files-R6QHQBH4.js +22 -0
  78. package/dist/files-UCALOYWZ.js +22 -0
  79. package/dist/files-UWZP7P6B.js +2 -0
  80. package/dist/files-VIDLQM7Y.js +20 -0
  81. package/dist/files-X2RDLF3W.js +22 -0
  82. package/dist/files-XVDNOAZB.js +22 -0
  83. package/dist/index.d.ts +2 -0
  84. package/dist/index.js +29252 -0
  85. package/dist/overlay-host.css +14 -0
  86. package/dist/overlay.css +1530 -0
  87. package/dist/workspace-KGOQ67YV.js +2 -0
  88. package/dist/workspace-NB6BACZA.js +12 -0
  89. package/dist/workspace-X2NGGGTQ.js +12 -0
  90. package/dist/workspace-X4QXECQQ.js +12 -0
  91. package/package.json +92 -0
@@ -0,0 +1,1530 @@
1
+ :host {
2
+ all: initial;
3
+ display: block;
4
+ position: fixed;
5
+ inset: 0;
6
+ pointer-events: none;
7
+ z-index: 2147483647;
8
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
9
+ font-size: 14px;
10
+ line-height: 1.5;
11
+ color: #e2e8f0;
12
+ --vibeflow-text-primary: #e2e8f0;
13
+ --vibeflow-text-secondary: #cbd5e1;
14
+ --vibeflow-text-muted: #475569;
15
+ --vibeflow-border-strong: #1e293b;
16
+ --vibeflow-border-subtle: #0a1628;
17
+ --vibeflow-surface-elevated: #050d1a;
18
+ --vibeflow-surface-hover: #1e293b;
19
+ --vibeflow-accent-soft: rgba(59, 130, 246, 0.08);
20
+ --vibeflow-accent-border: rgba(59, 130, 246, 0.2);
21
+ --vibeflow-accent-strong: #2563eb;
22
+ }
23
+
24
+ *, *::before, *::after {
25
+ box-sizing: border-box;
26
+ margin: 0;
27
+ padding: 0;
28
+ }
29
+
30
+ /* ── Annotation popover ─────────────────────────────────────────── */
31
+ .vibeflow-popover {
32
+ position: fixed;
33
+ background: #060d1a;
34
+ color: #e2e8f0;
35
+ border: 1px solid #1e293b;
36
+ border-radius: 12px;
37
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.55), 0 4px 16px rgba(0, 0, 0, 0.3);
38
+ padding: 0;
39
+ min-width: 480px;
40
+ max-width: 600px;
41
+ pointer-events: auto;
42
+ overflow: hidden;
43
+ }
44
+
45
+ .popover-header {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 8px;
49
+ padding: 10px 14px;
50
+ background: #080f1e;
51
+ border-bottom: 1px solid #1e293b;
52
+ }
53
+
54
+ .popover-target-icon {
55
+ width: 22px;
56
+ height: 22px;
57
+ background: #1e3a5f;
58
+ border: 1px solid #2563eb40;
59
+ border-radius: 5px;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ font-size: 12px;
64
+ flex-shrink: 0;
65
+ }
66
+
67
+ .popover-target-name {
68
+ font-size: 12px;
69
+ font-weight: 600;
70
+ color: #93c5fd;
71
+ white-space: nowrap;
72
+ overflow: hidden;
73
+ text-overflow: ellipsis;
74
+ max-width: 280px;
75
+ }
76
+
77
+ .popover-drag-handle {
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ font-size: 16px;
82
+ color: #334155;
83
+ margin-left: auto;
84
+ line-height: 1;
85
+ cursor: grab;
86
+ padding: 2px 4px;
87
+ border-radius: 4px;
88
+ transition: color .15s, background .15s;
89
+ flex-shrink: 0;
90
+ user-select: none;
91
+ }
92
+ .popover-drag-handle:hover {
93
+ color: #60a5fa;
94
+ background: rgba(96, 165, 250, 0.1);
95
+ }
96
+ .vibeflow-popover.popover-dragging .popover-drag-handle { cursor: grabbing; }
97
+ .vibeflow-popover.popover-dragging { user-select: none; }
98
+
99
+
100
+
101
+ .popover-body {
102
+ padding: 14px 16px 12px;
103
+ }
104
+
105
+ .popover-title-row {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 8px;
109
+ margin-bottom: 8px;
110
+ }
111
+
112
+ .popover-label {
113
+ font-size: 12px;
114
+ color: #94a3b8;
115
+ margin-bottom: 10px;
116
+ }
117
+
118
+ .popover-label strong {
119
+ color: #e2e8f0;
120
+ font-weight: 600;
121
+ }
122
+
123
+ .vibeflow-popover input[type="text"] {
124
+ display: block;
125
+ width: 100%;
126
+ padding: 7px 10px;
127
+ min-height: 34px;
128
+ border: 1px solid #1e3a5f;
129
+ border-radius: 8px;
130
+ background: #050d1a;
131
+ color: #e2e8f0;
132
+ font-size: 13px;
133
+ font-family: inherit;
134
+ }
135
+
136
+ .vibeflow-popover input[type="text"]:focus {
137
+ outline: 2px solid #3b82f6;
138
+ outline-offset: 1px;
139
+ border-color: #3b82f6;
140
+ }
141
+
142
+ .vibeflow-popover input[type="text"]::placeholder { color: #64748b; }
143
+
144
+ .vibeflow-popover select {
145
+ display: block;
146
+ width: 100%;
147
+ padding: 6px 8px;
148
+ margin-bottom: 8px;
149
+ border: 1px solid #1e3a5f;
150
+ border-radius: 6px;
151
+ background: #050d1a;
152
+ color: #e2e8f0;
153
+ font-size: 14px;
154
+ font-family: system-ui, sans-serif;
155
+ cursor: pointer;
156
+ appearance: auto;
157
+ -webkit-appearance: auto;
158
+ }
159
+
160
+ .vibeflow-popover select:focus {
161
+ outline: 2px solid #3b82f6;
162
+ outline-offset: 1px;
163
+ border-color: #3b82f6;
164
+ }
165
+
166
+ .vibeflow-popover textarea {
167
+ display: block;
168
+ width: 100%;
169
+ min-height: 100px;
170
+ padding: 8px 10px;
171
+ margin-bottom: 10px;
172
+ border: 1px solid #1e3a5f;
173
+ border-radius: 8px;
174
+ background: #050d1a;
175
+ color: #e2e8f0;
176
+ font-size: 12px;
177
+ font-family: monospace;
178
+ line-height: 1.6;
179
+ resize: vertical;
180
+ }
181
+
182
+ .vibeflow-popover textarea:focus {
183
+ outline: 2px solid #3b82f6;
184
+ outline-offset: 1px;
185
+ border-color: #3b82f6;
186
+ }
187
+
188
+ .vibeflow-popover textarea::placeholder { color: #64748b; }
189
+
190
+ .type-picker {
191
+ position: relative;
192
+ display: inline-block;
193
+ flex-shrink: 0;
194
+ }
195
+
196
+ .type-picker-trigger {
197
+ display: inline-flex;
198
+ align-items: center;
199
+ gap: 5px;
200
+ padding: 3px 8px;
201
+ border-radius: 6px;
202
+ border: 1px solid rgba(255,255,255,0.08);
203
+ background: rgba(255,255,255,0.05);
204
+ color: rgba(255,255,255,0.7);
205
+ font-size: 12px;
206
+ cursor: pointer;
207
+ white-space: nowrap;
208
+ }
209
+
210
+ .type-picker-trigger:hover {
211
+ border-color: rgba(255,255,255,0.15);
212
+ color: #fff;
213
+ }
214
+
215
+ .type-picker-icon { font-size: 13px; line-height: 1; }
216
+
217
+ .type-picker-dropdown {
218
+ display: none;
219
+ position: absolute;
220
+ top: calc(100% + 4px);
221
+ left: 0;
222
+ background: #1e293b;
223
+ border: 1px solid rgba(255,255,255,0.12);
224
+ border-radius: 8px;
225
+ padding: 4px 0;
226
+ z-index: 200;
227
+ min-width: 140px;
228
+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);
229
+ }
230
+
231
+ .type-picker-dropdown.open {
232
+ display: block;
233
+ }
234
+
235
+ .type-picker-dropdown .type-picker-option {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 8px;
239
+ width: 100%;
240
+ padding: 6px 12px;
241
+ border: none;
242
+ border-radius: 0;
243
+ background: transparent;
244
+ color: rgba(255,255,255,0.55);
245
+ font-size: 12px;
246
+ font-weight: 400;
247
+ cursor: pointer;
248
+ text-align: left;
249
+ }
250
+
251
+ .type-picker-dropdown .type-picker-option:hover {
252
+ background: rgba(255,255,255,0.06);
253
+ color: #fff;
254
+ }
255
+
256
+ .type-picker-dropdown .type-picker-option--active {
257
+ background: rgba(59,130,246,0.15);
258
+ color: #93c5fd;
259
+ font-weight: 500;
260
+ }
261
+
262
+ .popover-actions {
263
+ display: flex;
264
+ gap: 8px;
265
+ padding: 0 16px 14px;
266
+ margin-top: 0;
267
+ align-items: center;
268
+ }
269
+
270
+ .popover-actions-spacer { flex: 1; }
271
+
272
+ .vibeflow-popover button {
273
+ padding: 7px 16px;
274
+ border-radius: 7px;
275
+ font-size: 13px;
276
+ font-family: system-ui, sans-serif;
277
+ font-weight: 500;
278
+ line-height: 1.4;
279
+ cursor: pointer;
280
+ border: 1px solid #334155;
281
+ background: #1e293b;
282
+ color: #94a3b8;
283
+ transition: background 0.12s, color 0.12s;
284
+ }
285
+
286
+ .vibeflow-popover button:hover { background: #334155; color: #e2e8f0; }
287
+ .vibeflow-popover button.btn-primary { background: #2563eb; color: #fff; border-color: #1d4ed8; font-weight: 600; }
288
+ .vibeflow-popover button.btn-primary:hover { background: #1d4ed8; }
289
+ .vibeflow-popover button.btn-ghost { background: transparent; border-color: #334155; color: #64748b; font-size: 12px; }
290
+ .vibeflow-popover button.btn-ghost:hover { background: #1e293b; color: #94a3b8; }
291
+ .vibeflow-popover button.btn-capture,
292
+ .vibeflow-popover button.btn-screenshot { background: transparent; border-color: #334155; color: #64748b; font-size: 12px; padding: 6px 10px; }
293
+ .vibeflow-popover button.btn-capture:hover,
294
+ .vibeflow-popover button.btn-screenshot:hover { background: #1e293b; color: #94a3b8; }
295
+ .vibeflow-popover button:disabled,
296
+ .modal-footer button:disabled {
297
+ opacity: 0.45;
298
+ cursor: not-allowed;
299
+ }
300
+
301
+ /* ── Corner trigger button (bottom-right icon) ──────────────────── */
302
+ /* Design reference: v2/docs/design-proposal/overlay.html (.ps-trigger) */
303
+ .vibeflow-corner-trigger {
304
+ position: fixed;
305
+ bottom: 20px;
306
+ right: 20px;
307
+ width: 44px;
308
+ height: 44px;
309
+ background: #2563eb;
310
+ color: #ffffff;
311
+ border: none;
312
+ border-radius: 12px;
313
+ font-size: 20px;
314
+ line-height: 1;
315
+ cursor: pointer;
316
+ pointer-events: auto;
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ box-shadow: 0 4px 20px rgba(37, 99, 235, 0.5), 0 2px 8px rgba(0, 0, 0, 0.4);
321
+ transition: background 0.15s, box-shadow 0.15s, transform 0.1s;
322
+ user-select: none;
323
+ }
324
+
325
+ .vibeflow-corner-trigger:hover {
326
+ background: #2563eb;
327
+ box-shadow: 0 6px 24px rgba(37, 99, 235, 0.7), 0 2px 8px rgba(0, 0, 0, 0.4);
328
+ transform: translateY(-1px);
329
+ }
330
+
331
+ .vibeflow-corner-trigger:active {
332
+ transform: translateY(0);
333
+ }
334
+
335
+ .vibeflow-corner-trigger.annotating {
336
+ background: #d97706;
337
+ box-shadow: 0 4px 20px rgba(217, 119, 6, 0.6), 0 2px 8px rgba(0, 0, 0, 0.4);
338
+ }
339
+
340
+ .vibeflow-corner-trigger.annotating:hover {
341
+ background: #b45309;
342
+ box-shadow: 0 6px 24px rgba(217, 119, 6, 0.8), 0 2px 8px rgba(0, 0, 0, 0.4);
343
+ }
344
+
345
+ .vibeflow-corner-trigger.saved-flash {
346
+ background: #16a34a;
347
+ box-shadow: 0 4px 20px rgba(22, 163, 74, 0.7), 0 2px 8px rgba(0, 0, 0, 0.4);
348
+ }
349
+
350
+ .vibeflow-corner-trigger.disconnected {
351
+ background: #374151;
352
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.3);
353
+ }
354
+
355
+ .vibeflow-corner-trigger.disconnected:hover {
356
+ background: #4b5563;
357
+ }
358
+
359
+ /* Holding (long-press unlocks drag) — pulsing ring animation */
360
+ .vibeflow-corner-trigger.trigger-holding {
361
+ cursor: grab;
362
+ box-shadow: 0 0 0 3px rgba(99, 132, 241, 0.6), 0 4px 20px rgba(37, 99, 235, 0.5);
363
+ animation: trigger-hold-pulse 0.6s ease-out;
364
+ }
365
+
366
+ @keyframes trigger-hold-pulse {
367
+ 0% { box-shadow: 0 0 0 0 rgba(99, 132, 241, 0.8), 0 4px 20px rgba(37, 99, 235, 0.5); }
368
+ 100% { box-shadow: 0 0 0 8px rgba(99, 132, 241, 0), 0 4px 20px rgba(37, 99, 235, 0.5); }
369
+ }
370
+
371
+ /* Dragging — no hover effects, move cursor, full-opacity with bright glow */
372
+ .vibeflow-corner-trigger.trigger-dragging {
373
+ cursor: grabbing !important;
374
+ transform: scale(1.15);
375
+ background: #3b82f6;
376
+ box-shadow: 0 0 0 3px #fff, 0 8px 32px rgba(37, 99, 235, 0.9), 0 4px 16px rgba(0, 0, 0, 0.5);
377
+ transition: none;
378
+ opacity: 1;
379
+ }
380
+
381
+ /* Task count badge on the corner trigger */
382
+ .vibeflow-trigger-badge {
383
+ position: absolute;
384
+ top: -6px;
385
+ right: -6px;
386
+ min-width: 18px;
387
+ height: 18px;
388
+ background: #ef4444;
389
+ color: #fff;
390
+ font-size: 10px;
391
+ font-weight: 700;
392
+ border-radius: 9px;
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ padding: 0 4px;
397
+ border: 2px solid #0f172a;
398
+ pointer-events: none;
399
+ }
400
+
401
+ /* ── Sidebar ────────────────────────────────────────────────────── */
402
+ .vibeflow-sidebar {
403
+ position: fixed;
404
+ right: 0;
405
+ top: 0;
406
+ width: 360px;
407
+ height: 100vh;
408
+ background: #060d1a;
409
+ color: #e2e8f0;
410
+ border-left: 1px solid #1e293b;
411
+ overflow-y: auto;
412
+ padding: 16px;
413
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.4);
414
+ pointer-events: auto;
415
+ transform: translateX(100%);
416
+ transition: transform 0.2s ease;
417
+ }
418
+
419
+ .vibeflow-sidebar.open { transform: translateX(0); }
420
+
421
+ .vibeflow-sidebar h3 {
422
+ margin: 0 0 12px;
423
+ font-size: 16px;
424
+ font-weight: 600;
425
+ color: #f1f5f9;
426
+ display: flex;
427
+ align-items: center;
428
+ justify-content: space-between;
429
+ }
430
+
431
+ .sidebar-close {
432
+ background: none;
433
+ border: none;
434
+ color: #94a3b8;
435
+ font-size: 18px;
436
+ cursor: pointer;
437
+ padding: 2px 6px;
438
+ border-radius: 4px;
439
+ }
440
+
441
+ .sidebar-close:hover { background: #1e293b; color: #e2e8f0; }
442
+
443
+ /* Project name label shown below the sidebar heading — source: sidebar.ts → refreshSidebar() */
444
+ .sidebar-project-name {
445
+ font-size: 11px;
446
+ font-weight: 500;
447
+ color: #60a5fa;
448
+ margin: -8px 0 10px;
449
+ white-space: nowrap;
450
+ overflow: hidden;
451
+ text-overflow: ellipsis;
452
+ }
453
+
454
+ .sidebar-add-btn {
455
+ background: #1e3a5f;
456
+ border: 1px solid #2563eb50;
457
+ color: #60a5fa;
458
+ font-size: 16px;
459
+ font-weight: 700;
460
+ line-height: 1;
461
+ width: 24px;
462
+ height: 24px;
463
+ border-radius: 6px;
464
+ cursor: pointer;
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ flex-shrink: 0;
469
+ margin-left: auto;
470
+ transition: background 0.15s, border-color 0.15s;
471
+ }
472
+
473
+ .sidebar-add-btn:hover {
474
+ background: #1e40af;
475
+ border-color: #3b82f6;
476
+ }
477
+
478
+ .empty-msg { color: #64748b; font-size: 14px; padding: 8px 0; }
479
+
480
+ .task-card {
481
+ margin: 8px 0;
482
+ padding: 11px 13px;
483
+ border: 1px solid #1e293b;
484
+ border-radius: 10px;
485
+ background: #0d1829;
486
+ cursor: pointer;
487
+ transition: border-color 0.12s, background 0.12s, box-shadow 0.12s, transform 0.12s;
488
+ position: relative;
489
+ display: flex;
490
+ flex-direction: column;
491
+ gap: 7px;
492
+ }
493
+
494
+ .task-card:hover {
495
+ border-color: #1e3a5f;
496
+ background: #0f1f35;
497
+ box-shadow: 0 4px 16px rgba(0,0,0,0.3);
498
+ transform: translateY(-1px);
499
+ }
500
+
501
+ .task-card-header {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 6px;
505
+ margin-bottom: 4px;
506
+ }
507
+
508
+ /* Status badges — showcase: overlay-showcase.html → [data-vibeflow-id="showcase-status-badges"] */
509
+ .status-badge {
510
+ display: inline-block;
511
+ padding: 1px 6px;
512
+ border-radius: 3px;
513
+ font-size: 10px;
514
+ font-weight: 600;
515
+ text-transform: uppercase;
516
+ border: 1px solid;
517
+ }
518
+
519
+ .status-todo { color: #f59e0b; border-color: #f59e0b; background: rgba(245,158,11,0.1); }
520
+ .status-in-progress { color: #3b82f6; border-color: #3b82f6; background: rgba(59,130,246,0.1); }
521
+ .status-done { color: #22c55e; border-color: #22c55e; background: rgba(34,197,94,0.1); }
522
+ .status-backlog { color: #94a3b8; border-color: #94a3b8; background: rgba(148,163,184,0.1); }
523
+ .status-review { color: #a855f7; border-color: #a855f7; background: rgba(168,85,247,0.1); }
524
+
525
+ /* Type badges — showcase: overlay-showcase.html → [data-vibeflow-id="showcase-status-badges"] */
526
+ .type-badge {
527
+ display: inline-block;
528
+ padding: 1px 5px;
529
+ border-radius: 3px;
530
+ font-size: 9px;
531
+ font-weight: 700;
532
+ letter-spacing: 0.04em;
533
+ text-transform: uppercase;
534
+ border: 1px solid;
535
+ flex-shrink: 0;
536
+ line-height: 1.5;
537
+ }
538
+
539
+ .type-badge-task { color: #94a3b8; border-color: rgba(148,163,184,0.2); background: rgba(148,163,184,0.1); }
540
+ .type-badge-bug { color: #f87171; border-color: rgba(239,68,68,0.25); background: rgba(239,68,68,0.12); }
541
+ .type-badge-research { color: #c084fc; border-color: rgba(139,92,246,0.2); background: rgba(192,132,252,0.12); }
542
+
543
+ .task-title {
544
+ font-size: 12px;
545
+ font-weight: 600;
546
+ color: #ffffff;
547
+ margin: 4px 0 2px;
548
+ }
549
+
550
+ .task-selector {
551
+ font-size: 11px;
552
+ color: #64748b;
553
+ font-family: 'SF Mono', 'Fira Code', monospace;
554
+ }
555
+
556
+ .task-url-badge {
557
+ font-size: 10px;
558
+ color: #64748b;
559
+ background: #1e293b;
560
+ border: 1px solid #334155;
561
+ border-radius: 3px;
562
+ padding: 1px 5px;
563
+ margin-left: auto;
564
+ font-family: 'SF Mono', 'Fira Code', monospace;
565
+ }
566
+
567
+ .task-description {
568
+ margin: 6px 0 0;
569
+ font-size: 10px;
570
+ color: #64748b;
571
+ line-height: 1.5;
572
+ display: -webkit-box;
573
+ -webkit-line-clamp: 2;
574
+ -webkit-box-orient: vertical;
575
+ overflow: hidden;
576
+ text-overflow: ellipsis;
577
+ }
578
+
579
+ .task-card .task-actions {
580
+ display: flex;
581
+ gap: 5px;
582
+ margin-top: 8px;
583
+ }
584
+
585
+ .task-watermark {
586
+ position: absolute;
587
+ top: 4px;
588
+ right: 8px;
589
+ font-size: 16px;
590
+ opacity: 0.3;
591
+ pointer-events: none;
592
+ user-select: none;
593
+ }
594
+
595
+ .task-card .task-actions button {
596
+ padding: 2px 8px;
597
+ font-size: 11px;
598
+ border-radius: 4px;
599
+ background: #334155;
600
+ border: 1px solid #475569;
601
+ color: #cbd5e1;
602
+ cursor: pointer;
603
+ }
604
+
605
+ .task-card .task-actions button:hover { background: #475569; }
606
+ .task-card .task-actions button.done-btn { color: #4ade80; border-color: #4ade80; }
607
+ .task-card .task-actions button.delete-btn { color: #f87171; border-color: #f87171; }
608
+ .task-card .task-actions button.edit-btn { color: #93c5fd; border-color: #93c5fd; }
609
+
610
+ /* ── Context menu ────────────────────────────────────────────────────── */
611
+ .vibeflow-context-menu {
612
+ position: fixed;
613
+ background: #1e293b;
614
+ border: 1px solid #334155;
615
+ border-radius: 8px;
616
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
617
+ min-width: 200px;
618
+ pointer-events: auto;
619
+ padding: 4px;
620
+ }
621
+
622
+ .vibeflow-context-menu button {
623
+ display: block;
624
+ width: 100%;
625
+ text-align: left;
626
+ padding: 8px 12px;
627
+ border: none;
628
+ background: none;
629
+ color: #e2e8f0;
630
+ font-size: 13px;
631
+ font-family: system-ui, sans-serif;
632
+ cursor: pointer;
633
+ border-radius: 4px;
634
+ }
635
+
636
+ .vibeflow-context-menu button:hover { background: #334155; }
637
+
638
+ .vibeflow-context-menu .menu-icon {
639
+ display: inline-block;
640
+ width: 18px;
641
+ text-align: center;
642
+ margin-right: 8px;
643
+ }
644
+
645
+ /* ── Screenshot preview in popover ─────────────────────────────── */
646
+ .screenshot-preview img {
647
+ display: block;
648
+ max-width: 100%;
649
+ border-radius: 4px;
650
+ margin-top: 6px;
651
+ margin-bottom: 6px;
652
+ border: 1px solid #334155;
653
+ }
654
+
655
+ /* ── Task indicators (badges on annotated elements) ─────────────── */
656
+ .vibeflow-indicators {
657
+ position: fixed;
658
+ inset: 0;
659
+ pointer-events: none;
660
+ z-index: 5;
661
+ }
662
+
663
+ .vibeflow-task-indicator {
664
+ position: fixed;
665
+ width: 20px;
666
+ height: 20px;
667
+ border-radius: 50%;
668
+ background: #ef4444;
669
+ color: #fff;
670
+ font-size: 10px;
671
+ font-weight: 700;
672
+ display: flex;
673
+ align-items: center;
674
+ justify-content: center;
675
+ pointer-events: auto;
676
+ cursor: pointer;
677
+ border: 2px solid #0f172a;
678
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
679
+ transform-origin: center;
680
+ transition: transform 0.15s;
681
+ user-select: none;
682
+ line-height: 1;
683
+ }
684
+
685
+ .vibeflow-task-indicator.all-done {
686
+ background: #22c55e;
687
+ font-size: 12px;
688
+ }
689
+
690
+ .vibeflow-task-indicator:hover { transform: scale(1.3); }
691
+
692
+ /* ── Task indicator tooltip ─────────────────────────────────────── */
693
+ .vibeflow-task-tooltip {
694
+ position: fixed;
695
+ background: #1e293b;
696
+ border: 1px solid #334155;
697
+ border-radius: 10px;
698
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
699
+ padding: 8px;
700
+ min-width: 240px;
701
+ max-width: 320px;
702
+ max-height: 400px;
703
+ overflow-y: auto;
704
+ pointer-events: auto;
705
+ z-index: 20;
706
+ }
707
+
708
+ .vibeflow-task-tooltip .task-card {
709
+ margin: 4px 0;
710
+ }
711
+
712
+ .vibeflow-task-tooltip .task-card:first-child {
713
+ margin-top: 0;
714
+ }
715
+
716
+ /* ── Tooltip close button (shown when tooltip is pinned) ─────────── */
717
+ .tooltip-close-btn {
718
+ position: absolute;
719
+ top: 6px;
720
+ right: 6px;
721
+ background: none;
722
+ border: none;
723
+ color: #64748b;
724
+ font-size: 14px;
725
+ cursor: pointer;
726
+ padding: 2px 5px;
727
+ border-radius: 3px;
728
+ line-height: 1;
729
+ pointer-events: auto;
730
+ }
731
+
732
+ .tooltip-close-btn:hover { background: #334155; color: #e2e8f0; }
733
+
734
+ .vibeflow-task-tooltip { position: relative; }
735
+
736
+ /* ── Sidebar legend / filter toggles ─────────────────────────────── */
737
+ .sidebar-legend {
738
+ display: flex;
739
+ gap: 6px;
740
+ flex-wrap: wrap;
741
+ margin-bottom: 12px;
742
+ padding-bottom: 10px;
743
+ border-bottom: 1px solid #1e293b;
744
+ }
745
+
746
+ .legend-toggle {
747
+ display: flex;
748
+ align-items: center;
749
+ gap: 4px;
750
+ padding: 3px 10px;
751
+ border-radius: 4px;
752
+ font-size: 11px;
753
+ font-weight: 500;
754
+ cursor: pointer;
755
+ border: 1px solid #334155;
756
+ background: #0f172a;
757
+ color: #64748b;
758
+ transition: all 0.1s;
759
+ pointer-events: auto;
760
+ line-height: 1.4;
761
+ }
762
+
763
+ .legend-toggle.active {
764
+ background: #1e293b;
765
+ color: #e2e8f0;
766
+ border-color: #475569;
767
+ }
768
+
769
+ .legend-toggle:hover { background: #1e293b; color: #cbd5e1; }
770
+
771
+ /* ── Page / variant switcher ────────────────────────────────────── */
772
+ .vibeflow-page-switcher {
773
+ position: fixed;
774
+ bottom: 16px;
775
+ left: 50%;
776
+ transform: translateX(-50%);
777
+ display: flex;
778
+ align-items: center;
779
+ gap: 4px;
780
+ background: #0f172a;
781
+ border: 1px solid #1e293b;
782
+ border-radius: 8px;
783
+ padding: 5px 10px;
784
+ font-size: 12px;
785
+ pointer-events: auto;
786
+ user-select: none;
787
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
788
+ max-width: 80vw;
789
+ overflow-x: auto;
790
+ }
791
+
792
+ .page-switcher-label {
793
+ color: #64748b;
794
+ margin-right: 4px;
795
+ flex-shrink: 0;
796
+ }
797
+
798
+ .page-tab {
799
+ color: #94a3b8;
800
+ text-decoration: none;
801
+ padding: 3px 8px;
802
+ border-radius: 5px;
803
+ white-space: nowrap;
804
+ transition: background 0.15s, color 0.15s;
805
+ }
806
+
807
+ .page-tab:hover { background: #1e293b; color: #e2e8f0; }
808
+
809
+ .page-tab.active {
810
+ background: #1e40af;
811
+ color: #e2e8f0;
812
+ font-weight: 600;
813
+ }
814
+
815
+ /* ── Full-screen edit modal ─────────────────────────────────────── */
816
+ .vibeflow-modal-backdrop {
817
+ position: fixed;
818
+ inset: 0;
819
+ background: rgba(0, 0, 0, 0.7);
820
+ display: flex;
821
+ align-items: center;
822
+ justify-content: center;
823
+ pointer-events: auto;
824
+ z-index: 10;
825
+ }
826
+
827
+ .vibeflow-modal {
828
+ background: #060d18;
829
+ border: 1px solid #1e293b;
830
+ border-radius: 12px;
831
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
832
+ width: min(860px, 92vw);
833
+ height: min(620px, 88vh);
834
+ display: flex;
835
+ flex-direction: column;
836
+ pointer-events: auto;
837
+ overflow: hidden;
838
+ }
839
+
840
+ /* Narrower modal for the overlay add task (kanban-style) */
841
+ .vibeflow-modal.overlay-add-modal {
842
+ width: min(540px, 92vw);
843
+ height: auto;
844
+ max-height: min(600px, 88vh);
845
+ }
846
+
847
+ .overlay-modal-header {
848
+ background: #060d18;
849
+ border-bottom: 1px solid #1e293b;
850
+ }
851
+
852
+ .modal-header {
853
+ display: flex;
854
+ align-items: center;
855
+ gap: 10px;
856
+ padding: 12px 16px 10px;
857
+ border-bottom: 1px solid #1e293b;
858
+ flex-shrink: 0;
859
+ background: #060d18;
860
+ }
861
+
862
+ .modal-header input[type="text"] {
863
+ flex: 1;
864
+ padding: 6px 10px;
865
+ background: #0f172a;
866
+ border: 1px solid #1e293b;
867
+ border-radius: 6px;
868
+ color: #e2e8f0;
869
+ font-size: 15px;
870
+ font-weight: 500;
871
+ font-family: system-ui, sans-serif;
872
+ text-align: center;
873
+ }
874
+
875
+ .modal-header input[type="text"]:focus {
876
+ outline: none;
877
+ border-color: #3b82f6;
878
+ box-shadow: 0 0 0 2px rgba(59,130,246,0.25);
879
+ }
880
+
881
+ .modal-header select {
882
+ padding: 6px 8px;
883
+ background: #0f172a;
884
+ border: 1px solid #1e293b;
885
+ border-radius: 6px;
886
+ color: #e2e8f0;
887
+ font-size: 13px;
888
+ font-family: system-ui, sans-serif;
889
+ cursor: pointer;
890
+ }
891
+
892
+ .modal-tabs {
893
+ display: flex;
894
+ gap: 0;
895
+ padding: 0 16px;
896
+ border-bottom: 1px solid #334155;
897
+ flex-shrink: 0;
898
+ }
899
+
900
+ .modal-tab {
901
+ padding: 8px 16px;
902
+ font-size: 13px;
903
+ color: #64748b;
904
+ border-bottom: 2px solid transparent;
905
+ cursor: pointer;
906
+ user-select: none;
907
+ margin-bottom: -1px;
908
+ }
909
+
910
+ .modal-tab:hover { color: #94a3b8; }
911
+
912
+ .modal-tab.active {
913
+ color: #60a5fa;
914
+ border-bottom-color: #3b82f6;
915
+ font-weight: 500;
916
+ }
917
+
918
+ .modal-body {
919
+ flex: 1;
920
+ display: flex;
921
+ flex-direction: column;
922
+ overflow: hidden;
923
+ padding: 12px 16px;
924
+ gap: 8px;
925
+ }
926
+
927
+ .modal-editor-pane,
928
+ .modal-preview-pane {
929
+ flex: 1;
930
+ overflow: auto;
931
+ }
932
+
933
+ .modal-editor-pane textarea {
934
+ width: 100%;
935
+ height: 100%;
936
+ min-height: 0;
937
+ background: #0f172a;
938
+ border: 1px solid #334155;
939
+ border-radius: 6px;
940
+ color: #e2e8f0;
941
+ font-size: 13px;
942
+ font-family: 'Menlo', 'Monaco', 'Courier New', monospace;
943
+ line-height: 1.6;
944
+ padding: 12px;
945
+ resize: none;
946
+ outline: none;
947
+ }
948
+
949
+ .modal-editor-pane textarea:focus {
950
+ border-color: #3b82f6;
951
+ box-shadow: 0 0 0 2px rgba(59,130,246,0.15);
952
+ }
953
+
954
+ .modal-preview-pane {
955
+ background: #0f172a;
956
+ border: 1px solid #334155;
957
+ border-radius: 6px;
958
+ padding: 16px;
959
+ color: #e2e8f0;
960
+ font-size: 14px;
961
+ line-height: 1.7;
962
+ }
963
+
964
+ .modal-preview-pane h1,
965
+ .modal-preview-pane h2,
966
+ .modal-preview-pane h3 { font-weight: 700; margin: 0.8em 0 0.3em; }
967
+ .modal-preview-pane h1 { font-size: 1.4em; color: #f1f5f9; }
968
+ .modal-preview-pane h2 { font-size: 1.2em; color: #f1f5f9; }
969
+ .modal-preview-pane h3 { font-size: 1.05em; color: #cbd5e1; }
970
+ .modal-preview-pane p { margin: 0.5em 0; }
971
+ .modal-preview-pane strong { font-weight: 700; color: #f1f5f9; }
972
+ .modal-preview-pane em { font-style: italic; color: #94a3b8; }
973
+ .modal-preview-pane code {
974
+ font-family: 'Menlo', monospace;
975
+ font-size: 12px;
976
+ background: #1e293b;
977
+ padding: 1px 5px;
978
+ border-radius: 3px;
979
+ color: #7dd3fc;
980
+ }
981
+ .modal-preview-pane pre {
982
+ background: #1e293b;
983
+ border-radius: 6px;
984
+ padding: 10px 12px;
985
+ overflow-x: auto;
986
+ margin: 0.6em 0;
987
+ }
988
+ .modal-preview-pane pre code {
989
+ background: none;
990
+ padding: 0;
991
+ color: #93c5fd;
992
+ font-size: 12px;
993
+ line-height: 1.5;
994
+ }
995
+ .modal-preview-pane ul, .modal-preview-pane ol {
996
+ padding-left: 20px;
997
+ margin: 0.4em 0;
998
+ }
999
+ .modal-preview-pane li { margin: 0.2em 0; }
1000
+ .modal-preview-pane hr {
1001
+ border: none;
1002
+ border-top: 1px solid #334155;
1003
+ margin: 0.8em 0;
1004
+ }
1005
+ .modal-preview-empty {
1006
+ color: #475569;
1007
+ font-style: italic;
1008
+ }
1009
+
1010
+ .modal-footer {
1011
+ display: flex;
1012
+ align-items: center;
1013
+ justify-content: space-between;
1014
+ gap: 8px;
1015
+ padding: 10px 16px 14px;
1016
+ border-top: 1px solid #334155;
1017
+ flex-shrink: 0;
1018
+ }
1019
+
1020
+ .modal-footer-left { display: flex; gap: 8px; align-items: center; }
1021
+ .modal-footer-right { display: flex; gap: 8px; align-items: center; }
1022
+
1023
+ /* Modal footer buttons */
1024
+ .modal-footer button {
1025
+ padding: 7px 18px;
1026
+ border-radius: 7px;
1027
+ font-size: 13px;
1028
+ font-family: system-ui, sans-serif;
1029
+ font-weight: 500;
1030
+ cursor: pointer;
1031
+ border: 1px solid #334155;
1032
+ background: #1e293b;
1033
+ color: #cbd5e1;
1034
+ transition: background 0.12s, border-color 0.12s;
1035
+ }
1036
+
1037
+ .modal-footer button:hover { background: #334155; }
1038
+
1039
+ /* Button variants — showcase: overlay-showcase.html → [data-vibeflow-id="showcase-buttons"] */
1040
+ .modal-footer button.btn-primary {
1041
+ background: #2563eb;
1042
+ color: #fff;
1043
+ border-color: #1d4ed8;
1044
+ padding: 7px 24px;
1045
+ }
1046
+ .modal-footer button.btn-primary:hover { background: #1d4ed8; }
1047
+
1048
+ .modal-footer button.btn-ghost {
1049
+ background: transparent;
1050
+ border-color: #334155;
1051
+ color: #64748b;
1052
+ }
1053
+ .modal-footer button.btn-ghost:hover { background: #1e293b; color: #94a3b8; border-color: #475569; }
1054
+
1055
+ .modal-footer button.btn-screenshot {
1056
+ font-size: 12px;
1057
+ padding: 6px 14px;
1058
+ background: transparent;
1059
+ border: 1px dashed #334155;
1060
+ color: #64748b;
1061
+ }
1062
+ .modal-footer button.btn-screenshot:hover { border-color: #475569; color: #94a3b8; background: #1e293b; }
1063
+
1064
+ /* ── Screenshot section in edit modal ────────────────────────────────── */
1065
+ .modal-screenshot-section {
1066
+ padding: 0 16px 10px;
1067
+ flex-shrink: 0;
1068
+ }
1069
+
1070
+ /* Screenshot components — showcase: overlay-showcase.html → [data-vibeflow-id="showcase-screenshots"] */
1071
+ .screenshot-container {
1072
+ position: relative;
1073
+ display: inline-flex;
1074
+ border-radius: 8px;
1075
+ overflow: hidden;
1076
+ border: 1px solid #334155;
1077
+ background: #0f172a;
1078
+ max-width: 100%;
1079
+ }
1080
+
1081
+ .screenshot-container img {
1082
+ display: block;
1083
+ max-width: 100%;
1084
+ max-height: 140px;
1085
+ object-fit: contain;
1086
+ }
1087
+
1088
+ .screenshot-remove-overlay {
1089
+ position: absolute;
1090
+ inset: 0;
1091
+ background: rgba(0, 0, 0, 0.55);
1092
+ opacity: 0;
1093
+ transition: opacity 0.15s;
1094
+ display: flex;
1095
+ align-items: center;
1096
+ justify-content: center;
1097
+ pointer-events: none;
1098
+ }
1099
+
1100
+ .screenshot-container:hover .screenshot-remove-overlay { opacity: 1; pointer-events: auto; }
1101
+
1102
+ .screenshot-remove-overlay button {
1103
+ background: rgba(239, 68, 68, 0.9);
1104
+ border: none;
1105
+ color: #fff;
1106
+ padding: 5px 12px;
1107
+ border-radius: 6px;
1108
+ font-size: 12px;
1109
+ font-weight: 500;
1110
+ cursor: pointer;
1111
+ }
1112
+
1113
+ .screenshot-remove-overlay button:hover { background: #ef4444; }
1114
+
1115
+ /* ── Screenshot thumbnail in sidebar task cards ───────────────────────── */
1116
+ .task-screenshot-thumb {
1117
+ margin-top: 6px;
1118
+ border-radius: 5px;
1119
+ overflow: hidden;
1120
+ border: 1px solid #1e293b;
1121
+ position: relative;
1122
+ }
1123
+
1124
+ .task-screenshot-thumb img {
1125
+ display: block;
1126
+ width: 100%;
1127
+ max-height: 72px;
1128
+ object-fit: cover;
1129
+ object-position: top;
1130
+ }
1131
+
1132
+ .task-screenshot-thumb:hover .screenshot-remove-overlay { opacity: 1; pointer-events: auto; }
1133
+
1134
+ /* ── In-progress task card — blue highlight + spinner ─────────────────── */
1135
+ .task-card.in-progress {
1136
+ border-color: rgba(59, 130, 246, 0.4);
1137
+ background: rgba(59, 130, 246, 0.08);
1138
+ }
1139
+
1140
+ .task-card.in-progress:hover {
1141
+ border-color: rgba(59, 130, 246, 0.6);
1142
+ background: rgba(59, 130, 246, 0.12);
1143
+ }
1144
+
1145
+ @keyframes vibeflow-spin {
1146
+ to { transform: rotate(360deg); }
1147
+ }
1148
+
1149
+ .task-spinner {
1150
+ display: inline-block;
1151
+ width: 11px;
1152
+ height: 11px;
1153
+ border: 2px solid rgba(59, 130, 246, 0.25);
1154
+ border-top-color: #3b82f6;
1155
+ border-radius: 50%;
1156
+ animation: vibeflow-spin 0.7s linear infinite;
1157
+ flex-shrink: 0;
1158
+ }
1159
+
1160
+ /* ── Other-pages hint in sidebar ─────────────────────────────────────── */
1161
+ .other-pages-hint {
1162
+ text-align: center;
1163
+ font-size: 11px;
1164
+ color: #475569;
1165
+ padding: 8px 0 4px;
1166
+ border-top: 1px solid #1e293b;
1167
+ margin-top: 8px;
1168
+ }
1169
+
1170
+ /* ── Source pointer row in popover ───────────────────────────────────── */
1171
+ /* Shown below the popover header when Tier 1 source info is available. */
1172
+ .popover-source {
1173
+ display: flex;
1174
+ align-items: center;
1175
+ gap: 6px;
1176
+ padding: 4px 14px;
1177
+ background: #0a1628;
1178
+ border-bottom: 1px solid #1e293b;
1179
+ font-family: 'SF Mono', 'Fira Code', 'Menlo', monospace;
1180
+ font-size: 10px;
1181
+ color: #4b6584;
1182
+ min-height: 0;
1183
+ line-height: 1.4;
1184
+ }
1185
+
1186
+ .popover-source:empty { display: none; }
1187
+
1188
+ .popover-source a {
1189
+ color: #38bdf8;
1190
+ text-decoration: none;
1191
+ }
1192
+
1193
+ .popover-source a:hover { text-decoration: underline; }
1194
+
1195
+ .popover-source-sep {
1196
+ color: #334155;
1197
+ }
1198
+
1199
+ /* ── Source row in modal footer ─────────────────────────────────────── */
1200
+ /* Minimalistic file:line label between the left and right footer groups. */
1201
+ .modal-source-row {
1202
+ flex: 1;
1203
+ display: flex;
1204
+ align-items: center;
1205
+ justify-content: center;
1206
+ gap: 4px;
1207
+ font-family: 'SF Mono', 'Fira Code', 'Menlo', monospace;
1208
+ font-size: 10px;
1209
+ color: #475569;
1210
+ overflow: hidden;
1211
+ }
1212
+
1213
+ .modal-source-label {
1214
+ white-space: nowrap;
1215
+ overflow: hidden;
1216
+ text-overflow: ellipsis;
1217
+ max-width: 220px;
1218
+ }
1219
+
1220
+ .modal-source-link {
1221
+ color: #38bdf8;
1222
+ text-decoration: none;
1223
+ font-size: 11px;
1224
+ flex-shrink: 0;
1225
+ }
1226
+
1227
+ .modal-source-link:hover { opacity: 0.75; }
1228
+
1229
+ /* ── Inspect Element Modal ───────────────────────────────────────────── */
1230
+ .vibeflow-inspect-modal {
1231
+ background: #060d1a;
1232
+ border: 1px solid #1e293b;
1233
+ border-radius: 14px;
1234
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
1235
+ width: min(640px, 92vw);
1236
+ display: flex;
1237
+ flex-direction: column;
1238
+ pointer-events: auto;
1239
+ overflow: hidden;
1240
+ max-height: 80vh;
1241
+ }
1242
+
1243
+ .inspect-header {
1244
+ display: flex;
1245
+ align-items: center;
1246
+ justify-content: space-between;
1247
+ padding: 12px 16px;
1248
+ background: #080f1e;
1249
+ border-bottom: 1px solid #1e293b;
1250
+ flex-shrink: 0;
1251
+ }
1252
+
1253
+ .inspect-heading {
1254
+ display: flex;
1255
+ align-items: center;
1256
+ gap: 8px;
1257
+ }
1258
+
1259
+ .inspect-tag {
1260
+ font-family: 'Menlo', 'Monaco', monospace;
1261
+ font-size: 12px;
1262
+ color: #7dd3fc;
1263
+ background: rgba(56, 189, 248, 0.08);
1264
+ border: 1px solid rgba(56, 189, 248, 0.2);
1265
+ border-radius: 4px;
1266
+ padding: 1px 6px;
1267
+ }
1268
+
1269
+ .inspect-title {
1270
+ font-size: 12px;
1271
+ font-weight: 600;
1272
+ color: #cbd5e1;
1273
+ }
1274
+
1275
+ .inspect-close {
1276
+ background: none;
1277
+ border: none;
1278
+ color: #64748b;
1279
+ font-size: 14px;
1280
+ cursor: pointer;
1281
+ padding: 2px 6px;
1282
+ border-radius: 4px;
1283
+ line-height: 1;
1284
+ transition: background 0.1s, color 0.1s;
1285
+ }
1286
+
1287
+ .inspect-close:hover { background: #334155; color: #e2e8f0; }
1288
+
1289
+ .inspect-rows {
1290
+ padding: 10px 14px;
1291
+ display: flex;
1292
+ flex-direction: column;
1293
+ gap: 5px;
1294
+ overflow-y: auto;
1295
+ flex: 1;
1296
+ }
1297
+
1298
+ .inspect-row {
1299
+ display: flex;
1300
+ align-items: baseline;
1301
+ gap: 8px;
1302
+ padding: 4px 0;
1303
+ border-bottom: 1px solid rgba(30, 41, 59, 0.55);
1304
+ }
1305
+
1306
+ .inspect-row:last-child { border-bottom: none; }
1307
+
1308
+ .inspect-row-label {
1309
+ font-size: 10px;
1310
+ font-weight: 600;
1311
+ color: #475569;
1312
+ text-transform: uppercase;
1313
+ letter-spacing: 0.04em;
1314
+ min-width: 82px;
1315
+ flex-shrink: 0;
1316
+ }
1317
+
1318
+ .inspect-row-value {
1319
+ font-family: 'SF Mono', 'Fira Code', 'Menlo', monospace;
1320
+ font-size: 10px;
1321
+ color: #cbd5e1;
1322
+ word-break: break-all;
1323
+ flex: 1;
1324
+ line-height: 1.5;
1325
+ background: rgba(5, 13, 26, 0.9);
1326
+ border: 1px solid #1e293b;
1327
+ border-radius: 3px;
1328
+ padding: 2px 6px;
1329
+ }
1330
+
1331
+ .inspect-copy-btn,
1332
+ .vibeflow-inspect-modal a.inspect-copy-btn {
1333
+ background: none;
1334
+ border: 1px solid #334155;
1335
+ color: #64748b;
1336
+ font-size: 11px;
1337
+ padding: 2px 6px;
1338
+ border-radius: 4px;
1339
+ cursor: pointer;
1340
+ line-height: 1.4;
1341
+ flex-shrink: 0;
1342
+ text-decoration: none;
1343
+ transition: background 0.1s, color 0.1s;
1344
+ }
1345
+
1346
+ .inspect-copy-btn:hover,
1347
+ .vibeflow-inspect-modal a.inspect-copy-btn:hover { background: #334155; color: #e2e8f0; }
1348
+
1349
+ .inspect-footer {
1350
+ padding: 10px 14px;
1351
+ border-top: 1px solid #1e293b;
1352
+ flex-shrink: 0;
1353
+ display: flex;
1354
+ justify-content: flex-end;
1355
+ }
1356
+
1357
+ .inspect-copy-all-btn {
1358
+ background: #2563eb;
1359
+ border: 1px solid #1d4ed8;
1360
+ color: #ffffff;
1361
+ font-size: 12px;
1362
+ font-weight: 500;
1363
+ padding: 5px 14px;
1364
+ border-radius: 6px;
1365
+ cursor: pointer;
1366
+ transition: background 0.12s, border-color 0.12s;
1367
+ }
1368
+
1369
+ .inspect-copy-all-btn:hover { background: #1d4ed8; border-color: #1e40af; }
1370
+
1371
+ /* ── React Quality Badge (⚠ replaces drag-grip icon; color range by quality) ──── */
1372
+ @keyframes rq-pulse {
1373
+ 0%, 100% { opacity: 1; }
1374
+ 50% { opacity: 0.55; }
1375
+ }
1376
+
1377
+ /* 'none' → red: production React build, no fiber context */
1378
+ .popover-drag-handle--quality-none {
1379
+ color: #ef4444;
1380
+ cursor: pointer;
1381
+ animation: rq-pulse 2s ease-in-out infinite;
1382
+ }
1383
+ .popover-drag-handle--quality-none:hover { color: #fca5a5; background: rgba(239, 68, 68, 0.12); animation: none; }
1384
+
1385
+ /* 'partial' → amber: React with component name only, no source file */
1386
+ .popover-drag-handle--quality-partial {
1387
+ color: #f59e0b;
1388
+ cursor: pointer;
1389
+ animation: rq-pulse 3s ease-in-out infinite;
1390
+ }
1391
+ .popover-drag-handle--quality-partial:hover { color: #fcd34d; background: rgba(245, 158, 11, 0.12); animation: none; }
1392
+
1393
+ /* ── React Quality Modal ─────────────────────────────────────────────── */
1394
+ .vibeflow-rq-overlay {
1395
+ position: fixed;
1396
+ inset: 0;
1397
+ background: rgba(2, 12, 27, 0.75);
1398
+ backdrop-filter: blur(6px);
1399
+ display: flex;
1400
+ align-items: center;
1401
+ justify-content: center;
1402
+ z-index: 10000;
1403
+ pointer-events: all;
1404
+ padding: 20px;
1405
+ }
1406
+ .vibeflow-rq-modal {
1407
+ background: #1e293b;
1408
+ border: 1px solid rgba(255,255,255,0.1);
1409
+ border-radius: 16px;
1410
+ width: 480px;
1411
+ max-width: 100%;
1412
+ max-height: 80vh;
1413
+ overflow-y: auto;
1414
+ position: relative;
1415
+ box-shadow: 0 24px 64px rgba(0,0,0,0.6);
1416
+ font-size: 13px;
1417
+ color: #e2e8f0;
1418
+ }
1419
+ .rq-close {
1420
+ position: absolute;
1421
+ top: 14px;
1422
+ right: 14px;
1423
+ background: transparent;
1424
+ border: none;
1425
+ color: rgba(255,255,255,0.4);
1426
+ cursor: pointer;
1427
+ font-size: 15px;
1428
+ line-height: 1;
1429
+ padding: 4px;
1430
+ }
1431
+ .rq-close:hover { color: rgba(255,255,255,0.8); }
1432
+ .rq-header { padding: 24px 24px 0; }
1433
+ .rq-heading {
1434
+ font-size: 15px;
1435
+ font-weight: 700;
1436
+ color: #f1f5f9;
1437
+ margin-bottom: 16px;
1438
+ }
1439
+ .rq-levels {
1440
+ display: flex;
1441
+ gap: 8px;
1442
+ margin-bottom: 0;
1443
+ }
1444
+ .rq-level {
1445
+ flex: 1;
1446
+ padding: 10px;
1447
+ border-radius: 10px;
1448
+ text-align: center;
1449
+ border: 1px solid rgba(255,255,255,0.06);
1450
+ background: rgba(255,255,255,0.02);
1451
+ }
1452
+ .rq-level--active {
1453
+ border-color: rgba(245,158,11,0.4);
1454
+ background: rgba(245,158,11,0.06);
1455
+ }
1456
+ .rq-level-icon { font-size: 18px; margin-bottom: 4px; }
1457
+ .rq-level-label { font-size: 11px; font-weight: 700; margin-bottom: 3px; }
1458
+ .rq-level-desc { font-size: 10px; color: rgba(255,255,255,0.45); line-height: 1.4; }
1459
+ .rq-body { padding: 16px 24px 4px; }
1460
+ .rq-section-title {
1461
+ font-size: 10px;
1462
+ font-weight: 700;
1463
+ color: rgba(255,255,255,0.35);
1464
+ text-transform: uppercase;
1465
+ letter-spacing: 0.06em;
1466
+ margin: 12px 0 8px;
1467
+ }
1468
+ .rq-feature {
1469
+ display: flex;
1470
+ align-items: flex-start;
1471
+ gap: 10px;
1472
+ margin-bottom: 8px;
1473
+ }
1474
+ .rq-feature-icon { font-size: 14px; flex-shrink: 0; margin-top: 1px; }
1475
+ .rq-feature-text strong { color: #f1f5f9; }
1476
+ .rq-feature-text span { color: rgba(255,255,255,0.55); }
1477
+ .rq-note {
1478
+ font-size: 12px;
1479
+ color: rgba(255,255,255,0.55);
1480
+ line-height: 1.6;
1481
+ background: rgba(255,255,255,0.03);
1482
+ border: 1px solid rgba(255,255,255,0.06);
1483
+ border-radius: 8px;
1484
+ padding: 10px 12px;
1485
+ margin: 8px 0;
1486
+ }
1487
+ .rq-note--amber {
1488
+ background: rgba(245,158,11,0.06);
1489
+ border-color: rgba(245,158,11,0.2);
1490
+ color: rgba(252,211,77,0.85);
1491
+ }
1492
+ .rq-note--success {
1493
+ background: rgba(74,222,128,0.06);
1494
+ border-color: rgba(74,222,128,0.2);
1495
+ color: rgba(74,222,128,0.9);
1496
+ }
1497
+ .rq-codeblock {
1498
+ background: #0f172a;
1499
+ border: 1px solid rgba(255,255,255,0.08);
1500
+ border-radius: 8px;
1501
+ padding: 12px 14px;
1502
+ margin: 8px 0;
1503
+ overflow-x: auto;
1504
+ font-family: 'SF Mono', 'Menlo', monospace;
1505
+ font-size: 11px;
1506
+ color: #7dd3fc;
1507
+ line-height: 1.7;
1508
+ white-space: pre;
1509
+ }
1510
+ .rq-footer {
1511
+ padding: 16px 24px;
1512
+ border-top: 1px solid rgba(255,255,255,0.06);
1513
+ display: flex;
1514
+ gap: 10px;
1515
+ justify-content: flex-end;
1516
+ }
1517
+ .rq-btn {
1518
+ padding: 9px 18px;
1519
+ border-radius: 8px;
1520
+ border: none;
1521
+ font-size: 13px;
1522
+ font-weight: 600;
1523
+ cursor: pointer;
1524
+ transition: background 0.12s;
1525
+ }
1526
+ .rq-btn-secondary {
1527
+ background: #334155;
1528
+ color: rgba(255,255,255,0.7);
1529
+ }
1530
+ .rq-btn-secondary:hover { background: #475569; }