@qnote/q-ai-note 1.0.2 → 1.0.4

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 (40) hide show
  1. package/dist/server/aiClient.d.ts.map +1 -1
  2. package/dist/server/aiClient.js +7 -0
  3. package/dist/server/aiClient.js.map +1 -1
  4. package/dist/server/api/chat.d.ts.map +1 -1
  5. package/dist/server/api/chat.js +3 -0
  6. package/dist/server/api/chat.js.map +1 -1
  7. package/dist/server/api/nodeEntities.d.ts +3 -0
  8. package/dist/server/api/nodeEntities.d.ts.map +1 -0
  9. package/dist/server/api/nodeEntities.js +116 -0
  10. package/dist/server/api/nodeEntities.js.map +1 -0
  11. package/dist/server/api/settings.d.ts.map +1 -1
  12. package/dist/server/api/settings.js +16 -1
  13. package/dist/server/api/settings.js.map +1 -1
  14. package/dist/server/config.d.ts +3 -2
  15. package/dist/server/config.d.ts.map +1 -1
  16. package/dist/server/config.js +6 -1
  17. package/dist/server/config.js.map +1 -1
  18. package/dist/server/index.d.ts.map +1 -1
  19. package/dist/server/index.js +2 -0
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/nodeEntitiesStore.d.ts +78 -0
  22. package/dist/server/nodeEntitiesStore.d.ts.map +1 -0
  23. package/dist/server/nodeEntitiesStore.js +196 -0
  24. package/dist/server/nodeEntitiesStore.js.map +1 -0
  25. package/dist/server/react/agent.d.ts +3 -0
  26. package/dist/server/react/agent.d.ts.map +1 -1
  27. package/dist/server/react/agent.js +132 -2
  28. package/dist/server/react/agent.js.map +1 -1
  29. package/dist/server/react/prompts.d.ts +1 -0
  30. package/dist/server/react/prompts.d.ts.map +1 -1
  31. package/dist/server/react/prompts.js +25 -4
  32. package/dist/server/react/prompts.js.map +1 -1
  33. package/dist/server/react/tools.d.ts.map +1 -1
  34. package/dist/server/react/tools.js +105 -0
  35. package/dist/server/react/tools.js.map +1 -1
  36. package/dist/web/app.js +872 -57
  37. package/dist/web/index.html +78 -1
  38. package/dist/web/styles.css +783 -33
  39. package/dist/web/vueRenderers.js +228 -13
  40. package/package.json +1 -1
@@ -83,11 +83,13 @@ body {
83
83
  .content {
84
84
  flex: 1;
85
85
  margin-left: 220px;
86
- padding: 24px 32px;
87
- max-width: 1400px;
86
+ width: calc(100vw - 220px);
87
+ padding: 24px;
88
88
  }
89
89
 
90
90
  .page {
91
+ max-width: 1560px;
92
+ margin: 0 auto;
91
93
  animation: fadeIn 0.2s ease;
92
94
  }
93
95
 
@@ -169,6 +171,20 @@ h2 {
169
171
  gap: 8px;
170
172
  }
171
173
 
174
+ .inline-checkbox {
175
+ display: inline-flex;
176
+ align-items: center;
177
+ gap: 4px;
178
+ font-size: 12px;
179
+ color: var(--text-secondary);
180
+ user-select: none;
181
+ }
182
+
183
+ .inline-checkbox input[type="checkbox"] {
184
+ width: 14px;
185
+ height: 14px;
186
+ }
187
+
172
188
  .insight-box {
173
189
  background: #eef3fd;
174
190
  border: 1px solid #c6d5f8;
@@ -213,6 +229,13 @@ h2 {
213
229
  color: var(--text-secondary);
214
230
  }
215
231
 
232
+ .change-target {
233
+ background: #f1f3f4;
234
+ border: 1px solid var(--border);
235
+ border-radius: 999px;
236
+ padding: 1px 8px;
237
+ }
238
+
216
239
  .change-type {
217
240
  font-size: 11px;
218
241
  border-radius: 8px;
@@ -331,15 +354,24 @@ h2 {
331
354
  .work-tree {
332
355
  flex: 1;
333
356
  overflow-y: auto;
334
- padding: 8px;
357
+ padding: 4px;
358
+ display: flex;
359
+ flex-direction: column;
360
+ align-items: flex-start;
361
+ gap: 8px;
335
362
  }
336
363
 
337
364
  /* Parent Node Card */
338
365
  .tree-parent-card {
366
+ display: inline-flex;
367
+ flex-direction: column;
368
+ align-items: flex-start;
369
+ width: fit-content;
370
+ max-width: 100%;
339
371
  background: var(--bg);
340
372
  border: 1px solid var(--border);
341
- border-radius: 12px;
342
- margin-bottom: 12px;
373
+ border-radius: 10px;
374
+ margin-bottom: 8px;
343
375
  overflow: visible;
344
376
  }
345
377
 
@@ -347,13 +379,22 @@ h2 {
347
379
  position: relative;
348
380
  display: flex;
349
381
  align-items: center;
350
- gap: 10px;
351
- padding: 12px 14px;
382
+ justify-content: flex-start;
383
+ gap: 8px;
384
+ padding: 8px 10px;
352
385
  background: linear-gradient(135deg, #f8f9fa 0%, #fff 100%);
353
386
  cursor: pointer;
354
387
  transition: background 0.2s;
355
388
  }
356
389
 
390
+ .tree-parent-card.collapsed .tree-parent-header {
391
+ border-left: 3px solid #d0d7e2;
392
+ }
393
+
394
+ .tree-parent-card.expanded .tree-parent-header {
395
+ border-left: 3px solid #8ab4f8;
396
+ }
397
+
357
398
  .tree-parent-header:focus-visible,
358
399
  .tree-leaf-node:focus-visible {
359
400
  outline: 2px solid #c2dbff;
@@ -369,10 +410,47 @@ h2 {
369
410
  height: 10px;
370
411
  }
371
412
 
413
+ .node-expand-btn {
414
+ width: 20px;
415
+ height: 20px;
416
+ border-radius: 6px;
417
+ border: 1px solid var(--border);
418
+ background: #fff;
419
+ color: var(--text-secondary);
420
+ cursor: pointer;
421
+ display: inline-flex;
422
+ align-items: center;
423
+ justify-content: center;
424
+ flex-shrink: 0;
425
+ transition: all 0.15s ease;
426
+ }
427
+
428
+ .node-expand-btn svg {
429
+ width: 14px;
430
+ height: 14px;
431
+ transform: rotate(0deg);
432
+ transition: transform 0.15s ease;
433
+ }
434
+
435
+ .node-expand-btn.expanded svg {
436
+ transform: rotate(90deg);
437
+ }
438
+
439
+ .node-expand-btn:hover {
440
+ border-color: #9fb8e7;
441
+ background: #eef4ff;
442
+ color: #1a53b8;
443
+ }
444
+
372
445
  .tree-parent-header .node-name {
373
- flex: 1;
446
+ flex: 0 1 auto;
447
+ min-width: 0;
448
+ max-width: 460px;
374
449
  font-weight: 600;
375
- font-size: 15px;
450
+ font-size: 14px;
451
+ white-space: nowrap;
452
+ overflow: hidden;
453
+ text-overflow: ellipsis;
376
454
  }
377
455
 
378
456
  .tree-parent-header .node-meta {
@@ -384,20 +462,27 @@ h2 {
384
462
  }
385
463
 
386
464
  .tree-parent-children {
387
- padding: 8px 14px 14px 28px;
388
- display: flex;
465
+ padding: 6px 10px 10px 14px;
466
+ display: inline-flex;
389
467
  flex-direction: column;
468
+ align-items: flex-start;
469
+ width: fit-content;
470
+ max-width: 100%;
390
471
  gap: 6px;
391
472
  border-top: 1px dashed var(--border);
392
- background: #fafafa;
473
+ background: #fcfcfc;
393
474
  }
394
475
 
395
476
  /* Child Node (non-leaf) */
396
477
  .tree-child-node {
478
+ width: fit-content;
479
+ min-width: 220px;
480
+ max-width: min(100%, 680px);
397
481
  display: flex;
398
482
  align-items: center;
399
- gap: 8px;
400
- padding: 8px 12px;
483
+ gap: 6px;
484
+ min-height: 42px;
485
+ padding: 8px 10px;
401
486
  border-radius: 8px;
402
487
  background: white;
403
488
  border: 1px solid var(--border);
@@ -415,9 +500,14 @@ h2 {
415
500
  }
416
501
 
417
502
  .tree-child-node .node-name {
418
- flex: 1;
503
+ flex: 0 1 auto;
504
+ min-width: 0;
505
+ max-width: 360px;
419
506
  font-size: 13px;
420
507
  font-weight: 500;
508
+ white-space: nowrap;
509
+ overflow: hidden;
510
+ text-overflow: ellipsis;
421
511
  }
422
512
 
423
513
  .tree-child-node .node-meta {
@@ -429,26 +519,233 @@ h2 {
429
519
  .tree-leaf-container {
430
520
  display: flex;
431
521
  flex-direction: column;
432
- gap: 8px;
433
- padding: 10px 8px 2px;
522
+ gap: 6px;
523
+ padding: 6px 2px 2px;
434
524
  background: linear-gradient(180deg, #f5f5f5 0%, #fafafa 100%);
435
525
  border-top: 1px dashed var(--border);
436
- margin-top: 4px;
526
+ margin-top: 2px;
437
527
  width: 100%;
438
528
  }
439
529
 
440
530
  .tree-leaf-grid {
441
531
  display: grid;
442
- grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
532
+ grid-template-columns: repeat(1, minmax(220px, 1fr));
443
533
  gap: 8px;
444
534
  width: 100%;
445
535
  }
446
536
 
537
+ .tree-root-mixed-grid {
538
+ display: grid;
539
+ grid-template-columns: repeat(1, minmax(0, 1fr));
540
+ gap: 10px;
541
+ grid-auto-flow: dense;
542
+ align-items: start;
543
+ width: 100%;
544
+ }
545
+
546
+ .root-grid-item {
547
+ min-width: 0;
548
+ }
549
+
550
+ .tree-root-mixed-grid .root-grid-item.branch > .tree-parent-card {
551
+ width: 100%;
552
+ }
553
+
554
+ .tree-root-mixed-grid .root-grid-item.leaf > .tree-leaf-node {
555
+ width: 100%;
556
+ min-width: 0;
557
+ max-width: none;
558
+ }
559
+
560
+ /* Dense tree mode */
561
+ .dense-tree {
562
+ width: 100%;
563
+ border: 1px solid #e7ebf1;
564
+ border-radius: 8px;
565
+ background: #fff;
566
+ padding: 6px;
567
+ }
568
+
569
+ .dense-tree.dense-vertical {
570
+ display: flex;
571
+ flex-direction: column;
572
+ gap: 2px;
573
+ }
574
+
575
+ .dense-tree.dense-horizontal {
576
+ display: flex;
577
+ gap: 14px;
578
+ align-items: flex-start;
579
+ overflow-x: auto;
580
+ overflow-y: auto;
581
+ padding-bottom: 6px;
582
+ }
583
+
584
+ .dense-lane-board {
585
+ flex-wrap: nowrap;
586
+ }
587
+
588
+ .dense-lane {
589
+ min-width: var(--lane-width, 220px);
590
+ width: var(--lane-width, 220px);
591
+ flex: 0 0 var(--lane-width, 220px);
592
+ border-right: 1px solid #eef2f7;
593
+ padding-right: 10px;
594
+ padding-left: 2px;
595
+ }
596
+
597
+ .dense-lane:last-child {
598
+ border-right: none;
599
+ padding-right: 0;
600
+ }
601
+
602
+ .dense-lane-body {
603
+ width: 100%;
604
+ min-width: 0;
605
+ }
606
+
607
+ .dense-svg-node {
608
+ pointer-events: auto;
609
+ display: flex;
610
+ align-items: center;
611
+ gap: 4px;
612
+ min-height: 26px;
613
+ border-radius: 4px;
614
+ padding: 1px 6px;
615
+ border: 1px solid transparent;
616
+ background: rgba(255, 255, 255, 0.92);
617
+ cursor: pointer;
618
+ }
619
+
620
+ .dense-svg-node:hover {
621
+ border-color: #d4e3fb;
622
+ background: #f7faff;
623
+ }
624
+
625
+ .dense-svg-node:focus-visible {
626
+ outline: 2px solid #c2dbff;
627
+ outline-offset: 1px;
628
+ }
629
+
630
+ .dense-expand-btn {
631
+ width: 16px;
632
+ height: 16px;
633
+ border-radius: 4px;
634
+ }
635
+
636
+ .dense-expand-placeholder {
637
+ width: 16px;
638
+ height: 16px;
639
+ display: inline-block;
640
+ flex-shrink: 0;
641
+ }
642
+
643
+ .dense-link-path {
644
+ stroke: #9bb3d8;
645
+ stroke-width: 1.25;
646
+ fill: none;
647
+ vector-effect: non-scaling-stroke;
648
+ }
649
+
650
+ .dense-node-name {
651
+ flex: 0 1 auto;
652
+ min-width: 0;
653
+ max-width: var(--lane-name-max, 154px);
654
+ font-size: 12px;
655
+ font-weight: 500;
656
+ white-space: nowrap;
657
+ overflow: hidden;
658
+ text-overflow: ellipsis;
659
+ }
660
+
661
+ .lane-tree-node-main {
662
+ display: flex;
663
+ flex-direction: column;
664
+ gap: 1px;
665
+ min-width: 0;
666
+ }
667
+
668
+ .lane-tree-title-line {
669
+ display: inline-flex;
670
+ align-items: center;
671
+ gap: 4px;
672
+ min-width: 0;
673
+ }
674
+
675
+ .lane-tree-summary-line {
676
+ display: inline-flex;
677
+ align-items: center;
678
+ gap: 4px;
679
+ min-height: 14px;
680
+ }
681
+
682
+ .lane-tree-node-main.stack-summary .dense-node-name {
683
+ max-width: calc(var(--lane-name-max, 154px) + 28px);
684
+ }
685
+
686
+ .lane-tree-node {
687
+ position: relative;
688
+ }
689
+
690
+ .lane-tree-node-row {
691
+ position: relative;
692
+ pointer-events: auto;
693
+ display: flex;
694
+ align-items: center;
695
+ gap: 4px;
696
+ min-height: 26px;
697
+ border-radius: 4px;
698
+ padding: 1px 6px;
699
+ border: 1px solid transparent;
700
+ background: rgba(255, 255, 255, 0.92);
701
+ cursor: pointer;
702
+ }
703
+
704
+ .lane-tree-node-row:hover {
705
+ border-color: #d4e3fb;
706
+ background: #f7faff;
707
+ }
708
+
709
+ .lane-tree-node-row:focus-visible {
710
+ outline: 2px solid #c2dbff;
711
+ outline-offset: 1px;
712
+ }
713
+
714
+ .lane-tree-children {
715
+ margin-left: 14px;
716
+ padding-left: 10px;
717
+ border-left: 1.2px solid #9bb3d8;
718
+ }
719
+
720
+ .lane-tree-node .lane-tree-node-row::before {
721
+ content: '';
722
+ position: absolute;
723
+ left: -10px;
724
+ top: 13px;
725
+ width: 10px;
726
+ height: 0;
727
+ border-top: 1.2px solid #9bb3d8;
728
+ }
729
+
730
+ .dense-lane > .dense-lane-body > .lane-tree-node > .lane-tree-node-row::before {
731
+ display: none;
732
+ }
733
+
734
+ .lane-tree-node-row:hover .node-actions,
735
+ .lane-tree-node-row:focus .node-actions,
736
+ .lane-tree-node-row:focus-within .node-actions {
737
+ opacity: 1;
738
+ transform: translateY(0) scale(1);
739
+ pointer-events: auto;
740
+ }
741
+
447
742
  /* Leaf Node Block */
448
743
  .tree-leaf-node {
449
744
  position: relative;
450
- min-width: 0;
451
- max-width: none;
745
+ width: 220px;
746
+ min-height: 40px;
747
+ min-width: 220px;
748
+ max-width: 220px;
452
749
  padding: 8px 10px;
453
750
  background: white;
454
751
  border: 1px solid var(--border);
@@ -462,10 +759,15 @@ h2 {
462
759
  overflow: visible;
463
760
  }
464
761
 
762
+ .tree-leaf-grid > .tree-leaf-node {
763
+ width: auto;
764
+ min-width: 0;
765
+ max-width: none;
766
+ }
767
+
465
768
  .tree-leaf-node:hover {
466
769
  border-color: var(--primary);
467
- transform: translateY(-2px);
468
- box-shadow: 0 4px 12px rgba(0,0,0,0.1);
770
+ box-shadow: 0 4px 10px rgba(0,0,0,0.1);
469
771
  }
470
772
 
471
773
  .tree-leaf-node .node-status {
@@ -479,17 +781,18 @@ h2 {
479
781
  font-size: 12px;
480
782
  font-weight: 500;
481
783
  display: inline-block;
482
- flex: 1;
784
+ flex: 0 1 auto;
785
+ max-width: 140px;
483
786
  overflow: hidden;
484
787
  text-overflow: ellipsis;
485
788
  white-space: nowrap;
486
789
  }
487
790
 
488
791
  .tree-leaf-node .node-name.short-name {
489
- overflow: visible;
490
- text-overflow: clip;
491
- white-space: normal;
492
- word-break: break-all;
792
+ overflow: hidden;
793
+ text-overflow: ellipsis;
794
+ white-space: nowrap;
795
+ word-break: break-word;
493
796
  }
494
797
 
495
798
  /* Node Actions */
@@ -557,6 +860,15 @@ h2 {
557
860
  background: var(--primary-hover);
558
861
  }
559
862
 
863
+ .node-action-btn.chat {
864
+ background: #eef3fd;
865
+ color: #1d4ed8;
866
+ }
867
+
868
+ .node-action-btn.chat:hover {
869
+ background: #dbe8ff;
870
+ }
871
+
560
872
  .node-status.pending { background: #9aa0a6; }
561
873
  .node-status.in_progress { background: var(--primary); }
562
874
  .node-status.done { background: var(--success); }
@@ -688,6 +1000,17 @@ h2 {
688
1000
  flex: 1;
689
1001
  }
690
1002
 
1003
+ .result-detail-list {
1004
+ margin-top: 6px;
1005
+ padding-left: 24px;
1006
+ }
1007
+
1008
+ .result-detail-item {
1009
+ font-size: 12px;
1010
+ color: var(--text-secondary);
1011
+ line-height: 1.4;
1012
+ }
1013
+
691
1014
  .btn-sm {
692
1015
  padding: 4px 10px;
693
1016
  font-size: 12px;
@@ -904,6 +1227,25 @@ h2 {
904
1227
  border-color: var(--primary);
905
1228
  }
906
1229
 
1230
+ .settings-kv-list {
1231
+ display: flex;
1232
+ flex-direction: column;
1233
+ gap: 8px;
1234
+ margin-bottom: 8px;
1235
+ }
1236
+
1237
+ .settings-kv-row {
1238
+ display: grid;
1239
+ grid-template-columns: 1fr 1fr auto;
1240
+ gap: 8px;
1241
+ align-items: center;
1242
+ }
1243
+
1244
+ .settings-kv-row .setting-header-key,
1245
+ .settings-kv-row .setting-header-value {
1246
+ width: 100%;
1247
+ }
1248
+
907
1249
  /* Dialog */
908
1250
  dialog {
909
1251
  position: fixed;
@@ -1050,25 +1392,359 @@ dialog::backdrop {
1050
1392
  /* Sandbox Layout - Left/Right */
1051
1393
  .sandbox-layout {
1052
1394
  display: grid;
1053
- grid-template-columns: minmax(0, 1fr) 320px;
1054
- gap: 12px;
1395
+ grid-template-columns: minmax(0, 72fr) minmax(280px, 28fr);
1396
+ gap: 16px;
1055
1397
  height: calc(100vh - 180px);
1056
- padding-right: 10px;
1398
+ padding-right: 8px;
1057
1399
  box-sizing: border-box;
1400
+ position: relative;
1401
+ }
1402
+
1403
+ .sandbox-layout.presentation-mode {
1404
+ grid-template-columns: minmax(0, 82fr) minmax(240px, 18fr);
1405
+ }
1406
+
1407
+ .sandbox-layout.is-fullscreen {
1408
+ grid-template-columns: minmax(0, 1fr);
1409
+ width: 100%;
1410
+ height: calc(100dvh - 178px);
1411
+ padding: 6px 8px 8px;
1412
+ background: transparent;
1413
+ align-items: stretch;
1414
+ }
1415
+
1416
+ .sandbox-layout.is-fullscreen .sandbox-tree-section,
1417
+ .sandbox-layout.is-fullscreen .sandbox-chat-section {
1418
+ min-height: 0;
1419
+ }
1420
+
1421
+ .sandbox-layout.is-fullscreen .sandbox-chat-section {
1422
+ display: none;
1423
+ }
1424
+
1425
+ #page-sandbox-detail:fullscreen {
1426
+ background: var(--bg-secondary);
1427
+ padding: 16px 24px 20px;
1428
+ overflow: auto;
1058
1429
  }
1059
1430
 
1060
1431
  .sandbox-tree-section {
1432
+ position: relative;
1061
1433
  width: 100%;
1062
1434
  min-width: 0;
1063
1435
  display: flex;
1064
1436
  flex-direction: column;
1065
1437
  background: var(--bg);
1066
1438
  border-radius: 12px;
1067
- padding: 16px;
1439
+ padding: 12px;
1068
1440
  box-shadow: var(--shadow);
1069
1441
  overflow: hidden;
1070
1442
  }
1071
1443
 
1444
+ .work-tree-legend {
1445
+ display: flex;
1446
+ align-items: center;
1447
+ gap: 8px;
1448
+ flex-wrap: wrap;
1449
+ margin: 0 8px 6px;
1450
+ font-size: 12px;
1451
+ color: var(--text-secondary);
1452
+ }
1453
+
1454
+ .work-tree-legend .legend-title {
1455
+ font-weight: 600;
1456
+ color: var(--text);
1457
+ }
1458
+
1459
+ .work-tree-legend .legend-chip {
1460
+ border: 1px solid var(--border);
1461
+ border-radius: 999px;
1462
+ padding: 1px 8px;
1463
+ background: #fff;
1464
+ font-weight: 600;
1465
+ color: #1a53b8;
1466
+ }
1467
+
1468
+ .work-tree-legend .legend-state {
1469
+ display: inline-flex;
1470
+ align-items: center;
1471
+ gap: 4px;
1472
+ }
1473
+
1474
+ .work-tree-legend .legend-state .dot {
1475
+ width: 8px;
1476
+ height: 8px;
1477
+ border-radius: 999px;
1478
+ display: inline-block;
1479
+ }
1480
+
1481
+ .work-tree-legend .legend-state.issue-open .dot {
1482
+ background: #d93025;
1483
+ }
1484
+
1485
+ .work-tree-legend .legend-state.issue-closed .dot {
1486
+ background: #1e8e3e;
1487
+ }
1488
+
1489
+ .node-entity-drawer {
1490
+ position: absolute;
1491
+ top: 0;
1492
+ right: 0;
1493
+ width: 420px;
1494
+ max-width: min(420px, calc(100% - 8px));
1495
+ height: 100%;
1496
+ max-height: none;
1497
+ overflow: auto;
1498
+ background: #fff;
1499
+ border: 1px solid var(--border);
1500
+ border-radius: 12px;
1501
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.18);
1502
+ padding: 12px;
1503
+ z-index: 5;
1504
+ }
1505
+
1506
+ .node-entity-drawer.hidden {
1507
+ display: none;
1508
+ }
1509
+
1510
+ .drawer-header {
1511
+ display: flex;
1512
+ justify-content: space-between;
1513
+ align-items: flex-start;
1514
+ margin-bottom: 10px;
1515
+ position: sticky;
1516
+ top: 0;
1517
+ background: #fff;
1518
+ z-index: 2;
1519
+ padding-bottom: 6px;
1520
+ }
1521
+
1522
+ .drawer-header-actions {
1523
+ display: flex;
1524
+ align-items: center;
1525
+ gap: 8px;
1526
+ }
1527
+
1528
+ .drawer-title {
1529
+ font-size: 14px;
1530
+ font-weight: 600;
1531
+ }
1532
+
1533
+ .drawer-subtitle {
1534
+ margin-top: 2px;
1535
+ font-size: 12px;
1536
+ color: var(--text-secondary);
1537
+ }
1538
+
1539
+ .summary-strip.compact {
1540
+ margin-bottom: 10px;
1541
+ gap: 8px;
1542
+ }
1543
+
1544
+ .summary-strip.compact .summary-card {
1545
+ min-width: 110px;
1546
+ flex: 1 1 110px;
1547
+ padding: 8px 10px;
1548
+ }
1549
+
1550
+ .summary-strip.compact .summary-card .value {
1551
+ font-size: 14px;
1552
+ }
1553
+
1554
+ .drawer-create-form {
1555
+ display: grid;
1556
+ gap: 8px;
1557
+ padding: 10px;
1558
+ background: #f8f9fb;
1559
+ border: 1px solid var(--border);
1560
+ border-radius: 10px;
1561
+ margin-bottom: 10px;
1562
+ }
1563
+
1564
+ .drawer-create-form.hidden {
1565
+ display: none;
1566
+ }
1567
+
1568
+ .entity-field-group.hidden {
1569
+ display: none;
1570
+ }
1571
+
1572
+ .entity-form-hint {
1573
+ font-size: 12px;
1574
+ color: var(--text-secondary);
1575
+ }
1576
+
1577
+ .entity-form-actions {
1578
+ display: flex;
1579
+ justify-content: flex-end;
1580
+ gap: 8px;
1581
+ }
1582
+
1583
+ .drawer-create-form input,
1584
+ .drawer-create-form select,
1585
+ .drawer-create-form textarea {
1586
+ width: 100%;
1587
+ border: 1px solid var(--border);
1588
+ border-radius: 8px;
1589
+ padding: 8px 10px;
1590
+ font-size: 13px;
1591
+ background: #fff;
1592
+ }
1593
+
1594
+ .drawer-list {
1595
+ display: grid;
1596
+ gap: 8px;
1597
+ }
1598
+
1599
+ .node-entity-mini-badges {
1600
+ display: inline-flex;
1601
+ align-items: center;
1602
+ gap: 4px;
1603
+ position: relative;
1604
+ }
1605
+
1606
+ .node-entity-mini-badges.blind-spot {
1607
+ opacity: 0.72;
1608
+ }
1609
+
1610
+ .node-entity-mini-badge {
1611
+ font-size: 10px;
1612
+ color: var(--text-secondary);
1613
+ border: 1px solid var(--border);
1614
+ border-radius: 999px;
1615
+ padding: 1px 6px;
1616
+ background: #fff;
1617
+ line-height: 1.3;
1618
+ }
1619
+
1620
+ .node-entity-mini-badge.active {
1621
+ border-color: #c7dafc;
1622
+ background: #e8f0fe;
1623
+ color: #1a53b8;
1624
+ }
1625
+
1626
+ .node-entity-mini-badges.blind-spot .node-entity-mini-badge {
1627
+ border-style: dashed;
1628
+ }
1629
+
1630
+ .node-entity-mini-badges.issue-open::after,
1631
+ .node-entity-mini-badges.issue-closed::after {
1632
+ content: '';
1633
+ width: 8px;
1634
+ height: 8px;
1635
+ border-radius: 999px;
1636
+ border: 1px solid #fff;
1637
+ position: absolute;
1638
+ top: -4px;
1639
+ right: -4px;
1640
+ }
1641
+
1642
+ .node-entity-mini-badges.issue-open::after {
1643
+ background: #d93025;
1644
+ }
1645
+
1646
+ .node-entity-mini-badges.issue-closed::after {
1647
+ background: #1e8e3e;
1648
+ }
1649
+
1650
+ .entity-filter-tabs {
1651
+ display: flex;
1652
+ flex-wrap: wrap;
1653
+ gap: 6px;
1654
+ margin-bottom: 10px;
1655
+ }
1656
+
1657
+ .entity-filter-tabs .btn.active {
1658
+ background: #e8f0fe;
1659
+ color: var(--primary);
1660
+ border-color: #c7dafc;
1661
+ }
1662
+
1663
+ .entity-card {
1664
+ border: 1px solid var(--border);
1665
+ border-radius: 10px;
1666
+ padding: 8px 10px;
1667
+ background: #fff;
1668
+ position: relative;
1669
+ }
1670
+
1671
+ .entity-card-header {
1672
+ display: flex;
1673
+ justify-content: space-between;
1674
+ align-items: center;
1675
+ gap: 8px;
1676
+ }
1677
+
1678
+ .entity-card-actions {
1679
+ display: inline-flex;
1680
+ gap: 6px;
1681
+ visibility: hidden;
1682
+ opacity: 0;
1683
+ transition: opacity 0.15s ease;
1684
+ }
1685
+
1686
+ .entity-card:hover .entity-card-actions,
1687
+ .entity-card:focus-within .entity-card-actions {
1688
+ visibility: visible;
1689
+ opacity: 1;
1690
+ }
1691
+
1692
+ .entity-type-pill {
1693
+ font-size: 11px;
1694
+ border-radius: 10px;
1695
+ padding: 2px 8px;
1696
+ background: #e8f0fe;
1697
+ color: #1a53b8;
1698
+ }
1699
+
1700
+ .entity-meta {
1701
+ margin-top: 4px;
1702
+ color: var(--text-secondary);
1703
+ font-size: 12px;
1704
+ }
1705
+
1706
+ .entity-status-pill {
1707
+ font-size: 11px;
1708
+ border-radius: 10px;
1709
+ padding: 1px 8px;
1710
+ margin-right: 6px;
1711
+ }
1712
+
1713
+ .entity-status-pill.open,
1714
+ .entity-status-pill.in_progress {
1715
+ background: #e8f0fe;
1716
+ color: #1a53b8;
1717
+ }
1718
+
1719
+ .entity-status-pill.blocked {
1720
+ background: #fce8e6;
1721
+ color: #b3261e;
1722
+ }
1723
+
1724
+ .entity-status-pill.resolved,
1725
+ .entity-status-pill.closed,
1726
+ .entity-status-pill.ready {
1727
+ background: #e6f4ea;
1728
+ color: #1e8e3e;
1729
+ }
1730
+
1731
+ .entity-status-pill.building {
1732
+ background: #fff7e0;
1733
+ color: #9a6700;
1734
+ }
1735
+
1736
+ .entity-content {
1737
+ margin-top: 6px;
1738
+ font-size: 13px;
1739
+ white-space: pre-wrap;
1740
+ line-height: 1.5;
1741
+ }
1742
+
1743
+ .entity-content a {
1744
+ color: var(--primary);
1745
+ text-decoration: underline;
1746
+ }
1747
+
1072
1748
  .sandbox-chat-section {
1073
1749
  width: 100%;
1074
1750
  min-width: 0;
@@ -1076,12 +1752,31 @@ dialog::backdrop {
1076
1752
  flex-direction: column;
1077
1753
  background: var(--bg);
1078
1754
  border-radius: 12px;
1079
- padding: 12px;
1755
+ padding: 10px;
1080
1756
  margin-right: 2px;
1081
1757
  box-shadow: var(--shadow);
1082
1758
  overflow: hidden;
1083
1759
  }
1084
1760
 
1761
+ @media (max-width: 1366px) {
1762
+ .sandbox-layout {
1763
+ grid-template-columns: minmax(0, 70fr) minmax(260px, 30fr);
1764
+ }
1765
+
1766
+ .sandbox-layout.presentation-mode {
1767
+ grid-template-columns: minmax(0, 80fr) minmax(220px, 20fr);
1768
+ }
1769
+
1770
+ .node-entity-drawer {
1771
+ width: 360px;
1772
+ max-width: min(360px, calc(100% - 8px));
1773
+ }
1774
+
1775
+ .tree-child-node {
1776
+ max-width: min(100%, 560px);
1777
+ }
1778
+ }
1779
+
1085
1780
  .sandbox-chat-section .chat-container {
1086
1781
  flex: 1;
1087
1782
  height: auto;
@@ -1094,6 +1789,61 @@ dialog::backdrop {
1094
1789
  overflow-y: auto;
1095
1790
  }
1096
1791
 
1792
+ .quick-chat-popover {
1793
+ position: absolute;
1794
+ z-index: 8;
1795
+ width: 340px;
1796
+ max-width: min(340px, calc(100% - 24px));
1797
+ background: #fff;
1798
+ border: 1px solid var(--border);
1799
+ border-radius: 10px;
1800
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.18);
1801
+ padding: 10px;
1802
+ }
1803
+
1804
+ .quick-chat-header {
1805
+ display: flex;
1806
+ align-items: center;
1807
+ justify-content: space-between;
1808
+ margin-bottom: 8px;
1809
+ font-size: 12px;
1810
+ color: var(--text-secondary);
1811
+ }
1812
+
1813
+ .quick-chat-popover textarea {
1814
+ width: 100%;
1815
+ min-height: 90px;
1816
+ resize: vertical;
1817
+ border: 1px solid var(--border);
1818
+ border-radius: 8px;
1819
+ padding: 8px 10px;
1820
+ font-size: 13px;
1821
+ font-family: inherit;
1822
+ }
1823
+
1824
+ .quick-chat-popover textarea:focus {
1825
+ outline: none;
1826
+ border-color: var(--primary);
1827
+ }
1828
+
1829
+ .quick-chat-meta {
1830
+ text-align: right;
1831
+ font-size: 11px;
1832
+ color: var(--text-secondary);
1833
+ }
1834
+
1835
+ .quick-chat-actions {
1836
+ display: flex;
1837
+ justify-content: flex-end;
1838
+ gap: 8px;
1839
+ margin-top: 8px;
1840
+ }
1841
+
1842
+ .quick-chat-actions .btn.disabled {
1843
+ opacity: 0.6;
1844
+ pointer-events: none;
1845
+ }
1846
+
1097
1847
  /* Sandbox Chat */
1098
1848
  .sandbox-chat {
1099
1849
  margin-top: 32px;