backpack-viewer 0.2.7 → 0.2.9

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.
package/dist/style.css ADDED
@@ -0,0 +1,914 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ /* --- Theme Variables --- */
8
+
9
+ :root {
10
+ --bg: #141414;
11
+ --bg-surface: #1a1a1a;
12
+ --bg-hover: #222222;
13
+ --bg-active: #2a2a2a;
14
+ --bg-elevated: #1e1e1e;
15
+ --bg-inset: #111111;
16
+ --border: #2a2a2a;
17
+ --text: #d4d4d4;
18
+ --text-strong: #e5e5e5;
19
+ --text-muted: #737373;
20
+ --text-dim: #525252;
21
+ --accent: #d4a27f;
22
+ --accent-hover: #e8b898;
23
+ --badge-text: #141414;
24
+ --glass-bg: rgba(20, 20, 20, 0.85);
25
+ --glass-border: rgba(255, 255, 255, 0.08);
26
+ --chip-bg: rgba(42, 42, 42, 0.7);
27
+ --chip-bg-active: rgba(42, 42, 42, 0.9);
28
+ --chip-bg-hover: rgba(50, 50, 50, 0.9);
29
+ --chip-border-active: rgba(255, 255, 255, 0.06);
30
+
31
+ --shadow: rgba(0, 0, 0, 0.6);
32
+ --shadow-strong: rgba(0, 0, 0, 0.5);
33
+ /* Canvas colors */
34
+ --canvas-edge: rgba(255, 255, 255, 0.08);
35
+ --canvas-edge-highlight: rgba(212, 162, 127, 0.5);
36
+ --canvas-edge-dim: rgba(255, 255, 255, 0.03);
37
+ --canvas-edge-label: rgba(255, 255, 255, 0.2);
38
+ --canvas-edge-label-highlight: rgba(212, 162, 127, 0.7);
39
+ --canvas-edge-label-dim: rgba(255, 255, 255, 0.05);
40
+ --canvas-arrow: rgba(255, 255, 255, 0.12);
41
+ --canvas-arrow-highlight: rgba(212, 162, 127, 0.5);
42
+ --canvas-node-label: #a3a3a3;
43
+ --canvas-node-label-dim: rgba(212, 212, 212, 0.2);
44
+ --canvas-type-badge: rgba(115, 115, 115, 0.5);
45
+ --canvas-type-badge-dim: rgba(115, 115, 115, 0.15);
46
+ --canvas-selection-border: #d4d4d4;
47
+ --canvas-node-border: rgba(255, 255, 255, 0.15);
48
+ }
49
+
50
+ [data-theme="light"] {
51
+ --bg: #f5f5f4;
52
+ --bg-surface: #fafaf9;
53
+ --bg-hover: #f0efee;
54
+ --bg-active: #e7e5e4;
55
+ --bg-elevated: #f0efee;
56
+ --bg-inset: #e7e5e4;
57
+ --border: #d6d3d1;
58
+ --text: #292524;
59
+ --text-strong: #1c1917;
60
+ --text-muted: #78716c;
61
+ --text-dim: #a8a29e;
62
+ --accent: #c17856;
63
+ --accent-hover: #b07a5e;
64
+ --badge-text: #fafaf9;
65
+ --glass-bg: rgba(250, 250, 249, 0.85);
66
+ --glass-border: rgba(0, 0, 0, 0.08);
67
+ --chip-bg: rgba(214, 211, 209, 0.5);
68
+ --chip-bg-active: rgba(214, 211, 209, 0.8);
69
+ --chip-bg-hover: rgba(200, 197, 195, 0.8);
70
+ --chip-border-active: rgba(0, 0, 0, 0.08);
71
+
72
+ --shadow: rgba(0, 0, 0, 0.1);
73
+ --shadow-strong: rgba(0, 0, 0, 0.15);
74
+ /* Canvas colors */
75
+ --canvas-edge: rgba(0, 0, 0, 0.1);
76
+ --canvas-edge-highlight: rgba(193, 120, 86, 0.6);
77
+ --canvas-edge-dim: rgba(0, 0, 0, 0.03);
78
+ --canvas-edge-label: rgba(0, 0, 0, 0.25);
79
+ --canvas-edge-label-highlight: rgba(193, 120, 86, 0.8);
80
+ --canvas-edge-label-dim: rgba(0, 0, 0, 0.06);
81
+ --canvas-arrow: rgba(0, 0, 0, 0.15);
82
+ --canvas-arrow-highlight: rgba(193, 120, 86, 0.6);
83
+ --canvas-node-label: #57534e;
84
+ --canvas-node-label-dim: rgba(87, 83, 78, 0.2);
85
+ --canvas-type-badge: rgba(87, 83, 78, 0.5);
86
+ --canvas-type-badge-dim: rgba(87, 83, 78, 0.15);
87
+ --canvas-selection-border: #292524;
88
+ --canvas-node-border: rgba(0, 0, 0, 0.1);
89
+ }
90
+
91
+ body {
92
+ font-family: system-ui, -apple-system, sans-serif;
93
+ background: var(--bg);
94
+ color: var(--text);
95
+ overflow: hidden;
96
+ }
97
+
98
+ #app {
99
+ display: flex;
100
+ height: 100vh;
101
+ width: 100vw;
102
+ }
103
+
104
+ /* --- Sidebar --- */
105
+
106
+ #sidebar {
107
+ width: 280px;
108
+ min-width: 280px;
109
+ background: var(--bg-surface);
110
+ border-right: 1px solid var(--border);
111
+ display: flex;
112
+ flex-direction: column;
113
+ padding: 16px;
114
+ overflow-y: auto;
115
+ }
116
+
117
+ #sidebar h2 {
118
+ font-size: 13px;
119
+ font-weight: 600;
120
+ text-transform: uppercase;
121
+ letter-spacing: 0.05em;
122
+ color: var(--text-muted);
123
+ margin-bottom: 14px;
124
+ }
125
+
126
+ #sidebar input {
127
+ width: 100%;
128
+ padding: 8px 12px;
129
+ border: 1px solid var(--border);
130
+ border-radius: 6px;
131
+ background: var(--bg);
132
+ color: var(--text);
133
+ font-size: 13px;
134
+ outline: none;
135
+ margin-bottom: 12px;
136
+ }
137
+
138
+ #sidebar input:focus {
139
+ border-color: var(--accent);
140
+ }
141
+
142
+ #sidebar input::placeholder {
143
+ color: var(--text-dim);
144
+ }
145
+
146
+ #ontology-list {
147
+ list-style: none;
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: 2px;
151
+ }
152
+
153
+ .ontology-item {
154
+ padding: 10px 12px;
155
+ border-radius: 6px;
156
+ cursor: pointer;
157
+ transition: background 0.15s;
158
+ }
159
+
160
+ .ontology-item:hover {
161
+ background: var(--bg-hover);
162
+ }
163
+
164
+ .ontology-item.active {
165
+ background: var(--bg-active);
166
+ }
167
+
168
+ .ontology-item .name {
169
+ display: block;
170
+ font-size: 13px;
171
+ font-weight: 500;
172
+ color: var(--text);
173
+ }
174
+
175
+ .ontology-item .stats {
176
+ display: block;
177
+ font-size: 11px;
178
+ color: var(--text-dim);
179
+ margin-top: 2px;
180
+ }
181
+
182
+ .sidebar-edit-btn {
183
+ position: absolute;
184
+ right: 8px;
185
+ top: 10px;
186
+ background: none;
187
+ border: none;
188
+ color: var(--text-dim);
189
+ font-size: 11px;
190
+ cursor: pointer;
191
+ opacity: 0;
192
+ transition: opacity 0.1s;
193
+ }
194
+
195
+ .ontology-item {
196
+ position: relative;
197
+ }
198
+
199
+ .ontology-item:hover .sidebar-edit-btn {
200
+ opacity: 0.7;
201
+ }
202
+
203
+ .sidebar-edit-btn:hover {
204
+ opacity: 1 !important;
205
+ color: var(--text);
206
+ }
207
+
208
+ .sidebar-rename-input {
209
+ background: transparent;
210
+ border: none;
211
+ border-bottom: 1px solid var(--accent);
212
+ color: var(--text);
213
+ font: inherit;
214
+ font-size: 13px;
215
+ font-weight: 500;
216
+ outline: none;
217
+ width: 100%;
218
+ padding: 0;
219
+ }
220
+
221
+ /* --- Sidebar Footer --- */
222
+
223
+ .sidebar-footer {
224
+ margin-top: auto;
225
+ padding-top: 16px;
226
+ border-top: 1px solid var(--border);
227
+ text-align: center;
228
+ }
229
+
230
+ .sidebar-footer a {
231
+ display: block;
232
+ font-size: 12px;
233
+ font-weight: 500;
234
+ color: var(--accent);
235
+ text-decoration: none;
236
+ margin-bottom: 4px;
237
+ }
238
+
239
+ .sidebar-footer a:hover {
240
+ color: var(--accent-hover);
241
+ }
242
+
243
+ .sidebar-footer span {
244
+ display: block;
245
+ font-size: 10px;
246
+ color: var(--text-dim);
247
+ }
248
+
249
+ /* --- Theme Toggle --- */
250
+
251
+ .theme-toggle {
252
+ position: absolute;
253
+ top: 16px;
254
+ right: 16px;
255
+ z-index: 30;
256
+ background: var(--bg-surface);
257
+ border: 1px solid var(--border);
258
+ border-radius: 8px;
259
+ color: var(--text-muted);
260
+ font-size: 18px;
261
+ cursor: pointer;
262
+ padding: 6px 10px;
263
+ line-height: 1;
264
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
265
+ box-shadow: 0 2px 8px var(--shadow);
266
+ }
267
+
268
+ .theme-toggle:hover {
269
+ color: var(--text);
270
+ border-color: var(--text-muted);
271
+ background: var(--bg-hover);
272
+ }
273
+
274
+ /* --- Zoom Controls --- */
275
+
276
+ .zoom-controls {
277
+ position: absolute;
278
+ top: 16px;
279
+ right: 16px;
280
+ z-index: 30;
281
+ display: flex;
282
+ gap: 4px;
283
+ transition: right 0.2s ease;
284
+ }
285
+
286
+ /* Shift left when theme toggle is present (standalone viewer) */
287
+ .theme-toggle ~ .zoom-controls {
288
+ right: 58px;
289
+ }
290
+
291
+ .zoom-btn {
292
+ background: var(--bg-surface);
293
+ border: 1px solid var(--border);
294
+ border-radius: 8px;
295
+ color: var(--text-muted);
296
+ font-size: 18px;
297
+ cursor: pointer;
298
+ padding: 6px 10px;
299
+ line-height: 1;
300
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
301
+ box-shadow: 0 2px 8px var(--shadow);
302
+ }
303
+
304
+ .zoom-btn:hover {
305
+ color: var(--text);
306
+ border-color: var(--text-muted);
307
+ background: var(--bg-hover);
308
+ }
309
+
310
+ /* --- Canvas --- */
311
+
312
+ #canvas-container {
313
+ flex: 1;
314
+ position: relative;
315
+ overflow: hidden;
316
+ }
317
+
318
+ #graph-canvas {
319
+ position: absolute;
320
+ top: 0;
321
+ left: 0;
322
+ width: 100%;
323
+ height: 100%;
324
+ cursor: grab;
325
+ }
326
+
327
+ #graph-canvas:active {
328
+ cursor: grabbing;
329
+ }
330
+
331
+ /* --- Search Overlay --- */
332
+
333
+ .search-overlay {
334
+ position: absolute;
335
+ top: 16px;
336
+ left: 50%;
337
+ transform: translateX(-50%);
338
+ z-index: 20;
339
+ display: flex;
340
+ flex-direction: column;
341
+ align-items: center;
342
+ gap: 8px;
343
+ max-height: calc(100vh - 48px);
344
+ pointer-events: none;
345
+ }
346
+
347
+ .search-overlay > * {
348
+ pointer-events: auto;
349
+ }
350
+
351
+ .search-overlay.hidden {
352
+ display: none;
353
+ }
354
+
355
+ .search-input-wrap {
356
+ position: relative;
357
+ width: 380px;
358
+ max-width: calc(100vw - 340px);
359
+ }
360
+
361
+ .search-input {
362
+ width: 100%;
363
+ padding: 10px 16px;
364
+ padding-right: 36px;
365
+ border: 1px solid var(--glass-border);
366
+ border-radius: 10px;
367
+ background: var(--glass-bg);
368
+ backdrop-filter: blur(12px);
369
+ -webkit-backdrop-filter: blur(12px);
370
+ color: var(--text);
371
+ font-size: 14px;
372
+ outline: none;
373
+ transition: border-color 0.15s, box-shadow 0.15s;
374
+ }
375
+
376
+ .search-input:focus {
377
+ border-color: rgba(212, 162, 127, 0.4);
378
+ box-shadow: 0 0 0 3px rgba(212, 162, 127, 0.1);
379
+ }
380
+
381
+ .search-input::placeholder {
382
+ color: var(--text-dim);
383
+ }
384
+
385
+ .search-kbd {
386
+ position: absolute;
387
+ right: 10px;
388
+ top: 50%;
389
+ transform: translateY(-50%);
390
+ padding: 2px 7px;
391
+ border: 1px solid var(--border);
392
+ border-radius: 4px;
393
+ background: var(--bg-surface);
394
+ color: var(--text-dim);
395
+ font-size: 11px;
396
+ font-family: monospace;
397
+ pointer-events: none;
398
+ }
399
+
400
+ .search-kbd.hidden {
401
+ display: none;
402
+ }
403
+
404
+ /* Search results dropdown */
405
+
406
+ .search-results {
407
+ list-style: none;
408
+ width: 380px;
409
+ max-width: calc(100vw - 340px);
410
+ background: var(--glass-bg);
411
+ backdrop-filter: blur(12px);
412
+ -webkit-backdrop-filter: blur(12px);
413
+ border: 1px solid var(--border);
414
+ border-radius: 10px;
415
+ overflow: hidden;
416
+ box-shadow: 0 8px 32px var(--shadow-strong);
417
+ }
418
+
419
+ .search-results.hidden {
420
+ display: none;
421
+ }
422
+
423
+ .search-result-item {
424
+ display: flex;
425
+ align-items: center;
426
+ gap: 8px;
427
+ padding: 8px 14px;
428
+ cursor: pointer;
429
+ transition: background 0.1s;
430
+ }
431
+
432
+ .search-result-item:hover {
433
+ background: var(--bg-hover);
434
+ }
435
+
436
+ .search-result-dot {
437
+ width: 8px;
438
+ height: 8px;
439
+ border-radius: 50%;
440
+ flex-shrink: 0;
441
+ }
442
+
443
+ .search-result-label {
444
+ font-size: 13px;
445
+ color: var(--text);
446
+ flex: 1;
447
+ overflow: hidden;
448
+ text-overflow: ellipsis;
449
+ white-space: nowrap;
450
+ }
451
+
452
+ .search-result-type {
453
+ font-size: 11px;
454
+ color: var(--text-dim);
455
+ flex-shrink: 0;
456
+ }
457
+
458
+ /* Type filter chips */
459
+
460
+ .type-chips {
461
+ display: flex;
462
+ flex-wrap: wrap;
463
+ gap: 4px;
464
+ justify-content: center;
465
+ max-width: 500px;
466
+ max-height: 200px;
467
+ overflow-y: auto;
468
+ padding: 4px;
469
+ border-radius: 10px;
470
+ }
471
+
472
+ .type-chip {
473
+ display: flex;
474
+ align-items: center;
475
+ gap: 4px;
476
+ padding: 3px 10px;
477
+ border: 1px solid transparent;
478
+ border-radius: 12px;
479
+ background: var(--chip-bg);
480
+ color: var(--text-dim);
481
+ font-size: 11px;
482
+ cursor: pointer;
483
+ transition: all 0.15s;
484
+ white-space: nowrap;
485
+ }
486
+
487
+ .type-chip.active {
488
+ background: var(--chip-bg-active);
489
+ color: var(--text-muted);
490
+ border-color: var(--chip-border-active);
491
+ }
492
+
493
+ .type-chip:hover {
494
+ background: var(--chip-bg-hover);
495
+ }
496
+
497
+ .type-chip-dot {
498
+ width: 6px;
499
+ height: 6px;
500
+ border-radius: 50%;
501
+ flex-shrink: 0;
502
+ }
503
+
504
+ .type-chip:not(.active) .type-chip-dot {
505
+ opacity: 0.3;
506
+ }
507
+
508
+ /* --- Info Panel --- */
509
+
510
+ .info-panel {
511
+ position: absolute;
512
+ top: 56px;
513
+ right: 16px;
514
+ width: 360px;
515
+ max-height: calc(100vh - 72px);
516
+ background: var(--bg-surface);
517
+ border: 1px solid var(--border);
518
+ border-radius: 10px;
519
+ overflow-y: auto;
520
+ padding: 20px;
521
+ z-index: 10;
522
+ box-shadow: 0 8px 32px var(--shadow);
523
+ transition: top 0.25s ease, right 0.25s ease, bottom 0.25s ease,
524
+ left 0.25s ease, width 0.25s ease, max-height 0.25s ease,
525
+ border-radius 0.25s ease;
526
+ }
527
+
528
+ .info-panel.hidden {
529
+ display: none;
530
+ }
531
+
532
+ .info-panel.info-panel-maximized {
533
+ top: 0;
534
+ right: 0;
535
+ bottom: 0;
536
+ left: 0;
537
+ width: auto;
538
+ max-height: none;
539
+ border-radius: 0;
540
+ z-index: 40;
541
+ }
542
+
543
+ /* --- Toolbar (back, forward, maximize, close) --- */
544
+
545
+ .info-panel-toolbar {
546
+ position: absolute;
547
+ top: 12px;
548
+ right: 14px;
549
+ display: flex;
550
+ align-items: center;
551
+ gap: 2px;
552
+ z-index: 1;
553
+ }
554
+
555
+ .info-toolbar-btn {
556
+ background: none;
557
+ border: none;
558
+ color: var(--text-muted);
559
+ font-size: 16px;
560
+ cursor: pointer;
561
+ padding: 4px 6px;
562
+ line-height: 1;
563
+ border-radius: 4px;
564
+ transition: color 0.15s, background 0.15s;
565
+ }
566
+
567
+ .info-toolbar-btn:hover:not(:disabled) {
568
+ color: var(--text);
569
+ background: var(--bg-hover);
570
+ }
571
+
572
+ .info-toolbar-btn:disabled {
573
+ color: var(--text-dim);
574
+ cursor: default;
575
+ opacity: 0.3;
576
+ }
577
+
578
+ .info-close-btn {
579
+ font-size: 20px;
580
+ }
581
+
582
+ /* --- Clickable connections --- */
583
+
584
+ .info-connection-link {
585
+ cursor: pointer;
586
+ transition: background 0.15s;
587
+ }
588
+
589
+ .info-connection-link:hover {
590
+ background: var(--bg-active);
591
+ }
592
+
593
+ .info-connection-link .info-target {
594
+ color: var(--accent);
595
+ text-decoration: underline;
596
+ text-decoration-color: transparent;
597
+ transition: text-decoration-color 0.15s;
598
+ }
599
+
600
+ .info-connection-link:hover .info-target {
601
+ text-decoration-color: var(--accent);
602
+ }
603
+
604
+ /* Header */
605
+
606
+ .info-header {
607
+ margin-bottom: 16px;
608
+ }
609
+
610
+ .info-type-badge {
611
+ display: inline-block;
612
+ padding: 3px 10px;
613
+ border-radius: 12px;
614
+ font-size: 11px;
615
+ font-weight: 600;
616
+ color: var(--badge-text);
617
+ margin-bottom: 8px;
618
+ }
619
+
620
+ .info-label {
621
+ font-size: 18px;
622
+ font-weight: 600;
623
+ color: var(--text-strong);
624
+ margin-bottom: 4px;
625
+ word-break: break-word;
626
+ }
627
+
628
+ .info-id {
629
+ display: block;
630
+ font-size: 11px;
631
+ color: var(--text-dim);
632
+ font-family: monospace;
633
+ }
634
+
635
+ /* Sections */
636
+
637
+ .info-section {
638
+ margin-bottom: 16px;
639
+ }
640
+
641
+ .info-section-title {
642
+ font-size: 11px;
643
+ font-weight: 600;
644
+ text-transform: uppercase;
645
+ letter-spacing: 0.05em;
646
+ color: var(--text-muted);
647
+ margin-bottom: 8px;
648
+ padding-bottom: 4px;
649
+ border-bottom: 1px solid var(--border);
650
+ }
651
+
652
+ /* Properties */
653
+
654
+ .info-props {
655
+ display: grid;
656
+ grid-template-columns: auto 1fr;
657
+ gap: 4px 12px;
658
+ }
659
+
660
+ .info-props dt {
661
+ font-size: 12px;
662
+ color: var(--text-muted);
663
+ padding-top: 2px;
664
+ }
665
+
666
+ .info-props dd {
667
+ font-size: 12px;
668
+ color: var(--text);
669
+ word-break: break-word;
670
+ display: flex;
671
+ align-items: center;
672
+ gap: 4px;
673
+ }
674
+
675
+ .info-value {
676
+ white-space: pre-wrap;
677
+ }
678
+
679
+ .info-array {
680
+ display: flex;
681
+ flex-wrap: wrap;
682
+ gap: 4px;
683
+ }
684
+
685
+ .info-tag {
686
+ display: inline-block;
687
+ padding: 2px 8px;
688
+ background: var(--bg-hover);
689
+ border-radius: 4px;
690
+ font-size: 11px;
691
+ color: var(--text-muted);
692
+ }
693
+
694
+ .info-json {
695
+ font-size: 11px;
696
+ font-family: monospace;
697
+ color: var(--text-muted);
698
+ background: var(--bg-inset);
699
+ padding: 6px 8px;
700
+ border-radius: 4px;
701
+ overflow-x: auto;
702
+ white-space: pre;
703
+ }
704
+
705
+ /* Connections */
706
+
707
+ .info-connections {
708
+ list-style: none;
709
+ display: flex;
710
+ flex-direction: column;
711
+ gap: 6px;
712
+ }
713
+
714
+ .info-connection {
715
+ display: flex;
716
+ align-items: center;
717
+ gap: 6px;
718
+ padding: 6px 8px;
719
+ background: var(--bg-elevated);
720
+ border-radius: 6px;
721
+ font-size: 12px;
722
+ flex-wrap: wrap;
723
+ }
724
+
725
+ .info-target-dot {
726
+ width: 8px;
727
+ height: 8px;
728
+ border-radius: 50%;
729
+ flex-shrink: 0;
730
+ }
731
+
732
+ .info-arrow {
733
+ color: var(--text-dim);
734
+ font-size: 14px;
735
+ flex-shrink: 0;
736
+ }
737
+
738
+ .info-edge-type {
739
+ color: var(--text-muted);
740
+ font-size: 11px;
741
+ font-weight: 500;
742
+ }
743
+
744
+ .info-target {
745
+ color: var(--text);
746
+ font-weight: 500;
747
+ }
748
+
749
+ .info-edge-props {
750
+ width: 100%;
751
+ padding-top: 4px;
752
+ padding-left: 20px;
753
+ }
754
+
755
+ .info-edge-prop {
756
+ display: block;
757
+ font-size: 11px;
758
+ color: var(--text-dim);
759
+ }
760
+
761
+ /* Editing controls */
762
+
763
+ .info-editable {
764
+ cursor: default;
765
+ position: relative;
766
+ }
767
+
768
+ .info-inline-edit {
769
+ background: none;
770
+ border: none;
771
+ color: var(--badge-text);
772
+ opacity: 0;
773
+ font-size: 10px;
774
+ cursor: pointer;
775
+ margin-left: 4px;
776
+ transition: opacity 0.15s;
777
+ }
778
+
779
+ .info-editable:hover .info-inline-edit {
780
+ opacity: 0.8;
781
+ }
782
+
783
+ .info-inline-edit:hover {
784
+ opacity: 1 !important;
785
+ }
786
+
787
+ .info-edit-inline-input {
788
+ background: transparent;
789
+ border: none;
790
+ border-bottom: 1px solid var(--accent);
791
+ color: var(--badge-text);
792
+ font: inherit;
793
+ font-size: inherit;
794
+ outline: none;
795
+ width: 100%;
796
+ padding: 0;
797
+ }
798
+
799
+ .info-edit-input {
800
+ background: var(--bg-inset);
801
+ border: 1px solid var(--border);
802
+ border-radius: 4px;
803
+ padding: 3px 6px;
804
+ font-size: 12px;
805
+ color: var(--text);
806
+ flex: 1;
807
+ min-width: 0;
808
+ }
809
+
810
+ .info-edit-input:focus {
811
+ outline: none;
812
+ border-color: var(--accent);
813
+ }
814
+
815
+ .info-delete-prop {
816
+ background: none;
817
+ border: none;
818
+ color: var(--text-dim);
819
+ font-size: 14px;
820
+ cursor: pointer;
821
+ padding: 0 2px;
822
+ flex-shrink: 0;
823
+ opacity: 0;
824
+ transition: opacity 0.1s, color 0.1s;
825
+ }
826
+
827
+ .info-props dd:hover .info-delete-prop {
828
+ opacity: 1;
829
+ }
830
+
831
+ .info-delete-prop:hover {
832
+ color: #ef4444;
833
+ }
834
+
835
+ .info-add-btn {
836
+ background: none;
837
+ border: 1px dashed var(--border);
838
+ border-radius: 4px;
839
+ padding: 6px 10px;
840
+ font-size: 12px;
841
+ color: var(--text-dim);
842
+ cursor: pointer;
843
+ width: 100%;
844
+ margin-top: 8px;
845
+ transition: border-color 0.15s, color 0.15s;
846
+ }
847
+
848
+ .info-add-btn:hover {
849
+ border-color: var(--accent);
850
+ color: var(--text);
851
+ }
852
+
853
+ .info-add-row {
854
+ display: flex;
855
+ gap: 4px;
856
+ margin-top: 6px;
857
+ }
858
+
859
+ .info-add-save {
860
+ background: var(--accent);
861
+ border: none;
862
+ border-radius: 4px;
863
+ padding: 3px 10px;
864
+ font-size: 12px;
865
+ color: var(--badge-text);
866
+ cursor: pointer;
867
+ flex-shrink: 0;
868
+ }
869
+
870
+ .info-add-save:hover {
871
+ background: var(--accent-hover);
872
+ }
873
+
874
+ .info-delete-edge {
875
+ background: none;
876
+ border: none;
877
+ color: var(--text-dim);
878
+ font-size: 14px;
879
+ cursor: pointer;
880
+ margin-left: auto;
881
+ padding: 0 2px;
882
+ opacity: 0;
883
+ transition: opacity 0.1s, color 0.1s;
884
+ }
885
+
886
+ .info-connection:hover .info-delete-edge {
887
+ opacity: 1;
888
+ }
889
+
890
+ .info-delete-edge:hover {
891
+ color: #ef4444;
892
+ }
893
+
894
+ .info-danger {
895
+ margin-top: 8px;
896
+ padding-top: 12px;
897
+ border-top: 1px solid var(--border);
898
+ }
899
+
900
+ .info-delete-node {
901
+ background: none;
902
+ border: 1px solid rgba(239, 68, 68, 0.3);
903
+ border-radius: 6px;
904
+ padding: 6px 12px;
905
+ font-size: 12px;
906
+ color: #ef4444;
907
+ cursor: pointer;
908
+ width: 100%;
909
+ transition: background 0.15s;
910
+ }
911
+
912
+ .info-delete-node:hover {
913
+ background: rgba(239, 68, 68, 0.1);
914
+ }